;; ;; spreadspace pic utils ;; ;; ;; Copyright (C) 2011-2013 Christian Pointner ;; ;; This file is part of spreadspace pic utils. ;; ;; spreadspace pic utils is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; any later version. ;; ;; spreadspace pic utils is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with spreadspace pic utils. If not, see . ;; wait_new_cmd movlw combuff movwf FSR clrf combuff clrf current_cmdlen clrf flags wait_cmd call com_rx_byte movwf INDF ; process received byte incf FSR,f btfss F_CMD_STARTED goto wait_cmd_len movf current_cmdlen,f btfsc STATUS,Z goto new_cmd decfsz current_cmdlen,f goto wait_cmd goto exec_cmd wait_cmd_len ; command code received, now wait for length bsf F_CMD_STARTED goto wait_cmd new_cmd ; got new command code and length -> check it movf combuff,w sublw CMD_MAX btfss STATUS,C goto invalid_cmd movlw CMD_MIN_LEN ; check for minimum command len subwf combuff + .1,w btfss STATUS,C goto invalid_cmd movlw .2 ; 2 bytes already received subwf combuff + .1,w movwf current_cmdlen goto wait_cmd exec_cmd ; command is complete -> check csum movlw combuff movwf FSR movf combuff + .1,w movwf cnt clrf csum exec_cmd_check_csum movf INDF,w xorwf csum,f incf FSR,f decfsz cnt,f goto exec_cmd_check_csum movf csum,f btfss STATUS,Z goto csum_error movf combuff,w ; command is correct and complete -> dispatch addwf PCL,f goto wait_new_cmd goto cmd_identify ; identify goto cmd_boot ; boot goto HOOK_CMD_RESET ; reset goto HOOK_CMD_R_FLASH ; read flash segment goto HOOK_CMD_W_FLASH ; write flash segment goto HOOK_CMD_R_EEPROM ; read eeprom goto HOOK_CMD_W_EEPROM ; write eeprom goto HOOK_CMD_R_CONFIG ; read config goto HOOK_CMD_R_CONFIG ; write config ;; ** generic error messages ******* invalid_cmd ; received command code is not known or len is bogus movlw E_INV_CMD call ack_cmd goto wait_new_cmd csum_error ; received command has an invalid check sum movlw E_BAD_CSUM call ack_cmd goto wait_new_cmd address_invalid ; received command uses invalid address (i.e. not aligned to 16bytes) movlw E_ADDR_INVALID call ack_cmd goto wait_new_cmd address_prohibited ; received command uses prohibited address (i.e. FLASH < 0x100) movlw E_ADDR_PROHIB call ack_cmd goto wait_new_cmd ;; ** generic command handlers ************ ;; ** identify ******* cmd_identify clrf csum movf combuff,w call com_tx_byte movlw .18 call com_tx_byte movlw E_OK call com_tx_byte movlw VERSION_MIN call com_tx_byte movlw VERSION_MAJ call com_tx_byte movlw NAME_0 call com_tx_byte movlw NAME_1 call com_tx_byte movlw NAME_2 call com_tx_byte movlw DEVID_L call com_tx_byte movlw DEVID_H call com_tx_byte movlw FLASH_SIZE_L call com_tx_byte movlw FLASH_SIZE_H call com_tx_byte movlw FSS call com_tx_byte movlw EEPROM_SIZE_L call com_tx_byte movlw EEPROM_SIZE_H call com_tx_byte movlw MESS call com_tx_byte movlw CFG call com_tx_byte movf csum,w call com_tx_byte goto wait_new_cmd ;; ** boot ******* cmd_boot movlw E_OK call ack_cmd goto USERVECT ;; ** not implemented commands ******* cmd_not_impl movlw E_NOT_IMPL call ack_cmd goto wait_new_cmd