;*************************************************************************** ; ; File Name :'terminal.asm" ; Title :RS-232 Terminal ; Date :2001.12.26. Lastmod.:[2003.02.08.] ; Version :1.0.2 ; Support telephone :+36-70-333-4034 ; Support fax : ; Support Email :info@vfx.hu ; Target MCU : *** ; ;*************************************************************************** ; D E S C R I P T I O N ; ; RS-232 alapu terminal ; ; ;*************************************************************************** ; 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.26 VFX Creation ; 1.00 2003.02.02 VFX Redesign all functions ; ;*************************************************************************** ;Hardware ;*************************************************************************** ;* ;************************************************************************** ;* Const Def .equ CMD_Buffer_Length = 32 .equ Term_EchoHEX_Mode = 0b00000001 ;Terminal loopback mode HEX .equ Term_EchoASCII_Mode = 0b00000010 ;Terminal loopback mode ASCII .equ Term_NoOkMsg = 0b00000100 ;No "Ok." measage .equ Term_Rec_Xmodem = 0b01000000 ;Terminal XMODEM Receive mode ;*************************************************************************** .DSEG CMD_Len: .byte 1 ;a CMD aktualis hossza CMD_Pos: .byte 1 ;Curzor pozicio a CMD stringen belul CMD_Data: .byte CMD_Buffer_Length ;CMD buffer 'string' Term_Stat: .byte 1 ;Terminal status ;************************************************************************* ;* Text Const ;* .CSEG Term_Init: clr R16 ;normal Terminal munkodes sts CMD_Len,R16 sts CMD_Pos,R16 sts Term_Stat,R16 ret ;*********************************************** ; Terminal, Main Terminal: Term01: rcall Rs232GetByte brcs Term1 ret Term1: lds R17,Term_Stat andi R17,Term_EchoHEX_Mode ;TEST mode brne Term1_EchoHex lds R17,Term_Stat andi R17,Term_EchoASCII_Mode breq Term1_2 Term1_EchoASCII: mov R16,R0 ;itt echo modban vagyunk R0-t egybol kuldjuk vissza cpi R16,0x1B breq term1_01 ;ESC | CAN kilepes cpi R16,CAN brne term1_02 term1_01: lds R17,Term_Stat andi R17,255-Term_EchoASCII_Mode sts Term_Stat,R17 rjmp Terminal term1_02: rcall SendChrW rjmp Terminal Term1_EchoHex: mov R16,R0 ;itt echo modban vagyunk R0-t egybol kuldjuk vissza cpi R16,0x1B breq term1_03 ;ESC kilepes cpi R16,CAN brne term1_04 term1_03: lds R17,Term_Stat andi R17,255-Term_EchoHEX_Mode sts Term_Stat,R17 rjmp Terminal term1_04: rcall HEXtoUART ldi R16,32 rcall SendChrW rjmp Terminal Term1_2: mov R16,R0 ;Normal terminal mode cpi R16,$7b ;<'z' brcc Term2 cpi R16,$61 ;<'a' brcs Term2 CBR R16,32 ;kisbetu -> NAGYBETU konverzio!! Term2: mov R0,R16 ;csak nagybetu jo!!!!! cpi R16,CR ;Enter? breq Term3 ;IGEN -> Parancsfeldolgozas cpi R16,LF ;Line feed? breq Term31 cpi R16,BS ;BackSpace? breq CMDDelChar rcall PutCharToCMD brcc Terminal rcall CMDTooLong ;Command to long! sec rjmp CMDExit Term3: rcall PutCharToCMD brcc CMDProc1 rcall CMDTooLong ;Command to long! sec rjmp CMDExit Term31: ;LF volt lds R16,CMD_Pos ;Command Line Curs Pos cpi R16,0 ldi R16,CR mov R0,R16 brne Term3 ;ha nem ures, akkor kicsereljuk CR-re rjmp Terminal CMDProc1: rjmp CMDProcess ;Command line Process CMDDelChar: ;Charakter torles ;ne ez meg nincs megirva lds R16,CMD_Pos ;Command Line Curs Pos cpi R16,0 breq CMDDelC01 dec R16 sts CMD_Pos,R16 lds R17,CMD_Len ;Command Line Lenght dec R17 sts CMD_Len,R17 CMDDelC01: rjmp Terminal ;****************************** ;* Put char to CMD buffer ;* In: R0 - char ;* Out c=1 no more space PutCharToCMD: ldi ZL,Low(CMD_Data) ldi ZH,High(CMD_Data) clr R1 lds R16,CMD_Pos ;Command Line Curs Pos lds R17,CMD_Len ;Command Line Lenght cpi R17,CMD_Buffer_Length brsh P_err ;Pos>=CMD_Buffer_Length, nincs tobb hely cp R16,R17 brne OverWrite ;Ha pos<>Len, akkor feluliras! add ZL,R17 adc ZH,R1 inc R17 rjmp WriteCMD OverWrite: add ZL,R16 adc ZH,R1 WriteCMD: st Z,R0 sts CMD_Len,R17 inc R16 sts CMD_Pos,R16 ;uj pozicio eltarolasa clc ;nincs hiba sima tarolas volt ret P_err: sec ;hiba tarolas nincs ret CMDProcess: ldi XL,Low(CMD_Data) ldi XH,High(CMD_Data) ldi ZL,Low(Tm_Commands*2) ldi ZH,High(Tm_Commands*2) ;Parancstablazat cime ; ldi R16,(Tm_Commands/32768) ;Low/High part of FLASH ; out RAMPZ,R16 LeaderZero: rcall ESCSpace cpi R16,LF breq LeaderZero ;Line feed is kimarad sbiw XL,1 mov R4,XL mov R5,XH ;elmentjuk az elso ertekes karakter cimet nextCMD: lpm R0,Z+ tst R0 ;lehivjuk a tabla kovetkezo lelemet brne VanMegCMD ;ha 0, akkor nincs ilyen parancs rjmp CMDUnk ;ismeretlen parancs hibauzenet VanMegCMD: ld R16,X+ ;parancs kovetkezo karaktere cp R16,R0 brne Nemstimmel lpm R0,Z+ ;kovetkezo karakter a sztringben tst R0 brne VanMegCMD ;PARANCS megvan!!! adiw ZL,1 ;tablaban a szoveg vegere ertunk andi ZL,254 ;tehat jo a parancs lpm R0,Z+ ;Z-t eltoljuk a vegrehajto rutin cimehez push R0 lpm push R0 ;STACKban vegrehajto rutin cime mov ZL,XL mov ZH,XH ;Z reg a parancs tobbi resze ret ;Ugras a vegrehajto reszre Nemstimmel: mov XL,R4 ;itt kell eldonteni miert nem stimmel mov XH,R5 ;pointer visszaallitasa SrchStr: lpm R0,Z+ ;megkeressuk a sztring veget tst R0 brne SrchStr adiw ZL,1 andi ZL,254 ;csak a paros cim jo adiw ZL,2 ;kovetkezo sztring elejere allunk rjmp nextCMD CMDUnk: rcall CMDUnknown sec rjmp CMDExit SyntErr: rcall SyntaxErr sec rjmp CMDExit CMDOK: lds R16,Term_Stat andi R16,Term_NoOkMsg brne CMDDone rcall CMDOkMsg CMDDone: clc CMDExit: clr R16 sts CMD_Len,R16 sts CMD_Pos,R16 ;alaphelyzet ret ;****************************************** ;** E R R O R S ;******************************************* ;****************************************** ; Command Too Long massege CMDTooLong: ldi R16,Low(LongCMD) ldi R17,High(LongCMD) rjmp SendError ;****************************************** ; Command Too Long massege CMDUnknown: ldi R16,Low(UnknownCMD) ldi R17,High(UnknownCMD) rjmp SendError ;****************************************** ; Syntax Error massege SyntaxErr: ldi R16,Low(StxErr) ldi R17,High(StxErr) rjmp SendError CMDOkMsg: ldi R16,Low(CMDAck) ldi R17,High(CMDAck) rjmp SendMSG SendError: push R16 push R17 ldi R16,Low(Errx) ldi R17,High(Errx) rcall SendStrW pop R17 pop R16 SendMSG: rcall SendStrW ret ;******************************************************** ; TERMINAL PARANCSOK VEGREHAJTASA ;******************************************************** ;**************************************** ;** TERMINAL HELP ;** ; Tm_Help: rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr ldi R16,Low(HelpStr) ldi R17,High(HelpStr) rcall SendStrW rjmp CMDDone SyntErr1: rjmp SyntErr ;************************************* ;* Update User FLASH Tm_Upgrade: rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr1 cli rjmp 0x0C00 ;M88-on ettol updatelnie kell ;*********************************** TM_CCFL: rcall GetHexDigit brcs SyntErr1 tst R0 brne CCFLOn cbi InvPow_PORT,InvPow ;Inverter On rjmp CCFLDone CCFLOn: sbi InvPow_PORT,InvPow ;Inverter Off CCFLDone: ldi R16,CR rcall SendChrW rjmp CMDOk SyntErr7: rjmp SyntErr TM_PEEK: rcall Get2Digit brcs SyntErr7 mov R3,R0 rcall Get2Digit brcs SyntErr7 mov R2,R0 ;R3:R2 = Offset rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr7 mov XL,R2 mov XH,R3 ld R0,X rcall BinToUART ldi R16,CR rcall SendChrW rjmp CMDDone ;************************************************** TM_Poke: rcall Get4Digit brcs SyntErr9 movw R2,R2 ;R3:R2 - address rcall ESCSpace ;SPACE kihagy cpi R16,',' brne SyntErr9 rcall Get2Digit brcs SyntErr9 mov R4,R0 ;R4- data rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr9 movw ZL,R2 st Z,R4 rjmp CMDOk SyntErr9: rjmp SyntErr ;************************************************ TM_Echo: rcall ESCSpace ;SPACE kihagy cpi R16,CR breq EchoHex cpi R16,65 ;'A'? brne SyntErr9 rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr9 EchAscii: lds R16,Term_Stat ori R16,Term_EchoASCII_Mode ;Echo ASCII rjmp EchoC EchoHex: lds R16,Term_Stat ori R16,Term_EchoHEX_Mode ;Echo Hex modban EchoC: sts Term_Stat,R16 rjmp CMDOk ;************************************************ TM_TMOK: rcall GetHexDigit brcs SyntErr9 rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr9 lds R16,Term_Stat andi R16,255-Term_NoOkMsg tst R0 breq TM_TMOK0 ori R16,Term_NoOkMsg TM_TMOK0: sts Term_Stat,R16 rjmp CMDOk ;************************************************ TM_USR: rcall Get4Digit ;R3:R2 - address brcs SyntErr9 rcall ESCSpace ;SPACE kihagy cpi R16,CR brne SyntErr9 movw ZL,R2 icall rjmp CMDOk ;--------------------------------------------------------------------------- Ready: .DB "Ready>>",0 CMDAck: .DB "Ok.",CR,0,0 Errx: .DB "Error:",0,0 LongCMD: .DB " Command too long",CR,0,0 UnknownCMD: .DB " Unknown Command",CR,0 StxErr: .DB " Syntax Error",CR,0,0 ;Terminal parancsok ; "parancs",0,address ; a tabla elso eleme mindig az ures parancs legyen ures sor+ENTER Tm_Commands: .db CR,0,low(CMDOK),high(CMDOK) .db "HELP",0,0,low(Tm_Help),high(Tm_Help) .db "H",0,low(Tm_Help),high(Tm_Help) .db "UPDATE",0,0,low(Tm_Upgrade),high(Tm_Upgrade) .db "CCFL",0,0,low(TM_CCFL),high(TM_CCFL) .db "PEEK",0,0,low(TM_PEEK), high(TM_PEEK) .db "POKE",0,0,low(TM_Poke), high(TM_Poke) .db "ECHO",0,0,low(TM_Echo),high(TM_Echo) .db "TERMOK",0,0,low(TM_TMOK),high(TM_TMOK) .db "USR",0,low(TM_USR),high(TM_USR) .dw 0 HelpStr: .db "VFX - Service Terminal Help ",CR .db "H vagy HELP - ezt a helpet adja",CR .db "UPDATE - FLASH frissites ",CR .db "CCFL x - CCFL ON/OFF ",CR .db "PEEK xxxx - A SRAM xxxx cim tartalmat irja ki",CR .db "POKE xxxx,yy - xxxx cimre beirja yy erteket",CR .db "ECHO A - minden kapott karaktert HEX,ASCII alakban visszakuld",CR .db "TERMOK x - x=1 Terminal nem kuld 'OK' nyugtat",CR .db "USR xxxx - call xxxx ",CR .db "H vagy HELP - ezt a helpet adja",CR .dw 0