Mercurial > public > mk2
changeset 148:055977afc2f9
Make loogbook search twice faster.
+ Cleanup inc/dec eeprom_address macros.
+ Cleanup loop menu_logbook2.
+ Make 2 bytes steps
author | JeanDo |
---|---|
date | Sun, 09 Jan 2011 16:04:02 +0100 |
parents | c09b0be2e1e6 |
children | 55a763d514ed |
files | code_part1/OSTC_code_asm_part1/i2c_eeprom.asm code_part1/OSTC_code_asm_part1/menu_logbook.asm |
diffstat | 2 files changed, 75 insertions(+), 364 deletions(-) [+] |
line wrap: on
line diff
--- a/code_part1/OSTC_code_asm_part1/i2c_eeprom.asm Sun Jan 09 14:39:09 2011 +0100 +++ b/code_part1/OSTC_code_asm_part1/i2c_eeprom.asm Sun Jan 09 16:04:02 2011 +0100 @@ -19,53 +19,45 @@ ; ToDo: use 2nd 32KB from external EEPROM for something incf_eeprom_address macro ext_ee_temp1 ; Will increase eeprom_address:2 with the 8Bit value "ext_ee_temp1" and takes - movlw ext_ee_temp1 ; care of bank switching at 0x8000 - call incf_eeprom_address0 + movlw ext_ee_temp1 ; care of bank switching at 0x8000 + call incf_eeprom_address0 endm incf_eeprom_address0: - movwf ext_ee_temp1 -incf_eeprom_address1: - movlw d'1' ; increase address - addwf eeprom_address+0,F - movlw d'0' - addwfc eeprom_address+1,F - btfss eeprom_address+1,7 ; at address 8000? - bra incf_eeprom_address2 ; No, continue - - ; Yes, clear eeprom_address:2 - clrf eeprom_address+0 ; Clear eeprom address - clrf eeprom_address+1 - -incf_eeprom_address2: - decfsz ext_ee_temp1,F ; All done? - bra incf_eeprom_address1 ; No, continue - return ; Done. + addwf eeprom_address+0,F ; increase address + movlw d'0' + addwfc eeprom_address+1,F -decf_eeprom_address macro ext_ee_temp1 ; Will decrease eeprom_address:2 with the 8Bit value "ext_ee_temp1" and takes - movlw ext_ee_temp1 ; care of bank switching at 0x8000 - call decf_eeprom_address0 - endm + btfss eeprom_address+1,7 ; at address 8000? + return ; No, continue + + ; Yes, clear eeprom_address:2 + clrf eeprom_address+0 ; Clear eeprom address + clrf eeprom_address+1 + return ; Done. + +;============================================================================= +; Will decrease eeprom_address:2 with the 8Bit value "ext_ee_temp1" and takes +; care of bank switching at 0x8000 + +decf_eeprom_address macro ext_ee_temp1 + movlw ext_ee_temp1 + call decf_eeprom_address0 + endm decf_eeprom_address0: - movwf ext_ee_temp1 -decf_eeprom_address1: - movlw d'1' ; decrease address - subwf eeprom_address+0,F - movlw d'0' - subwfb eeprom_address+1,F + subwf eeprom_address+0,F ; decrease address: do a 16-8bits substract. + movlw d'0' + subwfb eeprom_address+1,F - btfss eeprom_address+1,7 ; at address 8000? - bra decf_eeprom_address2 ; No, continue - - movlw b'01111111' ; yes, reset highbyte - movwf eeprom_address+1 - -decf_eeprom_address2: - decfsz ext_ee_temp1,F ; All done? - bra decf_eeprom_address1 ; No, continue - return ; Done. + btfss eeprom_address+1,7 ; at address 8000? + return ; No, done. + movlw b'01111111' ; yes, reset highbyte + movwf eeprom_address+1 + return ; Done. + +;============================================================================= write_external_eeprom: ; data in WREG ; increase address eeprom_address+0:eeprom_address+1 after write
--- a/code_part1/OSTC_code_asm_part1/menu_logbook.asm Sun Jan 09 14:39:09 2011 +0100 +++ b/code_part1/OSTC_code_asm_part1/menu_logbook.asm Sun Jan 09 16:04:02 2011 +0100 @@ -49,78 +49,68 @@ clrf divemins+1 call I2CReset ; Reset I2C Bus call get_free_EEPROM_location ; search from "here" backwards through the external memory - clrf temp1 ; max. 32KB - clrf temp2 movlw d'5' movwf menupos ; Here: stores current position on display (5-x) - + +;----------------------------------------------------------------------------- +; search external EEPROM backwards from eeprom_address +; for 0xFA, 0xFA (store 1st. 0xFA position for next search) +; read header data and display it +; wait for user to confirm/exit +; recopy data to search from here + menu_logbook1b: - ; search external EEPROM backwards from eeprom_address - ; for 0xFA, 0xFA (store 1st. 0xFA position for next search) - ; read header data and display it - ; wait for user to confirm/exit - ; recopy data to search from here WIN_INVERT .1 DISPLAYTEXT .12 ;" Wait.." WIN_INVERT .0 - bcf first_FA ; clear flags - bcf second_FA + ;---- fast loop: check every other byte ---------------------------------- menu_logbook2: - movlw d'1' ; increase 16Bit value - addwf divemins+0,F - movlw d'0' - addwfc divemins+1,F + infsnz divemins+0,F ; increase 16Bit value + incf divemins+1,F + infsnz divemins+0,F ; increase 16Bit value, twice + incf divemins+1,F - btfsc divemins+1,7 ; At 0x8000? - bra menu_logbook_reset ; yes, restart (if not empty) + btfsc divemins+1,7 ; At 0x8000? + bra menu_logbook_reset ; yes, restart (if not empty) - decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000 - + decf_eeprom_address d'2' ; +2 to eeprom address. + call I2CREAD ; reads one byte (Slow! Better use Blockread!) - btfsc first_FA ; - bra test_2nd_FA - - bsf first_FA ; Found 1st. 0xFA? - movlw 0xFA + movlw 0xFA ; That was a FA ? cpfseq SSPBUF - bcf first_FA ; No, clear flag - bra menu_logbook3 ; and continue search + bra menu_logbook2 ; No: continue the fast loop... + + ;---- Slow check : was it before or after that one ? --------------------- -test_2nd_FA: - btfsc second_FA - bra test_FA_DONE - - bsf second_FA ; found 2nd 0xFA? - movlw 0xFA - cpfseq SSPBUF - rcall no_second_FA ; No, clear both flags! - bra menu_logbook3 ; and continue search + incf_eeprom_address d'1' ; Been one step too far ? + call I2CREAD ; reads one byte (Slow! Better use Blockread!) + movlw 0xFA ; That was a FA ? + xorwf SSPBUF,W + bz menu_loop_tooFar ; Got it ! + + decf_eeprom_address d'2' ; Instead, not far enough ? + call I2CREAD ; reads one byte (Slow! Better use Blockread!) + infsnz divemins+0,F ; Keep in sync (-1+2 == +1) + incf divemins+1,F + movlw 0xFA ; It was the second FA ? + xorwf SSPBUF,W + bz test_FA_DONE + bra menu_logbook2 ; No: continue the fast loop... + +menu_loop_tooFar; + movlw -.1 ; Correct counter too, + addwf divemins+0 ; by doing a 16bit decrement. + movlw 0 + addwfc divemins+1 test_FA_DONE: ; Found 0xFA 0xFA! movff eeprom_address+0,eeprom_header_address+0 ; store current address into temp register movff eeprom_address+1,eeprom_header_address+1 ; we must continue search here later - incf divenumber,F ; new header found, increase divenumber - bra menu_logbook4 ; Done with searching, display the header! - -no_second_FA: ; discard both flags! - bcf second_FA - bcf first_FA - return - - -menu_logbook3: - movlw d'1' ; increase global counter - addwf temp1,F - movlw d'0' - addwfc temp2,F - - btfsc temp2,7 ; 32KB searched? - bra menu_logbook3b ; Yes - bra menu_logbook2 ; No, not now - + incf divenumber,F ; new header found, increase divenumber + bra menu_logbook4 ; Done with searching, display the header! menu_logbook3b: btfss logbook_page_not_empty ; Was there at least one dive? @@ -138,7 +128,7 @@ menu_logbook4: ; Adjust eeprom_address to set pointer on first headerbyte - incf_eeprom_address d'3' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 + incf_eeprom_address d'2' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 btfss logbook_profile_view ; Display profile (search routine is used in profileview, too) bra menu_logbook_display_loop ; No, display overwiev list @@ -165,8 +155,6 @@ movff eeprom_header_address+1,decodata+1 movff divemins+0,max_pressure+0 movff divemins+1,max_pressure+1 - movff temp1,logbook_temp6 - movff temp2,samplesecs movlw d'3' addwf decodata+0,F @@ -631,58 +619,6 @@ return profile_view_get_depth_new1: -;bra profile_view_get_depth_new1_1 ; Skip all data to ignore... - -; decfsz divisor_deco,F ; Check divisor -; bra profile_view_get_depth_new1_1 ; Divisor not zero... -; -;; tstfsz timeout_counter2 ; Any bytes to ignore -;; bra profile_view_get_depth_new2 ; Yes (1-127) -;; return ; No (0) -; -; movff logbook_temp2,divisor_deco ; Restore divisor value! -;; check for event byte and the extra informations -; btfss event_occured -; bra profile_view_get_depth_new2 ; No event! -; -; call I2CREAD2 ; read event byte -; decf timeout_counter2,F ; Reduce number of bytes to ignore -; -; movlw d'0' ; Extra bytes to ignore because of event -; btfsc SSPBUF,4 -; addlw d'2' ; two bytes for manual gas set -; btfsc SSPBUF,5 -; addlw d'1' ; one byte for gas change -; movwf logbook_temp5 ; store extra bytes to ignore -; -; tstfsz logbook_temp5 ; Anything to ignore? -; bra profile_view_get_depth_new1_2 ; Yes -; bra profile_view_get_depth_new2 ; No, continue with normal routine -; -;profile_view_get_depth_new1_2: -; call I2CREAD2 ; ignore byte -; decf timeout_counter2,F ; Reduce number of bytes to ignore -; decfsz logbook_temp5,F ; reduce extra bytes ignore counter -; bra profile_view_get_depth_new1_2 ; loop -; -;profile_view_get_depth_new2: -; movlw d'4' ; Temp (2) and Deko (2) in the sample? -; cpfseq timeout_counter2 -; bra profile_view_get_depth_new2_2 ; No -; ; Yes, skip Temp! -; call I2CREAD2 ; ignore byte -; decf timeout_counter2,F ; Reduce number of bytes to ignore -; call I2CREAD2 ; ignore byte -; decf timeout_counter2,F ; Reduce number of bytes to ignore -; -;profile_view_get_depth_new2_2: -; call I2CREAD2 ; ignore byte -; -; decfsz timeout_counter2,F ; reduce counter -; bra profile_view_get_depth_new2_2; Loop -; return - -profile_view_get_depth_new1_1: tstfsz timeout_counter2 ; Any bytes to ignore bra profile_view_get_depth_new3 ; Yes (1-127) return ; No (0) @@ -702,8 +638,6 @@ movff max_pressure+0,divemins+0 movff max_pressure+1,divemins+1 movff mintemp+0, divenumber - movff logbook_temp6,temp1 - movff samplesecs,temp2 decf divenumber,F bcf all_dives_shown @@ -826,218 +760,3 @@ output_16 ; Divetime minutes STRCAT_PRINT "'" ; Display header-row in list return - - -;profileview_menu: -; movlw d'1' -; movwf menupos -;profileview_menu1: -; call PLED_clear_divemode_menu -; call PLED_profileview_menu ; Displays Menu -;profileview_menu2: -; call PLED_divemenu_cursor -; bcf sleepmode ; clear some flags -; bcf menubit2 -; bcf menubit3 -; bcf switch_right -; bcf switch_left -; clrf timeout_counter2 -; -;profileview_menu_loop: -; call check_switches_logbook -; -; btfsc menubit3 ; SET/MENU? -; bra profileview_menu_move_cursor; Move Cursor -; btfsc menubit2 ; ENTER? -; bra profileview_menu_do ; Do task -; -; btfsc onesecupdate -; call timeout_surfmode ; timeout -; btfsc onesecupdate -; call set_dive_modes ; check, if divemode must be entered -; bcf onesecupdate ; one second update -; btfsc sleepmode ; Timeout? -; bra exit_profileview ; back to list -; btfsc divemode -; goto restart ; Enter Divemode if required -; -; bra profileview_menu_loop ; wait for something to do -; -;profileview_menu_do: -; dcfsnz menupos,F -; bra exit_profileview ; back to list, quit profileview menu -; dcfsnz menupos,F -; bra profileview_menu_delete ; Delete Dive from external EEPROM -;; dcfsnz menupos,F -;; bra profileview_menu_format ; Delete all Dives from external EEPROM -;; -;profileview_menu_move_cursor: -; incf menupos,F -; movlw d'3' ; number of menu options+1 -; cpfseq menupos ; =limit? -; bra profileview_menu_move_cursor2 ; No! -; movlw d'1' ; Yes, reset to position 1! -; movwf menupos -;profileview_menu_move_cursor2: -; bra profileview_menu2 ; Return to Profile Menu, also updates cursor - -;profileview_menu_format: -; call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK! -; -; movwf menupos ; Used as temp -; tstfsz menupos -; bra profileview_menu_format_loop2 ; Format now! -; -; bra exit_profileview ; back to list, quit profileview menu -; -;profileview_menu_format_loop2: ; Do now format! -; call PLED_ClearScreen -; DISPLAYTEXT .12 ; "Wait.." -; call reset_external_eeprom ; delete profile memory -; goto menu ; Return to Menu - -;profileview_menu_delete: -; call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK! -; movwf menupos ; Used as temp -; tstfsz menupos -; bra profileview_menu_delete_loop2 ; Delete now! -; -; bra exit_profileview ; back to list, quit profileview menu -; -;profileview_menu_delete_loop2: ; Do now delete -; call PLED_ClearScreen -; DISPLAYTEXT .12 ; "Wait.." -; -;; eeprom_address:2 is set to the second byte after the ending 0xFD 0xFD -;; eeprom_address:2 - 1 -> set to the last byte after the 0xFD 0xFD of the current dive -; -;; Set pointer to Byte after the final "0xFD 0xFD" -; decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000 -; movff eeprom_address+0,divemins+0 -; movff eeprom_address+1,divemins+1 -; -;; eeprom_header_address:2 + 1 -> set to the first 0xFA of the 0xFA 0xFA start bytes of the header -; movlw d'1' ; -; addwf eeprom_header_address+0,F -; movlw d'0' -; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1 -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!) -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+1 ; Yes, clear address -; -; movff divemins+0,eeprom_address+0 -; movff divemins+1,eeprom_address+1 ; Read source -; call I2CREAD ; reads one byte (Slow! Better use Blockread!) -; movwf profile_temp+0 -; movlw 0xFE -; cpfseq profile_temp+0 -; bra profileview_menu_delete_notlast ; we're not deleting the last dive.... -; -;; Just move the 0xFE after the dive and delete the rest with 0xFF -; movff eeprom_header_address+0, eeprom_address+0 -; movff eeprom_header_address+1, eeprom_address+1 ; Write target -; movlw 0xFE -; call I2CWRITE ; Write the byte -; -;; Now, delete everything _between_ eeprom_header_address and divemins:2+2 with 0xFF -; movlw d'1' ; -; addwf eeprom_header_address+0,F -; movlw d'0' -; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1 -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!) -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+1 ; Yes, clear address -; -; movff eeprom_header_address+0,eeprom_address+0 -; movff eeprom_header_address+1,eeprom_address+1 -; -; movlw d'1' ; -; addwf divemins+0,F -; movlw d'0' -; addwfc divemins+1,F ; divemins:2 + 1 -; btfss divemins+1,7 ; at 7FFF? -; bra profileview_menu_delete_loop2a ; Skip -; clrf divemins+0 ; Yes, clear address -; clrf divemins+1 -; -;; movff eeprom_header_address+0,eeprom_address+0 -;; movff eeprom_header_address+1,eeprom_address+1 -; -; -;profileview_menu_delete_loop2a: -; movlw 0xFF -; call I2CWRITE ; Write the byte -; -; incf_eeprom_address d'1' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 -; -; movff divemins+0,sub_a+0 -; movff divemins+1,sub_a+1 -; movff eeprom_address+0,sub_b+0 -; movff eeprom_address+1,sub_b+1 -; call sub16 ; sub_c = sub_a - sub_b -; tstfsz sub_c+0 ; Done (Result=Zero?) ? -; bra profileview_menu_delete_loop2a ; No, continue -; tstfsz sub_c+1 ; Done (Result=Zero?) ? -; bra profileview_menu_delete_loop2a ; No, continue -; goto menu_logbook ; Return to list when done deleting -; -;profileview_menu_delete_notlast: -;; Move everything byte-wise from divemins:2 to eeprom_header_address:2 until 0xFD 0xFD 0xFE is found and were moved -; call get_free_EEPROM_location ; Searches 0xFD, 0xFD, 0xFE and sets Pointer to 0xFE -; -; incf_eeprom_address d'2' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 -; movff eeprom_address+0,profile_temp+0 -; movff eeprom_address+1,profile_temp+1 -;; holds now address of 0xFE + 2 (Abort condition....) -; decf_eeprom_address d'2' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000 -;; holds now address of 0xFE again -; movff eeprom_address+0,divemins+0 -; movff eeprom_address+1,divemins+1 ; Copy to working read registers -; -;profileview_menu_delete_loop3: -; movff divemins+0,eeprom_address+0 -; movff divemins+1,eeprom_address+1 ; Read source -; call I2CREAD ; reads one byte (Slow! Better use Blockread!) -; movff eeprom_header_address+0, eeprom_address+0 -; movff eeprom_header_address+1, eeprom_address+1 ; Write target -; call I2CWRITE ; Write the byte -; -; movff divemins+0,eeprom_address+0 -; movff divemins+1,eeprom_address+1 ; Set to source again -; movlw 0xFF -; call I2CWRITE ; Delete the source.... -; -; movlw d'1' -; addwf divemins+0,F ; Increase source (Divemins:2) -; movlw d'0' -; addwfc divemins+1,F -; btfsc divemins+1,7 ; at 0x8000? -; clrf divemins+0 ; Yes, clear address (+0 first!) -; btfsc divemins+1,7 ; at 0x8000? -; clrf divemins+1 ; Yes, clear address -; -; movlw d'1' ; Increase target (eeprom_header_address:2) -; addwf eeprom_header_address+0,F -; movlw d'0' -; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1 -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!) -; btfsc eeprom_header_address+1,7 ; at 7FFF? -; clrf eeprom_header_address+1 ; Yes, clear address -; -; movff divemins+0,sub_a+0 -; movff divemins+1,sub_a+1 -; movff profile_temp+0,sub_b+0 -; movff profile_temp+1,sub_b+1 -; call sub16 ; sub_c = sub_a - sub_b -; tstfsz sub_c+0 ; Done (Result=Zero?) ? -; bra profileview_menu_delete_loop3 ; No, continue -; tstfsz sub_c+1 ; Done (Result=Zero?) ? -; bra profileview_menu_delete_loop3 ; No, continue -; -; goto menu_logbook ; Return to list when done deleting - - - \ No newline at end of file