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