; ;********************************************************************** ; stdcmd.asm - Standard set of commands for execution by Cmd ;********************************************************************** ; ; created 3/11/98 -jea ; modified 10/17/98 -jea ; ; Functions in this file: ; Null command (CR with no command line text) ; PortD set and read in decimal and hex ; Banked register read and write ; Display a string message on the local terminal ; Display the PICos version ; ; These functions should be used as examples for adding commands to ; the PICos environment. ; ; Functions receive input parameters converted from the cmd line ; according to the format string. All parameters are stored in the ; cmdPrmBuff in the order in which they are entered. Decimal and ; hexadecimal parameters occupy one byte while string parameters are ; terminated with a 0. ; ; Output must be provided in the form of a 0 terminated ascii string. ; This string is returned in the cmdOutBuff output buffer. If the ; first character in this buffer is not 0 it is resubmitted as ; command input. The most common use of this is for the involkation ; of the u1: function to provide output to the user and redraw the ; command line prompt. All ouput strings must have a LF character ; as the last char before the 0 termination to cause the prompt to ; be redisplayed. This buffer is preinitalized by Cmd to contain ; header info to involke u1: with a LF only on return from all ; functions. This causes a new prompt after functions that don't ; generate any output. ; ; The PortD commands are very simple and illustrate the use of both ; the input parameter buffer and the output string generation ; utilities. The source code for the output string generation ; utilities is located in the file "oututil.asm". ; ; Each command must be terminated with a return instruction which ; results in returning from the command processor function Cmd. This ; is due to the fact that Cmd was the last called function. Cmd loads ; the cmd function's address directly into the PC thus causing no ; push onto the stack. ; ;********************************************************************* NullCmd ; CR with no cmd line text ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry data "\r", CmdPC, "Null command (CR_only)\r\n" ; CmdMenu table entry CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; return ; return null result string from Cmd ; ;********************************************************************* ; I/O Port D interface functions ;********************************************************************* SetDDec ; load decimal parameter into port d ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "PORTDD=n\r", CmdPC, "Set portd to a decimal value\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; ; fetch decimal parameter from buffer and copy to port d movlw cmdPrmBuff ; load parameter buffer addr movwf FSR1 ; into FSR1 movlb 1 ; select sfr bank for port d movpf INDF1, PORTD ; output parameter on port d ; fall through to DspDDec ;********************************************************************* DspDDec ; create output string reporting value in portd as a decimal number ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "PORTDD\r", CmdPC, "Display portd in decimal\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; copy first part of output string into output buffer using FSR0 CpyTbl2Out PortdD ; copy port d value into output buffer as a decimal number movlb 1 ; select sfr bank for port d movfp PORTD, WREG ; load port d value into W call Dec2Buf ; convert decimal value into output buffer ; copy last part of output string into same output buffer using FSR0 CpyTbl2Out DcmlD return ; return from Cmd ; This is the end of the functions executable code ; ; These data statements store constant ascii output strings in program ; memory. They're accessed using the CpyTbl2Out macro. PortdD ; constant string for port d display data "\nPortD = ",0 DcmlD ; constant string for decimal display data " decimal\n\r",0 ; ;********************************************************************* SetDHex ; load hexidecimal parameter into port d ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "PORTDX=x\r", CmdPC, "Set portd to a hex value\r\n" data "PORTD=x\r", CmdPC, "Set portd to a hex value\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; ; fetch hexidecimal parameter from buffer and copy to port d movlw cmdPrmBuff ; load parameter buffer addr movwf FSR1 ; into FSR1 movlb 1 ; select sfr bank for port d movpf INDF1, PORTD ; output parameter to port d ; fall through to DspDHex ;********************************************************************* DspDHex ; create output string reporting value in port d as a hex number ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "PORTDX\r", CmdPC, "Display portd in hex\r\n" data "PORTD\r", CmdPC, "Display portd in hex\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; copy first part of output string into output buffer using FSR0 CpyTbl2Out PortdD ; copy port d value into output buffer as a hex number movlb 1 ; select sfr bank for port d movfp PORTD, WREG ; load port d value into W call Hex2Buf ; convert hex value into output buffer ; copy last part of output string into same output buffer using FSR0 CpyTbl2Out HexD return ; return from Cmd ; This is the end of the functions executable code ; ; These data statements store constant ascii output strings in program ; memory. They're accessed using the CpyTbl2Out macro. HexD ; constant string for hex display data " hex\n\r",0 ; ;********************************************************************* RFRead ; read banked register file x:x ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "REGx:x\r", CmdPC, "Read banked register file x:x\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; data memory allocation for banked register read cblock ; declare bank 0 variables saveBSR ; BSR context save variable readVal ; read register value storage endc ; executable code for banked register read movlw cmdPrmBuff ; load addr of parameter buffer movwf FSR1 ; into FSR1, pointing to bank parameter movlw 0x0F ; put mask in W andwf INDF1, W ; mask bank parameter into W movlr high(saveBSR) ; select gpr bank for BSR save movpf BSR, saveBSR ; save current BSR in banked variable movwf BSR ; load bank parameter into BSR incf FSR1 ; point to file address parameter movlw 0x18 ; load address greater than sfr range cpfslt INDF1 ; if file addr is in sfr range then skip swapf BSR ; otherwise move bank value to gpr bits movfp INDF1, FSR0 ; move address parameter into FSR0 movfp INDF0, WREG ; fetch data value into W movlr high(readVal) ; select gpr bank for register storage movwf readVal ; store read value in banked variable ; create output string reporting value of data byte ; copy first part of output string into output buffer using FSR0 CpyTbl2Out RFD ; copy register bank into output buffer as a hexidecimal number decf FSR1 ; point back to bank paramter movlw 0x0F ; put mask in W andwf INDF1, W ; mask bank parameter into W call Hex2Buf ; convert hex value into output buffer ; put a ':' after the bank value (Hex2Buf leaves FSR0 pointing at end) movlw ':' ; load : char movwf INDF0 ; put it into the output string movlr high(cmdOutPtr) ; select cmdOutPtr bank incf cmdOutPtr ; point to next output char location ; copy register address into output buffer as a hexidecimal number incf FSR1 ; point to file address parameter movfp INDF1, WREG ; read register file address into W call Hex2Buf ; convert hex value into output buffer ; copy " = " into same output buffer using FSR0 CpyTbl2Out EqD ; copy register data into output buffer as a hexidecimal number movlr high(readVal) ; select gpr bank for register storage movfp readVal, WREG ; load read value into W call Hex2Buf ; convert hex value into output buffer ; put a LF and CR after the data movlw '\n' ; load LF char movwf INDF0 ; put it into the output string incf FSR0 ; point to next output char location movlw '\r' ; load ascii CR into last location in buff movwf INDF0 ; CR terminates cmd line when resubmited movlr high(saveBSR) ; select gpr bank for saved BSR movfp saveBSR, BSR ; restore original BSR value return ; return from Cmd ; This is the end of the functions executable code ; ; These data statements store constant ascii output strings in program ; memory. They're accessed using the CpyTbl2Buf and CpyTblCont macros ; with the addresses given by the labels. RFD ; constant string for register file display data "\nBanked Register ",0 ; ;********************************************************************* RFWrite ; write an x parameter into banked register file x:x ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "REGx:x=x\r", CmdPC, "Write x at banked register file x:x\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; movlw cmdPrmBuff ; load addr of start of parameter buffer movwf FSR1 ; into FSR1 movlw 0x0F ; put mask in W andwf INDF1, W ; mask bank parameter into W movlr high(saveBSR) ; select gpr bank for BSR save movpf BSR, saveBSR ; save current BSR in banked variable movwf BSR ; load bank parameter into BSR incf FSR1 ; point to file address parameter movlw 0x18 ; load address greater than sfr range cpfslt INDF1 ; if file addr is in sfr range then skip swapf BSR ; otherwise move bank value to gpr bits movfp INDF1, FSR0 ; move address parameter into FSR0 incf FSR1 ; point to register value parameter movfp INDF1, INDF0 ; write data value into register movlr high(saveBSR) ; select gpr bank for saved BSR movfp saveBSR, BSR ; restore original BSR value return ; return null result string from Cmd ; ;********************************************************************* ; USART1 output commands ;********************************************************************* MsgDisp ; Display the message string on USART1 ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "MSG:s\r", CmdPC, "Display message s on USART1\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; movlw cmdPrmBuff ; load parameter buffer addr movwf FSR0 ; into FSR0 bsf ALUSTA, FS0 ; setup FSR0 for auto increment bcf ALUSTA, FS1 ; movlw cmdOutBuff ; load start of output buffer addr movwf FSR1 ; into FSR1 movlw 0x0D ; load CR char movwf INDF1 ; into output buffer incf FSR1 ; point to next location movlw 0x0A ; load LF char movwf INDF1 ; into output buffer NxtOutM incf FSR1 ; point to next location movfp INDF0, INDF1 ; move char from parameter to output tstfsz INDF1 ; skip if last parameter was 0 goto NxtOutM ; copy next char ; 0 has terminated string parameter copy bsf ALUSTA, FS1 ; reset FSR0 to no change ; send string to user terminal on USART1 movlw cmdOutBuff ; load output buffer addr movwf txPtr ; into txPtr call StartTx ; start interrupt based Tx on UART1 btfsc u1Flags, TxRdy ; skip when Tx buffer empty goto $-1 ; until then wait ; load LF and prompt into output buffer movlw cmdOutBuff ; load start of output buffer addr movwf FSR1 ; into FSR1 movlw '\n' ; load ascii LF char into W movwf INDF1 ; overwrite 0 incf FSR1 ; point to next location movpf FSR1, cmdOutPtr ; load current location into ptr CpyTbl2Out PromptD ; concatinate prompt onto string ; send string to user terminal on USART1 movlw cmdOutBuff ; load output buffer addr movwf txPtr ; into txPtr call StartTx ; start interrupt based Tx on UART1 btfsc u1Flags, TxRdy ; skip when Tx buffer empty goto $-1 ; until then wait ; init output buffer to cause u1: to display new prompt after cmd movlw cmdOutBuff ; load start of output buffer movwf FSR1 ; into FSR1 movlw 'u' ; load ascii u movwf INDF1 ; into buffer incf FSR1 ; point to next location movlw '1' ; load ascii 1 movwf INDF1 ; into buffer incf FSR1 ; point to next location movlw ':' ; load ascii : movwf INDF1 ; into buffer incf FSR1 ; point to next location movlw '\n' ; load ascii LF movwf INDF1 ; into buffer movpf FSR1, cmdOutPtr ; save current location in output pointer incf FSR1 ; point to next location movlw '\r' ; load ascii CR into last location in buff movwf INDF1 ; CR terminates cmd line when resubmited return ; return from Cmd ; ;********************************************************************* U1Disp ; command used by all commands to send user output to USART1 ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "U1:s\r", CmdPC, "Transmit s on USART1\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; ; support lcd command output display in here somewhere? ; call Out2LCD ; display function output on LCD movlw cmdPrmBuff ; load parameter buffer addr movwf FSR0 ; into FSR0 bsf ALUSTA, FS0 ; setup FSR0 for auto increment bcf ALUSTA, FS1 ; movlw cmdOutBuff-1 ; load prestart of output buffer addr movwf FSR1 ; into FSR1 NxtOutS incf FSR1 ; point to next location movfp INDF0, INDF1 ; move char from parameter to output tstfsz INDF1 ; skip if last parameter was 0 goto NxtOutS ; copy next char ; 0 has terminated string parameter copy bsf ALUSTA, FS1 ; reset FSR0 to no change decf FSR1 ; backup to char before 0 termination movlw '\n' ; load ascii LF char into W cpfseq INDF1 ; skip if last char was a LF goto TxS ; otherwise send existing string ; last char was a LF, redisplay cmd prompt incf FSR1 ; inc to point at 0 termination movpf FSR1, cmdOutPtr ; load current location into ptr CpyTbl2Out PromptD ; concatinate prompt onto string TxS ; send string to user terminal on USART1 movlw cmdOutBuff ; load output buffer addr movwf txPtr ; into txPtr call StartTx ; start interrupt based Tx on UART1 btfsc u1Flags, TxRdy ; skip when Tx buffer empty goto $-1 ; until then wait clrf cmdOutBuff ; clear first char in cmdOutBuff return ; return from Cmd ; This is the end of the functions executable code ; ; These data statements store constant ascii output strings in program ; memory. They're accessed using the CpyTbl2Buf and CpyTblCont macros ; with the addresses given by the labels. PromptD ; constant string for command line prompt data "\rPICos>",0 ; ;********************************************************************* DspVer ; display the PICos version ;********************************************************************* ; install this command in the CmdMenu lookup table CmdPC = $ ; save current inline assembly PC value org CurCmdMenuAdr ; set assembly PC to addr for new entry ; CmdMenu table entry data "VER\r", CmdPC, "Display PICos version\r\n" CurCmdMenuAdr = $ ; set current CmdMenu addr for next entry org CmdPC ; begin cmd code gen at inline address ; copy first part of output string into output buffer using FSR0 CpyTbl2Out VerD ; copy major version into output buffer movlw high (Version) ; load major rev digit call Dec2Buf ; convert decimal value into output buffer ; put a . between the major and minor rev movlw '.' ; load . char movwf INDF0 ; put it into the output string incf cmdOutPtr ; point to next output char location ; copy minor version into output buffer as a hex number movlw low (Version) ; load minor rev digit call Hex2Buf ; convert hex value into output buffer ; put a LF and CR after the rev movlw '\n' ; load LF char movwf INDF0 ; put it into the output string incf FSR0 ; point to next output char location movlw '\r' ; load ascii CR into last location in buff movwf INDF0 ; CR terminates cmd line when resubmited return ; return from Cmd ; This is the end of the functions executable code ; ; These data statements store constant ascii output strings in program ; memory. They're accessed using the CpyTbl2Out macro. VerD ; constant string for version display data "\nPICos Version ",0 ; end of file stdcmd.asm ******************************************************
file: /Techref/piclist/andrewspicos/stdcmd.htm, 19KB, , updated: 2000/2/17 10:50, local time: 2024/8/14 13:06,
3.145.115.114:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://piclist.com/techref/piclist/andrewspicos/stdcmd.htm"> piclist andrewspicos stdcmd</A> |
Did you find what you needed? |
![]() o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. |
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.