📄 nand.asm
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -