Mercurial > public > hwos_code
view src/comm.asm @ 348:fca4f9de5f4a
[FIX] GasVolume: missing gas changes w/o stops.
author | jDG |
---|---|
date | Wed, 15 Jul 2015 17:57:37 +0200 |
parents | 7e5772df60cd |
children | 2fd258596af0 |
line wrap: on
line source
;============================================================================= ; ; File comm.asm ; ; RS232 via USB ; ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY ; 2011-08-22 : [mH] Creation ; 2012-02-11 : [jDG] Added "c" set custom text, and "i" identify. #include "hwos.inc" #include "eeprom_rs232.inc" #include "tft.inc" #include "wait.inc" #include "strings.inc" #include "convert.inc" #include "external_flash.inc" #include "tft_outputs.inc" #include "surfmode.inc" #include "rtc.inc" #include "adc_lightsensor.inc" #include "shared_definitions.h" extern new_battery_menu,restart,option_reset_all extern option_check_all, gaslist_cleanup_list, get_first_gas_to_WREG, get_first_dil_to_WREG extern vault_decodata_into_eeprom #DEFINE timeout_comm_pre_mode .120 ; Pre-loop #DEFINE timeout_comm_mode .120 ; Download mode #DEFINE timeout_service_mode .120 ; Service mode #DEFINE comm_title_row .0 #DEFINE comm_title_column_usb .50 #DEFINE comm_title_column_ble .25 #DEFINE comm_string_row .30 #DEFINE comm_string_column .40 #DEFINE comm_status1_row .70 #DEFINE comm_status1_column .10 #DEFINE comm_status2_row .100 #DEFINE comm_status2_column comm_status1_column #DEFINE comm_status3_row .130 #DEFINE comm_status3_column comm_status1_column #DEFINE comm_warning_row .160 #DEFINE comm_warning_column .65 comm code ; test for comm global comm_mode, comm_mode0 comm_mode: WAITMS d'1' btfss vusb_in ; USB plugged in? return ; No, it was only a glitch WAITMS d'1' btfss vusb_in ; USB plugged in? return ; No, it was only a glitch comm_mode0: call TFT_ClearScreen WIN_COLOR color_greenish btfsc ble_available ; ble available bra comm_mode0_ble WIN_SMALL comm_title_column_usb, comm_title_row STRCPY_TEXT_PRINT tUsbTitle ; USB Mode bra comm_mode0_common comm_mode0_ble: WIN_SMALL comm_title_column_ble, comm_title_row STRCPY_TEXT_PRINT tBleTitle ; BLE Mode comm_mode0_common: call TFT_standard_color WIN_TOP .10 WIN_LEFT .1 movlw 0xDE movwf TBLPTRL movlw 0xEE movwf TBLPTRH movlw 0x01 movwf TBLPTRU extern color_image call color_image ; Show usb logo WIN_SMALL comm_status1_column, comm_status1_row STRCPY_TEXT_PRINT tUsbStarting ; Starting... call TFT_serial ; Show serial and firmware version bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) bcf switch_right bcf comm_service_enabled bsf menubit bcf battery_removed_in_usb ; =1: The battery has been removed in USB movlw timeout_comm_pre_mode movwf timeout_counter WIN_SMALL comm_status1_column+.80, comm_status1_row STRCPY_TEXT_PRINT tUsbStartDone ; Done... call enable_rs232 ; Also sets to speed_normal ... comm_mode1: bcf onesecupdate bcf LEDr dcfsnz timeout_counter,F bra comm_service_exit ; Timeout -> Exit comm_mode2: btfsc rechargeable bra comm_mode4 ; Skip call get_battery_voltage ; gets battery voltage movlw .3 cpfslt batt_voltage+1 ; Batt Voltage less then 3*256mV? bra comm_mode3 ; No ; Set flag bsf battery_removed_in_usb ; =1: The battery has been removed in USB bra comm_mode4 comm_mode3: ; Voltage ok. Do we have a new battery now? btfsc battery_removed_in_usb ; =1: The battery has been removed in USB goto new_battery_menu ; show "New battery dialog" comm_mode4: call rs232_get_byte btfss vusb_in ; USB plugged in? bra comm_service_exit_nousb_delay ; Disconnected -> Exit comm_mode4a: btfsc switch_right ; Abort with right bra comm_service_exit btfsc onesecupdate bra comm_mode1 movlw 0xAA ; start byte=0xAA? cpfseq RCREG1 bra comm_mode2a bra comm_mode2b ; Startbyte for service mode found comm_mode2a: movlw 0xBB ; start byte=0xBB? cpfseq RCREG1 bra comm_mode2 ; Cycle bra comm_download_mode ; Startbyte for download mode found comm_mode2b: ; Startbyte found call rs232_wait_tx ; Wait for UART movlw 0x4B movwf TXREG1 ; Send Answer ; Now, check comm command call rs232_get_byte ; first byte call rs232_wait_tx ; Wait for UART movff RCREG1,TXREG1 ; Echo movlw UPPER comm_service_key cpfseq RCREG1 bra comm_mode1 ; Wrong -> Restart call rs232_get_byte ; second byte call rs232_wait_tx ; Wait for UART movff RCREG1,TXREG1 ; Echo movlw HIGH (comm_service_key & 0xFFFF) cpfseq RCREG1 bra comm_mode1 ; Wrong -> Restart call rs232_get_byte ; third byte call rs232_wait_tx ; Wait for UART movff RCREG1,TXREG1 ; Echo movlw LOW comm_service_key cpfseq RCREG1 bra comm_mode1 ; Wrong -> Restart ; Enable comm service mode WIN_SMALL comm_status2_column, comm_status2_row STRCPY_TEXT_PRINT tUsbServiceMode ; Service mode enabled bsf comm_service_enabled bra comm_download_mode0 ; Startbyte for download mode found comm_service_exit_nousb_delay: WAITMS d'200' btfss vusb_in ; USB plugged in? bra comm_service_exit_nousb ; Disconnected -> Exit bra comm_mode4a ; (Still) connected, return comm_service_exit_nousb: ; Disconnected -> Exit WIN_SMALL comm_status3_column, comm_status3_row STRCPY_TEXT_PRINT tUsbClosed ; Port closed bra comm_service_exit_common comm_service_exit: WIN_SMALL comm_status3_column, comm_status3_row STRCPY_TEXT_PRINT tUsbExit ; Exited comm_service_exit_common: call rs232_wait_tx ; Wait for UART movlw 0xFF ; Reply FF movwf TXREG1 ; Send Answer ; Wait 1 second bcf onesecupdate btfss onesecupdate bra $-2 ; Wait 1 second bcf onesecupdate btfss onesecupdate bra $-2 call disable_rs232 goto restart ;----------------------------------------------------------------------------- comm_service_ll_bootloader: bsf LEDr WIN_SMALL comm_status3_column, comm_status3_row STRCPY_TEXT_PRINT tUsbLlBld ; Low Level Bootloader started WIN_TOP comm_warning_row WIN_LEFT comm_warning_column TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon goto 0x1FF0C ;----------------------------------------------------------------------------- ; send firmware to bootloader ; comm_send_firmware: movlw 0x50 ; send echo movwf TXREG1 call rs232_wait_tx ; Wait for UART ; Read 5 bytes into buffer. lfsr FSR2,buffer movlw .5 ; counter movwf lo movlw 0x55 ; 5'ft byte checksum. movwf hi comm_send_firmware_loop: call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_send_firmware_abort ; No, abort! movf RCREG1,W movwf POSTINC2 ; Store checksum byte. xorwf hi,F ; Also xor into checksum rlncf hi,F ; And rotate it. decfsz lo,F bra comm_send_firmware_loop ; Check that 5ft byte checksum's checksum movf hi,W bnz comm_send_firmware_failed movlw 0x4C ; send OK movwf TXREG1 call rs232_wait_tx ; Wait for UART ; Passed: goto second stage verification. ; NOTE: Bootloader is Bank0. With buffer at address 0x200. call vault_decodata_into_eeprom ; Store last deco data (And Time/Date) into EEPROM goto 0x1FDF0 ; And pray... comm_send_firmware_failed: WIN_SMALL comm_string_column, comm_string_row call TFT_warnings_color STRCPY_PRINT "Checksum failed" comm_send_firmware_abort: movlw 0xFF ; send ABORTED byte. movwf TXREG1 bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- ; Reset to Dive 1 in logbook comm_reset_logbook_pointers: clrf EEADRH ; Make sure to select eeprom bank 0 clrf EEDATA write_int_eeprom .4 write_int_eeprom .5 write_int_eeprom .6 write_int_eeprom .2 ; Also, delete total dive counter write_int_eeprom .3 write_int_eeprom .15 write_int_eeprom .16 ; And the backup counter, too call ext_flash_erase_logbook ; And complete logbook (!) bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- comm_reset_battery_gauge: ; Resets battery gauge registers call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- ; erases range in 4kB steps comm_erase_range4kb: movlw 0x42 ; send echo movwf TXREG1 call rs232_wait_tx ; Wait for UART bcf INTCON,GIE ; All interrups off! rcall comm_get_flash_address ; Get three bytes address or return btfsc rs232_recieve_overflow ; Got Data? bra comm_download_mode0 ; No, Done. call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, Done. movff RCREG1,lo ; Got 4bytes: 3bytes address and 1 bytes (lo) amount of 4kB blocks comm_erase_range4kb1: call ext_flash_erase4kB ; Erase block! movlw 0x10 addwf ext_flash_address+1,F movlw .0 addwfc ext_flash_address+2,F ; Increase address by .4096, or 0x1000 decfsz lo,F bra comm_erase_range4kb1 ; Loop until lo=zero bra comm_download_mode0 ; Done (Sends the 4C OK too). ;----------------------------------------------------------------------------- comm_erase_4kb: ; Get 3 bytes start address bcf INTCON,GIE ; All interrups off! rcall comm_get_flash_address ; Get three bytes address or return btfsc rs232_recieve_overflow ; Got Data? bra comm_download_mode0 ; No, Done. call ext_flash_erase4kB ; Erase one block bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- comm_write_range: ; Get 3 bytes start address movlw 0x30 ; send echo movwf TXREG1 call rs232_wait_tx ; Wait for UART bcf INTCON,GIE ; All interrups off! rcall comm_get_flash_address ; Get three bytes address or return btfsc rs232_recieve_overflow ; Got Data? bra comm_download_mode0 ; No, Done. comm_write_range_loop: call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, Done (and send OK byte too). movf RCREG1,W call ext_flash_byte_write ; write one byte call incf_ext_flash_address_p1 ; increase address+1 bra comm_write_range_loop ;----------------------------------------------------------------------------- comm_send_range: ; Get 3 bytes start address and 3 bytes amount movlw 0x20 ; send echo movwf TXREG1 call rs232_wait_tx ; Wait for UART bcf INTCON,GIE ; All interrups off! rcall comm_get_flash_address ; Get three bytes address or return btfsc rs232_recieve_overflow ; Got Data? bra comm_download_mode0 ; No, Done. call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, Done. movff RCREG1,up call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, Done. movff RCREG1,hi call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, Done. movff RCREG1,lo ; If lo==0, we must precondition hi because there is to many bytes send ! movf lo,W bnz $+4 decf hi,F movlw 0x40 cpfslt up ; Abort when up > 0x3F bra comm_download_mode0 ; Abort ; 6bytes received, send data ; needs ext_flash_address:3 start address and up:hi:lo amount call ext_flash_read_block_start movwf TXREG1 bra comm_send_range24 ; counter 24bit comm_send_range24_loop: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_range24: call rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_range24_loop decf hi,F movlw 0xFF cpfseq hi bra comm_send_range24_loop decf up,F movlw 0xFF cpfseq up bra comm_send_range24_loop call ext_flash_read_block_stop bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- comm_get_flash_address: call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+2 call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+1 call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+0 return ;----------------------------------------------------------------------------- comm_download_mode: ; Enable comm download mode WIN_SMALL comm_status2_column, comm_status2_row STRCPY_TEXT_PRINT tUsbDownloadMode; Download mode enabled bsf INTCON,GIE ; All interrups on call rs232_wait_tx ; Wait for UART movlw 0xBB ; Command Echo movwf TXREG1 ; Send Answer comm_download_mode0: bsf INTCON,GIE ; All interrups on call rs232_wait_tx ; Wait for UART movlw 0x4C ; 4C in service mode btfss comm_service_enabled movlw 0x4D ; 4D in download mode movwf TXREG1 ; Send Answer movlw timeout_service_mode movwf timeout_counter ; Timeout bcf switch_right comm_download_mode1: bcf onesecupdate dcfsnz timeout_counter,F bra comm_service_exit ; Timeout -> Exit comm_download_mode2: call rs232_get_byte ; Check for a byte btfsc comm_service_enabled btg LEDr ; Blink in Service mode btfss vusb_in ; USB plugged in? bra comm_service_exit_nousb ; Disconnected -> Exit btfsc switch_right ; Abort with right bra comm_service_exit btfsc onesecupdate bra comm_download_mode1 btfsc rs232_recieve_overflow bra comm_download_mode2 ; Wait for command byte ; command received! bcf LEDr movlw 0xFF cpfseq RCREG1 bra $+4 bra comm_service_exit ; exit movlw "a" cpfseq RCREG1 bra $+4 bra comm_send_headers ; Send all 256 dive headers movlw "b" cpfseq RCREG1 bra $+4 bra comm_set_time ; Read time and date from the PC and set clock movlw "c" cpfseq RCREG1 bra $+4 bra comm_set_custom_text ; Send a opt_name_length byte string of custom text. movlw "f" cpfseq RCREG1 bra $+4 bra comm_send_dive ; Send header and profile for one dive movlw "i" cpfseq RCREG1 bra $+4 bra comm_identify ; Send firmware, serial, etc. movlw "j" cpfseq RCREG1 bra $+4 bra comm_hardware_descriptor ; Send hardware descriptor byte movlw "n" cpfseq RCREG1 bra $+4 goto comm_send_string ; Send a 15byte string to the screen movlw "m" cpfseq RCREG1 bra $+4 goto comm_send_compact_headers ; Send all 256 compact headers movlw "l" cpfseq RCREG1 bra $+4 call TFT_dump_screen ; Dump the screen contents movlw "r" cpfseq RCREG1 bra $+4 bra comm_read_setting ; Read a setting (And send via USB) movlw "w" cpfseq RCREG1 bra $+4 bra comm_write_setting ; Write a setting (Into RAM) movlw "x" cpfseq RCREG1 bra $+4 bra comm_option_reset_all ; Reset all options to factory default. btfss comm_service_enabled ; Done for Download mode bra comm_download_mode0 ; Loop with timeout reset movlw 0x20 cpfseq RCREG1 bra $+4 bra comm_send_range ; send hi:lo:temp1 bytes starting from ext_flash_address:3 movlw 0x22 cpfseq RCREG1 bra $+4 bra comm_reset_logbook_pointers ; Resets all logbook pointers and the logbook (!) movlw 0x23 cpfseq RCREG1 bra $+4 bra comm_reset_battery_gauge ; Resets battery gauge registers movlw 0x30 cpfseq RCREG1 bra $+4 bra comm_write_range ; write bytes starting from ext_flash_address:3 (Stop when timeout) movlw 0x40 cpfseq RCREG1 bra $+4 bra comm_erase_4kb ; erases 4kB block from ext_flash_address:3 (Warning: No confirmation or built-in security here...) movlw 0x42 cpfseq RCREG1 bra $+4 bra comm_erase_range4kb ; erases range in 4kB steps (Get 3 bytes address and 1byte amount of 4kB blocks) movlw 0x50 cpfseq RCREG1 bra $+4 bra comm_send_firmware ; send firmware to bootloader ; movlw "t" ; cpfseq RCREG1 ; bra $+4 ; goto testloop ; Start raw-data testloop movlw 0xC1 cpfseq RCREG1 bra $+4 bra comm_service_ll_bootloader ; Start low-level bootloader bra comm_download_mode0 ; Loop with timeout reset ;----------------------------------------------------------------------------- comm_send_compact_headers: movlw "m" ; send echo movwf TXREG1 ; Send 13 bytes/dive (Compact Header) ; 1st: 200009h-200016h ; 2nd: 201009h-201016h ; 3rd: 202009h-202016h ; 100: 264009h-264016h ; 256: 2FF009h-2FF016h movlw 0x1F movwf ext_flash_address+2 movlw 0xF0 movwf ext_flash_address+1 comm_send_compact_headers2: movlw 0x09 movwf ext_flash_address+0 ; Adjust address for next dive movlw 0x10 addwf ext_flash_address+1 movlw 0x00 addwfc ext_flash_address+2 movlw 0x30 cpfseq ext_flash_address+2 ; All 256 dive send? bra comm_send_compact_headers4 ; No, continue bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_compact_headers4: movlw .13 movwf lo ; Counter call rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_compact_headers3 ; counter 24bit comm_send_compact_headers_loop: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_compact_headers3: call rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_compact_headers_loop call ext_flash_read_block_stop movlw 0xFF ; Spare movwf TXREG1 call rs232_wait_tx ; Wait for UART movlw 0xFF ; Spare movwf TXREG1 call rs232_wait_tx ; Wait for UART movlw 0xFF ; Spare movwf TXREG1 call rs232_wait_tx ; Wait for UART bra comm_send_compact_headers2 ; continue ;----------------------------------------------------------------------------- comm_send_headers: movlw "a" ; send echo movwf TXREG1 ; Send 256 bytes/dive (Header) ; 1st: 200000h-2000FFh ; 2nd: 201000h-2010FFh ; 3rd: 202000h-2020FFh ; 100: 264000h-2640FFh ; 256: 2FF000h-2FF0FFh movlw 0x1F movwf ext_flash_address+2 movlw 0xF0 movwf ext_flash_address+1 comm_send_headers2: movlw 0x00 movwf ext_flash_address+0 ; Adjust address for next dive movlw 0x10 addwf ext_flash_address+1 movlw 0x00 addwfc ext_flash_address+2 movlw 0x30 cpfseq ext_flash_address+2 ; All 256 dive send? bra comm_send_headers4 ; No, continue bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_headers4: clrf lo ; Counter call rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_headers3 ; counter 24bit comm_send_headers_loop: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_headers3: call rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_headers_loop call ext_flash_read_block_stop bra comm_send_headers2 ; continue ;----------------------------------------------------------------------------- comm_option_reset_all: ; Reset all options to factory default. movlw "x" ; send echo movwf TXREG1 call option_reset_all bra comm_download_mode0 ; Done. back to loop with timeout reset ;----------------------------------------------------------------------------- comm_set_time: movlw "b" ; send echo movwf TXREG1 call rs232_wait_tx ; wait for UART call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort movff RCREG1, hours movlw d'24' cpfslt hours clrf hours call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort movff RCREG1, mins movlw d'60' cpfslt mins clrf mins call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort movff RCREG1, secs movlw d'60' cpfslt secs clrf secs call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort movff RCREG1, month movlw d'13' cpfslt month movwf month call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort call comm_check_day ; Check day call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort movff RCREG1, year movlw d'100' cpfslt year clrf year ; All ok, set RTCC call rtc_set_rtc ; writes mins,sec,hours,day,month and year to rtc module bra comm_download_mode0 ; Done. back to loop with timeout reset ;----------------------------------------------------------------------------- ; Set OSTC3 custom text string (opt_name_length ascii chars). ; comm_set_custom_text: movlw "c" ; send echo movwf TXREG1 call rs232_wait_tx ; wait for UART lfsr FSR2,opt_name movlw opt_name_length movwf lo ; counter comm_set_ctext_loop: call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_set_ctext_loop_done ; no, abort movff RCREG1,POSTINC2 ; Store character decfsz lo,F bra comm_set_ctext_loop comm_set_ctext_loop_done: tstfsz lo ; Got opt_name_length bytes? bra comm_set_ctext_loop_done2 ; no, clear remaining chars bra comm_download_mode0 ; Done. Loop with timeout reset comm_set_ctext_loop_done2: clrf POSTINC2 decfsz lo,F bra comm_set_ctext_loop_done2 bra comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- ; Reply Serial (2 bytes low:high), firmware (major.minor) and custom text. ; comm_identify: movlw "i" ; send echo movwf TXREG1 call rs232_wait_tx ; wait for UART ;---- Read serial from internal EEPROM address 0000 clrf EEADRH clrf EEADR ; Get Serial number LOW call read_eeprom ; read byte movff EEDATA,lo incf EEADR,F ; Get Serial number HIGH call read_eeprom ; read byte movff EEDATA,hi ;---- Emit serial number movff lo,TXREG1 call rs232_wait_tx movff hi,TXREG1 call rs232_wait_tx ;---- Emit fiwmware hi.lo movlw softwareversion_x movwf TXREG1 call rs232_wait_tx movlw softwareversion_y movwf TXREG1 call rs232_wait_tx ;---- Emit custom text movlw opt_name_length movwf hi lfsr FSR2,opt_name common_identify_loop: movff POSTINC2,TXREG1 call rs232_wait_tx decfsz hi,F bra common_identify_loop bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- ; Reply hardware descriptor byte ; comm_hardware_descriptor: movlw "j" ; send echo movwf TXREG1 call rs232_wait_tx ; wait for UART movff hardware_flag,TXREG1 bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- comm_send_dive: movlw "f" ; send echo movwf TXREG1 call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort! movff RCREG1,lo ; Store dive number (0-255) ; First, send the header (again) ; Set ext_flash_address:3 to TOC entry of this dive ; 1st: 200000h-200FFFh -> lo=0 ; 2nd: 201000h-201FFFh -> lo=1 ; 3rd: 202000h-202FFFh -> lo=2 ; 256: 2FF000h-2FFFFFh -> lo=255 clrf ext_flash_address+0 clrf ext_flash_address+1 movlw 0x20 movwf ext_flash_address+2 movlw .16 mulwf lo ; lo*16 = offset to 0x2000 (up:hi) movf PRODL,W addwf ext_flash_address+1,F movf PRODH,W addwfc ext_flash_address+2,F incf_ext_flash_address d'2' ; Skip 0xFA, 0xFA call ext_flash_byte_read_plus ; Read start address of profile movff temp1,ext_flash_log_pointer+0 call ext_flash_byte_read_plus ; Read start address of profile movff temp1,ext_flash_log_pointer+1 call ext_flash_byte_read_plus ; Read start address of profile movff temp1,ext_flash_log_pointer+2 call ext_flash_byte_read_plus ; Read end address of profile movff temp1,convert_value_temp+0 call ext_flash_byte_read_plus ; Read end address of profile movff temp1,convert_value_temp+1 call ext_flash_byte_read_plus ; Read end address of profile movff temp1,convert_value_temp+2 decf_ext_flash_address d'8' ; Back again to first 0xFA in header movf ext_flash_log_pointer+0,W cpfseq convert_value_temp+0 ; Equal? bra comm_send_dive1 ; No, Send header movf ext_flash_log_pointer+1,W cpfseq convert_value_temp+1 ; Equal? bra comm_send_dive1 ; No, Send header movf ext_flash_log_pointer+2,W cpfseq convert_value_temp+2 ; Equal? bra comm_send_dive1 ; No, Send header ; Start=End -> Not good, abort bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_dive1: ; Send header clrf hi ; Counter call rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_dive_header comm_send_dive_header2: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_dive_header: call rs232_wait_tx ; Wait for UART decfsz hi,F bra comm_send_dive_header2 call ext_flash_read_block_stop ; Set address for profile movff ext_flash_log_pointer+0,ext_flash_address+0 movff ext_flash_log_pointer+1,ext_flash_address+1 movff ext_flash_log_pointer+2,ext_flash_address+2 movlw .6 ; Skip 6byte short header in profile - only for internal use call incf_ext_flash_address0_0x20 ; increases bytes in ext_flash_address:3 with 0x200000 bank switching comm_send_dive_profile: call ext_flash_byte_read_plus_0x20 ; Read one byte into temp1, takes care of banking at 0x200000 call rs232_wait_tx ; Wait for UART movff temp1,TXREG1 ; Send a byte ; 24bit compare with end address movff convert_value_temp+0,WREG cpfseq ext_flash_address+0 bra comm_send_dive_profile movff convert_value_temp+1,WREG cpfseq ext_flash_address+1 bra comm_send_dive_profile movff convert_value_temp+2,WREG cpfseq ext_flash_address+2 bra comm_send_dive_profile rcall comm_read_setting_wait ; Wait for UART bra comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- comm_read_setting: movlw "r" movwf TXREG1 call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_read_abort ; No, abort! rcall comm_read_setting_wait ; Wait for UART movlw 0x0F cpfsgt RCREG1 ; 0x00-0x0F: unused bra comm_read_abort ; abort! subwf RCREG1,W ; Subtract unused commands dcfsnz WREG bra comm_read_gas1 ; RCREG1=0x10 dcfsnz WREG bra comm_read_gas2 ; RCREG1=0x11 dcfsnz WREG bra comm_read_gas3 ; RCREG1=0x12 dcfsnz WREG bra comm_read_gas4 ; RCREG1=0x13 dcfsnz WREG bra comm_read_gas5 ; RCREG1=0x14 dcfsnz WREG bra comm_read_dil1 ; RCREG1=0x15 dcfsnz WREG bra comm_read_dil2 ; RCREG1=0x16 dcfsnz WREG bra comm_read_dil3 ; RCREG1=0x17 dcfsnz WREG bra comm_read_dil4 ; RCREG1=0x18 dcfsnz WREG bra comm_read_dil5 ; RCREG1=0x19 dcfsnz WREG bra comm_read_sp1 ; RCREG1=0x1A dcfsnz WREG bra comm_read_sp2 ; RCREG1=0x1B dcfsnz WREG bra comm_read_sp3 ; RCREG1=0x1C dcfsnz WREG bra comm_read_sp4 ; RCREG1=0x1D dcfsnz WREG bra comm_read_sp5 ; RCREG1=0x1E dcfsnz WREG movff opt_ccr_mode, TXREG1 ; RCREG1=0x1F dcfsnz WREG movff opt_dive_mode, TXREG1 ; RCREG1=0x20 dcfsnz WREG movff char_I_deco_model, TXREG1 ; RCREG1=0x21 dcfsnz WREG movff opt_ppO2_max, TXREG1 ; RCREG1=0x22 dcfsnz WREG movff opt_ppO2_min, TXREG1 ; RCREG1=0x23 dcfsnz WREG movff char_I_extra_time, TXREG1 ; RCREG1=0x24 dcfsnz WREG movff opt_GF_low, TXREG1 ; RCREG1=0x25 dcfsnz WREG movff opt_GF_high, TXREG1 ; RCREG1=0x26 dcfsnz WREG movff opt_aGF_low, TXREG1 ; RCREG1=0x27 dcfsnz WREG movff opt_aGF_high, TXREG1 ; RCREG1=0x28 dcfsnz WREG movff opt_enable_aGF, TXREG1 ; RCREG1=0x29 dcfsnz WREG movff char_I_saturation_multiplier, TXREG1; RCREG1=0x2A dcfsnz WREG movff char_I_desaturation_multiplier, TXREG1; RCREG1=0x2B dcfsnz WREG movff opt_last_stop, TXREG1 ; RCREG1=0x2C dcfsnz WREG movff opt_brightness, TXREG1 ; RCREG1=0x2D dcfsnz WREG movff opt_units, TXREG1 ; RCREG1=0x2E dcfsnz WREG movff opt_sampling_rate, TXREG1 ; RCREG1=0x2F dcfsnz WREG movff opt_salinity, TXREG1 ; RCREG1=0x30 dcfsnz WREG movff opt_dive_color_scheme, TXREG1 ; RCREG1=0x31 dcfsnz WREG movff opt_language, TXREG1 ; RCREG1=0x32 dcfsnz WREG movff opt_dateformat, TXREG1 ; RCREG1=0x33 dcfsnz WREG movff opt_compass_gain, TXREG1 ; RCREG1=0x34 dcfsnz WREG movff opt_pressure_adjust, TXREG1 ; RCREG1=0x35 dcfsnz WREG movff opt_enable_safetystop, TXREG1 ; RCREG1=0x36 dcfsnz WREG movff opt_calibration_O2_ratio, TXREG1; RCREG1=0x37 dcfsnz WREG movff opt_sensor_fallback, TXREG1 ; RCREG1=0x38 dcfsnz WREG movff opt_flip_screen, TXREG1 ; RCREG1=0x39 dcfsnz WREG movff opt_cR_button_left, TXREG1 ; RCREG1=0x3A dcfsnz WREG movff opt_cR_button_right, TXREG1 ; RCREG1=0x3B dcfsnz WREG movff char_I_bottom_usage, TXREG1 ; RCREG1=0x3C dcfsnz WREG movff char_I_deco_usage, TXREG1 ; RCREG1=0x3D dcfsnz WREG movff opt_modwarning, TXREG1 ; RCREG1=0x3E dcfsnz WREG movff opt_vsitextv2, TXREG1 ; RCREG1=0x3F dcfsnz WREG movff opt_vsigraph, TXREG1 ; RCREG1=0x40 dcfsnz WREG movff opt_showppo2, TXREG1 ; RCREG1=0x41 comm_read_abort: comm_read_done: bra comm_download_mode0 ; Done. Loop with timeout reset comm_read_setting_wait: goto rs232_wait_tx ; Wait for UART (and return!) comm_read_gas1: movff opt_gas_O2_ratio+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_He_ratio+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_type+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_OC_bail_gas_change+0,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_gas2: movff opt_gas_O2_ratio+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_He_ratio+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_type+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_OC_bail_gas_change+1,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_gas3: movff opt_gas_O2_ratio+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_He_ratio+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_type+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_OC_bail_gas_change+2,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_gas4: movff opt_gas_O2_ratio+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_He_ratio+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_type+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_OC_bail_gas_change+3,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_gas5: movff opt_gas_O2_ratio+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_He_ratio+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_gas_type+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_OC_bail_gas_change+4,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_dil1: movff opt_dil_O2_ratio+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_He_ratio+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_type+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_dil_change+0,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_dil2: movff opt_dil_O2_ratio+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_He_ratio+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_type+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_dil_change+1,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_dil3: movff opt_dil_O2_ratio+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_He_ratio+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_type+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_dil_change+2,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_dil4: movff opt_dil_O2_ratio+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_He_ratio+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_type+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_dil_change+3,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_dil5: movff opt_dil_O2_ratio+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_He_ratio+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff opt_dil_type+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_dil_change+4,TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_sp1: movff char_I_setpoint_cbar+0, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_setpoint_change+0, TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_sp2: movff char_I_setpoint_cbar+1, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_setpoint_change+1, TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_sp3: movff char_I_setpoint_cbar+2, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_setpoint_change+2, TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_sp4: movff char_I_setpoint_cbar+3, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_setpoint_change+3, TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset comm_read_sp5: movff char_I_setpoint_cbar+4, TXREG1 rcall comm_read_setting_wait ; Wait for UART movff char_I_setpoint_change+4, TXREG1 bra comm_read_done ; Done. Wait for UART and loop with timeout reset ;----------------------------------------------------------------------------- comm_write_gas1: movff RCREG1,opt_gas_O2_ratio+0 rcall comm_write_get_byte movff RCREG1,opt_gas_He_ratio+0 rcall comm_write_get_byte movff RCREG1,opt_gas_type+0 rcall comm_write_get_byte movff RCREG1,opt_OC_bail_gas_change+0 bra comm_write_abort ; Done. Loop with timeout reset comm_write_gas2: movff RCREG1,opt_gas_O2_ratio+1 rcall comm_write_get_byte movff RCREG1,opt_gas_He_ratio+1 rcall comm_write_get_byte movff RCREG1,opt_gas_type+1 rcall comm_write_get_byte movff RCREG1,opt_OC_bail_gas_change+1 bra comm_write_abort ; Done. Loop with timeout reset comm_write_gas3: movff RCREG1,opt_gas_O2_ratio+2 rcall comm_write_get_byte movff RCREG1,opt_gas_He_ratio+2 rcall comm_write_get_byte movff RCREG1,opt_gas_type+2 rcall comm_write_get_byte movff RCREG1,opt_OC_bail_gas_change+2 bra comm_write_abort ; Done. Loop with timeout reset comm_write_gas4: movff RCREG1,opt_gas_O2_ratio+3 rcall comm_write_get_byte movff RCREG1,opt_gas_He_ratio+3 rcall comm_write_get_byte movff RCREG1,opt_gas_type+3 rcall comm_write_get_byte movff RCREG1,opt_OC_bail_gas_change+3 bra comm_write_abort ; Done. Loop with timeout reset comm_write_gas5: movff RCREG1,opt_gas_O2_ratio+4 rcall comm_write_get_byte movff RCREG1,opt_gas_He_ratio+4 rcall comm_write_get_byte movff RCREG1,opt_gas_type+4 rcall comm_write_get_byte movff RCREG1,opt_OC_bail_gas_change+4 bra comm_write_abort ; Done. Loop with timeout reset comm_write_setting: movlw "w" movwf TXREG1 rcall comm_write_get_byte ; "Byte 2" btfsc rs232_recieve_overflow ; Got byte? bra comm_write_abort ; No, abort! movff RCREG1,temp1 ; Copy rcall comm_write_get_byte ; "Byte 3" rcall comm_read_setting_wait ; Wait for UART movlw 0x0F cpfsgt temp1 ; 0x00-0x0F: unused bra comm_write_abort ; abort! subwf temp1,W ; Subtract unused commands dcfsnz WREG bra comm_write_gas1 ; RCREG1=0x10 dcfsnz WREG bra comm_write_gas2 ; RCREG1=0x11 dcfsnz WREG bra comm_write_gas3 ; RCREG1=0x12 dcfsnz WREG bra comm_write_gas4 ; RCREG1=0x13 dcfsnz WREG bra comm_write_gas5 ; RCREG1=0x14 dcfsnz WREG bra comm_write_dil1 ; RCREG1=0x15 dcfsnz WREG bra comm_write_dil2 ; RCREG1=0x16 dcfsnz WREG bra comm_write_dil3 ; RCREG1=0x17 dcfsnz WREG bra comm_write_dil4 ; RCREG1=0x18 dcfsnz WREG bra comm_write_dil5 ; RCREG1=0x19 dcfsnz WREG bra comm_write_sp1 ; RCREG1=0x1A dcfsnz WREG bra comm_write_sp2 ; RCREG1=0x1B dcfsnz WREG bra comm_write_sp3 ; RCREG1=0x1C dcfsnz WREG bra comm_write_sp4 ; RCREG1=0x1D dcfsnz WREG bra comm_write_sp5 ; RCREG1=0x1E dcfsnz WREG movff RCREG1, opt_ccr_mode ; RCREG1=0x1F dcfsnz WREG movff RCREG1, opt_dive_mode ; RCREG1=0x20 dcfsnz WREG movff RCREG1, char_I_deco_model ; RCREG1=0x21 dcfsnz WREG movff RCREG1, opt_ppO2_max ; RCREG1=0x22 dcfsnz WREG movff RCREG1, opt_ppO2_min ; RCREG1=0x23 dcfsnz WREG movff RCREG1, char_I_extra_time ; RCREG1=0x24 dcfsnz WREG movff RCREG1, opt_GF_low ; RCREG1=0x25 dcfsnz WREG movff RCREG1, opt_GF_high ; RCREG1=0x26 dcfsnz WREG movff RCREG1, opt_aGF_low ; RCREG1=0x27 dcfsnz WREG movff RCREG1, opt_aGF_high ; RCREG1=0x28 dcfsnz WREG movff RCREG1, opt_enable_aGF ; RCREG1=0x29 dcfsnz WREG movff RCREG1, char_I_saturation_multiplier; RCREG1=0x2A dcfsnz WREG movff RCREG1, char_I_desaturation_multiplier; RCREG1=0x2B dcfsnz WREG movff RCREG1, opt_last_stop ; RCREG1=0x2C dcfsnz WREG movff RCREG1, opt_brightness ; RCREG1=0x2D dcfsnz WREG movff RCREG1, opt_units ; RCREG1=0x2E dcfsnz WREG movff RCREG1, opt_sampling_rate ; RCREG1=0x2F dcfsnz WREG movff RCREG1, opt_salinity ; RCREG1=0x30 dcfsnz WREG movff RCREG1, opt_dive_color_scheme ; RCREG1=0x31 dcfsnz WREG movff RCREG1, opt_language ; RCREG1=0x32 dcfsnz WREG movff RCREG1, opt_dateformat ; RCREG1=0x33 dcfsnz WREG movff RCREG1, opt_compass_gain ; RCREG1=0x34 dcfsnz WREG movff RCREG1, opt_pressure_adjust ; RCREG1=0x35 dcfsnz WREG movff RCREG1, opt_enable_safetystop ; RCREG1=0x36 dcfsnz WREG movff RCREG1, opt_calibration_O2_ratio; RCREG1=0x37 dcfsnz WREG movff RCREG1, opt_sensor_fallback ; RCREG1=0x38 dcfsnz WREG movff RCREG1, opt_flip_screen ; RCREG1=0x39 dcfsnz WREG movff RCREG1, opt_cR_button_left ; RCREG1=0x3A dcfsnz WREG movff RCREG1, opt_cR_button_right ; RCREG1=0x3B dcfsnz WREG movff RCREG1, char_I_bottom_usage ; RCREG1=0x3C dcfsnz WREG movff RCREG1, char_I_deco_usage ; RCREG1=0x3D dcfsnz WREG movff RCREG1, opt_modwarning ; RCREG1=0x3E dcfsnz WREG movff RCREG1, opt_vsitextv2 ; RCREG1=0x3F dcfsnz WREG movff RCREG1, opt_vsigraph ; RCREG1=0x40 dcfsnz WREG movff RCREG1, opt_showppo2 ; RCREG1=0x41 comm_write_abort: ; Check Options, gases and diluents call option_check_all ; Check all options (and reset if not within their min/max boundaries) bsf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth bcf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth call get_first_gas_to_WREG ; Makes sure at least one Gas is "First" call get_first_dil_to_WREG ; Makes sure at least one Diluent is "First" bra comm_download_mode0 ; Done. Loop with timeout reset comm_write_get_byte: call rs232_get_byte return comm_write_dil1: movff RCREG1,opt_dil_O2_ratio+0 rcall comm_write_get_byte movff RCREG1,opt_dil_He_ratio+0 rcall comm_write_get_byte movff RCREG1,opt_dil_type+0 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+0 bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil2: movff RCREG1,opt_dil_O2_ratio+1 rcall comm_write_get_byte movff RCREG1,opt_dil_He_ratio+1 rcall comm_write_get_byte movff RCREG1,opt_dil_type+1 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+1 bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil3: movff RCREG1,opt_dil_O2_ratio+2 rcall comm_write_get_byte movff RCREG1,opt_dil_He_ratio+2 rcall comm_write_get_byte movff RCREG1,opt_dil_type+2 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+2 bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil4: movff RCREG1,opt_dil_O2_ratio+3 rcall comm_write_get_byte movff RCREG1,opt_dil_He_ratio+3 rcall comm_write_get_byte movff RCREG1,opt_dil_type+3 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+3 bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil5: movff RCREG1,opt_dil_O2_ratio+4 rcall comm_write_get_byte movff RCREG1,opt_dil_He_ratio+4 rcall comm_write_get_byte movff RCREG1,opt_dil_type+4 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+4 bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp1: movff RCREG1,char_I_setpoint_cbar+0 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+0 bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp2: movff RCREG1,char_I_setpoint_cbar+1 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+1 bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp3: movff RCREG1,char_I_setpoint_cbar+2 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+2 bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp4: movff RCREG1,char_I_setpoint_cbar+3 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+3 bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp5: movff RCREG1,char_I_setpoint_cbar+4 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+4 bra comm_write_abort ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- comm_send_string: movlw "n" ; send echo movwf TXREG1 call rs232_wait_tx ; Wait for UART WIN_SMALL comm_string_column, comm_string_row movlw .16 movwf lo ; counter comm_send_string_loop: call rs232_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_send_string_abort ; No, abort! movff RCREG1,POSTINC2 ; Store character decfsz lo,F bra comm_send_string_loop comm_send_string_abort: STRCAT_PRINT "" ; Show the text goto comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- comm_check_day: movff RCREG1, day movff month,lo ; new month dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .28 dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .30 dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .30 dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .30 dcfsnz lo,F movlw .31 dcfsnz lo,F movlw .30 dcfsnz lo,F movlw .31 cpfsgt day ; day ok? return ; OK movlw .1 ; not OK, set to 1st movwf day return ;---------------------------------------------------------------------------- END