;*************************************************************************** ; ; File Name :'user.asm" ; Title :Altalanos felhasznaloi rutinok ; Date :2001.12.30. Lastmod.:[2003.02.08.] ; Version :1.0.0 ; Support telephone :+36-30-9541-658 VFX ; Support fax :+36-30-9809-372 ; Support Email :info@vfx.hu ; Target MCU : *** ; ;*************************************************************************** ; 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 2001.12.30 VFX Creation ; ;*************************************************************************** ; ; ; ;Hardware ;*************************************************************************** ;* ;************************************************************************** ;* Const Def ;*************************************************************************** .DSEG UserFLASH: .byte 3 ;Belso FLASH irashoz kell, Data pointer to FLASH AppData: .byte 256 ;atmeneti tarolo az update-hez AppDataPointer: .byte 1 ;pointer az AppDatan beul ;************************************************************************* ;* Text Const ;* .CSEG ;******************************** ; 8 byte-ot HEX alakban kiir a sorosportra X-regtol kezdve ; In: X - address ; ; HexDump: ldi R21,8 clr XL clr XH HexDump1: call DumpRow dec R21 brne HexDump1 ret ;**************************** ;* Memoria DUMP 1 sora X-tol kezdve ; DumpRow: mov R0,XH call HexToUART ;Cim H-byte mov R0,XL call HexToUART ;L-byte rjmp DumpCont ; R2:R1 Virtual Address, amit kiir a sor ele DumpAddr: mov R0,R2 call HexToUART ;Cim H-byte mov R0,R1 call HexToUART ;L-byte DumpCont: ldi R16,' ' call SendChrW push XL push XH call DumpHalfRow ldi R16,'|' call SendChrW call DumpHalfRow ldi R16,' ' call SendChrW pop XH pop XL ldi R22,16 DumpASCCIRow: ld R16,X+ cpi R16,32 brcs asciirossz cpi R16,128 brcs asciijo asciirossz: ldi R16,'.' ;igy jeloljuk a rossz ascii code-ot asciijo: call SendChrW dec R22 brne DumpASCCIRow ldi R16,CR call SendChrW ret ;******************************** ; 8 byte-ot hex alakban kiir a sorosportra X-regtol kezdve ; DumpHalfRow: ldi R22,8 DumpR0: ld R0,X+ call HexToUART ldi R16,' ' call SendChrW dec R22 brne DumpR0 ret TstHexDigit: rcall MakeUpper subi R16,'0' brcs tstherr cpi R16,10 brcs tsthexok subi R16,7 brcs tstherr cpi R16,16 brsh tstherr tsthexok: clc ret tstherr: sec ret .equ PAGESIZEB = PAGESIZE*2 ;*********************************** ; Felkeszules a FLASH irasara ; ;ide majd kell meg az interruptok tiltasa stb... INIT_Upgrade: clr R0 sts UserFLASH+0,R0 ;Ez a Z-reg sts UserFLASH+1,R0 sts UserFLASH+2,R0 ;Ez a RAMPZ sts AppDataPointer,R0 ret ;********************************* ; R16-nyi 0x1A -t kell tolteni a Flashbe Usr_Fill_1A: clr R1 inc R1 rjmp CopyAD0 ;********************************* ; R16 - hany byte-ot kell betolteni a FLASHbe X-regtol kezdve ; CopyAppData: clr R1 ;ez donti el, hogy masolas vagy fill lesz-e CopyAD0: lds R17,AppDataPointer ldi ZL,Low(AppData) ldi ZH,High(AppData) clr R0 add ZL,R17 adc ZH,R0 ;Z = AppData kovetkezo byte CopyAD1: tst R1 breq CopyVan ldi R18,0x1A rjmp FillVan CopyVan: ld R18,X+ FillVan: st Z+,R18 inc R17 cpi R17,0 brne CopyAD2 ;itt megtelt az AppData lehet FLASHbe tolni push ZL push ZH push XL push XH push R17 push R16 call WriteToPage pop R16 pop R17 pop XH pop XL pop ZH pop ZL ldi ZL,low(AppData) ldi ZH,High(AppData) clr R17 CopyAD2: dec R16 brne CopyAD1 ;amig van masolando, addig ciklus sts AppDataPointer,R17 ret WriteToPage: ldi R16,128 ;mert nem byte, hanem word kell ldi XL,low(AppData) ldi XH,High(AppData) lds R18,UserFLASH+2 out RAMPZ,R18 lds ZH,UserFLASH+1 lds ZL,UserFLASH+0 ;ahhol abbahagytuk az elobbi blokkot ott folytatjuk ;[RAMPZ:Z] -> FLASH pointer ;Disable write to Boot area cpi R18,1 brne Wrloop cpi ZH,0xE0 ;[RAMPZ:Z]>=0xF000 (word) brlo Wrloop ret ;if this is boot -> exit Wrloop: ld R0,X+ ld R1,X+ ldi R17,0b00000001 ;Fill Temp buffer Command call Do_spm adiw ZL,2 cpi ZL,0 ;Ha ZL=0, akkor laphatarhoz ertunk, irni kell a flashbe brne MegNemKellIrni rcall WriteToFLASH MegNemKellIrni: dec R16 brne Wrloop sts UserFLASH+0,ZL ;ahhol abbahagytuk az elobbi blokkot ott folytatjuk sts UserFLASH+1,ZH sts UserFLASH+2,R18 ret WriteToFLASH: ;mikor ide jut eggyel nagyobb lapon vagyunk push ZH dec ZH ;most vagyunk a jo lapon ;lehet torolni ldi R17,0b00000011 ;Erase parancs rcall Do_spm ldi R17,0b00000101 ;Write Page Command rcall Do_spm ;itt kellene visszaellleorizni az uj flash tartalmat!!! ldi R17, (1< Y - to comma ; c= 1 -> end of sentence ; GetNextComma: ld R16,Y+ cpi R16,',' ;Comma? breq GetNextComma0 cpi R16,'*' breq GetNextComma1 ;end of sentence cpi R16,CR breq GetNextComma1 ;end of sentence cpi R16,LF brne GetNextComma GetNextComma1: sec ret GetNextComma0: clc ret ;********************* ; In: R16 - ASCII kod ; Out R16 - UpperCased ASCII MakeUpper: cpi R16,$7b ;<'z' brcc NoNeedConv cpi R16,$61 ;<'a' brcs NoNeedConv CBR R16,32 ;kisbetu -> NAGYBETU konverzio!! NoNeedConv: ret DumpY512: push YL push YH push ZL push ZH ldi R16,32 movw XL,YL TM_CFID0x1: push R16 call DumpRow pop R16 dec R16 brne TM_CFID0x1 pop ZH pop ZL pop YH pop YL ret ;************************** ; In: X - ASCII Ptr ; R0 - byte 0..255 ; ; Out: X - ASCII number + 0 ; PrintByte: ldi R17,100 call Bont ldi R17,10 call Bont mov R16,R0 ori R16,0x30 st X+,R16 clr R16 st X,R16 sbiw XL,3 ret Bont: ser R16 Bont1: inc R16 sub R0,R17 brcc Bont1 add R0,R17 ori R16,0x30 st X+,R16 ret