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