comparison code_part1/OSTC_code_asm_part1/menu_logbook.asm @ 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 c3ac603ba248
comparison
equal deleted inserted replaced
146:c09b0be2e1e6 148:055977afc2f9
47 WIN_INVERT .0 47 WIN_INVERT .0
48 clrf divemins+0 ; Here: used as temp variables 48 clrf divemins+0 ; Here: used as temp variables
49 clrf divemins+1 49 clrf divemins+1
50 call I2CReset ; Reset I2C Bus 50 call I2CReset ; Reset I2C Bus
51 call get_free_EEPROM_location ; search from "here" backwards through the external memory 51 call get_free_EEPROM_location ; search from "here" backwards through the external memory
52 clrf temp1 ; max. 32KB
53 clrf temp2
54 52
55 movlw d'5' 53 movlw d'5'
56 movwf menupos ; Here: stores current position on display (5-x) 54 movwf menupos ; Here: stores current position on display (5-x)
57 55
56 ;-----------------------------------------------------------------------------
57 ; search external EEPROM backwards from eeprom_address
58 ; for 0xFA, 0xFA (store 1st. 0xFA position for next search)
59 ; read header data and display it
60 ; wait for user to confirm/exit
61 ; recopy data to search from here
62
58 menu_logbook1b: 63 menu_logbook1b:
59 ; search external EEPROM backwards from eeprom_address
60 ; for 0xFA, 0xFA (store 1st. 0xFA position for next search)
61 ; read header data and display it
62 ; wait for user to confirm/exit
63 ; recopy data to search from here
64 WIN_INVERT .1 64 WIN_INVERT .1
65 DISPLAYTEXT .12 ;" Wait.." 65 DISPLAYTEXT .12 ;" Wait.."
66 WIN_INVERT .0 66 WIN_INVERT .0
67 bcf first_FA ; clear flags 67
68 bcf second_FA 68 ;---- fast loop: check every other byte ----------------------------------
69
70 menu_logbook2: 69 menu_logbook2:
71 movlw d'1' ; increase 16Bit value 70 infsnz divemins+0,F ; increase 16Bit value
72 addwf divemins+0,F 71 incf divemins+1,F
73 movlw d'0' 72 infsnz divemins+0,F ; increase 16Bit value, twice
74 addwfc divemins+1,F 73 incf divemins+1,F
75 74
76 btfsc divemins+1,7 ; At 0x8000? 75 btfsc divemins+1,7 ; At 0x8000?
77 bra menu_logbook_reset ; yes, restart (if not empty) 76 bra menu_logbook_reset ; yes, restart (if not empty)
78 77
79 decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000 78 decf_eeprom_address d'2' ; +2 to eeprom address.
80 79
81 call I2CREAD ; reads one byte (Slow! Better use Blockread!) 80 call I2CREAD ; reads one byte (Slow! Better use Blockread!)
82 81
83 btfsc first_FA ; 82 movlw 0xFA ; That was a FA ?
84 bra test_2nd_FA
85
86 bsf first_FA ; Found 1st. 0xFA?
87 movlw 0xFA
88 cpfseq SSPBUF 83 cpfseq SSPBUF
89 bcf first_FA ; No, clear flag 84 bra menu_logbook2 ; No: continue the fast loop...
90 bra menu_logbook3 ; and continue search 85
91 86 ;---- Slow check : was it before or after that one ? ---------------------
92 test_2nd_FA: 87
93 btfsc second_FA 88 incf_eeprom_address d'1' ; Been one step too far ?
94 bra test_FA_DONE 89 call I2CREAD ; reads one byte (Slow! Better use Blockread!)
95 90 movlw 0xFA ; That was a FA ?
96 bsf second_FA ; found 2nd 0xFA? 91 xorwf SSPBUF,W
97 movlw 0xFA 92 bz menu_loop_tooFar ; Got it !
98 cpfseq SSPBUF 93
99 rcall no_second_FA ; No, clear both flags! 94 decf_eeprom_address d'2' ; Instead, not far enough ?
100 bra menu_logbook3 ; and continue search 95 call I2CREAD ; reads one byte (Slow! Better use Blockread!)
96 infsnz divemins+0,F ; Keep in sync (-1+2 == +1)
97 incf divemins+1,F
98 movlw 0xFA ; It was the second FA ?
99 xorwf SSPBUF,W
100 bz test_FA_DONE
101 bra menu_logbook2 ; No: continue the fast loop...
102
103 menu_loop_tooFar;
104 movlw -.1 ; Correct counter too,
105 addwf divemins+0 ; by doing a 16bit decrement.
106 movlw 0
107 addwfc divemins+1
101 108
102 test_FA_DONE: ; Found 0xFA 0xFA! 109 test_FA_DONE: ; Found 0xFA 0xFA!
103 movff eeprom_address+0,eeprom_header_address+0 ; store current address into temp register 110 movff eeprom_address+0,eeprom_header_address+0 ; store current address into temp register
104 movff eeprom_address+1,eeprom_header_address+1 ; we must continue search here later 111 movff eeprom_address+1,eeprom_header_address+1 ; we must continue search here later
105 incf divenumber,F ; new header found, increase divenumber 112 incf divenumber,F ; new header found, increase divenumber
106 bra menu_logbook4 ; Done with searching, display the header! 113 bra menu_logbook4 ; Done with searching, display the header!
107
108 no_second_FA: ; discard both flags!
109 bcf second_FA
110 bcf first_FA
111 return
112
113
114 menu_logbook3:
115 movlw d'1' ; increase global counter
116 addwf temp1,F
117 movlw d'0'
118 addwfc temp2,F
119
120 btfsc temp2,7 ; 32KB searched?
121 bra menu_logbook3b ; Yes
122 bra menu_logbook2 ; No, not now
123
124 114
125 menu_logbook3b: 115 menu_logbook3b:
126 btfss logbook_page_not_empty ; Was there at least one dive? 116 btfss logbook_page_not_empty ; Was there at least one dive?
127 goto menu ; Not a single header was found, leave logbook. 117 goto menu ; Not a single header was found, leave logbook.
128 bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster) 118 bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster)
136 bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster) 126 bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster)
137 127
138 128
139 menu_logbook4: 129 menu_logbook4:
140 ; Adjust eeprom_address to set pointer on first headerbyte 130 ; Adjust eeprom_address to set pointer on first headerbyte
141 incf_eeprom_address d'3' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 131 incf_eeprom_address d'2' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
142 132
143 btfss logbook_profile_view ; Display profile (search routine is used in profileview, too) 133 btfss logbook_profile_view ; Display profile (search routine is used in profileview, too)
144 bra menu_logbook_display_loop ; No, display overwiev list 134 bra menu_logbook_display_loop ; No, display overwiev list
145 135
146 movf divesecs,W ; divenumber that is searched 136 movf divesecs,W ; divenumber that is searched
163 movff divenumber,mintemp+0 ; store all registered required to rebuilt the current logbookpage after the detail/profile view 153 movff divenumber,mintemp+0 ; store all registered required to rebuilt the current logbookpage after the detail/profile view
164 movff eeprom_header_address+0,decodata+0 ; several registers are used as temp registers here 154 movff eeprom_header_address+0,decodata+0 ; several registers are used as temp registers here
165 movff eeprom_header_address+1,decodata+1 155 movff eeprom_header_address+1,decodata+1
166 movff divemins+0,max_pressure+0 156 movff divemins+0,max_pressure+0
167 movff divemins+1,max_pressure+1 157 movff divemins+1,max_pressure+1
168 movff temp1,logbook_temp6
169 movff temp2,samplesecs
170 158
171 movlw d'3' 159 movlw d'3'
172 addwf decodata+0,F 160 addwf decodata+0,F
173 movlw d'0' 161 movlw d'0'
174 addwfc decodata+1,F ; Re-Adjust pointer again 162 addwfc decodata+1,F ; Re-Adjust pointer again
629 bra profile_view_get_depth_new1 ; no 0xFD 617 bra profile_view_get_depth_new1 ; no 0xFD
630 bsf second_FD ; End found! Set Flag! Skip remaining pixels! 618 bsf second_FD ; End found! Set Flag! Skip remaining pixels!
631 return 619 return
632 620
633 profile_view_get_depth_new1: 621 profile_view_get_depth_new1:
634 ;bra profile_view_get_depth_new1_1 ; Skip all data to ignore...
635
636 ; decfsz divisor_deco,F ; Check divisor
637 ; bra profile_view_get_depth_new1_1 ; Divisor not zero...
638 ;
639 ;; tstfsz timeout_counter2 ; Any bytes to ignore
640 ;; bra profile_view_get_depth_new2 ; Yes (1-127)
641 ;; return ; No (0)
642 ;
643 ; movff logbook_temp2,divisor_deco ; Restore divisor value!
644 ;; check for event byte and the extra informations
645 ; btfss event_occured
646 ; bra profile_view_get_depth_new2 ; No event!
647 ;
648 ; call I2CREAD2 ; read event byte
649 ; decf timeout_counter2,F ; Reduce number of bytes to ignore
650 ;
651 ; movlw d'0' ; Extra bytes to ignore because of event
652 ; btfsc SSPBUF,4
653 ; addlw d'2' ; two bytes for manual gas set
654 ; btfsc SSPBUF,5
655 ; addlw d'1' ; one byte for gas change
656 ; movwf logbook_temp5 ; store extra bytes to ignore
657 ;
658 ; tstfsz logbook_temp5 ; Anything to ignore?
659 ; bra profile_view_get_depth_new1_2 ; Yes
660 ; bra profile_view_get_depth_new2 ; No, continue with normal routine
661 ;
662 ;profile_view_get_depth_new1_2:
663 ; call I2CREAD2 ; ignore byte
664 ; decf timeout_counter2,F ; Reduce number of bytes to ignore
665 ; decfsz logbook_temp5,F ; reduce extra bytes ignore counter
666 ; bra profile_view_get_depth_new1_2 ; loop
667 ;
668 ;profile_view_get_depth_new2:
669 ; movlw d'4' ; Temp (2) and Deko (2) in the sample?
670 ; cpfseq timeout_counter2
671 ; bra profile_view_get_depth_new2_2 ; No
672 ; ; Yes, skip Temp!
673 ; call I2CREAD2 ; ignore byte
674 ; decf timeout_counter2,F ; Reduce number of bytes to ignore
675 ; call I2CREAD2 ; ignore byte
676 ; decf timeout_counter2,F ; Reduce number of bytes to ignore
677 ;
678 ;profile_view_get_depth_new2_2:
679 ; call I2CREAD2 ; ignore byte
680 ;
681 ; decfsz timeout_counter2,F ; reduce counter
682 ; bra profile_view_get_depth_new2_2; Loop
683 ; return
684
685 profile_view_get_depth_new1_1:
686 tstfsz timeout_counter2 ; Any bytes to ignore 622 tstfsz timeout_counter2 ; Any bytes to ignore
687 bra profile_view_get_depth_new3 ; Yes (1-127) 623 bra profile_view_get_depth_new3 ; Yes (1-127)
688 return ; No (0) 624 return ; No (0)
689 625
690 ; timeout_counter2 now holds the number of additional bytes to ignore (0-127) 626 ; timeout_counter2 now holds the number of additional bytes to ignore (0-127)
700 movff decodata+0,eeprom_address+0 636 movff decodata+0,eeprom_address+0
701 movff decodata+1,eeprom_address+1 637 movff decodata+1,eeprom_address+1
702 movff max_pressure+0,divemins+0 638 movff max_pressure+0,divemins+0
703 movff max_pressure+1,divemins+1 639 movff max_pressure+1,divemins+1
704 movff mintemp+0, divenumber 640 movff mintemp+0, divenumber
705 movff logbook_temp6,temp1
706 movff samplesecs,temp2
707 decf divenumber,F 641 decf divenumber,F
708 bcf all_dives_shown 642 bcf all_dives_shown
709 643
710 decf menupos2,F 644 decf menupos2,F
711 645
824 movff SSPBUF,hi 758 movff SSPBUF,hi
825 bsf leftbind 759 bsf leftbind
826 output_16 ; Divetime minutes 760 output_16 ; Divetime minutes
827 STRCAT_PRINT "'" ; Display header-row in list 761 STRCAT_PRINT "'" ; Display header-row in list
828 return 762 return
829
830
831 ;profileview_menu:
832 ; movlw d'1'
833 ; movwf menupos
834 ;profileview_menu1:
835 ; call PLED_clear_divemode_menu
836 ; call PLED_profileview_menu ; Displays Menu
837 ;profileview_menu2:
838 ; call PLED_divemenu_cursor
839 ; bcf sleepmode ; clear some flags
840 ; bcf menubit2
841 ; bcf menubit3
842 ; bcf switch_right
843 ; bcf switch_left
844 ; clrf timeout_counter2
845 ;
846 ;profileview_menu_loop:
847 ; call check_switches_logbook
848 ;
849 ; btfsc menubit3 ; SET/MENU?
850 ; bra profileview_menu_move_cursor; Move Cursor
851 ; btfsc menubit2 ; ENTER?
852 ; bra profileview_menu_do ; Do task
853 ;
854 ; btfsc onesecupdate
855 ; call timeout_surfmode ; timeout
856 ; btfsc onesecupdate
857 ; call set_dive_modes ; check, if divemode must be entered
858 ; bcf onesecupdate ; one second update
859 ; btfsc sleepmode ; Timeout?
860 ; bra exit_profileview ; back to list
861 ; btfsc divemode
862 ; goto restart ; Enter Divemode if required
863 ;
864 ; bra profileview_menu_loop ; wait for something to do
865 ;
866 ;profileview_menu_do:
867 ; dcfsnz menupos,F
868 ; bra exit_profileview ; back to list, quit profileview menu
869 ; dcfsnz menupos,F
870 ; bra profileview_menu_delete ; Delete Dive from external EEPROM
871 ;; dcfsnz menupos,F
872 ;; bra profileview_menu_format ; Delete all Dives from external EEPROM
873 ;;
874 ;profileview_menu_move_cursor:
875 ; incf menupos,F
876 ; movlw d'3' ; number of menu options+1
877 ; cpfseq menupos ; =limit?
878 ; bra profileview_menu_move_cursor2 ; No!
879 ; movlw d'1' ; Yes, reset to position 1!
880 ; movwf menupos
881 ;profileview_menu_move_cursor2:
882 ; bra profileview_menu2 ; Return to Profile Menu, also updates cursor
883
884 ;profileview_menu_format:
885 ; call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
886 ;
887 ; movwf menupos ; Used as temp
888 ; tstfsz menupos
889 ; bra profileview_menu_format_loop2 ; Format now!
890 ;
891 ; bra exit_profileview ; back to list, quit profileview menu
892 ;
893 ;profileview_menu_format_loop2: ; Do now format!
894 ; call PLED_ClearScreen
895 ; DISPLAYTEXT .12 ; "Wait.."
896 ; call reset_external_eeprom ; delete profile memory
897 ; goto menu ; Return to Menu
898
899 ;profileview_menu_delete:
900 ; call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
901 ; movwf menupos ; Used as temp
902 ; tstfsz menupos
903 ; bra profileview_menu_delete_loop2 ; Delete now!
904 ;
905 ; bra exit_profileview ; back to list, quit profileview menu
906 ;
907 ;profileview_menu_delete_loop2: ; Do now delete
908 ; call PLED_ClearScreen
909 ; DISPLAYTEXT .12 ; "Wait.."
910 ;
911 ;; eeprom_address:2 is set to the second byte after the ending 0xFD 0xFD
912 ;; eeprom_address:2 - 1 -> set to the last byte after the 0xFD 0xFD of the current dive
913 ;
914 ;; Set pointer to Byte after the final "0xFD 0xFD"
915 ; decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000
916 ; movff eeprom_address+0,divemins+0
917 ; movff eeprom_address+1,divemins+1
918 ;
919 ;; eeprom_header_address:2 + 1 -> set to the first 0xFA of the 0xFA 0xFA start bytes of the header
920 ; movlw d'1' ;
921 ; addwf eeprom_header_address+0,F
922 ; movlw d'0'
923 ; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
924 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
925 ; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
926 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
927 ; clrf eeprom_header_address+1 ; Yes, clear address
928 ;
929 ; movff divemins+0,eeprom_address+0
930 ; movff divemins+1,eeprom_address+1 ; Read source
931 ; call I2CREAD ; reads one byte (Slow! Better use Blockread!)
932 ; movwf profile_temp+0
933 ; movlw 0xFE
934 ; cpfseq profile_temp+0
935 ; bra profileview_menu_delete_notlast ; we're not deleting the last dive....
936 ;
937 ;; Just move the 0xFE after the dive and delete the rest with 0xFF
938 ; movff eeprom_header_address+0, eeprom_address+0
939 ; movff eeprom_header_address+1, eeprom_address+1 ; Write target
940 ; movlw 0xFE
941 ; call I2CWRITE ; Write the byte
942 ;
943 ;; Now, delete everything _between_ eeprom_header_address and divemins:2+2 with 0xFF
944 ; movlw d'1' ;
945 ; addwf eeprom_header_address+0,F
946 ; movlw d'0'
947 ; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
948 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
949 ; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
950 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
951 ; clrf eeprom_header_address+1 ; Yes, clear address
952 ;
953 ; movff eeprom_header_address+0,eeprom_address+0
954 ; movff eeprom_header_address+1,eeprom_address+1
955 ;
956 ; movlw d'1' ;
957 ; addwf divemins+0,F
958 ; movlw d'0'
959 ; addwfc divemins+1,F ; divemins:2 + 1
960 ; btfss divemins+1,7 ; at 7FFF?
961 ; bra profileview_menu_delete_loop2a ; Skip
962 ; clrf divemins+0 ; Yes, clear address
963 ; clrf divemins+1
964 ;
965 ;; movff eeprom_header_address+0,eeprom_address+0
966 ;; movff eeprom_header_address+1,eeprom_address+1
967 ;
968 ;
969 ;profileview_menu_delete_loop2a:
970 ; movlw 0xFF
971 ; call I2CWRITE ; Write the byte
972 ;
973 ; incf_eeprom_address d'1' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
974 ;
975 ; movff divemins+0,sub_a+0
976 ; movff divemins+1,sub_a+1
977 ; movff eeprom_address+0,sub_b+0
978 ; movff eeprom_address+1,sub_b+1
979 ; call sub16 ; sub_c = sub_a - sub_b
980 ; tstfsz sub_c+0 ; Done (Result=Zero?) ?
981 ; bra profileview_menu_delete_loop2a ; No, continue
982 ; tstfsz sub_c+1 ; Done (Result=Zero?) ?
983 ; bra profileview_menu_delete_loop2a ; No, continue
984 ; goto menu_logbook ; Return to list when done deleting
985 ;
986 ;profileview_menu_delete_notlast:
987 ;; Move everything byte-wise from divemins:2 to eeprom_header_address:2 until 0xFD 0xFD 0xFE is found and were moved
988 ; call get_free_EEPROM_location ; Searches 0xFD, 0xFD, 0xFE and sets Pointer to 0xFE
989 ;
990 ; incf_eeprom_address d'2' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
991 ; movff eeprom_address+0,profile_temp+0
992 ; movff eeprom_address+1,profile_temp+1
993 ;; holds now address of 0xFE + 2 (Abort condition....)
994 ; decf_eeprom_address d'2' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000
995 ;; holds now address of 0xFE again
996 ; movff eeprom_address+0,divemins+0
997 ; movff eeprom_address+1,divemins+1 ; Copy to working read registers
998 ;
999 ;profileview_menu_delete_loop3:
1000 ; movff divemins+0,eeprom_address+0
1001 ; movff divemins+1,eeprom_address+1 ; Read source
1002 ; call I2CREAD ; reads one byte (Slow! Better use Blockread!)
1003 ; movff eeprom_header_address+0, eeprom_address+0
1004 ; movff eeprom_header_address+1, eeprom_address+1 ; Write target
1005 ; call I2CWRITE ; Write the byte
1006 ;
1007 ; movff divemins+0,eeprom_address+0
1008 ; movff divemins+1,eeprom_address+1 ; Set to source again
1009 ; movlw 0xFF
1010 ; call I2CWRITE ; Delete the source....
1011 ;
1012 ; movlw d'1'
1013 ; addwf divemins+0,F ; Increase source (Divemins:2)
1014 ; movlw d'0'
1015 ; addwfc divemins+1,F
1016 ; btfsc divemins+1,7 ; at 0x8000?
1017 ; clrf divemins+0 ; Yes, clear address (+0 first!)
1018 ; btfsc divemins+1,7 ; at 0x8000?
1019 ; clrf divemins+1 ; Yes, clear address
1020 ;
1021 ; movlw d'1' ; Increase target (eeprom_header_address:2)
1022 ; addwf eeprom_header_address+0,F
1023 ; movlw d'0'
1024 ; addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
1025 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
1026 ; clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
1027 ; btfsc eeprom_header_address+1,7 ; at 7FFF?
1028 ; clrf eeprom_header_address+1 ; Yes, clear address
1029 ;
1030 ; movff divemins+0,sub_a+0
1031 ; movff divemins+1,sub_a+1
1032 ; movff profile_temp+0,sub_b+0
1033 ; movff profile_temp+1,sub_b+1
1034 ; call sub16 ; sub_c = sub_a - sub_b
1035 ; tstfsz sub_c+0 ; Done (Result=Zero?) ?
1036 ; bra profileview_menu_delete_loop3 ; No, continue
1037 ; tstfsz sub_c+1 ; Done (Result=Zero?) ?
1038 ; bra profileview_menu_delete_loop3 ; No, continue
1039 ;
1040 ; goto menu_logbook ; Return to list when done deleting
1041
1042
1043