⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 down.asm

📁 完整的方案
💻 ASM
字号:
dPcOk:                 .EQU  0x01
dEraseErr:             .EQU  0x05
dPgmErr:               .EQU  0x06
dPCCsErr:              .EQU  0x07
dCardMessage:          .EQU  0x07
ShakeWait1:            .EQU  0xc000
ShakeWait2:            .EQU  0x4000

_PcRecPage:            .EQU  0x500
_FlashFlag:            .EQU  0x500
_PgmSize:              .EQU  0x501
_PgmErr:               .EQU  0x502
DCount:               .EQU  0x506
_DownLoadFlag:         .EQU  0x510
_AckBook:              .EQU  0x511
_CardFreePage:         .EQU  0x512
_DownNandMaxBank:      .EQU  0x513
_BookBlockBuf:         .EQU  0x520
_BookNameBuf:          .EQU  0x300
_NandLengthBuf0:       .EQU  0x2c0
_NandLengthBuf1:       .EQU  0x2c1
_NandLengthBuf2:       .EQU  0x2c2
_NandLengthBuf3:       .EQU  0x2c3
_BookNameSourceBuf:    .EQU  0x2c4
_BookNameSourceBufEnd: .EQU  0x2e4
OldVersionBit:         .EQU  Bit0


DownLoad:
         R1=0
         [_DownLoadFlag]=R1
         CALL ClearWatchDog
         CALL DTDown
         CALL ShakeHand
         CMP R1, 0
         JNE DownLoad_
         PC=DownLoadErr8
DownLoad_:
         CALL ClearWatchDog
         CALL PcDataIn
         R1=nINIT|_CEB
         [P_IOB_Data]=R1
DownLoad0:
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE DownLoad0
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE DownLoad0
         R1=[P_IOB_Data]
         R1&=0xff
         CMP R1,0x55
         JNE DownLoad0
DownLoad1:
         CALL ClearWatchDog
         CALL PcRecByte
         CMP R3, 0x55
         JE DownLoad2
         PC=DownLoadErr1
DownLoad2:
         CALL PcRecByte
         CMP R3, 0xaa
         JE DownLoad3
         PC=DownLoadErr2
DownLoad3:
         CALL PcRecByte1
         CMP R3, 0xd5
         JNE DownLoad4
         PC=DownLoadOldErase
DownLoad4:        
         R1=[_DownLoadFlag]
         TEST R1, OldVersionBit
         JE DownLoad5
         CALL ClrPCAck
         PC=DownLoadOldData
DownLoad5:
         CALL ClrPCAck
         CMP R3, 0x00
         JNE DownLoad6
         PC=DownLoadErr3
DownLoad6:
         CMP R3, 0x08
         JNE DownLoad7
         PC=DownLoadData
DownLoad7:
         CMP R3, 0x05
         JNE DownLoad8
         PC=DownLoadBookMess
DownLoad8:
         CMP R3, 0x07
         JCC DownLoad9
         PC=DownLoadErr4
DownLoad9:
         R1=R3
         CALL TxHex
         R3-=1
         R3+=DownLoadTab
         PC=[R3]
DownLoadTab:
         .DW DownGetCardMess
         .DW DownDeleteBook
         .DW DownFinish
         .DW DownFormate
         .DW DownWait
         .DW DownWait

DownLoadData:
         CALL PcRecByte
         CALL PcRecByte
DownLoadData_:
         CALL DownASector
         CMP  R1, 0
         JE DownLoadData1
         PC=DownLoadErr5
DownLoadData1:
         CALL PcDataOut
         CALL ClearWatchDog
         R1=[_PcRecPage]
         CALL TxWord
         R1=[_PcRecPage]
         R1&=0x07
         JNE DownLoadData2
         CALL TxChg
DownLoadData2:
         R1=[_DownLoadFlag]
         TEST R1, OldVersionBit
         JNE DownLoadData2__
         R1=[_PcRecPage]
         JE DownLoadData2__
         CMP R1, 1
         JNE DownLoadData2_
         R1+=[_CardFreePage]
         CALL EraseCurrentPageBlock
         JMP DownLoadData2__
DownLoadData2_:
         R1&=0x1f
         JNE DownLoadData2__
         R1=[_PcRecPage]
         R1+=[_CardFreePage]
         CALL EraseCurrentPageBlock
DownLoadData2__:
         R1=[_PcRecPage]
         R1+=[_CardFreePage]
         CALL PgmSector
         CMP R1, 0
         JNE DownLoadPgmErr
//         R1=[_PcRecPage]
//         JE DownLoadDataFinish
DownLoadData3:
         R1=dPcOk
         CALL GivePcAck
         PC=DownLoad_

DownLoadPgmErr:
         CALL PrintPage
         R1=dPgmErr
         CALL GivePcAck
         PC=DownLoadErr6

DownLoadDataFinish:
         CALL PrOk
         R1=[_DownLoadFlag]
         TEST R1, OldVersionBit
         JNE DownLoadOldDataFinish
         PC=DownGetCardMess_

DownLoadOldData:
         PC=DownLoadData_
DownLoadOldDataFinish:
         PC=DownFinish_

DownGetCardMess:
         R3=0xff
         CALL PcRecByte1
DownGetCardMess_:
         CALL PcDataOut
         CALL IDChip
         R1=[_NandMaxBank]
         [_DownNandMaxBank]=R1
         CALL GetCardMess
         R1=[_HowManyBook]
         JE DownGetCardMess__
         R1=R1 LSL 4
         R5=R1 LSL 1
         R3=0x80
         R4=0
         R2=0x100
         CALL ReadNandByteBuf
DownGetCardMess__:
         R1=dCardMessage
         CALL GivePcAck
         R1=[_HowManyBook]
         CALL AckByte
         R1=[_DownNandMaxBank]
         R1=R1 LSR 2
         R1=R1 LSR 4
         CALL AckByte
         R1=[_HowManyBook]
         JE DownGetCardMessEnd
         R1=R1 LSL 4
         R5=R1 LSL 1
         R4=0x100
DownGetCardMessACK0:
         R1=[R4++]
         CALL AckByte
         R5-=1
         JNE DownGetCardMessACK0
DownGetCardMessEnd:
         R3=[_EndAddr]
         R4=[_EndBank]
         R1=R3 LSR 4
         R1=R1 LSR 4
         R1=R1 LSR 1
         R2=R4 LSL 4
         R2=R2 LSL 3
         R1|=R2
         [_CardFreePage]=R1
         PC=DownLoad_

DownLoadBookMess:
         CALL PcRecByte
         R4=0x100
         R5=0
DownLoadBookMess0:
         CALL PcRecByte
         R5+=R3
         [R4++]=R3
         TEST R4, Bit5
         JE DownLoadBookMess0
         CALL PcRecByte
         R4=R3 LSL 4
         R4=R4 LSL 4
         CALL PcRecByte1
         R3|=R4
         CMP R3, R5
         JE DownLoadBookMove
         PC=DownLoadErr7
DownLoadBookMove:
         CALL PcDataOut
         R3=0
         R4=0
         R2=0x200
         R5=0x200
         CALL ReadNandByteBuf
         R1=[_HowManyBook]
         R1+=1
         [0x20a]=R1
         R1=[_HowManyBook]
         JNE DownLoadBookMove_
DownLoad1stBook:
         R3=0x200
         R4=CardCheckTab
DownLoad1stBook0:
         R1=[R4++]
         [R3++]=R1
         TEST R3, Bit3
         JE DownLoad1stBook0

DownLoadBookMove_:
         R1=[_HowManyBook]
         R1=R1 LSL 4
         R1=R1 LSL 1
         R3=R1+0x280
         R4=0x100
DownLoadBookMove0:
         R1=[R4++]
         [R3++]=R1
         TEST R4, Bit5
         JE DownLoadBookMove0

         R3-=8
         R1=[_EndAddr]
         R1&=0xff
         [R3++]=R1
         R1=[_EndAddr]
         R1=R1 LSR 4
         R1=R1 LSR 4
         [R3++]=R1
         R1=[_EndBank]
         R1&=0xff
         [R3++]=R1
         R1=[_EndBank]
         R1=R1 LSR 4
         R1=R1 LSR 4
         [R3++]=R1
         R1=0
         CALL EraseBlock
         R1=0
         CALL PgmSector
         PC=DownGetCardMess_

DownDeleteBook:
         CALL PcRecByte1
         CALL PcDataOut
         R1=[_HowManyBook]
         JE DownDeleteBookEnd
         R3=0
         R4=0
         R2=0x200
         R5=0x200
         CALL ReadNandByteBuf
         R1=[_HowManyBook]
         R1-=1
         [0x20a]=R1
         R1=0
         CALL EraseBlock
         R1=0
         CALL PgmSector
DownDeleteBookEnd:
         PC=DownGetCardMess_

DownFinish:
         CALL PcRecByte1
         CALL PcDataOut
DownFinish_:
         R1=dPcOk
         CALL GivePcAck
         PC=UnitOff

DownWait:
         CALL PcRecByte1
         CALL PcDataOut
         R1='*'
         CALL TxByte
         R1=dPcOk
         CALL GivePcAck
         PC=DownLoad_

DownFormate:
         CALL PcRecByte1
         CALL PcDataOut
         CALL EraseAll
         CMP R1, 0
         JNE DownLoadErr9
         PC=DownGetCardMess_


DownLoadOldErase:
         CALL PcDataOut
         CALL Delay1ms
         CALL IDChip
         CALL PrErase
         CALL EraseAll
         CMP R1, 0
         JNE DownLoadErr9
DownLoadOldEraseOk:
         R1=dPcOk
         CALL GivePcAck
         CALL PrPgm
         R1=OldVersionBit
         [_DownLoadFlag]=R1
         R1=0
         [_CardFreePage]=R1
         PC=DownLoad_


DownLoadErr1:
          R3=1
          JMP DownLoadErr
DownLoadErr2:
          R3=2
          JMP DownLoadErr
DownLoadErr3:
          R3=3
          JMP DownLoadErr
DownLoadErr4:
          R3=4
          JMP DownLoadErr
DownLoadErr5:
          R3=5
          JMP DownLoadErr
DownLoadErr6:
          R3=6
          JMP DownLoadErr
DownLoadErr7:
          R3=7
          JMP DownLoadErr
DownLoadErr8:
          R3=8
          JMP DownLoadErr
DownLoadErr9:
          R3=9
DownLoadErr:
          CALL EnUart         
          R1='E'
          CALL TxByte
          R1='r'
          CALL TxByte
          R1='r'
          CALL TxByte
          R1=R3
          CALL TxHex
          CALL DiUart
          PC=UnitOff

         .ifdef  DEBUG_PC
WaitDebug:
          R2=R1
          CALL EnUart
          CALL Delay1ms
          R4+=1
          R1=R4&0x0ff
          JNE WaitDebug2
          R1=R4&0x1fff
          JNE WaitDebug1
          CALL TxChg   
WaitDebug1:
          R1=R2
          CALL TxByte
          CALL ClearWatchDog
WaitDebug2:
          CALL DiUart
          RETF
         .endif

ShakeHand:
         CALL ClearWatchDog
         R5=8
         R3=0         
ShakeHand1:
         R4=20
         R2=ShakeWait2
ShakeHand10:
         R2-=1
         JNE ShakeHand1_
         CALL ClearWatchDog
         R2=ShakeWait2
         R4-=1
         JNE ShakeHand1_
         PC=ShakeHand1Err
ShakeHand1_:
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE ShakeHand10
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE ShakeHand10
         R1=[P_IOB_Data]
         R1&=0x7f
         CMP R1,0x55
         JE ShakeHandOk

         R1=[P_IOA_Buffer]
         R1|=PcAckB
         [P_IOA_Buffer]=R1
ShakeHand2:
         CALL ClearWatchDog
         R2=ShakeWait2
ShakeHand20:
         R2-=1
         JE ShakeHand2Err
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JNE ShakeHand20
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JNE ShakeHand20
         CALL ClrPCAck
         CALL EnUart
         R1=R3
         CALL TxHex
         CALL DiUart
         R3+=1
         JMP ShakeHand1
ShakeHandOk:
         R1=1
         RETF


ShakeHand2Err:
         CALL ClrPCAck
         CALL PrintErr
         CALL EnUart
         R1=2
         CALL TxHex
         R1=R5
         CALL TxHex
         R1=R3
         CALL TxHex
         CALL DiUart
         CALL Delay10ms
         CALL Delay10ms
         PC=ShakeHand1
ShakeHand1Err:
         CALL PrintErr
         CALL EnUart
         R1=1
         CALL TxHex
         R1=R5
         CALL TxHex
         R1=R3
         CALL TxHex
         CALL DiUart
         R5-=1
         JE ShakeHand1Err_
         PC=ShakeHand1
ShakeHand1Err_:         
         R1=0
         RETF


DownASector:
         R1='^'
         CALL TxByte
         R5=R3
         R4=R3 LSL 4
         R4=R4 LSL 4
         [_PcRecPage]=R4
         CALL PcRecByte
         R5+=R3
         R4=[_PcRecPage]
         R4|=R3
         [_PcRecPage]=R4
         R3=0x200
         R4=[P_IOA_Buffer]
         CALL ClearWatchDog
         R1=0x6000
         [DCount]=R1
DownASector0:
         R1=[DCount]
         R1-=1
         [DCount]=R1
         JE DSErr1
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE DownASector0
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JE DownASector0
         R2=[P_IOB_Data]
         R4|=PcAckB
         [P_IOA_Buffer]=R4
         R2&=0xff
         [R3++]=R2
         R5+=R2
         R1=0x6000
         [DCount]=R1
DownASector1:
         R1=[DCount]
         R1-=1
         [DCount]=R1
         JE DSErr2
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JNE DownASector1
         R1=[P_IOA_Data]
         TEST R1, PcClkB
         JNE DownASector1
         CMP R3, 0x402
         JE DownASectorEnd
         R4&=PcAckB_
         [P_IOA_Buffer]=R4
         JMP DownASector0
DownASectorEnd:
         R1='&'
         CALL TxByte
         R5-=[0x400]
         R5-=[0x401]
         R1=[0x400]
         R1=R1 LSL 4
         R1=R1 LSL 4
         R1|=[0x401]
         CMP R1, R5
         JE DownASectorOk
DownASectorErr:
         R1=1
         RETF
DownASectorOk:
         R1=0
         RETF
DSErr1:
         R1='#'
         CALL TxByte
         R1='1'
         CALL TxByte
         R1=R3
         CALL TxWord
         R1=1
         RETF
DSErr2:
         R1='#'
         CALL TxByte
         R1='2'
         CALL TxByte
         R1=R3
         CALL TxWord
         R1=1
         RETF


AckByte:
          R2=R1
          R3=8
          JMP GivePcAck1
GivePcAck:
          R2=R1 LSL 4
          R2=R2 LSL 1
          R3=3
          R1=[P_IOA_Buffer]
          R1&=PcAckB_
          [P_IOA_Buffer]=R1
GivePcAck1:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE GivePcAck1
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE GivePcAck1
          R1=[P_IOA_Buffer]
          TEST R2, Bit7
          JE GivePcAckLo
GivePcAckHi:
          R1|=PcDatB
          JMP GivePcAck_
GivePcAckLo:
          R1&=PcDatB_
GivePcAck_:
          [P_IOA_Buffer]=R1
          R1=[P_IOA_Buffer]
          R1|=PcAckB
          [P_IOA_Buffer]=R1
GivePcAck2:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE GivePcAck2
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE GivePcAck2
          R1=[P_IOA_Buffer]
          R1&=PcAckB_
          [P_IOA_Buffer]=R1
          R2=R2 LSL 1
          R3-=1
          JNE GivePcAck1
          RETF

PcRecByte:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE PcRecByte
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE PcRecByte
          R3=[P_IOB_Data]
          R3&=0xff
          R1=[P_IOA_Buffer]
          R1|=PcAckB
          [P_IOA_Buffer]=R1
PcRecByte_:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE PcRecByte_
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE PcRecByte_
          R1=[P_IOA_Buffer]
          R1&=PcAckB_
          [P_IOA_Buffer]=R1
          RETF

PcRecByte1:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE PcRecByte1
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JE PcRecByte1
          R3=[P_IOB_Data]
          R3&=0xff
          R1=[P_IOA_Buffer]
          R1|=PcAckB
          [P_IOA_Buffer]=R1
PcRecByte1_:
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE PcRecByte1_
          R1=[P_IOA_Data]
          TEST R1, PcClkB
          JNE PcRecByte1_
          RETF

ClrPCAck:
          R1=[P_IOA_Buffer]
          R1&=PcAckB_
          [P_IOA_Buffer]=R1
          RETF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -