summaryrefslogtreecommitdiff
path: root/bootloader/bootloader.asm
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/bootloader.asm')
-rw-r--r--bootloader/bootloader.asm106
1 files changed, 74 insertions, 32 deletions
diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm
index 87ee0f6..02b9105 100644
--- a/bootloader/bootloader.asm
+++ b/bootloader/bootloader.asm
@@ -51,6 +51,7 @@ E_NOT_IMPL EQU .3
E_FLASH_WERR EQU .4
E_ADDR_INVALID EQU .5
E_ADDR_PROHIB EQU .6
+E_VALUE_OOB EQU .7
;; CMD codes
CCMD_IDENTIFY EQU 'i'
@@ -83,13 +84,15 @@ CMD_W_CONFIG EQU .8
CMD_INVALID EQU H'FF'
;; Variables
-inbuff EQU H'0020'
-inbuff_end EQU H'006F'
+combuff EQU H'0020'
+combuff_end EQU H'006F'
current_cmd EQU H'0070'
current_cmdlen EQU H'0071'
csum EQU H'0072'
-ret EQU H'0073'
+
+flags EQU H'007D'
+weep EQU .0
cnt2 EQU H'007E'
cnt1 EQU H'007F'
@@ -116,13 +119,18 @@ uart_tx_byte
xorwf csum,f
return
-ack_cmd
- movwf ret
+send_answer
+ movwf cnt1
+ movlw combuff
+ movwf FSR
clrf csum
- movf inbuff,w
- call uart_tx_byte
- movf ret,w
+send_answer_next
+ movf INDF,w
call uart_tx_byte
+ incf FSR,f
+ decfsz cnt1,f
+ goto send_answer_next
+
movf csum,w
call uart_tx_byte
return
@@ -149,12 +157,12 @@ translate_cmd_codes
xorlw CCMD_W_EEPROM ^ CCMD_R_EEPROM
btfsc STATUS,Z
retlw CMD_W_EEPROM
- ;; xorlw CCMD_R_CONFIG ^ CCMD_W_EEPROM
- ;; btfsc STATUS,Z
- ;; retlw CMD_R_CONFIG
- ;; xorlw CCMD_W_CONFIG ^ CCMD_R_CONFIG
- ;; btfsc STATUS,Z
- ;; retlw CMD_W_CONFIG
+ xorlw CCMD_R_CONFIG ^ CCMD_W_EEPROM
+ btfsc STATUS,Z
+ retlw CMD_R_CONFIG
+ xorlw CCMD_W_CONFIG ^ CCMD_R_CONFIG
+ btfsc STATUS,Z
+ retlw CMD_W_CONFIG
retlw CMD_INVALID
get_cmdlen
@@ -166,8 +174,8 @@ get_cmdlen
retlw .3 + .2*FSS ; write flash: addr | data | <csum>
retlw .5 ; read eeprom: addr | len | <csum>
retlw .5 ; write eeprom: addr | len | data | <csum> (minimal)
- ;; retlw .2 ; read config: nr | <csum>
- ;; retlw .4 ; write config: nr | word | <csum>
+ retlw .2 ; read config: nr | <csum>
+ retlw .4 ; write config: nr | word | <csum>
get_name
addwf PCL,f
@@ -204,22 +212,18 @@ boot
movwf SPBRG
clrf SPBRGH
- bcf TRISD,0 ; DEBUG!!!!
-
;; bank 0
bcf STATUS,RP0
movlw b'10010000' ; enable Serial Port, 8bit, enable continues receive, disable address detection
movwf RCSTA
- bsf PORTD,0 ; DEBUG!!!!
- ;; INIT Finished
-
wait_new_cmd
- movlw inbuff
+ movlw combuff
movwf FSR
movlw CMD_INVALID
movwf current_cmd
clrf current_cmdlen
+ clrf flags
wait_cmd
btfsc PIR1,RCIF
@@ -263,10 +267,14 @@ new_cmd ; got new command code
invalid_cmd ; received command code is not known
movlw E_INV_CMD
- call ack_cmd
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto wait_new_cmd
exec_cmd ; command is correct and complete
+ ;; TODO: check csum -> csum for write eeprom will not be correct because
+ ;; it isn't finished yet....???
movf current_cmd,w ; dispatch commands
addwf PCL,f
goto cmd_identify
@@ -276,8 +284,8 @@ exec_cmd ; command is correct and complete
goto cmd_w_flash
goto cmd_r_eeprom
goto cmd_w_eeprom
- ;; goto cmd_r_config
- ;; goto cmd_w_config
+ goto cmd_r_config
+ goto cmd_w_config
goto wait_new_cmd
;; ** Command Handlers ********************
@@ -329,13 +337,17 @@ cmd_identify_send_name
;; ** boot *******
cmd_boot
movlw E_OK
- call ack_cmd
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto USERVECT
;; ** reset *******
cmd_reset
movlw E_OK
- call ack_cmd
+ movwf combuff + .1
+ movlw .2
+ call send_answer
movlw b'00000001'
movwf WDTCON ; why does this not work?????
cmd_reset_wait
@@ -343,26 +355,56 @@ cmd_reset_wait
;; ** read flash *******
cmd_r_flash
+ ;; call read_flash_segment
+ movlw E_ADDR_INVALID
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto wait_new_cmd
;; ** write flash *******
cmd_w_flash
+ ;; call write_flash_segment
+ movlw E_ADDR_INVALID
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto wait_new_cmd
;; ** read eeprom *******
cmd_r_eeprom
+ ;; call read_eeprom
+ movlw E_ADDR_INVALID
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto wait_new_cmd
;; ** write eeprom *******
cmd_w_eeprom
- ;; depending on <len> the command may actually not be complete
+ btfss flags,weep
+ goto cmd_w_eeprom_len
+ ;; call write_eeprom
+ movlw E_ADDR_INVALID
+ movwf combuff + .1
+ movlw .2
+ call send_answer
goto wait_new_cmd
-;; cmd_r_config
-;; goto wait_new_cmd
+cmd_w_eeprom_len
+ movf combuff + .3,w
+ movwf current_cmdlen
+ bsf flags,weep
+ goto wait_cmd
-;; cmd_w_config
-;; goto wait_new_cmd
+ ;; ** not implemented commands *******
+cmd_r_config
+cmd_w_config
+ movlw E_NOT_IMPL
+ movwf combuff + .1
+ movlw .2
+ call send_answer
+ goto wait_new_cmd
;; -------------------------------------
;; dummy user code