www.pudn.com > bak22.rar > NAND.ASM, change:2007-06-12,size:21411b


EraseTestCir:  .EQU  0x8000 
PgmTestCir:    .EQU  0x8000 
EraseAll: 
          R4=0 
EraseAll0: 
          CALL ClearWatchDog 
          CALL EnUart 
          R1=R4&0x0f 
          JNE EraseAll_ 
          CALL TxChg 
EraseAll_: 
          R1=R4 
          CALL TxHex 
          CALL DiUart 
          R1=R4 
          CALL EraseBlock 
          CMP R1, 0 
          JE EraseAll__ 
          RETF 
EraseAll__: 
          R4+=0x01 
          CMP R4, 0x800 
          JNE EraseAll0 
          R1=0 
          RETF 
 
EraseCurrentPageBlock: 
          R1=R1 LSR 4 
          R1=R1 LSR 1 
          JMP EraseBlock 
EraseCurrentAddrBlock: 
           R1=R4 LSL 2 
           TEST R3, BitF 
           JE EraseCurrentAddrBlock1 
           R1|=Bit1 
EraseCurrentAddrBlock1: 
           TEST R3, BitE 
           JE EraseCurrentAddrBlock2 
           R1|=Bit0 
EraseCurrentAddrBlock2: 
EraseBlock: 
           R5=R1 
           DATAOUT 
           SCMD 0x60 
           R1=R5 LSL 4 
           R1=R1 LSL 1 
           R1&=0xff 
           SADR0 
 
           R1=R5 LSR 3 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R5 LSR 3 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           R1&=0xff 
           .endif 
           SADRE 
           SCMD 0xd0 
           SCMD 0x70 
           R1=EraseTestCir 
           PC=NandReadyTest 
PgmSector: 
           R5=R1 
           DATAOUT 
           SCMD 0x00 
           SCMD 0x80 
           R1=0 
           SADR0 
           R1=R5&0xff 
           SADR 
           R1=R5 LSR 4 
           R1=R1 LSR 4 
           .ifdef M64 
           SADR 
           R1=0 
           .endif 
           SADRE 
           R4=0x200 
 
PgmSector0: 
           R1=[R4++] 
           WBYTE 
           R1=[R4++] 
           WBYTE 
           R1=[R4++] 
           WBYTE 
           R1=[R4++] 
           WBYTE           
           CMP R4, 0x400 
           JCC PgmSector0 
           SCMD 0x10 
           SCMD 0x70 
           R1=PgmTestCir 
NandReadyTest: 
           TESTRB 
           JNE NandReadyTest_ 
           R1-=1 
           JNE NandReadyTest 
           DATAOUT 
           R1=1 
           RETF 
NandReadyTest_: 
//           DATAIN 
//           R1=8 
//           CALL Delay0 
//           R1=[P_IOB_Data] 
//           TEST R1, Bit0 
//           JNE NandReadyTestErr 
NandReadyTestOk: 
           DATAOUT 
           R1=0 
           RETF 
NandReadyTestErr: 
           DATAOUT 
           R1=2 
           RETF 
 
 
 
VerifySector: 
           R5=R1 
           DATAOUT 
           SCMD 0x00 
           R1=0 
           SADR0 
           R1=R5&0xff 
           SADR 
           R1=R5 LSR 4 
           R1=R1 LSR 4 
           .ifdef M64 
           SADR 
           R1=0 
           .endif 
           SADRE 
           R4=0x200 
           DATAIN 
           CALL DelayN 
VerifySector0: 
           RBYTE 
           R1&=0xff 
           CMP R1, [R4] 
           JNE VerifySectorErr 
           R4+=1 
           CMP R4, 0x400 
           JCC VerifySector0 
           DATAOUT 
           R1=0 
           RETF 
VerifySectorErr: 
           DATAOUT 
           R1=1 
           RETF 
 
ReadSector: 
           R5=R1 
           DATAOUT 
           SCMD 0x00 
           R1=0 
           SADR0 
           R1=R5&0xff 
           SADR 
           R1=R5 LSR 4 
           R1=R1 LSR 4 
           .ifdef M64 
           SADR 
           R1=0 
           .endif 
           SADRE 
           R4=0x200 
           DATAIN 
           CALL DelayN 
ReadSector0: 
           RBYTE 
           R1&=0xff 
           [R4]=R1 
           R4+=1 
           CMP R4, 0x400 
           JCC ReadSector0 
           DATAOUT 
           RETF 
 
PrintSector: 
           R5=R1 
           CALL EnUart 
           CALL TxChg 
           DATAOUT 
           SCMD 0x00 
           R1=0 
           SADR0 
           R1=R5&0xff 
           SADR 
           R1=R5 LSR 4 
           R1=R1 LSR 4 
           .ifdef M64 
           SADR 
           R1=0 
           .endif 
 
           SADRE 
           CALL DelayN 
           DATAIN 
           R4=0x200 
PrintSector0: 
           R1=R4&0x0f 
           JNE PrintSector_ 
           CALL TxChg 
 
PrintSector_: 
           RBYTE 
           R1&=0xff 
           CALL TxHex 
           [R4]=R1 
           R4-=1 
           JNE PrintSector0 
           DATAOUT 
           RETF 
 
 
IDChip: 
           DATAOUT 
           CALL PrID 
           SCMD 0x90 
           SADR00 
           DATAIN 
           CALL DelayN 
           RBYTE 
           R1&=0xff 
           [_Tmp1]=R1 
           RBYTE 
           R1&=0xff 
           [_Tmp2]=R1 
           RBYTE 
           R1&=0xff 
           [_Tmp3]=R1 
           RBYTE 
           R1&=0xff 
           [_Tmp4]=R1 
           DATAOUT 
           CALL EnUart 
           R1=[_Tmp1] 
           CALL TxHex 
           R1=[_Tmp2] 
           CALL TxHex 
           R1=[_Tmp3] 
           CALL TxHex 
           R1=[_Tmp4] 
           CALL TxHex 
           CALL DiUart 
           R1=0x800 
           [_NandMaxBank]=R1 
           RETF 
 
ReadNandByteBuf: 
           DATAOUT  
           [_NandBufBak]=R4 
           R4=R2 
           TEST R3,Bit8 
           JE ReadNandByteBuf2 
ReadNandByteBuf1: 
           SCMD 0x01 
           JMP  ReadNandByteBuf3 
ReadNandByteBuf2: 
           SCMD 0x00 
ReadNandByteBuf3: 
           R1=R3&0xff 
           SADR0 
           R1=[_NandBufBak] 
           TEST R1, Bit0 
           JE ReadNandByteBuf5 
ReadNandByteBuf4: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           R1|=Bit7 
           JMP ReadNandByteBuf6 
ReadNandByteBuf5: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
ReadNandByteBuf6: 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
ReadNandByteBuf0: 
           RBYTE 
           R1&=0xff 
           [R4++]=R1 
           R5-=1 
           JE ReadNandByteBufE 
           R3+=1 
           JCS ReadNandByteChgB1 
           R1=R3&0x1ff 
           JNE ReadNandByteBuf0 
           JMP ReadNandByteChgB2 
ReadNandByteChgB1: 
           R1=[_NandBufBak] 
           R1+=1 
           [_NandBufBak]=R1 
ReadNandByteChgB2: 
           DATAOUT 
           PC=ReadNandByteBuf2 
ReadNandByteBufE: 
           DATAOUT 
           RETF 
 
ReadNandWordBuf: 
           R5=R5 LSL 1 
           DATAOUT  
           [_NandBufBak]=R4 
           R4=R2 
           TEST R3,Bit8 
           JE ReadNandWordBuf2 
ReadNandWordBuf1: 
           SCMD 0x01 
           JMP  ReadNandWordBuf3 
ReadNandWordBuf2: 
           SCMD 0x00 
ReadNandWordBuf3: 
           R1=R3&0xff 
           SADR0 
           R1=[_NandBufBak] 
           TEST R1, Bit0 
           JE ReadNandWordBuf5 
ReadNandWordBuf4: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           R1|=Bit7 
           JMP ReadNandWordBuf6 
ReadNandWordBuf5: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
ReadNandWordBuf6: 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
ReadNandWordBuf0: 
           TEST R5, Bit0 
           JNE ReadNandWordBuf0_2 
ReadNandWordBuf0_1: 
           RBYTE 
           R1&=0xff 
           [R4]=R1 
           JMP ReadNandWordBuf0_ 
ReadNandWordBuf0_2: 
           RBYTE 
           R1=R1 LSL 4 
           R1=R1 LSL 4 
           R1|=[R4] 
           [R4++]=R1 
ReadNandWordBuf0_: 
           R5-=1 
           JE ReadNandWordBufE 
           R3+=1 
           JCS ReadNandWordChgB1 
           R1=R3&0x1ff 
           JNE ReadNandWordBuf0 
           JMP ReadNandWordChgB2 
ReadNandWordChgB1: 
           R1=[_NandBufBak] 
           R1+=1 
           [_NandBufBak]=R1 
ReadNandWordChgB2: 
           DATAOUT 
           PC=ReadNandWordBuf2 
ReadNandWordBufE: 
           DATAOUT 
           RETF 
 
 
ReadNandByte:    
           DATAOUT 
           TEST R3,Bit8 
           JE ReadNandByte2 
ReadNandByte1: 
           SCMD 0x01 
           JMP  ReadNandByte_ 
ReadNandByte2: 
           SCMD 0x00 
ReadNandByte_: 
           R1=R3&0xff 
           SADR0 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           TEST R4, Bit0 
           JE ReadNandByte__ 
           R1|=Bit7 
ReadNandByte__: 
           SADR 
           R1=R4 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R4 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RBYTE 
           R5=R1&0xff 
           DATAOUT 
           R1=R5 
           RETF 
 
ReadNandWord: 
           DATAOUT 
           TEST R3,Bit8 
           JE ReadNandWord2 
ReadNandWord1: 
           SCMD 0x01 
           JMP  ReadNandWord_ 
ReadNandWord2: 
           SCMD 0x00 
ReadNandWord_: 
           R1=R3&0xff 
           SADR0 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           TEST R4, Bit0 
           JE ReadNandWord__ 
           R1|=Bit7 
ReadNandWord__: 
           SADR 
           R1=R4 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R4 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RBYTE 
           R5=R1&0xff 
           R1=R3&0x1ff 
           CMP R1, 0x1ff 
           JCS ReadNandWordAgain 
           RBYTE 
           R1=R1 LSL 4 
           R1=R1 LSL 4 
           R5|=R1 
           DATAOUT 
           R1=R5 
           RETF 
 
ReadNandWordAgain: 
           DATAOUT 
           R3+=1 
           JCC ReadNandWordAgain_ 
           R4+=1 
ReadNandWordAgain_: 
           SCMD 0x00 
           R1=R3&0xff 
           SADR0 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           TEST R4, Bit0 
           JE ReadNandWordAgain2__ 
           R1|=Bit7 
ReadNandWordAgain2__: 
           SADR 
           R1=R4 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R4 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RBYTE 
           R1=R1 LSL 4 
           R1=R1 LSL 4 
           R5|=R1 
           DATAOUT 
           R3-=1 
           R4-=0,Carry 
           DATAOUT 
           R1=R5 
           RETF 
 
AddrChg: 
//           R1=[_BookMark] 
//           TEST R1, BitF 
//           JE AddrChg_ 
//           RETF 
AddrChg_: 
           R3+=0x8000 
           TEST R3, BitE 
           JE AddrChg1 
           R4|=Bit8 
AddrChg1: 
           TEST R3, BitF 
           JE AddrChg2 
           R4|=Bit9 
AddrChg2: 
           R3&=0x3fff 
           TEST R4, Bit0 
           JE AddrChg3 
           R3|=BitE 
AddrChg3: 
           TEST R4, Bit1 
           JE AddrChg4 
           R3|=BitF 
AddrChg4: 
           R4=R4 LSR 2 
           RETF 
 
NandAddrInc: 
           R3+=1 
           R4+=0, Carry 
           RETF 
            
NandAddrAdd: 
           R3+=R1  
           R4+=0, Carry 
           RETF 
 
AddBookAddr: 
           R3+=[_CurrentBookAddr] 
           R4+=[_CurrentBookBank], Carry 
           RETF 
 
NandAddrSub: 
           R3-=R1 
           R4-=0, Carry 
           RETF 
 
 
ReadNand1Byte: 
           R1=[_NandAddrL] 
           R1+=1 
           [_NandAddrL]=R1 
           R2=R1&0x1ff 
           JNE ReadNand1Byte_ 
           JCC ReadNand1ByteSetAddr 
           R1=[_NandAddrH] 
           R1+=1 
           [_NandAddrH]=R1 
ReadNand1ByteSetAddr: 
           CALL SetSearchingAddr 
ReadNand1Byte_: 
           RBYTE 
           R1&=0xff 
           RETF 
 
SetR3R4Addr: 
           DATAOUT 
           TEST R3,Bit8 
           JE SetR3R4Addr2 
SetR3R4Addr1: 
           SCMD 0x01 
           JMP  SetR3R4Addr_ 
SetR3R4Addr2: 
           SCMD 0x00 
SetR3R4Addr_: 
           R1=R3&0xff 
           SADR0 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           TEST R4, Bit0 
           JE SetR3R4Addr__ 
           R1|=Bit7 
SetR3R4Addr__: 
           SADR 
           R1=R4 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R4 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RETF 
 
SetSearchingAddr: 
           DATAOUT 
           R1=[_NandAddrL] 
           TEST R1,Bit8 
           JE SetSearchingAddr2 
SetSearchingAddr1: 
           SCMD 0x01 
           JMP  SetSearchingAddr3 
SetSearchingAddr2: 
           SCMD 0x00 
SetSearchingAddr3: 
           R1=[_NandAddrL] 
           R1&=0xff 
           SADR0 
 
           R1=[_NandAddrH] 
           TEST R1, Bit0 
           JE SetSearchingAddr5 
SetSearchingAddr4: 
           R1=[_NandAddrL] 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           R1|=Bit7 
           JMP SetSearchingAddr6 
SetSearchingAddr5: 
           R1=[_NandAddrL] 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
SetSearchingAddr6: 
           SADR 
           R1=[_NandAddrH] 
           R1=R1 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=[_NandAddrH] 
           R1=R1 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RETF 
 
ChgSearchingAddr: 
           DATAOUT 
           R1=[_NandAddrL] 
           R1+=0x200 
           JCC ChgSearchingAddr1 
           R2=[_NandAddrH] 
           R2+=1 
           [_NandAddrH]=R2 
ChgSearchingAddr1: 
           R1&=0xfe00 
           R2=R5&0x1ff 
           R1|=R2 
           [_NandAddrL]=R1 
           R5-=0x200 
           SCMD 0x00 
           R1=[_NandAddrL] 
           R1&=0xff 
           SADR0 
           R1=[_NandAddrH] 
           TEST R1, Bit0 
           JE ChgSearchingAddr5 
ChgSearchingAddr4: 
           R1=[_NandAddrL] 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           R1|=Bit7 
           JMP ChgSearchingAddr6 
ChgSearchingAddr5: 
           R1=[_NandAddrL] 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
ChgSearchingAddr6: 
           SADR 
           R1=[_NandAddrH] 
           R1=R1 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=[_NandAddrH] 
           R1=R1 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
           RETF 
 
WriteNandWordBuf: 
           DATAOUT  
           [_NandBufBak]=R4 
           R4=R2 
           TEST R3,Bit8 
           JE WriteNandWordBuf2 
WriteNandWordBuf1: 
           SCMD 0x01 
           JMP  WriteNandWordBuf3 
WriteNandWordBuf2: 
           SCMD 0x00 
WriteNandWordBuf3: 
           SCMD 0x80 
           R1=R3&0xff 
           SADR0 
           R1=[_NandBufBak] 
           TEST R1, Bit0 
           JE WriteNandWordBuf5 
WriteNandWordBuf4: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           R1|=Bit7 
           JMP WriteNandWordBuf6 
WriteNandWordBuf5: 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
WriteNandWordBuf6: 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=[_NandBufBak] 
           R1=R1 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           CALL DelayN 
WriteNandWordBuf0: 
           R1=[R4] 
           R1&=0xff 
           WBYTE 
           R1=[R4++] 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           WBYTE 
           R5-=1 
           JNE WriteNandWordBufS  
           PC=WriteNandWordBufE 
WriteNandWordBufS:            
           R3+=2 
           JCS WriteNandWordChgB1 
           R1=R3&0x1ff 
           JNE WriteNandWordBuf0 
           JMP WriteNandWordChgB2 
WriteNandWordChgB1: 
           R1=[_NandBufBak] 
           R1+=1 
           [_NandBufBak]=R1 
WriteNandWordChgB2: 
           SCMD 0x10 
           SCMD 0x70 
           R1=PgmTestCir 
WriteNandReadyTest: 
           TESTRB 
           JNE WriteNandReadyTest_ 
           R1-=1 
           JNE WriteNandReadyTest 
WriteNandReadyTest_: 
           DATAIN 
           CALL DelayN 
WriteNandReadyTestOk: 
           DATAOUT 
           DATAOUT 
           PC=WriteNandWordBuf2 
 
WriteNandWordBufE: 
           SCMD 0x10 
           SCMD 0x70 
           R1=PgmTestCir 
WriteNandReadyTest2: 
           TESTRB 
           JNE WriteNandReadyTest2_ 
           R1-=1 
           JNE WriteNandReadyTest2          
WriteNandReadyTest2_: 
           DATAIN 
           CALL DelayN 
WriteNandReadyTest2Ok: 
           DATAOUT 
           RETF 
 
//EraseRecord: 
//          R4=Rec1OrgBlock 
//EraseRecord0: 
//          CALL ClearWatchDog 
//          R1=R4 
//          CALL EraseBlock 
//          CMP R1, 0 
//          JNE EraseRecordErr 
//          R4+=1 
//          CMP R4, Rec1EndBlock 
//          JNE EraseRecord0 
//          R1=0 
//EraseRecordErr: 
//          RETF 
 
DelayN: 
          PUSH R1,R2 TO [SP] 
          R1=0x400 
DelayN0: 
          TESTRB 
          JNE DelayNE 
          R1-=1 
          JNE DelayN0 
DelayNE: 
          POP R1,R2 FROM [SP] 
          RETF 
 
SkipWordFF: 
          CALL SetR3R4Addr 
          R5=0 
          JMP SkipWordFF1 
SkipWordFF0: 
          R1=R3&0x1ff 
          JNE SkipWordFF1 
          CALL SetR3R4Addr 
SkipWordFF1: 
          RBYTE_ 
          CMP R1, 0xff 
          JE SkipWordFFEnd 
          R3+=1 
          JCC SkipWordFF2 
          R4+=1 
SkipWordFF2: 
          R1=R3&0x1ff 
          JNE SkipWordFF3 
          CALL SetR3R4Addr 
SkipWordFF3: 
          RBYTE 
          R3+=1 
          JCC SkipWordFF4 
          R4+=1 
SkipWordFF4: 
          JMP SkipWordFF0 
SkipWordFFEnd: 
          DATAOUT 
          RETF 
 
 
SearchByteFF: 
          R5=0 
          CALL SetR3R4Addr 
          JMP SearchByteFF1 
SearchByteFF0: 
          R5+=1 
          R3+=1 
          R4+=0, Carry 
          R1=R3&0x1ff 
          JNE SearchByteFF1 
          CALL SetR3R4Addr 
SearchByteFF1: 
          RBYTE 
          R1&=0xff 
          CMP R1, 0xff 
          JNE SearchByteFF0 
          RETF 
 
 
CmpCoord: 
          R2=[_XValue] 
          R2+=XChgTab 
          R1=[R2]  
          R1=R1 LSL 4 
          R1=R1 LSL 4 
          [_Tmp1]=R1 
          R2=[_YValue] 
          R2+=YChgTab 
          R1=[R2]          
          R1|=[_Tmp1] 
          R3=[_QuestionAddr] 
          R4=[_QuestionBank] 
 
CmpWord: 
          R5=0 
          [_Tmp1]=R1 
          CALL SetR3R4Addr 
          JMP CmpWord1 
CmpWord0: 
          R5+=1 
          R3+=1 
          R4+=0, Carry 
          R1=R3&0x1ff 
          JNE CmpWord1 
          CALL SetR3R4Addr 
CmpWord1: 
          RBYTE 
          R1&=0xff 
          [_Tmp2]=R1 
          R3+=1 
          R4+=0, Carry 
          R1=R3&0x1ff 
          JNE CmpWord2 
          CALL SetR3R4Addr 
CmpWord2: 
          RBYTE 
          R1=R1 LSL 4 
          R1=R1 LSL 4 
          R1|=[_Tmp2] 
          CMP R1, [_Tmp1] 
          JE CmpWordOk 
          CMP R1, 0xffff 
          JNE CmpWord0 
CmpWordNo: 
          DATAOUT 
          R1=0 
          RETF 
CmpWordOk: 
          DATAOUT 
          R1=1 
          RETF 
 
ReadNandAddr: 
           DATAOUT 
           R5=4 
           TEST R3,Bit8 
           JE ReadNandAddr2 
ReadNandAddr1: 
           SCMD 0x01 
           JMP  ReadNandAddr_ 
ReadNandAddr2: 
           SCMD 0x00 
ReadNandAddr_: 
           R1=R3&0xff 
           SADR0 
           R1=R3 LSR 4 
           R1=R1 LSR 4 
           R1=R1 LSR 1 
           TEST R4, Bit0 
           JE ReadNandAddr__ 
           R1|=Bit7 
ReadNandAddr__: 
           SADR 
           R1=R4 LSR 1 
           R1&=0xff 
           .ifdef M64 
           SADR 
           R1=R4 LSR 1 
           R1=R1 LSR 4 
           R1=R1 LSR 4 
           .endif 
           SADRE 
           DATAIN 
           CALL DelayN 
ReadNandAddr0: 
           RBYTE_ 
           R3+=1 
           R4+=0, Carry 
           R5-=1 
           JE ReadNandAddrE 
           PUSH R1 TO [SP] 
           R3&=0x1ff 
           JNE ReadNandAddr0 
           PC=ReadNandAddr2 
ReadNandAddrE: 
           R4=R1 LSL 4 
           R4=R4 LSL 4 
           POP R1 FROM [SP] 
           R4|=R1 
           POP R1 FROM [SP] 
           R3=R1 LSL 4 
           R3=R3 LSL 4 
           POP R1 FROM [SP] 
           R3|=R1 
           DATAOUT 
           RETF 
 
PrintNand: 
           DATAOUT 
           CALL SetR3R4Addr 
PrintNand0: 
           R1=R5&0x0f 
           JNE PrintNand_ 
           CALL TxChg 
PrintNand_: 
           RBYTE 
           R1&=0xff 
           CALL TxHex 
           R5-=1 
           JNE PrintNand0 
           CALL DiUart 
           DATAOUT 
           RETF