;*************************************************************************** ; ; File Name :'xmodem.asm" ; Title :XMODEM only receive ; Date :2002.07.03. ; Version :1.0.0 ; Support telephone :+36-70-333-4034, Old: +36-30-9541-658 ; Support fax : ; Support Email :info@vfx.hu ; Target MCU :AT90S8515 ; ;*************************************************************************** ; D E S C R I P T I O N ; ; ; ;*************************************************************************** ; M O D I F I C A T I O N H I S T O R Y ; ; ; rev. date who why ; ---- ---------- --- -------------------------------------------- ; 0.01 2002.07.03 VFX Creation ; ; ;*************************************************************************** ;Hardware ;*************************************************************************** ;* ;* Kvarc: f=7.3728 MHz (T=135.63368 ns) ;* ;*************************************************************************** ; ; ; ;*************************************************************************** ;* Const Def .EQU Xmodem_Sync = 0 ;szinkronizalasi fazis .EQU Xmodem_SOH = 1 ;SOH byte-ra var .EQU Xmodem_Fill = 2 ;SOH byte megjott, block init megvolt .EQU Xmodem_Err = 3 ;megszakadt az atvitel, NAK kuldese 3 masodpercenkent .EQU SyncTiming = 300 ;ket karakter elkuldese kozott ;eltelt ido szinc. uzemmodban 3sec @100Hz ;************************************************************************** ;* Hardware Def. ; ;*************************************************************************** ;**** VARIABLES .DSEG CRC: .BYTE 2 ; CRC for XMODEM XmodemFlag: .BYTE 1 ;Xmodem Flag ;[2:0] = 000 sending 'c' Phase 1: syncronize Xm_BlkCounter: .BYTE 1 ;Xmodem Block Counter [00-FF] XmodemPTR: .BYTE 1 ;Xmodem Buffer pointer XmodemBuf: .BYTE 133 ;XMODEM RxBuffer FileLength: .byte 4 ;File hossz 32 bites LastPocketSize: .byte 1 ;utolso pocket merete byte-ban [0...128] XmodemMode: .byte 1 ;Mode0 - Nul modem letolti de nem csinal semmit ;Mode1 - DSP Boot Xm_ErrorCNT: .byte 1 ;Xmodem Time to Abort counter ;*************************************************************************** .ESEG ;*************************************************************************** .CSEG ;*************************************************************************** ;** Init Xmodem File Receive ;** Init_Xmodem: ldi R16,128 sts LastPocketSize,R16 clr R0 sts FileLength+0,R0 sts FileLength+1,R0 sts FileLength+2,R0 sts FileLength+3,R0 sts Xm_ErrorCNT,R0 sts XmodemFlag,R0 sts Xm_BlkCounter,R0 Init_XmNextBl: clr R0 sts CRC+0,R0 sts CRC+1,R0 sts XmodemPTR,R0 STS SCNT2+0,R0 STS SCNT2+1,R0 ret ;*************************************************************************** ;** Calc & Update XMODEM CRC ;* ;* In: R0 - data byte UpdateCRC: lds R17,CRC+1 mov R15,R17 swap R17 mov R16,R17 eor R17,R15 andi R17,0xF0 andi R16,0x0F eor R15,R16 mov R14,R17 lsl R14 rol R16 eor R15, R14 eor R17,R16 lds R14,CRC+0 eor R15,R0 eor R17,R14 sts CRC+0,R15 sts CRC+1,R17 ret ;*************************************************************************** ;** XMODEM Receive File & Block ;* ;* Xmodem_Rec: lds R16,XmodemFlag cpi R16,Xmodem_Sync breq Xm_Sync cpi R16,Xmodem_Fill brne Xmodem_Rec1 rjmp Xm_Fill Xmodem_Rec1: cpi R16,Xmodem_SOH breq Xm_SOH cpi R16,Xmodem_Err breq Xm_Sync rjmp Xmodem_Cancel Xm_Sync: call Rs232GetByte brcs Xm_valamijott ;itt meg mindig nem jott semmi lds R16,SCNT2+0 lds R17,SCNT2+1 or R16,R17 ;Timer lejart? breq Xm_Sync1 ret Xm_Sync1: ldi R16,NAK ;akkor, ha hiba van NAK megy 3 masodpercenkent lds R17,XmodemFlag cpi R17,Xmodem_Err breq Xm_Sync2 ;mivel meg mindig nem jott semmi kuldunk egy ;CRC - karaktert 3 masodpercenkent lds R16,Xm_ErrorCNT ;ha 20 'C' ideig nem jon semmi akkor abort!!! inc R16 sts Xm_ErrorCNT,R16 cpi R16,20 brne Xm_Sync25 rjmp Xm_Abort Xm_Sync25: ldi R16,'C' Xm_Sync2: call SendChrW ldi R16,Low(SyncTiming) ;Timer=3sec @100Hz sts SCNT2+0,R16 ldi R17,High(SyncTiming) sts SCNT2+1,R17 ret Xm_SOH: call Rs232GetByte brcs Xm_valamijott ret Xm_valamijott: mov R16,R0 cpi R16,CAN breq Xmodem_Cancel cpi R16,SOH breq Xmodem_StartOfH cpi R16,EOT breq Xmodem_EndOfT rjmp Xmodem_Rec Xm_ByteStr: .db " Bytes received ",CR,0 ;End of Trans == Canacel Xmodem_EndOfT: ldi R16,ACK call SendChrW ;Pozitiv nyugta Xm_Abort: ldi R16,CR call SendChrW ;soremeles lds R16,FileLength+0 ;ACC1 LSByte lds R17,FileLength+1 lds R18,FileLength+2 lds R19,FileLength+3 call ULTOA ;Print FileLength ldi XL,low(ASCIIBuf) ;Ascii Buffer Ptr ldi XH,high(ASCIIBuf) ;ldi R22,12 call PrintASCII ;rcall DumpASCII ldi R16,Low(Xm_ByteStr) ldi R17,High(Xm_ByteStr) call SendStrW Xmodem_Cancel: lds R16,Term_Stat ;End of Xmodem receiving cbr R16,Term_Rec_Xmodem ;Normal Terminal Mode sts Term_Stat,R16 lds R17,XmodemMode cpi R17,1 brne Xm_CancelEnd ;itt lesz vege a FALSH update-nak Xm_CancelEnd: clr R17 sts Updating,R17 ;Ezel jelzzuk keszen vagyunk sts XmodemMode,R17 ;barmi volt is, most null modem jmp CMDOk Xmodem_StartOfH: ldi R16,Xmodem_Fill sts XmodemFlag,R16 rcall Init_XmNextBl ldi ZL,Low(SyncTiming) ;Timer=3sec @100Hz sts SCNT2+0,ZL ;he nem jon ujjab byte, akkor baj van!! ldi ZL,High(SyncTiming) sts SCNT2+1,ZL rjmp Xmodem_Rec Xm_Fill: call Rs232GetByte ;itt beolvasunk 132 byte-ot brcs Xm_data ; blk counter,255-blk counter [2 byte] ; adatblok [128 byte] ; CRC [2 byte] ;total 132 byte lds R16,SCNT2+0 ;he nem jon ujjab byte, akkor baj van!! lds R17,SCNT2+1 or R16,R17 brne Xm_vanido ldi R16,Xmodem_Err sts XmodemFlag,R16 ;Time Out, Ismetles kell Xm_vanido: ret Xm_data: ldi ZL,Low(SyncTiming) ;Timer=3sec @100Hz sts SCNT2+0,ZL ;he nem jon ujjab byte, akkor baj van!! ldi ZL,High(SyncTiming) sts SCNT2+1,ZL ldi ZL,Low(XmodemBuf) ldi ZH,High(XmodemBuf) clr R1 lds R16,XmodemPTR add ZL,R16 adc ZH,R1 ;ZL:ZH -> Xmodem Actualis Pos. st Z,R0 ;Char eltarolasa inc R16 sts XmodemPTR,R16 cpi R16,3 ;3