summaryrefslogtreecommitdiff
path: root/bootloader/generic-mainloop.inc
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/generic-mainloop.inc')
-rw-r--r--bootloader/generic-mainloop.inc174
1 files changed, 174 insertions, 0 deletions
diff --git a/bootloader/generic-mainloop.inc b/bootloader/generic-mainloop.inc
new file mode 100644
index 0000000..1e93648
--- /dev/null
+++ b/bootloader/generic-mainloop.inc
@@ -0,0 +1,174 @@
+ ;;
+ ;; spreadspace pic utils
+ ;;
+ ;;
+ ;; Copyright (C) 2011 Christian Pointner <equinox@spreadspace.org>
+ ;;
+ ;; 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 <http://www.gnu.org/licenses/>.
+ ;;
+
+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 .19
+ 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 SUPPORTED_L
+ call com_tx_byte
+ movlw SUPPORTED_H
+ 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