# HG changeset patch # User heinrichsweikamp # Date 1519659628 -3600 # Node ID b455b31ce0220bbc92df2a393f14bea70a0e3ac7 # Parent f5de1ff88814bc3561e778a91e88994f88e905b6 work on 2.97 stable diff -r f5de1ff88814 -r b455b31ce022 src/aa_wordprocessor.asm --- a/src/aa_wordprocessor.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/aa_wordprocessor.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File aa_wordprocessor.asm +; File aa_wordprocessor.asm ## V2.97 ; ; Anti-aliased word processor ; @@ -8,200 +8,179 @@ ;============================================================================= ; HISTORY ; 2010-11-22 : [jDG] Creation. -; 2010-12-01 : [jDG] Adding 3bits antialiased fonts. +; 2010-12-01 : [jDG] Adding 3bits anti-aliased fonts. ; 2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0 ; 2012-08-12 : [mH] Moved font28 into bootloader section 0x1C000 ; ; BUGS : ; * If the three fonts are not in the same half of the PROM memory, TBLPTRU -; will be badly set, and font48 or font90 will display giberish... +; will be badly set, and font48 or font90 will display gibberish... ;============================================================================= ; ; MEMORY FOOTPRINT: ;------------------ ; -; wp_wordprocessor : 8KB, including fonts. -; aa_wordprocessor : 0.5KB code -; + 3.5KB aa_font28 (reduced to 99 chars) -; + 1.6KB aa_font48 -; + 2.2KB aa_font90 -; = 7.9 KB including fonts... +; wp_wordprocessor : 8 KB, including fonts +; aa_wordprocessor : 0.5 KB code +; + 3.5 KB aa_font28 (reduced to 99 chars) +; + 1.6 KB aa_font48 +; + 2.2 KB aa_font90 +; = 7.9 KB including fonts ; ; Input registers: -; buffer:26 String to print. -; win_font Font size (0=tiny, 1=small, 2=medium, 3=large) -; win_color1:2 16bits unpacked color -; win_top, win_leftx2 Position on screen -; win_inverse Inverse video mode. +; buffer:26 String to print +; win_font Font size (0=tiny, 1=small, 2=medium, 3=large) +; win_color1:2 16bits unpacked color +; win_top, win_leftx2 Position on screen +; win_inverse Inverse video mode ; ; Available general purpose registers: -; PRODH, PRODL (needed for array indexing) -; FSRx 12bits. Usefull as RAM pointers. +; PRODH, PRODL needed for array indexing) +; FSRx 12bits. Useful as RAM pointers. ;============================================================================= #include "hwos.inc" #include "tft.inc" - extern aa_font16_block - extern aa_font28_block - extern aa_font36_block - extern aa_font48_block - extern aa_font90_block - -;============================================================================= -; Temporary variables are overlayed in Bank 1, used also by C-code -; (p2_deco), MPLAB math and stdlib libraries. - - CBLOCK tmp ; Data overlay in reserved tmp area. - aa_flags:1 ; Various flags for aa_wordprocessor - aa_bitlen:1 ; Count of pixels when decoding bitmaps. - aa_start:2 ; PROM ptr to start of encoded bitmap - aa_end:2 ; and end of it. - aa_temp:2 ; Current color, divided by 2 or 4 - ; Reserved to tmp+0x08... - ENDC -; Flags allocation: -#define aa_antialias aa_flags,0 -#define aa_color_quart aa_flags,1 -#define aa_color_half aa_flags,2 + extern aa_font16_block + extern aa_font28_block + extern aa_font36_block + extern aa_font48_block + extern aa_font90_block ;------------------------------------------------------------------------------ ; Setup pointers for a char: -; Inputs WREG = char to draw, win_font -; Output aa_start, aa_end, win_height, aa_flags -; Trashed PRODH, PRODL, TBLPTR, TABLAT +; Inputs WREG = char to draw, win_font +; Output aa_start, aa_end, win_height, aa_flags +; Trashed PRODH, PRODL, TBLPTR, TABLAT ; -basic CODE +basic CODE aa_char_setup: - movwf PRODL ; save char into PROD for now. + movwf PRODL ; save char into PROD for now + movf win_font,W,BANKED ; Get font number (updates Z flag) + bnz aa_char_1 - movf win_font,W,BANKED ; Get font number (updates Z flag) - bnz aa_char_1 - - ; TINY font --------------------------------------------------------- - ; Font TINY character folding... + ; TINY font --------------------------------------------------------- + ; Font TINY character folding... aa_char_0: - movlw LOW aa_font16_block - movwf TBLPTRL - movlw HIGH aa_font16_block - movwf TBLPTRH - movlw UPPER aa_font16_block - movwf TBLPTRU - bra aa_char_99 - - ; SMALL font --------------------------------------------------------- - ; Font SMALL character folding... -aa_char_1: - decfsz WREG ; This is small font ??? - bra aa_char_2 + movlw LOW aa_font16_block + movwf TBLPTRL + movlw HIGH aa_font16_block + movwf TBLPTRH + movlw UPPER aa_font16_block + movwf TBLPTRU + bra aa_char_99 - movlw LOW aa_font28_block - movwf TBLPTRL - movlw HIGH aa_font28_block - movwf TBLPTRH - movlw UPPER aa_font28_block - movwf TBLPTRU - bra aa_char_99 - - ; STD font ----------------------------------------------------------- - ; Font SMALL character folding... -aa_char_2: - decfsz WREG ; This is small font ??? - bra aa_char_3 + ; SMALL font --------------------------------------------------------- + ; Font SMALL character folding... +aa_char_1: + decfsz WREG ; This is small font ??? + bra aa_char_2 + movlw LOW aa_font28_block + movwf TBLPTRL + movlw HIGH aa_font28_block + movwf TBLPTRH + movlw UPPER aa_font28_block + movwf TBLPTRU + bra aa_char_99 - movlw LOW aa_font36_block - movwf TBLPTRL - movlw HIGH aa_font36_block - movwf TBLPTRH - movlw UPPER aa_font36_block - movwf TBLPTRU - bra aa_char_99 + ; STD font ----------------------------------------------------------- + ; Font SMALL character folding... +aa_char_2: + decfsz WREG ; This is small font ??? + bra aa_char_3 + movlw LOW aa_font36_block + movwf TBLPTRL + movlw HIGH aa_font36_block + movwf TBLPTRH + movlw UPPER aa_font36_block + movwf TBLPTRU + bra aa_char_99 - ; MEDIUM font -------------------------------------------------------- + ; MEDIUM font -------------------------------------------------------- aa_char_3: - decfsz WREG ; This is medium font ??? - bra aa_char_4 + decfsz WREG ; This is medium font ??? + bra aa_char_4 - ; Font MEDIUM block: - movlw LOW aa_font48_block - movwf TBLPTRL - movlw HIGH aa_font48_block - movwf TBLPTRH - movlw UPPER aa_font48_block - movwf TBLPTRU - bra aa_char_99 + ; Font MEDIUM block: + movlw LOW aa_font48_block + movwf TBLPTRL + movlw HIGH aa_font48_block + movwf TBLPTRH + movlw UPPER aa_font48_block + movwf TBLPTRU + bra aa_char_99 - ; LARGE font --------------------------------------------------------- + ; LARGE font --------------------------------------------------------- aa_char_4: - ; Font LARGE block: - movlw LOW aa_font90_block - movwf TBLPTRL - movlw HIGH aa_font90_block - movwf TBLPTRH - movlw UPPER aa_font90_block - movwf TBLPTRU - - ; Execute font block ------------------------------------------------- -aa_char_99: - ; This is safe if the three fonts are in the same code segment - ; (and that segment do not span the 64K edge...) - movlw UPPER aa_font16_block - movwf TBLPTRU + ; Font LARGE block: + movlw LOW aa_font90_block + movwf TBLPTRL + movlw HIGH aa_font90_block + movwf TBLPTRH + movlw UPPER aa_font90_block + movwf TBLPTRU - ; Proceed to character substitutions + ; Execute font block ------------------------------------------------- +aa_char_99: + ; This is safe if the three fonts are in the same code segment + ; (and that segment do not span the 64K edge...) + movlw UPPER aa_font16_block + movwf TBLPTRU + + ; Proceed to character substitutions aa_char_30: - tblrd*+ ; Read FROM char - movf TABLAT,W ; Get it, and set Z,N - bz aa_char_32 ; Break at end of translations - - tblrd*+ ; Read TO char - cpfseq PRODL ; FROM == current char ? - bra aa_char_30 ; Different: loop - movff TABLAT, PRODL ; make substitution - bra aa_char_30 ; Loop. + tblrd*+ ; Read FROM char + movf TABLAT,W ; Get it, and set Z,N + bz aa_char_32 ; Break at end of translations - ; Make sure char is in the available range -aa_char_32: - tblrd*+ ; Read first char - movf TABLAT,W ; get it. - subwf PRODL,F ; (char - first) --> PRODL + tblrd*+ ; Read TO char + cpfseq PRODL ; FROM == current char ? + bra aa_char_30 ; Different: loop + movff TABLAT, PRODL ; make substitution + bra aa_char_30 ; Loop - tblrd*+ ; Read nb chars - movf TABLAT,W ; nbchars --> WREG - tblrd*+ ; Read default char - cpfslt PRODL ; if char > WREG ? - movff TABLAT,PRODL ; replace PRODL + ; Make sure char is in the available range +aa_char_32: + tblrd*+ ; Read first char + movf TABLAT,W ; get it + subwf PRODL,F ; (char - first) --> PRODL + tblrd*+ ; Read nb chars + movf TABLAT,W ; nbchars --> WREG + tblrd*+ ; Read default char + cpfslt PRODL ; if char > WREG ? + movff TABLAT,PRODL ; replace PRODL - ; Decode font height and anti-aliasing mode - clrf aa_flags ; Default to no AA - tblrd*+ ; Read font height + AA flag - movf TABLAT,W ; into WREG - bnn aa_char_34 ; High bit set ? - bsf aa_antialias ; YES : then the font is AA. + ; Decode font height and anti-aliasing mode + clrf aa_flags ; Default to no AA + tblrd*+ ; Read font height + AA flag + movf TABLAT,W ; into WREG + bnn aa_char_34 ; High bit set ? + bsf aa_antialias ; YES : then the font is AA aa_char_34: - andlw 0x7F ; Keep just font height, - movwf win_height,BANKED ; then save it (its a register) + andlw 0x7F ; Keep just font height, + movwf win_height,BANKED ; then save it (its a register) - ; Set PROM pointer to the char index - movf PRODL,W ; Read back char - mullw 2 ; PROD = 2*(char - base), TBLPTR=idx - movf PRODL,W - addwf TBLPTRL,F ; Add into TBLPTR (low byte) - movf PRODH,W - addwfc TBLPTRH,F ; and high byte. + ; Set PROM pointer to the char index + movf PRODL,W ; Read back char + mullw 2 ; PROD = 2*(char - base), TBLPTR=idx + movf PRODL,W + addwf TBLPTRL,F ; Add into TBLPTR (low byte) + movf PRODH,W + addwfc TBLPTRH,F ; and high byte - ; Read start and stop pointers - tblrd*+ ; aa_start = PROM16(*tblptr++) - movff TABLAT,aa_start+0 ; Read low byte - tblrd*+ - movff TABLAT,aa_start+1 ; and high byte + ; Read start and stop pointers + tblrd*+ ; aa_start = PROM16(*tblptr++) + movff TABLAT,aa_start+0 ; Read low byte + tblrd*+ + movff TABLAT,aa_start+1 ; and high byte - tblrd*+ ; aa_end = PROM16(*tblptr++) - movff TABLAT,aa_end+0 ; Read low byte - tblrd*+ - movff TABLAT,aa_end+1 ; and high byte + tblrd*+ ; aa_end = PROM16(*tblptr++) + movff TABLAT,aa_end+0 ; Read low byte + tblrd*+ + movff TABLAT,aa_end+1 ; and high byte - return + return ;------------------------------------------------------------------------------ ; Character width @@ -210,253 +189,254 @@ ; Trashed aa_bitlen, TBLPTR, TABLAT ; aa_char_width: - movff aa_start+0, TBLPTRL ; TBLPTR = aa_start - movff aa_start+1, TBLPTRH - clrf aa_bitlen ; clear reminders... + movff aa_start+0, TBLPTRL ; TBLPTR = aa_start + movff aa_start+1, TBLPTRH + clrf aa_bitlen ; clear reminders... ; Read bitmap byte, and decode length: aa_char_width_1: - ifdef AA_BYTE_SWAP - btg TBLPTRL,0 ; Toggle low ptr bit. + + ifdef AA_BYTE_SWAP + btg TBLPTRL,0 ; Toggle low ptr bit tblrd* - movf TABLAT,W ; Store to WREG - btg TBLPTRL,0 ; Get is back - tblrd*+ ; then increment (but trash TABLAT) - movwf TABLAT ; Then restore copy to TABLAT. - else - tblrd*+ ; Normal read... - movf TABLAT,W ; Store copy to WREG - endif - btfss aa_antialias ; Antialiased font ? - bra aa_char_width_10 ; No: always 7 bits count + movf TABLAT,W ; Store to WREG + btg TBLPTRL,0 ; Get is back + tblrd*+ ; then increment (but trash TABLAT) + movwf TABLAT ; Then restore copy to TABLAT + else + tblrd*+ ; Normal read... + movf TABLAT,W ; Store copy to WREG + endif + + btfss aa_antialias ; Anti-aliased font ? + bra aa_char_width_10 ; No: always 7 bits count - bn aa_char_width_10 ; Non-white pixels ? - andlw 0x1F ; Yes : 5 bits count. + bn aa_char_width_10 ; Non-white pixels ? + andlw 0x1F ; Yes : 5 bits count aa_char_width_10: - andlw 0x7F ; No: 7 bit count. - incf WREG ; WREG = repetition count - addwf aa_bitlen,F ; Add remaining pixels from last code. - - movf win_height,W,BANKED ; WREG = - height - negf WREG + andlw 0x7F ; No: 7 bit count + incf WREG ; WREG = repetition count + addwf aa_bitlen,F ; Add remaining pixels from last code + + movf win_height,W,BANKED ; WREG = - height + negf WREG - ; This is a hand-made division by successive substraction of height + ; This is a hand-made division by successive subtraction of height aa_char_width_2: - addwf aa_bitlen,F ; Try to substract win_height - bn aa_char_width_3 ; If neg it was a bad idea... + addwf aa_bitlen,F ; Try to subtract win_height + bn aa_char_width_3 ; If neg it was a bad idea... - infsnz win_width+0,F ; Succeded: do a 16bit increment - incf win_width+1,F ; on the win_width counter. - bra aa_char_width_2 ; and loop. + infsnz win_width+0,F ; Succeeded: do a 16bit increment + incf win_width+1,F ; on the win_width counter + bra aa_char_width_2 ; and loop aa_char_width_3: - negf WREG ; WREG = +height - addwf aa_bitlen,F ; Restore true reminder. + negf WREG ; WREG = +height + addwf aa_bitlen,F ; Restore true reminder - ; Are we done ? - movf TBLPTRL,W ; Compare TBLPTR to aa_end - cpfseq aa_end+0 - bra aa_char_width_1 ; Loop if LOW is different - movf TBLPTRH,W - cpfseq aa_end+1 ; Loop to if HIGH is different - bra aa_char_width_1 - - return + ; Are we done ? + movf TBLPTRL,W ; Compare TBLPTR to aa_end + cpfseq aa_end+0 + bra aa_char_width_1 ; Loop if LOW is different + movf TBLPTRH,W + cpfseq aa_end+1 ; Loop to if HIGH is different + bra aa_char_width_1 + return ;------------------------------------------------------------------------------ ; String width -; Inputs buffer (SHOULD BE NULL TERMINATED) -; Output win_width, win_height -; Trashed PROD, TBLPTR, FSR2, aa_bitlen, aa_start, aa_end, aa_flags +; Inputs buffer (SHOULD BE NULL TERMINATED) +; Output win_width, win_height +; Trashed PROD, TBLPTR, FSR2, aa_bitlen, aa_start, aa_end, aa_flags ; aa_string_width: - lfsr FSR2, buffer ; FSR2 pointer to start of string. - - clrf win_width+0 ; Clear width sum. - clrf win_width+1 ; (16 bit counter) + lfsr FSR2, buffer ; FSR2 pointer to start of string + clrf win_width+0 ; Clear width sum + clrf win_width+1 ; (16 bit counter) aa_string_width_1: - movf POSTINC2,W ; WREG = *FSR2++ - bz aa_string_width99 ; Exit if null byte encountered. + movf POSTINC2,W ; WREG = *FSR2++ + bz aa_string_width99 ; Exit if null byte encountered - rcall aa_char_setup ; setup aa_start / aa_end - rcall aa_char_width ; sum-up width into win_width - bra aa_string_width_1 ; and loop. + rcall aa_char_setup ; setup aa_start / aa_end + rcall aa_char_width ; sum-up width into win_width + bra aa_string_width_1 ; and loop aa_string_width99: - return + return ;------------------------------------------------------------------------------ ; Decode a compressed char. -; Inputs aa_start, aa_end, win_height, win_invert, win_color1, win_color2 -; Output none -; Trashed TBLPTR, TABLAT, PROD, aa_bitlen, aa_flags, aa_colorDir:2 +; Inputs aa_start, aa_end, win_height, win_invert, win_color1, win_color2 +; Output none +; Trashed TBLPTR, TABLAT, PROD, aa_bitlen, aa_flags, aa_colorDir:2 ; aa_decode_char: - movff aa_start+0, TBLPTRL ; TBLPTR = aa_start - movff aa_start+1, TBLPTRH + movff aa_start+0, TBLPTRL ; TBLPTR = aa_start + movff aa_start+1, TBLPTRH - ; Read bitmap byte, and decode color & length + ; Read bitmap byte, and decode color & length aa_decode_1: - ifdef AA_BYTE_SWAP - btg TBLPTRL,0 ; Toggle low ptr bit. + + ifdef AA_BYTE_SWAP + btg TBLPTRL,0 ; Toggle low ptr bit tblrd* - movf TABLAT,W ; Store to WREG - btg TBLPTRL,0 ; Get is back - tblrd*+ ; then increment (but trash TABLAT) - movwf TABLAT ; Then restore copy to TABLAT. - else - tblrd*+ ; Normal read... - movf TABLAT,W ; Store copy to WREG - endif - btfss aa_antialias ; Antialiased font ? - bra aa_decode_10 ; No: always 7 bits count - bn aa_decode_10 ; Non-white pixels ? - andlw 0x1F ; Yes : 5 bits count. -aa_decode_10: - andlw 0x7F ; No: 7 bit count. - incf WREG - movwf aa_bitlen ; repetition count --> aa_bitlen + movf TABLAT,W ; Store to WREG + btg TBLPTRL,0 ; Get is back + tblrd*+ ; then increment (but trash TABLAT) + movwf TABLAT ; Then restore copy to TABLAT + else + tblrd*+ ; Normal read... + movf TABLAT,W ; Store copy to WREG + endif - ;---- COLOR DECODING ------------------------------------------------- - ; - ; Code Normal Inverse - ; 1xx 0% 100% : Managed by aa_decode_13 - ; 011 25% 75% - ; 010 50% 50% - ; 001 75% 25% - ; 000 100% 0% : Managed by aa_decode_13 too. - ; - movf TABLAT,W ; Get back code - btfss aa_antialias ; Antialiased font ? - bra aa_decode_13 ; NO: 1bit case + btfss aa_antialias ; Anti-aliased font ? + bra aa_decode_10 ; No: always 7 bits count + bn aa_decode_10 ; Non-white pixels ? + andlw 0x1F ; Yes : 5 bits count +aa_decode_10: + andlw 0x7F ; No: 7 bit count + incf WREG + movwf aa_bitlen ; repetition count --> aa_bitlen - ; Asymetry test: 1xx code is another case for 1bit color. - ; This have to be done before inverse video, because - ; of the asymetric processing ! - bn aa_decode_13 ; decode as not-aa + ;---- COLOR DECODING ------------------------------------------------- + ; + ; Code Normal Inverse + ; 1xx 0% 100% : Managed by aa_decode_13 + ; 011 25% 75% + ; 010 50% 50% + ; 001 75% 25% + ; 000 100% 0% : Managed by aa_decode_13 too + ; + movf TABLAT,W ; Get back code + btfss aa_antialias ; Anti-aliased font ? + bra aa_decode_13 ; NO: 1bit case - ; Manage 000 special case too: - andlw 0xE0 ; Select color bits - bz aa_decode_13 ; That's a 000 ! + ; Asymmetry test: 1xx code is another case for 1bit color. + ; This have to be done before inverse video, because + ; of the asymmetric processing ! + bn aa_decode_13 ; decode as not-aa - ; Apply reverse video, in a reversed way - btfss win_invert ; Inverse video mode ? - sublw 0x80 + ; Manage 000 special case too: + andlw 0xE0 ; Select color bits + bz aa_decode_13 ; That's a 000 ! + + ; Apply reverse video, in a reversed way + btfss win_invert ; Inverse video mode ? + sublw 0x80 - ; Move the two bits to aa_color_half and aa_color_quarter: - swapf WREG ; --> 0000.0LL0 byte - iorlw b'001' ; We are in AA mode, don't forget it ! - movwf aa_flags ; save that to aa_color_(half/quad)/AA flags. + ; Move the two bits to aa_color_half and aa_color_quarter: + swapf WREG ; --> 0000.0LL0 byte + iorlw b'001' ; We are in AA mode, don't forget it ! + movwf aa_flags ; save that to aa_color_(half/quad)/AA flags - ;---- 2 bit x RGB(16bits) computation -------------------------------- - clrf PRODL ; We will accumulate result here... - clrf PRODH + ;---- 2 bit x RGB(16bits) computation -------------------------------- + clrf PRODL ; We will accumulate result here... + clrf PRODH - ; Take color div 2 into aa_temp. Max red = 15/31 - rrcf win_color1,W,BANKED ; xRRRRxGG - andlw b'01111011' ; 0RRRR0GG (don't change C) - movwf aa_temp+0 - rrcf win_color2,W,BANKED ; GGGxBBBB - andlw b'11101111' ; GGG0BBBB - movwf aa_temp+1 + ; Take color div 2 into aa_temp. Max red = 15/31 + rrcf win_color1,W,BANKED ; xRRRRxGG + andlw b'01111011' ; 0RRRR0GG (don't change C) + movwf aa_temp+0 + rrcf win_color2,W,BANKED ; GGGxBBBB + andlw b'11101111' ; GGG0BBBB + movwf aa_temp+1 - btfss aa_color_half - bra aa_decode_12 + btfss aa_color_half + bra aa_decode_12 - movff aa_temp+0,PRODH ; Add color/2 if bit set. - movff aa_temp+1,PRODL ; TFT is big endian, so swap here. + movff aa_temp+0,PRODH ; Add color/2 if bit set + movff aa_temp+1,PRODL ; TFT is big endian, so swap here aa_decode_12: - btfss aa_color_quart - bra aa_decode_3 + btfss aa_color_quart + bra aa_decode_3 - ; Divide it once again by 2. Max red = 7/31. - rrcf aa_temp+0,W ; xxRRRxxG - andlw b'00111001' ; 00RRR00G (don't change C) - movwf aa_temp+0 - rrcf aa_temp+1,W ; GGGxxBBB - andlw b'11100111' ; GGG00BBB - movwf aa_temp+1 + ; Divide it once again by 2. Max red = 7/31. + rrcf aa_temp+0,W ; xxRRRxxG + andlw b'00111001' ; 00RRR00G (don't change C) + movwf aa_temp+0 + rrcf aa_temp+1,W ; GGGxxBBB + andlw b'11100111' ; GGG00BBB + movwf aa_temp+1 - movf aa_temp+1,W ; Add color/4 - addwf PRODL,F ; NOTE: 7/31+15/31=22/31, - movf aa_temp+0,W ; hence composants won't overlap. - addwfc PRODH,F ; In right order, to propagate carry. + movf aa_temp+1,W ; Add color/4 + addwf PRODL,F ; NOTE: 7/31+15/31=22/31, + movf aa_temp+0,W ; hence components won't overlap + addwfc PRODH,F ; In right order, to propagate carry - bra aa_decode_3 ; Done. + bra aa_decode_3 ; Done - ; ---- Simple BLACK and WHITE cases ------------------------------ -aa_decode_13: ; Got a 1xx or a 000 code... - btfsc win_invert ; Inverse video mode ? - xorlw 0x80 ; YES: invert levels. - bn aa_decode_2 ; Then test high bit. + ; ---- Simple BLACK and WHITE cases ------------------------------ +aa_decode_13: ; Got a 1xx or a 000 code... + btfsc win_invert ; Inverse video mode ? + xorlw 0x80 ; YES: invert levels + bn aa_decode_2 ; Then test high bit - ; WHITE pixel (ie. full color) - bsf tft_rs,0 ; RS_H ; Data - movff win_color1,PORTA ; current draw color - movff win_color2,PORTH ; (rem: TFT is big endian) - bra aa_decode_4 + ; WHITE pixel (i.e. full color) + bsf tft_rs,0 ; RS_H Data + movff win_color1,PORTA ; current draw color + movff win_color2,PORTH ; (rem: TFT is big endian) + bra aa_decode_4 aa_decode_2: - bsf tft_rs,0 ; RS_H ; Data - clrf PORTA ; BLACK pixel - clrf PORTH - bra aa_decode_4 + bsf tft_rs,0 ; RS_H Data + clrf PORTA ; BLACK pixel + clrf PORTH + bra aa_decode_4 aa_decode_3: - bsf tft_rs,0 ; RS_H ; Data - movff PRODH,PORTA ; Move high byte to PORTA - movff PRODL,PORTH ; Move low byte to PORTH + bsf tft_rs,0 ; RS_H Data + movff PRODH,PORTA ; Move high byte to PORTA + movff PRODL,PORTH ; Move low byte to PORTH aa_decode_4: bcf INTCON,GIE aa_decode_4a: - ;---- PIXEL WRITE LOOP ----------------------------------------------- - bcf tft_nwr,0 ; WR_L - bsf tft_nwr,0 ; WR_H ; Tick + ;---- PIXEL WRITE LOOP ----------------------------------------------- + bcf tft_nwr,0 ; WR_L + bsf tft_nwr,0 ; WR_H Tick + + decf aa_bitlen,F + bnz aa_decode_4a - decf aa_bitlen,F - bnz aa_decode_4a - - bsf INTCON,GIE - ;---- BYTE-CODE LOOP ------------------------------------------------- - ; Are we done ? - movf TBLPTRL,W ; Compare TBLPTR to aa_end - cpfseq aa_end+0 - bra aa_decode_1 ; Loop if LOW is different - movf TBLPTRH,W - cpfseq aa_end+1 ; Loop too if HIGH is different - bra aa_decode_1 - - return + bsf INTCON,GIE + ;---- BYTE-CODE LOOP ------------------------------------------------- + ; Are we done ? + movf TBLPTRL,W ; Compare TBLPTR to aa_end + cpfseq aa_end+0 + bra aa_decode_1 ; Loop if LOW is different + movf TBLPTRH,W + cpfseq aa_end+1 ; Loop too if HIGH is different + bra aa_decode_1 + return ;------------------------------------------------------------------------------ ; Setup pointers for a char: ; Inputs : buffer : string to print (SHOULD BE NULL TERMINATED) ; Output : TFT commands on port D + clocks. ; - global aa_wordprocessor ; Callable from C-code. + global aa_wordprocessor ; Callable from C-code aa_wordprocessor: - banksel win_font ; Bank1, just to be sure. - rcall aa_string_width ; Set win_height, compute win_width:2 - call TFT_box_write ; Use that for the box. + banksel win_font ; Bank1, just to be sure + rcall aa_string_width ; Set win_height, compute win_width:2 + call TFT_box_write ; Use that for the box - ; Restart the loop for each char to print - lfsr FSR2, buffer ; FSR2 pointer to start of string. + ; Restart the loop for each char to print + lfsr FSR2, buffer ; FSR2 pointer to start of string - ; DATA block comand - Index_out 0x22 + ; DATA block command + Index_out 0x22 ; Index_out is a macro defined in tft.inc aa_wordprocessor_1: - movf POSTINC2,W ; WREG = *FSR2++ - bz aa_wordprocessor_99 ; Exit if null byte encountered. + movf POSTINC2,W ; WREG = *FSR2++ + bz aa_wordprocessor_99 ; Exit if null byte encountered - rcall aa_char_setup ; setup aa_start / aa_end - rcall aa_decode_char ; write pixels to screen - bra aa_wordprocessor_1 ; and loop. + rcall aa_char_setup ; setup aa_start / aa_end + rcall aa_decode_char ; write pixels to screen + bra aa_wordprocessor_1 ; and loop aa_wordprocessor_99: - ; END of bloc commande - Index_out 0x00 + ; END of bloc command + Index_out 0x00 + return - return - END \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/adc_lightsensor.asm --- a/src/adc_lightsensor.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/adc_lightsensor.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File adc.asm +; File adc.asm V2.98 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -14,126 +14,130 @@ #include "eeprom_rs232.inc" #include "i2c.inc" -sensors CODE + extern reset_battery_internal_only + +sensors CODE + +;============================================================================= wait_adc: movwf ADCON0 - nop - bsf ADCON0,1 ; start ADC + nop + bsf ADCON0,1 ; start ADC wait_adc2: - btfsc ADCON0,1 ; Wait... + btfsc ADCON0,1 ; Wait... bra wait_adc2 - return + return global get_battery_voltage -get_battery_voltage: ; starts ADC and waits until fnished - btfss battery_gauge_available - bra get_battery_voltage1 ; Normal ostc3 hardware +get_battery_voltage: ; starts ADC and waits until finished + btfss battery_gauge_available + bra get_battery_voltage1 ; Normal ostc3 hardware - call lt2942_get_accumulated_charge - call lt2942_get_voltage - - tstfsz batt_voltage+1 ; <256mV? - bra get_battery_voltage_noretry ; No + call lt2942_get_accumulated_charge + call lt2942_get_voltage + + tstfsz batt_voltage+1 ; <256mV? + bra get_battery_voltage_noretry ; No - ; Retry - call lt2942_get_accumulated_charge - call lt2942_get_voltage - + ; Retry + call lt2942_get_accumulated_charge + call lt2942_get_voltage + get_battery_voltage_noretry: - btfsc divemode - return ; Not in divemode + btfsc divemode + return ; Not in divemode - bcf cv_active - bcf cc_active - bcf LEDr - bcf TRISJ,2 ; Chrg-Out output - bsf CHRG_OUT + bcf cv_active + bcf cc_active + bcf LEDr + bcf TRISJ,2 ; Chrg-Out output + bsf CHRG_OUT - btfss CHRG_IN - bra charge_cc_active + btfss CHRG_IN + bra charge_cc_active - bcf CHRG_OUT - bsf TRISJ,2 ; Chrg-Out high impedance + bcf CHRG_OUT + bsf TRISJ,2 ; Chrg-Out high impedance - WAITMS d'1' + WAITMS d'1' - btfsc CHRG_IN - return -;cv_active: - decfsz safety_stop_countdown,F - return - movlw .15 - cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? - bra charge_cc_active ; No - bsf cc_active - bsf cv_active - bsf LEDr ; Indicate charging - call lt2942_charge_done ; Reset accumulating registers to 0xFFFF - WAITMS d'10' - bcf LEDr ; Indicate charging - bsf safety_stop_countdown,0 ; =1 - return + btfsc CHRG_IN + return + ;cv_active: + decfsz get_bat_volt_counter,F + return + movlw .15 + cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? + bra charge_cc_active ; No + bsf cc_active + bsf cv_active + bsf LEDr ; Indicate charging + call lt2942_charge_done ; Reset accumulating registers to 0xFFFF + WAITMS d'10' + bcf LEDr ; Indicate charging + bsf get_bat_volt_counter,0 ; =1 + return charge_cc_active: - bsf cc_active - bsf LEDr ; Indicate charging - bcf CHRG_OUT - bsf TRISJ,2 ; Chrg-Out high impedance - movlw .10 - movwf safety_stop_countdown - return + bsf cc_active + bsf LEDr ; Indicate charging + bcf CHRG_OUT + bsf TRISJ,2 ; Chrg-Out high impedance + movlw .10 + movwf get_bat_volt_counter + return get_battery_voltage1: - bsf adc_running ; =1: The ADC is in use - movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV + bsf adc_running ; =1: The ADC is in use + movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV movwf ADCON1 - movlw b'00011001' ; power on ADC, select AN6 - rcall wait_adc + movlw b'00011001' ; power on ADC, select AN6 + rcall wait_adc - movff ADRESH,batt_voltage+1 ; store value - movff ADRESL,batt_voltage+0 ; store value - bcf ADCON0,0 ; power off ADC + movff ADRESH,batt_voltage+1 ; store value + movff ADRESL,batt_voltage+0 ; store value + bcf ADCON0,0 ; power off ADC -; Multiply with 2,006 to be excact here... +; Multiply with 2,006 to be exact here... ; bcf STATUS,C ; rlcf xA+0,F ; -; rlcf xA+1,F ; x2 +; rlcf xA+1,F ; x2 -; movff xA+0,batt_voltage+0 ; store value +; movff xA+0,batt_voltage+0 ; store value ; movff xA+1,batt_voltage+1 - movlw LOW lithium_36v_low + movlw LOW lithium_36v_low movwf sub_a+0 - movlw HIGH lithium_36v_low + movlw HIGH lithium_36v_low movwf sub_a+1 movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b -; Battery is 3,6V (>lithium_36v_low?) + call subU16 ; sub_c = sub_a - sub_b + ; Battery is 3,6V (>lithium_36v_low?) btfss neg_flag - bra get_battery_voltage4 ; No, use 1,5V + bra get_battery_voltage4 ; No, use 1,5V - bsf battery_is_36v ; Yes, set flag (Cleared in power-on reset only!) + bsf battery_is_36v ; Yes, set flag (Cleared in power-on reset only!) -; Check if the battery is near-dead already - movlw LOW lithium_36v_empty + ; Check if the battery is near-dead already + movlw LOW lithium_36v_empty movwf sub_a+0 - movlw HIGH lithium_36v_empty + movlw HIGH lithium_36v_empty movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b -; Battery is not dead yet (>lithium_36v_empty?) + call subU16 ; sub_c = sub_a - sub_b + ; Battery is not dead yet (>lithium_36v_empty?) btfsc neg_flag - bra get_battery_voltage2 ; Yes, battery is still ok + bra get_battery_voltage2 ; Yes, battery is still ok - ; Battery is probably dead very soon - ; Set ">=24Ah used" into battery gauge registers - movlw .128 - movff WREG,battery_gauge+5 + ; Battery is probably dead very soon + ; Set ">=24Ah used" into battery gauge registers + movlw .128 + movff WREG,battery_gauge+5 get_battery_voltage2: - ; Use 3,6V battery gauging mode + ; Use 3,6V battery gauging mode movff battery_gauge+5,xC+3 movff battery_gauge+4,xC+2 movff battery_gauge+3,xC+1 @@ -144,12 +148,12 @@ ; Result is in percent movff internal_battery_capacity+0,xB+0 movff internal_battery_capacity+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo - ; Limit to 100 - movlw .100 - cpfslt lo - movwf lo + ; Limit to 100 + movlw .100 + cpfslt lo + movwf lo ; lo will be between 0 (Full) and 100 (empty) movf lo,W sublw .100 @@ -160,117 +164,118 @@ movwf lo ; lo will be between 100 (Full) and 0 (empty) -; use 3,6V battery sensing based on 50mA load -; 75% + ; use 3,6V battery sensing based on 50mA load + ; 75% movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 - movlw LOW lithium_36v_75 + movlw LOW lithium_36v_75 movwf sub_a+0 - movlw HIGH lithium_36v_75 + movlw HIGH lithium_36v_75 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3a - movlw .75 - movwf lo + bra get_battery_voltage3a + movlw .75 + movwf lo get_battery_voltage3a: ; 50% - movlw LOW lithium_36v_50 + movlw LOW lithium_36v_50 movwf sub_a+0 - movlw HIGH lithium_36v_50 + movlw HIGH lithium_36v_50 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3b - movlw .50 - movwf lo + bra get_battery_voltage3b + movlw .50 + movwf lo get_battery_voltage3b: - ; 25% - movlw LOW lithium_36v_25 + ; 25% + movlw LOW lithium_36v_25 movwf sub_a+0 - movlw HIGH lithium_36v_25 + movlw HIGH lithium_36v_25 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3c - movlw .25 - movwf lo + bra get_battery_voltage3c + movlw .25 + movwf lo get_battery_voltage3c: - ; 10% - movlw LOW lithium_36v_10 + ; 10% + movlw LOW lithium_36v_10 movwf sub_a+0 - movlw HIGH lithium_36v_10 + movlw HIGH lithium_36v_10 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3d - movlw .10 - movwf lo + bra get_battery_voltage3d + movlw .10 + movwf lo get_battery_voltage3d: movlw .100 cpfslt lo movwf lo ; lo will be between 100 (Full) and 0 (empty) - movf batt_percent,W - cpfsgt lo ; keep batt_percent on the lowest value found - movff lo,batt_percent ; store value - btfsc battery_is_36v ; but always use computed value for 3,6V battery - movff lo,batt_percent ; store value - bcf adc_running ; =1: The ADC is in use + movf batt_percent,W + cpfsgt lo ; keep batt_percent on the lowest value found + movff lo,batt_percent ; store value + btfsc battery_is_36v ; but always use computed value for 3,6V battery + movff lo,batt_percent ; store value + bcf adc_running ; =1: The ADC is in use return get_battery_voltage4: - ; Use 1,5V battery voltage mode - ; Use approximation (batt_voltage:2-aa_15v_low)/4 = lo + ; Use 1,5V battery voltage mode + ; Use approximation (batt_voltage:2-aa_15v_low)/4 = lo movff batt_voltage+0,sub_a+0 movff batt_voltage+1,sub_a+1 - movlw LOW aa_15v_low - movwf sub_b+0 - movlw HIGH aa_15v_low + movlw LOW aa_15v_low + movwf sub_b+0 + movlw HIGH aa_15v_low movwf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - bcf STATUS,C - rrcf sub_c+1 - rrcf sub_c+0 ; /2 - bcf STATUS,C - rrcf sub_c+1 - rrcf sub_c+0 ; /4 - movff sub_c+0,lo - bra get_battery_voltage3d ; Check limits and return + call subU16 ; sub_c = sub_a - sub_b + bcf STATUS,C + rrcf sub_c+1 + rrcf sub_c+0 ; /2 + bcf STATUS,C + rrcf sub_c+1 + rrcf sub_c+0 ; /4 + movff sub_c+0,lo + bra get_battery_voltage3d ; Check limits and return global get_ambient_level -get_ambient_level: ; starts ADC and waits until finished - btfsc adc_running ; ADC in use? - return ; Yes, return +get_ambient_level: ; starts ADC and waits until finished + btfsc adc_running ; ADC in use? + return ; Yes, return - btfsc ambient_sensor - bra get_ambient_level1 ; Normal ostc3 hardware + btfsc ambient_sensor + bra get_ambient_level1 ; Normal ostc3 hardware - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - incf isr1_temp,F ; adjust 0-2 to 1-3 - movlw ambient_light_max_high_cr; cR and 2 hardware brightest setting + incf isr1_temp,F ; adjust 0-2 to 1-3 + movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_eco ; brightest setting + movlw ambient_light_max_eco ; brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_medium; brightest setting + movlw ambient_light_max_medium ; brightest setting - movff WREG,ambient_light+0 ; Set to max. - movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt + movff WREG,ambient_light+0 ; Set to max. + movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt return get_ambient_level1: - movlw b'00000000' ; Vref+ = Vdd + movlw b'00000000' ; Vref+ = Vdd movwf ADCON1 - movlw b'00011101' ; power on ADC, select AN7 - rcall wait_adc + movlw b'00011101' ; power on ADC, select AN7 + rcall wait_adc movff ADRESH,ambient_light+1 movff ADRESL,ambient_light+0 - bcf ADCON0,0 ; power off ADC + bcf ADCON0,0 ; power off ADC ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) - ; First: Devide through 16 + ; First: Divide by 16 + banksel ambient_light bcf STATUS,C rrcf ambient_light+1 rrcf ambient_light+0 @@ -286,384 +291,367 @@ ; Result: ambient_light:2/16 ; Now, make sure to have value between ambient_light_low and ambient_light_max - movlw .254 - tstfsz ambient_light+1 ; >255? - movwf ambient_light+0 ; avoid ADC clipping + movlw .254 + tstfsz ambient_light+1 ; >255? + movwf ambient_light+0 ; avoid ADC clipping - incfsz ambient_light+0,W ; =255? - bra get_ambient_level2 ; No, continue + incfsz ambient_light+0,W ; =255? + bra get_ambient_level2 ; No, continue - movlw .254 - movwf ambient_light+0 ; avoid ADC clipping + movlw .254 + movwf ambient_light+0 ; avoid ADC clipping get_ambient_level2: -; movlw .10 -; subwf ambient_light+0,F ; Subtract 10 (ADC Offset) -; btfsc STATUS,N -; movwf ambient_light+0 ; avoid clipping +; movlw .10 +; subwf ambient_light+0,F ; Subtract 10 (ADC Offset) +; btfsc STATUS,N +; movwf ambient_light+0 ; avoid clipping - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - btfsc RCSTA1,7 ; UART module on? - clrf isr1_temp ; Yes, set temporally to eco mode + btfsc RCSTA1,7 ; UART module on? + clrf isr1_temp ; Yes, set temporally to eco mode - incf isr1_temp,F ; adjust 0-2 to 1-3 + incf isr1_temp,F ; adjust 0-2 to 1-3 - banksel common ; flag is in bank1 - movlw ambient_light_max_high_cr; cR and 2 hardware brightest setting - btfss battery_gauge_available - movlw ambient_light_max_high_15V; 1,5V battery brightest setting - btfsc battery_is_36v ; 3,6V battery in use? - movlw ambient_light_max_high_36V ; 3,6V battery brightest setting - banksel isr_backup ; Back to Bank0 ISR data + banksel common ; flag is in bank1 + movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting + btfss battery_gauge_available + movlw ambient_light_max_high_15V ; 1,5V battery brightest setting + btfsc battery_is_36v ; 3,6V battery in use? + movlw ambient_light_max_high_36V ; 3,6V battery brightest setting + banksel isr_backup ; Back to Bank0 ISR data dcfsnz isr1_temp,F - movlw ambient_light_max_eco ; brightest setting + movlw ambient_light_max_eco ; brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_medium; brightest setting + movlw ambient_light_max_medium ; brightest setting - banksel common ; ambient_light is in Bank1 - incf ambient_light+0,F ; +1 - cpfslt ambient_light+0 ; smaller then WREG? - movwf ambient_light+0 ; No, set to max. + banksel ambient_light + incf ambient_light+0,F ; +1 + cpfslt ambient_light+0 ; smaller then WREG? + movwf ambient_light+0 ; No, set to max. - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - incf isr1_temp,F ; adjust 0-2 to 1-3 - movlw ambient_light_min_high ; darkest setting + incf isr1_temp,F ; adjust 0-2 to 1-3 + movlw ambient_light_min_high ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_eco ; darkest setting + movlw ambient_light_min_eco ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_medium; darkest setting + movlw ambient_light_min_medium ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_high ; darkest setting - - banksel common ; ambient_light is in Bank1 - cpfsgt ambient_light+0 ; bigger then WREG? - movwf ambient_light+0 ; No, set to min - - movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt + movlw ambient_light_min_high ; darkest setting + + banksel ambient_light + cpfsgt ambient_light+0 ; bigger then WREG? + movwf ambient_light+0 ; No, set to min + banksel common + + movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt return global get_analog_inputs -get_analog_inputs: ; starts ADC and waits until finished - bsf adc_running ; =1: The ADC is in use - btfsc TFT_PWM - bra get_analog_inputs ; Wait for PWM low - movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV +get_analog_inputs: ; starts ADC and waits until finished + bsf adc_running ; =1: The ADC is in use + btfsc TFT_PWM + bra get_analog_inputs ; Wait for PWM low + movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV movwf ADCON1 - movlw b'00100001' ; power on ADC, select AN8 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor1:2 - addwf o2_mv_sensor1+0,F - movf ADRESH,W - addwfc o2_mv_sensor1+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor1+1,F ; /2 - rrcf o2_mv_sensor1+0,F + movlw b'00100001' ; power on ADC, select AN8 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor1:2 + addwf o2_mv_sensor1+0,F + movf ADRESH,W + addwfc o2_mv_sensor1+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor1+1,F ; /2 + rrcf o2_mv_sensor1+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor1+1 ; >ignore_mv? - bra get_analog_inputs2a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor1+1 - clrf o2_mv_sensor1+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor1+1 ; >ignore_mv? + bra get_analog_inputs2a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor1+1 + clrf o2_mv_sensor1+0 get_analog_inputs2a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor1+1 ; >25,5mV? - bra get_analog_inputs2 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor1+0 ; >1,9mV? - clrf o2_mv_sensor1+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor1+1 ; >25,5mV? + bra get_analog_inputs2 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor1+0 ; >1,9mV? + clrf o2_mv_sensor1+0 ; no, clear result get_analog_inputs2: - movlw b'00100101' ; power on ADC, select AN9 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor2:2 - addwf o2_mv_sensor2+0,F - movf ADRESH,W - addwfc o2_mv_sensor2+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor2+1,F ; /2 - rrcf o2_mv_sensor2+0,F + movlw b'00100101' ; power on ADC, select AN9 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor2:2 + addwf o2_mv_sensor2+0,F + movf ADRESH,W + addwfc o2_mv_sensor2+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor2+1,F ; /2 + rrcf o2_mv_sensor2+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor2+1 ; >ignore_mv? - bra get_analog_inputs3a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor2+1 - clrf o2_mv_sensor2+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor2+1 ; >ignore_mv? + bra get_analog_inputs3a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor2+1 + clrf o2_mv_sensor2+0 get_analog_inputs3a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor2+1 ; >25,5mV? - bra get_analog_inputs3 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor2+0 ; >1,9mV? - clrf o2_mv_sensor2+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor2+1 ; >25,5mV? + bra get_analog_inputs3 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor2+0 ; >1,9mV? + clrf o2_mv_sensor2+0 ; no, clear result get_analog_inputs3: - movlw b'00101001' ; power on ADC, select AN10 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor3:2 - addwf o2_mv_sensor3+0,F - movf ADRESH,W - addwfc o2_mv_sensor3+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor3+1,F ; /2 - rrcf o2_mv_sensor3+0,F + movlw b'00101001' ; power on ADC, select AN10 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor3:2 + addwf o2_mv_sensor3+0,F + movf ADRESH,W + addwfc o2_mv_sensor3+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor3+1,F ; /2 + rrcf o2_mv_sensor3+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor3+1 ; >ignore_mv? - bra get_analog_inputs4a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor3+1 - clrf o2_mv_sensor3+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor3+1 ; >ignore_mv? + bra get_analog_inputs4a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor3+1 + clrf o2_mv_sensor3+0 get_analog_inputs4a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor3+1 ; >25,5mV? - bra get_analog_inputs4 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor3+0 ; >1,9mV? - clrf o2_mv_sensor3+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor3+1 ; >25,5mV? + bra get_analog_inputs4 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor3+0 ; >1,9mV? + clrf o2_mv_sensor3+0 ; no, clear result get_analog_inputs4: - bcf ADCON0,0 ; power off ADC - bcf adc_running ; =1: The ADC is in use - return + bcf ADCON0,0 ; power off ADC + bcf adc_running ; =1: The ADC is in use + return - global piezo_config ; Sets up piezo sensitivity of heinrichs weikamp Piezo buttons (~30ms) -piezo_config: ; Settings between 20 and 200 - clrf TMR5H - clrf TMR5L ; ~2sec - bcf PIR5,TMR5IF ; Clear flag - bcf switch_right - bcf switch_left + global piezo_config ; sets up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms) +piezo_config: ; Settings between 20 and 200 + clrf TMR5H + clrf TMR5L ; ~2sec + bcf PIR5,TMR5IF ; Clear flag + bcf switch_right + bcf switch_left piezo_config0: btfsc switch_right - bra piezo_config + bra piezo_config btfsc switch_left - bra piezo_config ; Restart on button press - + bra piezo_config ; Restart on button press + btfss PIR5,TMR5IF - bra piezo_config0 ; Wait loop + bra piezo_config0 ; Wait loop - bcf INTCON,GIE - movff opt_cR_button_right,WREG; right button - btfsc flip_screen ; 180° rotation ? - movff opt_cR_button_left,WREG ; Yes, left button - rcall piezo_config_tx + bcf INTCON,GIE + movff opt_cR_button_right,WREG ; right button + btfsc flip_screen ; 180° rotation ? + movff opt_cR_button_left,WREG ; Yes, left button + rcall piezo_config_tx - movff opt_cR_button_left,WREG ; left button - btfsc flip_screen ; 180° rotation ? - movff opt_cR_button_right,WREG; Yes, right button - rcall piezo_config_tx + movff opt_cR_button_left,WREG ; left button + btfsc flip_screen ; 180° rotation ? + movff opt_cR_button_right,WREG ; Yes, right button + rcall piezo_config_tx - movlw .20 ; reserved - rcall piezo_config_tx - movlw .20 ; reserved - rcall piezo_config_tx - bsf INTCON,GIE - return + movlw .20 ; reserved + rcall piezo_config_tx + movlw .20 ; reserved + rcall piezo_config_tx + bsf INTCON,GIE + return -piezo_config_tx: ; Send one byte - movwf uart1_temp ; Store byte - movlw .8 - movwf uart2_temp ; Bit counter - bcf TX3_PIEZO_CFG ; Startbit - rcall piezo_config_wait_bit +piezo_config_tx: ; send one byte + movwf lo ; store byte + movlw .8 + movwf hi ; bit counter + bcf TX3_PIEZO_CFG ; start bit + rcall piezo_config_wait_bit piezo_config_tx_loop: - btfss uart1_temp,0 ; LSB first - bcf TX3_PIEZO_CFG - btfsc uart1_temp,0 ; LSB first - bsf TX3_PIEZO_CFG - rcall piezo_config_wait_bit - rrncf uart1_temp,F - decfsz uart2_temp,F - bra piezo_config_tx_loop - bsf TX3_PIEZO_CFG ; Stopbit - rcall piezo_config_wait_bit - return + btfss lo,0 ; LSB first + bcf TX3_PIEZO_CFG + btfsc lo,0 ; LSB first + bsf TX3_PIEZO_CFG + rcall piezo_config_wait_bit + rrncf lo,F + decfsz hi,F + bra piezo_config_tx_loop + bsf TX3_PIEZO_CFG ; stop bit + rcall piezo_config_wait_bit + return piezo_config_wait_bit: - setf TMR5H - movlw .255-.26 ;26 x 31,5µs = 819us + setf TMR5H + movlw .255-.26 ; 26 x 31,5µs = 819us movwf TMR5L - bcf PIR5,TMR5IF ; Clear flag + bcf PIR5,TMR5IF ; Clear flag piezo_config_wait_bit3: - btfss PIR5,TMR5IF + btfss PIR5,TMR5IF bra piezo_config_wait_bit3 ; Wait loop return - global reset_battery_pointer, reset_battery_internal_only -reset_battery_pointer: ; Resets battery pointer 0x07-0x0C and battery_gauge:5 - extern lt2942_charge_done - btfsc battery_gauge_available ; Something to reset? - call lt2942_charge_done ; Yes, reset accumulating registers to 0xFFFF -reset_battery_internal_only: - clrf EEADRH - clrf EEDATA ; Delete to zero - write_int_eeprom 0x07 - write_int_eeprom 0x08 - write_int_eeprom 0x09 - write_int_eeprom 0x0A - write_int_eeprom 0x0B - write_int_eeprom 0x0C - banksel battery_gauge+0 - clrf battery_gauge+0 - clrf battery_gauge+1 - clrf battery_gauge+2 - clrf battery_gauge+3 - clrf battery_gauge+4 - clrf battery_gauge+5 - banksel common - movlw .100 - movwf batt_percent - return + global reset_battery_pointer +reset_battery_pointer: ; Resets battery pointer 0x07-0x0C and battery_gauge:5 + extern lt2942_charge_done + btfsc battery_gauge_available ; Something to reset? + call lt2942_charge_done ; Yes, reset accumulating registers to 0xFFFF + goto reset_battery_internal_only ; and return + + + global get_analog_switches +get_analog_switches: ; starts ADC and waits until finished + btfsc analog_switches + bra get_analog_switches2 + ; no analog switches + bcf analog_sw2_pressed + bcf analog_sw1_pressed + return ; Done. +get_analog_switches2: + btfsc adc_running ; ADC in use? + return ; Yes, return - global get_analog_switches -get_analog_switches: ; starts ADC and waits until finished - btfsc analog_switches - bra get_analog_switches2 - ; no analog switches - bcf analog_sw2_pressed - bcf analog_sw1_pressed - return ; Done. -get_analog_switches2: - btfsc adc_running ; ADC in use? - return ; Yes, return - - movlw b'00001001' ; left justified - movwf ADCON2 -; movlw b'00000000' ; Vref+ = Vdd - clrf ADCON1 - movlw b'00100101' ; power on ADC, select AN9 - rcall wait_adc - banksel analog_counter - movff ADRESH,WREG - addwf analog_sw2_raw+0 - movlw .0 - addwfc analog_sw2_raw+1 - decfsz analog_counter,F ; continue averaging? - bra get_analog_switches2a ; Yes - ; Done. Compute average - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /2 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /4 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /8 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /16 - movff analog_sw2_raw+0, analog_sw2 - clrf analog_sw2_raw+1 - clrf analog_sw2_raw+0 ; Reset average registers -; movlw .16 -; movwf analog_counter ; only once... -get_analog_switches2a: - banksel common - bcf analog_sw2_pressed - movff opt_cR_button_left,WREG ;20-100 - bcf STATUS,C - rrcf WREG ;/2 -> 10-50 - bcf STATUS,C - rrcf WREG ;/2 -> 5-25 - decf WREG,W ;-1 - decf WREG,W ;-1 - decf WREG,W ;-1 -> 2-22 - banksel analog_sw2 - btfss button_polarity,1;(1= normal, 0=inverted) - bra sw2_inverted - addwf analog_sw2,W ; average (~128) - cpfsgt ADRESH - bra get_analog_sw1 - banksel common - bsf analog_sw2_pressed ; Left button normal - bra get_analog_sw1 + movlw b'00001001' ; left justified + movwf ADCON2 +; movlw b'00000000' ; Vref+ = Vdd + clrf ADCON1 + movlw b'00100101' ; power on ADC, select AN9 + rcall wait_adc + banksel analog_counter + movff ADRESH,WREG + addwf analog_sw2_raw+0 + movlw .0 + addwfc analog_sw2_raw+1 + decfsz analog_counter,F ; continue averaging? + bra get_analog_switches2a ; Yes + ; Done. Compute average + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /2 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /4 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /8 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /16 + movff analog_sw2_raw+0,analog_sw2 + clrf analog_sw2_raw+1 + clrf analog_sw2_raw+0 ; Reset average registers +; movlw .16 +; movwf analog_counter ; only once... +get_analog_switches2a: + banksel common + bcf analog_sw2_pressed + movff opt_cR_button_left,WREG ;20-100 + bcf STATUS,C + rrcf WREG ;/2 -> 10-50 + bcf STATUS,C + rrcf WREG ;/2 -> 5-25 + decf WREG,W ;-1 + decf WREG,W ;-1 + decf WREG,W ;-1 -> 2-22 + banksel analog_sw2 + btfss button_polarity,1 ;(1= normal, 0=inverted) + bra sw2_inverted + addwf analog_sw2,W ; average (~128) + cpfsgt ADRESH + bra get_analog_sw1 + banksel common + bsf analog_sw2_pressed ; Left button normal + bra get_analog_sw1 sw2_inverted: - subwf analog_sw2,W ; average (~128) - cpfslt ADRESH - bra get_analog_sw1 - banksel common - bsf analog_sw2_pressed ; Left button inverted + subwf analog_sw2,W ; average (~128) + cpfslt ADRESH + bra get_analog_sw1 + banksel common + bsf analog_sw2_pressed ; Left button inverted get_analog_sw1: - banksel common - movlw b'00101001' ; power on ADC, select AN10 - rcall wait_adc - banksel analog_counter - movff ADRESH,WREG - addwf analog_sw1_raw+0 - movlw .0 - addwfc analog_sw1_raw+1 - tstfsz analog_counter ; continue averaging? - bra get_analog_switches1a ; Yes - ; Done. Compute average - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /2 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /4 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /8 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /16 - movff analog_sw1_raw+0, analog_sw1 - clrf analog_sw1_raw+1 - clrf analog_sw1_raw+0 ; Reset average registers - movlw .16 - movwf analog_counter ; only once... -get_analog_switches1a: - banksel common - bcf analog_sw1_pressed - movff opt_cR_button_right,WREG ;20-100 - bcf STATUS,C - rrcf WREG ;/2 -> 10-50 - bcf STATUS,C - rrcf WREG ;/2 -> 5-25 - decf WREG,W ;-1 - decf WREG,W ;-1 - decf WREG,W ;-1 -> 2-22 - banksel analog_sw1 - btfss button_polarity,0;(1= normal, 0=inverted) - bra sw1_inverted - addwf analog_sw1,W ; average (~128) - cpfsgt ADRESH - bra get_analog_sw_done - banksel common - bsf analog_sw1_pressed ; right button normal - bra get_analog_sw_done + banksel common + movlw b'00101001' ; power on ADC, select AN10 + rcall wait_adc + banksel analog_counter + movff ADRESH,WREG + addwf analog_sw1_raw+0 + movlw .0 + addwfc analog_sw1_raw+1 + tstfsz analog_counter ; continue averaging? + bra get_analog_switches1a ; Yes + ; Done. Compute average + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /2 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /4 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /8 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /16 + movff analog_sw1_raw+0,analog_sw1 + clrf analog_sw1_raw+1 + clrf analog_sw1_raw+0 ; Reset average registers + movlw .16 + movwf analog_counter ; only once... +get_analog_switches1a: + banksel common + bcf analog_sw1_pressed + movff opt_cR_button_right,WREG ;20-100 + bcf STATUS,C + rrcf WREG ;/2 -> 10-50 + bcf STATUS,C + rrcf WREG ;/2 -> 5-25 + decf WREG,W ;-1 + decf WREG,W ;-1 + decf WREG,W ;-1 -> 2-22 + banksel analog_sw1 + btfss button_polarity,0 ;(1= normal, 0=inverted) + bra sw1_inverted + addwf analog_sw1,W ; average (~128) + cpfsgt ADRESH + bra get_analog_sw_done + banksel common + bsf analog_sw1_pressed ; right button normal + bra get_analog_sw_done sw1_inverted: - subwf analog_sw1,W ; average (~128) - cpfslt ADRESH - bra get_analog_sw_done - banksel common - bsf analog_sw1_pressed ; right button inverted + subwf analog_sw1,W ; average (~128) + cpfslt ADRESH + bra get_analog_sw_done + banksel common + bsf analog_sw1_pressed ; right button inverted get_analog_sw_done: - banksel common - movlw b'10001101' ; Restore to right justified - movwf ADCON2 - btfsc analog_sw1_pressed - return - btfsc analog_sw2_pressed - return - setf TMR1H ; No button pressed, enhance timer1 to overflow quickly - return + banksel common + movlw b'10001101' ; Restore to right justified + movwf ADCON2 + btfsc analog_sw1_pressed + return + btfsc analog_sw2_pressed + return + setf TMR1H ; No button pressed, enhance timer1 to overflow quickly + return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/calibrate.asm --- a/src/calibrate.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/calibrate.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,150 +1,149 @@ ;============================================================================= ; -; File calibration.asm REFACTORED VERSION V2.91 +; File calibration.asm REFACTORED VERSION V2.98 ; ; o2 sensor calibration subroutines ; ; Copyright (c) 2014, Heinrichs Weikamp, all right reserved. ;============================================================================= -#include "hwos.inc" -#include "shared_definitions.h" ; Mailbox between c and asm -#include "math.inc" -#include "adc_lightsensor.inc" -#include "eeprom_rs232.inc" +#include "hwos.inc" +#include "shared_definitions.h" ; Mailbox between c and asm +#include "math.inc" +#include "adc_lightsensor.inc" +#include "eeprom_rs232.inc" -calibrate CODE - global check_sensors ; Check O2 sensor thresholds for fallback and voting logic +calibrate CODE + + global check_sensors ; Check O2 sensor thresholds for fallback and voting logic check_sensors: ; Check min_mv movff o2_mv_sensor1+0, sub_a+0 movff o2_mv_sensor1+1, sub_a+1 - movlw LOW min_mv + movlw LOW min_mv movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - bsf use_O2_sensor1 ;=1: Use this sensor for deco + call sub16 ; sub_c = sub_a - sub_b + bsf use_O2_sensor1 ;=1: Use this sensor for deco btfsc neg_flag - bcf use_O2_sensor1 ;=1: Use this sensor for deco + bcf use_O2_sensor1 ;=1: Use this sensor for deco movff o2_mv_sensor2+0, sub_a+0 movff o2_mv_sensor2+1, sub_a+1 - movlw LOW min_mv + movlw LOW min_mv movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - bsf use_O2_sensor2 ;=1: Use this sensor for deco + call sub16 ; sub_c = sub_a - sub_b + bsf use_O2_sensor2 ;=1: Use this sensor for deco btfsc neg_flag - bcf use_O2_sensor2 ;=1: Use this sensor for deco + bcf use_O2_sensor2 ;=1: Use this sensor for deco movff o2_mv_sensor3+0, sub_a+0 movff o2_mv_sensor3+1, sub_a+1 - movlw LOW min_mv + movlw LOW min_mv movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - bsf use_O2_sensor3 ;=1: Use this sensor for deco + call sub16 ; sub_c = sub_a - sub_b + bsf use_O2_sensor3 ;=1: Use this sensor for deco btfsc neg_flag - bcf use_O2_sensor3 ;=1: Use this sensor for deco - + bcf use_O2_sensor3 ;=1: Use this sensor for deco + ; Check max_mv movff o2_mv_sensor1+0, sub_a+0 movff o2_mv_sensor1+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b + call sub16 ; sub_c = sub_a - sub_b btfss neg_flag - bcf use_O2_sensor1 ;=1: Use this sensor for deco + bcf use_O2_sensor1 ;=1: Use this sensor for deco movff o2_mv_sensor2+0, sub_a+0 movff o2_mv_sensor2+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b + call sub16 ; sub_c = sub_a - sub_b btfss neg_flag - bcf use_O2_sensor2 ;=1: Use this sensor for deco + bcf use_O2_sensor2 ;=1: Use this sensor for deco movff o2_mv_sensor3+0, sub_a+0 movff o2_mv_sensor3+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b + call sub16 ; sub_c = sub_a - sub_b btfss neg_flag - bcf use_O2_sensor3 ;=1: Use this sensor for deco + bcf use_O2_sensor3 ;=1: Use this sensor for deco - btfss hud_connection_ok ;=1: HUD connection ok - bra check_sensor2 ; No HUD/Digital data + btfss hud_connection_ok ;=1: HUD connection ok + bra check_sensor2 ; No HUD/Digital data - ; Copy disable flags from digital input - btfss sensor1_active - bcf use_O2_sensor1 - btfss sensor2_active - bcf use_O2_sensor2 - btfss sensor3_active - bcf use_O2_sensor3 - bra check_sensor3 ; Check for voting logic + ; Copy disable flags from digital input + btfss sensor1_active + bcf use_O2_sensor1 + btfss sensor2_active + bcf use_O2_sensor2 + btfss sensor3_active + bcf use_O2_sensor3 + return check_sensor2: ; Copy disable flags from internal calibration routine - btfss sensor1_calibrated_ok - bcf use_O2_sensor1 - btfss sensor2_calibrated_ok - bcf use_O2_sensor2 - btfss sensor3_calibrated_ok - bcf use_O2_sensor3 -check_sensor3: ; Check for voting logic - ; bcf voting_logic_sensor3 ; Yes, ignore this sensor - return + btfss sensor1_calibrated_ok + bcf use_O2_sensor1 + btfss sensor2_calibrated_ok + bcf use_O2_sensor2 + btfss sensor3_calibrated_ok + bcf use_O2_sensor3 + return global calibrate_mix calibrate_mix: - ; calibrate S8 HUD - btfss s8_digital ; S8 Digital? - bra calibrate_mix2 ; No + ; calibrate S8 HUD + btfss s8_digital ; S8 Digital? + bra calibrate_mix2 ; No - ; Yes, calibrate any S8-connected HUD - clrf temp1 ; Chksum - movlw 0xAA ; Start Byte - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + ; Yes, calibrate any S8-connected HUD + clrf lo ; Checksum + movlw 0xAA ; Start Byte + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movlw 0x31 ; Calibrate - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + movlw 0x31 ; Calibrate + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movff amb_pressure+0,WREG ; Ambient pressure - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 - movff amb_pressure+1,WREG - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + movff amb_pressure+0,WREG ; Ambient pressure + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 + movff amb_pressure+1,WREG + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movff temp1,TXREG2 ; Chksum - call rs232_wait_tx2 + movff lo,TXREG2 ; Checksum + call rs232_wait_tx2 calibrate_mix2: - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 - mullw .100 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 ; (%O2*100)*[ambient,mbar]/100 -> xC @@ -153,13 +152,13 @@ rcall calibrate_mix2_helper movff o2_mv_sensor1+0,xB+0 movff o2_mv_sensor1+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s1+0 movff xC+1,opt_x_s1+1 ; Factor for Sensor1 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 - mullw .100 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 ; (%O2*100)*[ambient,mbar]/100 -> xC @@ -168,13 +167,13 @@ rcall calibrate_mix2_helper movff o2_mv_sensor2+0,xB+0 movff o2_mv_sensor2+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s2+0 movff xC+1,opt_x_s2+1 ; Factor for Sensor2 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 - mullw .100 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 ; (%O2*100)*[ambient,mbar]/100 -> xC @@ -183,23 +182,23 @@ rcall calibrate_mix2_helper movff o2_mv_sensor3+0,xB+0 movff o2_mv_sensor3+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s3+0 movff xC+1,opt_x_s3+1 ; Factor for Sensor3 - bsf sensor1_calibrated_ok - bsf sensor2_calibrated_ok - bsf sensor3_calibrated_ok ; Set flags prior check + bsf sensor1_calibrated_ok + bsf sensor2_calibrated_ok + bsf sensor3_calibrated_ok ; Set flags prior check - rcall check_sensors ; Check O2 sensor thresholds min_mv and max_mv and set use_02_sensorX flags - ; initialise internal calibration flags - btfss use_O2_sensor1 ; Sensor out of range? - bcf sensor1_calibrated_ok ; Yes, disable this sensor - btfss use_O2_sensor2 ; Sensor out of range? - bcf sensor2_calibrated_ok ; Yes, disable this sensor - btfss use_O2_sensor3 ; Sensor out of range? - bcf sensor3_calibrated_ok ; Yes, disable this sensor + rcall check_sensors ; Check O2 sensor thresholds min_mv and max_mv and set use_02_sensorX flags + ; initialize internal calibration flags + btfss use_O2_sensor1 ; Sensor out of range? + bcf sensor1_calibrated_ok ; Yes, disable this sensor + btfss use_O2_sensor2 ; Sensor out of range? + bcf sensor2_calibrated_ok ; Yes, disable this sensor + btfss use_O2_sensor3 ; Sensor out of range? + bcf sensor3_calibrated_ok ; Yes, disable this sensor ; When no sensor is found, enable all three to show error state btfsc use_O2_sensor1 @@ -212,101 +211,100 @@ bsf use_O2_sensor2 bsf use_O2_sensor3 ; Clear factors - banksel opt_x_s1+0 + banksel opt_x_s1+0 clrf opt_x_s1+0 clrf opt_x_s1+1 clrf opt_x_s2+0 clrf opt_x_s2+1 clrf opt_x_s3+0 clrf opt_x_s3+1 - banksel common + banksel common return -calibrate_mix2_helper: - call mult16x16 ; xA*xB=xC - movlw LOW .100 +calibrate_mix2_helper: + call mult16x16 ; xA*xB=xC + movlw LOW .100 movwf xB+0 - movlw HIGH .100 + movlw HIGH .100 movwf xB+1 - goto div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder (And return) + goto div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder (And return) global compute_mvolts_for_all_sensors -compute_mvolts_for_all_sensors: ; Compute mV or all sensors (S8 Mode) +compute_mvolts_for_all_sensors: ; Compute mV or all sensors (S8 Mode) ; compute AD results in 100µV steps (16bit/sensor) ; 24bit AD result is in 244,1406541nV -; Devide 24bit value through 409,5999512 -> 410 (0,01% error) - #DEFINE ad2mv_factor .410 +; Divide 24bit value through 409,5999512 -> 410 (0,01% error) + #DEFINE ad2mv_factor .410 ; Sensor 1 clrf xC+3 movff s8_rawdata_sensor1+2,xC+2 movff s8_rawdata_sensor1+1,xC+1 movff s8_rawdata_sensor1+0,xC+0 - movlw LOW ad2mv_factor + movlw LOW ad2mv_factor movwf xB+0 - movlw HIGH ad2mv_factor + movlw HIGH ad2mv_factor movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+1,o2_mv_sensor1+1 - movff xC+0,o2_mv_sensor1+0 ; in 100uV steps + movff xC+0,o2_mv_sensor1+0 ; in 100uV steps ; Sensor 2 clrf xC+3 movff s8_rawdata_sensor2+2,xC+2 movff s8_rawdata_sensor2+1,xC+1 movff s8_rawdata_sensor2+0,xC+0 - movlw LOW ad2mv_factor + movlw LOW ad2mv_factor movwf xB+0 - movlw HIGH ad2mv_factor + movlw HIGH ad2mv_factor movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+1,o2_mv_sensor2+1 - movff xC+0,o2_mv_sensor2+0 ; in 100uV steps + movff xC+0,o2_mv_sensor2+0 ; in 100uV steps ; Sensor 3 clrf xC+3 movff s8_rawdata_sensor3+2,xC+2 movff s8_rawdata_sensor3+1,xC+1 movff s8_rawdata_sensor3+0,xC+0 - movlw LOW ad2mv_factor + movlw LOW ad2mv_factor movwf xB+0 - movlw HIGH ad2mv_factor + movlw HIGH ad2mv_factor movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+1,o2_mv_sensor3+1 - movff xC+0,o2_mv_sensor3+0 ; in 100uV steps + movff xC+0,o2_mv_sensor3+0 ; in 100uV steps - bcf new_s8_data_available ; Clear flag - return ; Done. + bcf new_s8_data_available ; Clear flag + return ; Done. - - global transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + global transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics transmit_setpoint: - return - btfss s8_digital ; S8 Digital? - return ; No, ignore + return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! + btfss s8_digital ; S8 Digital? + return ; No, ignore - ; Yes, transmit setpoint from WREG - movwf temp2 ; Store setpoint - clrf temp1 ; Chksum - movlw 0xAA ; Start Byte - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + ; Yes, transmit setpoint from WREG + movwf hi ; Store setpoint + clrf lo ; Checksum + movlw 0xAA ; Start Byte + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movlw 0x60 ; New SP - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + movlw 0x60 ; New SP + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movff temp2,WREG ; SP in cbar - addwf temp1,F - movff WREG,TXREG2 - call rs232_wait_tx2 + movff hi,WREG ; SP in cbar + addwf lo,F + movff WREG,TXREG2 + call rs232_wait_tx2 - movff temp1,TXREG2 ; Chksum - call rs232_wait_tx2 - return + movff lo,TXREG2 ; Checksum + call rs232_wait_tx2 + return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/calibrate.inc --- a/src/calibrate.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/calibrate.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,19 +1,9 @@ ;============================================================================= ; -; File calibrate.inc REFACTORED VERSION V2.91 +; File calibrate.inc REFACTORED VERSION V2.97 ; ;============================================================================= -; DELETE ## voting logic -; extern compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays - - extern calibrate_mix ; Calibrate with any mix - -; DELETE ## voting logic -; extern check_sensors ; Check O2 sensor thresholds for fallback - -; ADD ## voting logic - extern compute_mvolts_for_all_sensors ; compute sensor mv values from digital transmitted data - - extern transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics - \ No newline at end of file + extern calibrate_mix ; Calibrate with any mix + extern compute_mvolts_for_all_sensors ; compute sensor mv values from digital transmitted data + extern transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics diff -r f5de1ff88814 -r b455b31ce022 src/changelog.txt --- a/src/changelog.txt Sun Feb 25 18:25:38 2018 +0100 +++ b/src/changelog.txt Mon Feb 26 16:40:28 2018 +0100 @@ -1,5 +1,12 @@ [2.97] - Stable Version - +NEW: Internal deco calculator shows deco plan and gas beeds for Bailout case +NEW: CNS now, CNS in xx minutes, CNS if bailout plan is used and CNS when surfaced (Including all deco stops) is shown +NEW: Bailout TTS is computed in CCR mode (optionally) with gas needs for all bailout gases and all deco stops +NEW: Warning if an isobaric counter diffusion occurs (also in internal planner) +NEW: Warning "X-ZHL16-X" if deco model is used beyond theoretical limits +NEW: Show "Deco Zone" if we are in deco and at least one tissue is off-gassing +CHANGE: Internal deco routines heavily optimised for speed and code size CHANGE: Limit button sensitivity to 80% BUGFIX: Auto-Gain for newer compass versions did not work (Which decreased accuracy of heading) CHANGE: Make disabled gases darker in surface mode (Common issue for color-blind divers) @@ -7,7 +14,6 @@ NEW: Independent saturation/desaturation multipliers for GF and non-GF Deco modes CHANGE: Non-updated values are shown in dark blue (e.g. after a gas change) until values are valid again - [2.27] - Beta Version - BUGFIX: Display of negative (°C) water temperatures diff -r f5de1ff88814 -r b455b31ce022 src/color_processor.asm --- a/src/color_processor.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/color_processor.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File File color_processor.asm +; File File color_processor.asm ## V2.98 ; ; Decompress and draw an image. ; @@ -15,7 +15,7 @@ ; ; Inputs: TBLPTR points to the image description block. ; win_top, win_leftx2 the Top/Leftx2 corner here to put the image. -; Ouputs: None. +; Outputs: None. ; Trashed: TBLPTR, TABLAT, FSR2, PROD, win_width, win_height ; ; ImageBloc: @@ -43,135 +43,124 @@ #include "tft.inc" ;----------------------------------------------------------------------------- -; Temporary overlay (in bank 1). - - CBLOCK tmp ; Data overlay in reserved tmp area. - img_colors:1 - img_pixels:3 - img_count:2 - ; Reserved to tmp+0x07... - ENDC - -;----------------------------------------------------------------------------- ; ; Note: Some variables (win_width, win_height) are in BANK0 ! -basic CODE - global color_image +basic CODE + global color_image color_image: - banksel win_width ; Bank1, just to be sure... + banksel common ; Bank1, just to be sure... - ;---- Get image parameters ------------------------------------------- - tblrd*+ - movff TABLAT,win_width - tblrd*+ - movff TABLAT,win_height - tblrd*+ - movff TABLAT,img_colors - tblrd*+ ; Skip one byte (future flags ?) - ;---- Copy color table ----------------------------------------------- - movf img_colors,W - lfsr FSR2,buffer -get_colors_loop: - tblrd*+ - movff TABLAT,POSTINC2 - tblrd*+ - movff TABLAT,POSTINC2 - decfsz WREG - bra get_colors_loop + ;---- Get image parameters ------------------------------------------- + tblrd*+ + movff TABLAT,win_width + tblrd*+ + movff TABLAT,win_height + tblrd*+ + movff TABLAT,lo ; image colors + tblrd*+ ; Skip one byte (future flags ?) + ;---- Copy color table ----------------------------------------------- + movf lo,W + lfsr FSR2,buffer +get_colors_loop: + tblrd*+ + movff TABLAT,POSTINC2 + tblrd*+ + movff TABLAT,POSTINC2 + decfsz WREG + bra get_colors_loop + + ; Compute width * height * 2 : the number of pixels to write. + clrf img_pixels+2 + movf win_width,W ; Compute number of pixels to draw + mulwf win_height ; 0 .. 160x240 + bcf STATUS,C ; BEWARE: mulwf does not reset carry flag ! + rlcf PRODL ; x2 --> 0 .. 320x240, might be > 0xFFFF + rlcf PRODH + movff PRODL, img_pixels+0 + movff PRODH, img_pixels+1 + rlcf img_pixels+2 ; Get the upper bit in place - ; Compute width * height * 2 : the number of pixels to write. - clrf img_pixels+2 - movf win_width,W ; Compute number of pixels to draw - mulwf win_height ; 0 .. 160x240 - bcf STATUS,C ; BEWARE: mulwf does not reset carry flag ! - rlcf PRODL ; x2 --> 0 .. 320x240, might be > 0xFFFF - rlcf PRODH - movff PRODL, img_pixels+0 - movff PRODH, img_pixels+1 - rlcf img_pixels+2 ; Get the upper bit in place. - - clrf WREG ; Decrement count to ease end detection. - decf img_pixels+0,F - subwfb img_pixels+1,F - subwfb img_pixels+2,F + clrf WREG ; Decrement count to ease end detection + decf img_pixels+0,F + subwfb img_pixels+1,F + subwfb img_pixels+2,F - ;---- Send window command -------------------------------------------- - clrf win_width+1 ; x2 on width, for the true box size. - rlcf win_width+0 - rlcf win_width+1 - call TFT_box_write - Index_out 0x22 + ;---- Send window command -------------------------------------------- + clrf win_width+1 ; x2 on width, for the true box size + rlcf win_width+0 + rlcf win_width+1 + call TFT_box_write + Index_out 0x22 - ;---- Decode pixels -------------------------------------------------- + ;---- Decode pixels -------------------------------------------------- color_image_loop_xy: - ; Get pixel count - clrf img_count+0 - clrf img_count+1 + ; Get pixel count + clrf img_count+0 + clrf img_count+1 - ;---- Decode repetition count + ;---- Decode repetition count color_image_decode_1: - tblrd*+ ; Get one byte + tblrd*+ ; Get one byte - btfss TABLAT,7 ; High bit cleared ? - bra color_image_decode_2 ; YES: this is a color byte. - - rlcf TABLAT,F ; Drop high bit. - movlw .7 ; Move 7 bits + btfss TABLAT,7 ; High bit cleared ? + bra color_image_decode_2 ; YES: this is a color byte + + rlcf TABLAT,F ; Drop high bit. + movlw .7 ; Move 7 bits color_image_decode_3: - rlcf TABLAT,F ; Get bit into carry - rlcf img_count+0,F ; Push into pixel count - rlcf img_count+1,F - decfsz WREG - bra color_image_decode_3 ; and loop foreach 7 bits. - - bra color_image_decode_1 ; Decode next byte. + rlcf TABLAT,F ; Get bit into carry + rlcf img_count+0,F ; Push into pixel count + rlcf img_count+1,F + decfsz WREG + bra color_image_decode_3 ; and loop for each 7 bits + bra color_image_decode_1 ; Decode next byte color_image_decode_2: - ;---- Get pixel color into PROD - movf TABLAT,W ; Get color index. - addwf WREG ; *2 - lfsr FSR2,buffer ; Reinitialize color table. - movff WREG,FSR2L ; LOW(buffer) == 0 - movff POSTINC2,PRODL - movff POSTINC2,PRODH - - ; Substract count-1 from the number of pixel we should do. - movf img_count+0,W ; Make a 24bit substraction. - subwf img_pixels+0,F - movf img_count+1,W - subwfb img_pixels+1,F - movlw 0 - subwfb img_pixels+2,F + ;---- Get pixel color into PROD + movf TABLAT,W ; Get color index + addwf WREG ; *2 + lfsr FSR2,buffer ; Reinitialize color table + movff WREG,FSR2L ; LOW(buffer) == 0 + movff POSTINC2,PRODL + movff POSTINC2,PRODH + + ; Subtract count-1 from the number of pixel we should do. + movf img_count+0,W ; Make a 24bit subtraction + subwf img_pixels+0,F + movf img_count+1,W + subwfb img_pixels+1,F + movlw 0 + subwfb img_pixels+2,F color_image_not_over: - infsnz img_count+0 ; Increment count. - incf img_count+1 + infsnz img_count+0 ; Increment count + incf img_count+1 - ; Loop sending pixel color - incf img_count+1 ; Because we decrement first, should add one here ! - bsf tft_rs,0 ; RS_H ; Data - movff PRODH,PORTA ; Move high byte to PORTA - movff PRODL,PORTH ; Move low byte to PORTH - bcf INTCON,GIE + ; Loop sending pixel color + incf img_count+1 ; Because we decrement first, should add one here ! + bsf tft_rs,0 ; RS_H Data + movff PRODH,PORTA ; Move high byte to PORTA + movff PRODL,PORTH ; Move low byte to PORTH + bcf INTCON,GIE color_image_loop_pixel: - bcf tft_nwr,0 ; WR_L - bsf tft_nwr,0 ; WR_H ; Tick - decfsz img_count+0 - bra color_image_loop_pixel - decfsz img_count+1 - bra color_image_loop_pixel - bsf INTCON,GIE - - ; And count (on a 24bit counter) - clrf WREG ; Make a 24bit decrement. - decf img_pixels+0 - subwfb img_pixels+1,F - subwfb img_pixels+2,F + bcf tft_nwr,0 ; WR_L + bsf tft_nwr,0 ; WR_H Tick + decfsz img_count+0 + bra color_image_loop_pixel + decfsz img_count+1 + bra color_image_loop_pixel + bsf INTCON,GIE + + ; And count (on a 24bit counter) + clrf WREG ; Make a 24bit decrement + decf img_pixels+0 + subwfb img_pixels+1,F + subwfb img_pixels+2,F - bnn color_image_loop_xy ; Not finished ? loop... + bnn color_image_loop_xy ; Not finished ? loop... - ;---- Closeup -------------------------------------------------------- - Index_out 0x00 - return + ;---- Closeup -------------------------------------------------------- + Index_out 0x00 + return - end \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/comm.asm --- a/src/comm.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/comm.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File comm.asm REFACTORED VERSION 2.94 +; File comm.asm REFACTORED VERSION 2.98 ; ; RS232 via USB ; @@ -23,100 +23,104 @@ #include "adc_lightsensor.inc" #include "shared_definitions.h" - extern 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 .240 ; 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 + extern restart + extern option_reset_all + extern option_check_all + extern gaslist_cleanup_list + extern get_first_gas_to_WREG + extern get_first_dil_to_WREG + extern vault_decodata_into_eeprom + extern color_image -#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 timeout_comm_pre_mode .240 ; 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_warning_row .160 -#DEFINE comm_warning_column .65 +#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 + 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 + 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 + 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) + call TFT_standard_color + WIN_TOP .10 + WIN_LEFT .1 + movlw 0xDE + movwf TBLPTRL + movlw 0xEE + movwf TBLPTRH + movlw 0x01 + movwf TBLPTRU + 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... + bcf comm_service_enabled + bsf menubit + bcf battery_removed_in_usb ; =1: The battery has been removed in USB (properly not used for anything useful) + movlw timeout_comm_pre_mode + movwf comm_timeout + 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 + dcfsnz comm_timeout,F + bra comm_service_exit ; Timeout -> Exit comm_mode2: rcall comm_write_get_byte movlw 0xAA ; start byte=0xAA? cpfseq RCREG1 bra comm_mode2a - bra comm_mode2b ; Startbyte for service mode found + bra comm_mode2b ; Start byte for service mode found comm_mode2a: movlw 0xBB ; start byte=0xBB? cpfseq RCREG1 bra comm_mode2c - bra comm_download_mode ; Startbyte for download mode found + bra comm_download_mode ; Start byte for download mode found comm_mode2c: - btfss vusb_in ; USB plugged in? - bra comm_service_exit_nousb_delay ; Disconnected -> Exit + 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 @@ -124,7 +128,7 @@ btfsc onesecupdate bra comm_mode1 - bra comm_mode2 ; Cycle + bra comm_mode2 ; Cycle comm_mode2b: ; Startbyte found @@ -135,44 +139,44 @@ rcall comm_write_get_byte ; first byte rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + movff RCREG1,TXREG1 ; Echo movlw UPPER comm_service_key cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart + bra comm_mode1 ; Wrong -> Restart rcall comm_write_get_byte ; second byte rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + movff RCREG1,TXREG1 ; Echo movlw HIGH (comm_service_key & 0xFFFF) cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart + bra comm_mode1 ; Wrong -> Restart rcall comm_write_get_byte ; third byte rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + movff RCREG1,TXREG1 ; Echo movlw LOW comm_service_key cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart + 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 ; Set flag... - bra comm_download_mode0 ; ... but use common routine + WIN_SMALL comm_status2_column, comm_status2_row + STRCPY_TEXT_PRINT tUsbServiceMode ; Service mode enabled + bsf comm_service_enabled ; Set flag... + bra comm_download_mode0 ; ... but use common routine comm_service_exit_nousb_delay: - WAITMS d'200' - btfsc vusb_in ; USB plugged in? - 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 + WAITMS d'200' + btfsc vusb_in ; USB plugged in? + 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 + STRCPY_TEXT_PRINT tUsbExit ; Exited comm_service_exit_common: rcall comm_rs232_wait_tx ; Wait for UART - movlw 0xFF ; Reply FF + movlw 0xFF ; Reply FF movwf TXREG1 ; Send Answer ; Wait 1 second @@ -185,66 +189,66 @@ bra $-2 call disable_rs232 - goto restart + 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 + 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 - rcall comm_rs232_wait_tx ; Wait for UART + movlw 0x50 ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; Wait for UART - ; Read 5 bytes into buffer. + ; Read 5 bytes into buffer. lfsr FSR2,buffer movlw .5 ; counter movwf lo - movlw 0x55 ; 5'ft byte checksum. - movwf hi + movlw 0x55 ; 5'ft byte checksum. + movwf hi comm_send_firmware_loop: rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? + btfsc rs232_receive_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. + 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 + movf hi,W + bnz comm_send_firmware_failed - movlw 0x4C ; send OK - movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + movlw 0x4C ; send OK + movwf TXREG1 + rcall comm_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... + 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" + 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. + movlw 0xFF ; send ABORTED byte. movwf TXREG1 bra comm_download_mode0 ; Done. @@ -252,139 +256,116 @@ ; 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 .16 - write_int_eeprom .17 ; And the backup counter, too - call ext_flash_erase_logbook ; And complete logbook (!) - bra comm_download_mode0 ; Done. + call eeprom_reset_logbook_pointers ; clear logbook pointers in EEPROM... + 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. +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 - rcall comm_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. - - rcall comm_write_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). + movlw 0x42 ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; Wait for UART + bcf INTCON,GIE ; All interrupts off! + rcall comm_get_flash_address ; Get three bytes address or return + btfsc rs232_receive_overflow ; Got Data? + bra comm_download_mode0 ; No, Done. + rcall comm_write_get_byte + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. + movff RCREG1,lo + ; Got 4 bytes: 3 bytes address and 1 byte (lo) amount of 4kB blocks +comm_erase_range4kb_loop: + 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_range4kb_loop ; 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! +comm_erase_4kb: ; Get 3 bytes start address + bcf INTCON,GIE ; All interrupts off! - rcall comm_get_flash_address ; Get three bytes address or return - btfsc rs232_recieve_overflow ; Got Data? - bra comm_download_mode0 ; No, Done. + rcall comm_get_flash_address ; Get three bytes address or return + btfsc rs232_receive_overflow ; Got Data? + bra comm_download_mode0 ; No, Done. - call ext_flash_erase4kB ; Erase one block - bra comm_download_mode0 ; 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 +comm_write_range: ; Get 3 bytes start address + movlw 0x30 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART - bcf INTCON,GIE ; All interrups off! + bcf INTCON,GIE ; All interrupts off! - rcall comm_get_flash_address ; Get three bytes address or return - btfsc rs232_recieve_overflow ; Got Data? - bra comm_download_mode0 ; No, Done. + rcall comm_get_flash_address ; Get three bytes address or return + btfsc rs232_receive_overflow ; Got Data? + bra comm_download_mode0 ; No, Done. comm_write_range_loop: rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done (and send OK byte too). + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, Done (and send OK byte too). movf RCREG1,W -; bsf NCTS ; Hold Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) - call ext_flash_byte_write_comms ; write one byte -; bcf NCTS ; Release Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) - call incf_ext_flash_address_p1 ; increase address+1 +; bsf NCTS ; Hold Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) + call ext_flash_byte_write_comms ; write one byte +; bcf NCTS ; Release Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) + 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 - rcall comm_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_send_range: ; Get 3 bytes start address and 3 bytes amount + movlw 0x20 ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; Wait for UART + bcf INTCON,GIE ; All interrupts off! + rcall comm_get_flash_address ; Get three bytes address or return + btfsc rs232_receive_overflow ; Got Data? + bra comm_download_mode0 ; No, Done. rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. - movff RCREG1,up + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. + movff RCREG1,up rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. movff RCREG1,hi rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. movff RCREG1,lo - - ; If lo==0, we must precondition hi because there are 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 - + ; If lo==0, we must precondition hi because there are 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 + ; 6 bytes 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 + bra comm_send_range24 ; counter 24bit comm_send_range24_loop: - call ext_flash_read_block ; Read one byte - movwf TXREG1 ; Start new transmit + call ext_flash_read_block ; Read one byte + movwf TXREG1 ; Start new transmit comm_send_range24: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_range24_loop decf hi,F @@ -396,22 +377,21 @@ cpfseq up bra comm_send_range24_loop call ext_flash_read_block_stop - - bra comm_download_mode0 ; Done. + bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- comm_get_flash_address: rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? + btfsc rs232_receive_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+2 rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? + btfsc rs232_receive_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+1 rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? + btfsc rs232_receive_overflow ; Got byte? return ; No, return movff RCREG1,ext_flash_address+0 return @@ -420,37 +400,37 @@ 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 + WIN_SMALL comm_status2_column, comm_status2_row + STRCPY_TEXT_PRINT tUsbDownloadMode ; Download mode enabled + bsf INTCON,GIE ; All interrupts on rcall comm_rs232_wait_tx ; Wait for UART - movlw 0xBB ; Command Echo + movlw 0xBB ; Command Echo movwf TXREG1 ; Send Answer comm_download_mode0: - bsf INTCON,GIE ; All interrups on + bsf INTCON,GIE ; All interrupts on rcall comm_rs232_wait_tx ; Wait for UART - movlw 0x4C ; 4C in service mode - btfss comm_service_enabled - movlw 0x4D ; 4D in download mode + 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 + movwf comm_timeout ; Timeout bcf switch_right comm_download_mode1: bcf onesecupdate - dcfsnz timeout_counter,F - bra comm_service_exit ; Timeout -> Exit + dcfsnz comm_timeout,F + bra comm_service_exit ; Timeout -> Exit comm_download_mode2: - rcall comm_write_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 + rcall comm_write_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 + btfsc rs232_receive_overflow bra comm_download_mode2 ; Wait for command byte ; command received! @@ -471,22 +451,22 @@ cpfseq RCREG1 bra $+4 bra comm_set_custom_text ; Send a opt_name_length byte string of custom text. - movlw "f" ; 0x66 + movlw "f" ; 0x66 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. + bra comm_identify ; Send firmware, serial, etc. movlw "j" cpfseq RCREG1 bra $+4 - bra comm_hardware_descriptor ; Send hardware descriptor byte + bra comm_hardware_descriptor ; Send hardware descriptor byte movlw 0x60 cpfseq RCREG1 bra $+4 - bra comm_feature_and_hardware ; Send more detailed informations + bra comm_feature_and_hardware ; Send more detailed informations movlw "n" cpfseq RCREG1 bra $+4 @@ -498,28 +478,27 @@ movlw "l" cpfseq RCREG1 bra $+4 - call TFT_dump_screen ; Dump the screen contents + 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) + 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) + 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. - + 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 + 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 + bra comm_send_range ; send hi:lo:ext_flash_rw bytes starting from ext_flash_address:3 movlw 0x22 cpfseq RCREG1 bra $+4 @@ -527,32 +506,32 @@ movlw 0x23 cpfseq RCREG1 bra $+4 - bra comm_reset_battery_gauge ; Resets battery gauge registers + 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) + 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...) + 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) + 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 + bra comm_send_firmware ; send firmware to bootloader ; movlw "t" ; cpfseq RCREG1 ; bra $+4 -; goto testloop ; Start raw-data testloop +; 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 + bra comm_service_ll_bootloader ; Start low-level bootloader + bra comm_download_mode0 ; Loop with timeout reset ;----------------------------------------------------------------------------- @@ -585,7 +564,7 @@ bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_compact_headers4: - movlw .13 + movlw .13 movwf lo ; Counter rcall comm_rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte @@ -600,23 +579,23 @@ bra comm_send_compact_headers_loop call ext_flash_read_block_stop - ; Offset to total dive counter + ; Offset to total dive counter movlw .80 movwf ext_flash_address+0 - call ext_flash_read_block_start ; 1st byte - movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + call ext_flash_read_block_start ; 1st byte + movwf TXREG1 + rcall comm_rs232_wait_tx ; Wait for UART call ext_flash_read_block ; 2nd byte movwf TXREG1 - call ext_flash_read_block_stop - rcall comm_rs232_wait_tx ; Wait for UART + call ext_flash_read_block_stop + rcall comm_rs232_wait_tx ; Wait for UART - ; Offset to Logbook-Profile version + ; Offset to Logbook-Profile version movlw .8 movwf ext_flash_address+0 - call ext_flash_byte_read ; Get byte - movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + call ext_flash_byte_read ; Get byte + movwf TXREG1 + rcall comm_rs232_wait_tx ; Wait for UART bra comm_send_compact_headers2 ; continue @@ -635,7 +614,6 @@ movwf ext_flash_address+2 movlw 0xF0 movwf ext_flash_address+1 - comm_send_headers2: clrf ext_flash_address+0 ; Adjust address for next dive @@ -643,14 +621,12 @@ 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 + clrf lo ; Counter rcall comm_rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 @@ -667,181 +643,181 @@ ;----------------------------------------------------------------------------- -comm_option_reset_all: ; Reset all options to factory default. +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 + call option_reset_all + bra comm_download_mode0 ; Done. back to loop with timeout reset ;----------------------------------------------------------------------------- comm_write_get_byte: - goto rs232_get_byte ; returns... + goto rs232_get_byte ; returns... comm_rs232_wait_tx: - goto rs232_wait_tx ; returns... + goto rs232_wait_tx ; returns... comm_set_time: - movlw "b" ; send echo + movlw "b" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, abort movff RCREG1, hours movlw d'24' cpfslt hours clrf hours rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, abort movff RCREG1, mins movlw d'60' cpfslt mins clrf mins rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, abort movff RCREG1, secs movlw d'60' cpfslt secs clrf secs rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, abort movff RCREG1, month movlw d'13' cpfslt month movwf month rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort - call comm_check_day ; Check day + btfsc rs232_receive_overflow ; Got byte? + bra comm_download_mode0 ; No, abort + call comm_check_day ; Check day rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + btfsc rs232_receive_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 + 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). +; Set OSTC3 custom text string (opt_name_length ASCII chars). ; comm_set_custom_text: - movlw "c" ; send echo - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - lfsr FSR2,opt_name - movlw opt_name_length - movwf lo ; counter + movlw "c" ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + lfsr FSR2,opt_name + movlw opt_name_length + movwf lo ; counter comm_set_ctext_loop: - rcall comm_write_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 + rcall comm_write_get_byte + btfsc rs232_receive_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 + 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 + 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 - rcall comm_rs232_wait_tx ; wait for UART + movlw "i" ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART - ;---- Read serial from internal EEPROM address 0000 + ;---- Read serial from internal EEPROM address 0000 clrf EEADRH - clrf EEADR ; Get Serial number LOW - call read_eeprom ; read byte + 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 + incf EEADR,F ; Get Serial number HIGH + call read_eeprom ; read byte movff EEDATA,hi - ;---- Emit serial number - movff lo,TXREG1 + ;---- Emit serial number + movff lo,TXREG1 rcall comm_rs232_wait_tx - movff hi,TXREG1 + movff hi,TXREG1 rcall comm_rs232_wait_tx - ;---- Emit fiwmware hi.lo - movlw softwareversion_x - movwf TXREG1 + ;---- Emit firmware hi.lo + movlw softwareversion_x + movwf TXREG1 rcall comm_rs232_wait_tx - movlw softwareversion_y - movwf TXREG1 + movlw softwareversion_y + movwf TXREG1 rcall comm_rs232_wait_tx ;---- Emit custom text - movlw opt_name_length - movwf hi - lfsr FSR2,opt_name + movlw opt_name_length + movwf hi + lfsr FSR2,opt_name common_identify_loop: - movff POSTINC2,TXREG1 + movff POSTINC2,TXREG1 rcall comm_rs232_wait_tx decfsz hi,F bra common_identify_loop - bra comm_download_mode0 ; Done. + bra comm_download_mode0 ; Done. ;----------------------------------------------------------------------------- ; Reply hardware descriptor byte ; comm_hardware_descriptor: - movlw "j" ; send echo - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movff hardware_flag,TXREG1 - bra comm_download_mode0 ; Done. + movlw "j" ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movff hardware_flag,TXREG1 + bra comm_download_mode0 ; Done. comm_feature_and_hardware: - movlw 0x60 ; send echo - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movlw 0x00 ; Hardware high byte - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movff hardware_flag,TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movlw 0x00 ; Feature high Byte - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movlw 0x00 ; Feature low Byte - movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - movlw 0x00 ; Model descriptor byte - movwf TXREG1 - bra comm_download_mode0 ; Done. - + movlw 0x60 ; send echo + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movlw 0x00 ; Hardware high byte + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movff hardware_flag,TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movlw 0x00 ; Feature high Byte + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movlw 0x00 ; Feature low Byte + movwf TXREG1 + rcall comm_rs232_wait_tx ; wait for UART + movlw 0x00 ; Model descriptor byte + movwf TXREG1 + bra comm_download_mode0 ; Done. + ;----------------------------------------------------------------------------- comm_send_dive: - movlw "f"; 0x66 ; send echo + movlw "f"; 0x66 ; send echo movwf TXREG1 - + rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort! - movff RCREG1,lo ; Store dive number (0-255) + btfsc rs232_receive_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 @@ -853,56 +829,56 @@ movlw 0x20 movwf ext_flash_address+2 movlw .16 - mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + 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 + incf_ext_flash_address d'2' ; Skip 0xFA, 0xFA + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+0 + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+1 + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+2 + call ext_flash_byte_read_plus ; Read end address of profile + movff ext_flash_rw,ext_flash_end_pointer+0 + call ext_flash_byte_read_plus ; Read end address of profile + movff ext_flash_rw,ext_flash_end_pointer+1 + call ext_flash_byte_read_plus ; Read end address of profile + movff ext_flash_rw,ext_flash_end_pointer+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+0,W + cpfseq ext_flash_end_pointer+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+1,W + cpfseq ext_flash_end_pointer+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 + movf ext_flash_log_pointer+2,W + cpfseq ext_flash_end_pointer+2 ; Equal? + bra comm_send_dive1 ; No, Send header - ; Start=End -> Not good, abort - bra comm_download_mode0 ; Done. Loop with timeout reset + ; Start=End -> Not good, abort + bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_dive1: ; Send header - clrf hi ; Counter - rcall comm_rs232_wait_tx ; Wait for UART - call ext_flash_read_block_start ; 1st byte + clrf hi ; Counter + rcall comm_rs232_wait_tx ; Wait for UART + call ext_flash_read_block_start ; 1st byte movwf TXREG1 - bra comm_send_dive_header + bra comm_send_dive_header comm_send_dive_header2: - call ext_flash_read_block ; Read one byte - movwf TXREG1 ; Start new transmit + call ext_flash_read_block ; Read one byte + movwf TXREG1 ; Start new transmit comm_send_dive_header: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz hi,F - bra comm_send_dive_header2 + bra comm_send_dive_header2 call ext_flash_read_block_stop ; Set address for profile @@ -910,642 +886,636 @@ 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 + 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 ; Set address for short header/compact header, Byte 0 - + comm_send_dive_profile: - call ext_flash_byte_read_plus_0x20 ; Read one byte into temp1, takes care of banking at 0x200000 - rcall comm_rs232_wait_tx ; Wait for UART - movff temp1,TXREG1 ; Send a byte - + call ext_flash_byte_read_plus_0x20 ; Read one byte into ext_flash_rw, takes care of banking at 0x200000 + rcall comm_rs232_wait_tx ; Wait for UART + movff ext_flash_rw,TXREG1 ; Send a byte + ; 24bit compare with end address - movff convert_value_temp+0,WREG + movff ext_flash_end_pointer+0,WREG cpfseq ext_flash_address+0 - bra comm_send_dive_profile - movff convert_value_temp+1,WREG + bra comm_send_dive_profile + movff ext_flash_end_pointer+1,WREG cpfseq ext_flash_address+1 - bra comm_send_dive_profile - movff convert_value_temp+2,WREG + bra comm_send_dive_profile + movff ext_flash_end_pointer+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 + 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" + movlw "r" movwf TXREG1 rcall comm_write_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 char_I_ppO2_max, TXREG1 ; RCREG1=0x22 MODIFIED ## V2.94 - dcfsnz WREG - movff char_I_ppO2_min, TXREG1 ; RCREG1=0x23 MODIFIED ## V2.94 - 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 opt_sat_multiplier_non_gf, TXREG1; RCREG1=0x2A - dcfsnz WREG - movff opt_desat_multiplier_non_gf, 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 - clrf TXREG1 ; RCREG1=0x38 NOT USED ANYMORE (opt_sensor_fallback) ## voting logic - 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 - dcfsnz WREG - movff opt_temperature_adjust, TXREG1 ; RCREG1=0x42 - dcfsnz WREG - movff opt_safety_stop_length, TXREG1 ; RCREG1=0x43 - dcfsnz WREG - movff opt_safety_stop_start, TXREG1 ; RCREG1=0x44 - dcfsnz WREG - movff opt_safety_stop_end, TXREG1 ; RCREG1=0x45 - dcfsnz WREG - movff opt_safety_stop_reset, TXREG1 ; RCREG1=0x46 - dcfsnz WREG - clrf TXREG1 ; RCREG1=0x47, ignore conservatism for standard hwOS - dcfsnz WREG - movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 - dcfsnz WREG - movff button_polarity, TXREG1 ; RCREG1=0x49 - dcfsnz WREG - movff char_I_PSCR_drop, TXREG1 ; RCREG1=0x4A - dcfsnz WREG - movff char_I_PSCR_lungratio, TXREG1 ; RCREG1=0x4B - dcfsnz WREG - movff char_I_ppO2_max_deco, TXREG1 ; RCREG1=0x4C MODIFIED ## V2.94 - - ; NEW - dcfsnz WREG - movff char_I_ppO2_min_loop, TXREG1 ; RCREG1=0x4D ## CCR/pSCR min ppO2 MODIFIED ## V2.94 - dcfsnz WREG - movff char_I_tank_size+0, TXREG1 ; RCREG1=0x4E ## bailout gas needs - dcfsnz WREG - movff char_I_tank_size+1, TXREG1 ; RCREG1=0x4F ## bailout gas needs - dcfsnz WREG - movff char_I_tank_size+2, TXREG1 ; RCREG1=0x50 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_size+3, TXREG1 ; RCREG1=0x51 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_size+4, TXREG1 ; RCREG1=0x52 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_pres_fill+0, TXREG1 ; RCREG1=0x53 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_pres_fill+1, TXREG1 ; RCREG1=0x54 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_pres_fill+2, TXREG1 ; RCREG1=0x55 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_pres_fill+3, TXREG1 ; RCREG1=0x56 ## bailout gas needs - dcfsnz WREG - movff char_I_tank_pres_fill+4, TXREG1 ; RCREG1=0x57 ## bailout gas needs - dcfsnz WREG - movff char_I_cc_max_frac_o2, TXREG1 ; RCREG1=0x58 ## CCR max ppO2 limiter - dcfsnz WREG - movff opt_sim_setpoint_number, TXREG1 ; RCREG1=0x59 ## deco calculator enhancement - dcfsnz WREG - movff opt_calc_asc_gasvolume, TXREG1 ; RCREG1=0x5A ## bailout gas needs - dcfsnz WREG - movff opt_sim_use_aGF, TXREG1 ; RCREG1=0x5B ## deco calculator enhancement - dcfsnz WREG - movff char_I_altitude_wait, TXREG1 ; RCREG1=0x5C ## no fly altitude - dcfsnz WREG - movff opt_enable_IBCD, TXREG1 ; RCREG1=0x5D ## IBCD - dcfsnz WREG - movff opt_sat_multiplier_gf, TXREG1; RCREG1=0x5E - dcfsnz WREG - movff opt_desat_multiplier_gf, TXREG1; RCREG1=0x5F + btfsc rs232_receive_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 char_I_ppO2_max, TXREG1 ; RCREG1=0x22 + dcfsnz WREG + movff char_I_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 opt_sat_multiplier_non_gf, TXREG1 ; RCREG1=0x2A + dcfsnz WREG + movff opt_desat_multiplier_non_gf, 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 + clrf TXREG1 ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) + 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 + dcfsnz WREG + movff opt_temperature_adjust, TXREG1 ; RCREG1=0x42 + dcfsnz WREG + movff opt_safety_stop_length, TXREG1 ; RCREG1=0x43 + dcfsnz WREG + movff opt_safety_stop_start, TXREG1 ; RCREG1=0x44 + dcfsnz WREG + movff opt_safety_stop_end, TXREG1 ; RCREG1=0x45 + dcfsnz WREG + movff opt_safety_stop_reset, TXREG1 ; RCREG1=0x46 + dcfsnz WREG + clrf TXREG1 ; RCREG1=0x47, ignore conservatism for standard hwOS + dcfsnz WREG + movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 + dcfsnz WREG + movff button_polarity, TXREG1 ; RCREG1=0x49 + dcfsnz WREG + movff char_I_PSCR_drop, TXREG1 ; RCREG1=0x4A + dcfsnz WREG + movff char_I_PSCR_lungratio, TXREG1 ; RCREG1=0x4B + dcfsnz WREG + movff char_I_ppO2_max_deco, TXREG1 ; RCREG1=0x4C + dcfsnz WREG + movff char_I_ppO2_min_loop, TXREG1 ; RCREG1=0x4D + dcfsnz WREG + movff char_I_tank_size+0, TXREG1 ; RCREG1=0x4E + dcfsnz WREG + movff char_I_tank_size+1, TXREG1 ; RCREG1=0x4F + dcfsnz WREG + movff char_I_tank_size+2, TXREG1 ; RCREG1=0x50 + dcfsnz WREG + movff char_I_tank_size+3, TXREG1 ; RCREG1=0x51 + dcfsnz WREG + movff char_I_tank_size+4, TXREG1 ; RCREG1=0x52 + dcfsnz WREG + movff char_I_tank_pres_fill+0, TXREG1 ; RCREG1=0x53 + dcfsnz WREG + movff char_I_tank_pres_fill+1, TXREG1 ; RCREG1=0x54 + dcfsnz WREG + movff char_I_tank_pres_fill+2, TXREG1 ; RCREG1=0x55 + dcfsnz WREG + movff char_I_tank_pres_fill+3, TXREG1 ; RCREG1=0x56 + dcfsnz WREG + movff char_I_tank_pres_fill+4, TXREG1 ; RCREG1=0x57 + dcfsnz WREG + movff char_I_cc_max_frac_o2, TXREG1 ; RCREG1=0x58 + dcfsnz WREG + movff opt_sim_setpoint_number, TXREG1 ; RCREG1=0x59 + dcfsnz WREG + movff opt_calc_asc_gasvolume, TXREG1 ; RCREG1=0x5A + dcfsnz WREG + movff opt_sim_use_aGF, TXREG1 ; RCREG1=0x5B + dcfsnz WREG + movff char_I_altitude_wait, TXREG1 ; RCREG1=0x5C + dcfsnz WREG + movff opt_enable_IBCD, TXREG1 ; RCREG1=0x5D + dcfsnz WREG + movff opt_sat_multiplier_gf, TXREG1 ; RCREG1=0x5E + dcfsnz WREG + movff opt_desat_multiplier_gf, TXREG1; RCREG1=0x5F - - + comm_read_abort: comm_read_done: - bra comm_download_mode0 ; Done. Loop with timeout reset + bra comm_download_mode0 ; Done. Loop with timeout reset comm_read_setting_wait: - bra comm_rs232_wait_tx ; Wait for UART (and return!) + bra comm_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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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" + 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, char_I_ppO2_max ; RCREG1=0x22 MODIFIED ## V2.94 - dcfsnz WREG - movff RCREG1, char_I_ppO2_min ; RCREG1=0x23 MODIFIED ## V2.94 - 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, opt_sat_multiplier_non_gf; RCREG1=0x2A - dcfsnz WREG - movff RCREG1, opt_desat_multiplier_non_gf; 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 - nop ; RCREG1=0x38 NOT USED ANYMORE (opt_sensor_fallback) ## voting logic - 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 - dcfsnz WREG - movff RCREG1, opt_temperature_adjust ; RCREG1=0x42 - dcfsnz WREG - movff RCREG1, opt_safety_stop_length ; RCREG1=0x43 - dcfsnz WREG - movff RCREG1, opt_safety_stop_start ; RCREG1=0x44 - dcfsnz WREG - movff RCREG1, opt_safety_stop_end ; RCREG1=0x45 - dcfsnz WREG - movff RCREG1, opt_safety_stop_reset ; RCREG1=0x46 - dcfsnz WREG - nop ; RCREG1=0x47, ignore conservatism for standard hwOS - dcfsnz WREG - movff RCREG1, opt_diveTimeout ; RCREG1=0x48 - dcfsnz WREG - bra comm_write_button_polarity ; RCREG1=0x49 - dcfsnz WREG - movff RCREG1, char_I_PSCR_drop ; RCREG1=0x4A - dcfsnz WREG - movff RCREG1, char_I_PSCR_lungratio ; RCREG1=0x4B - dcfsnz WREG - movff RCREG1, char_I_ppO2_max_deco ; RCREG1=0x4C MODIFIED V2.94 + rcall comm_write_get_byte ; "Byte 2" + btfsc rs232_receive_overflow ; Got byte? + bra comm_write_abort ; No, abort! + movff RCREG1,lo ; Copy + rcall comm_write_get_byte ; "Byte 3" + rcall comm_read_setting_wait ; Wait for UART + movlw 0x0F + cpfsgt lo ; 0x00-0x0F: unused + bra comm_write_abort ; abort! + subwf lo,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, char_I_ppO2_max ; RCREG1=0x22 + dcfsnz WREG + movff RCREG1, char_I_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, opt_sat_multiplier_non_gf ; RCREG1=0x2A + dcfsnz WREG + movff RCREG1, opt_desat_multiplier_non_gf ; 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 + nop ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) + 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 + dcfsnz WREG + movff RCREG1, opt_temperature_adjust ; RCREG1=0x42 + dcfsnz WREG + movff RCREG1, opt_safety_stop_length ; RCREG1=0x43 + dcfsnz WREG + movff RCREG1, opt_safety_stop_start ; RCREG1=0x44 + dcfsnz WREG + movff RCREG1, opt_safety_stop_end ; RCREG1=0x45 + dcfsnz WREG + movff RCREG1, opt_safety_stop_reset ; RCREG1=0x46 + dcfsnz WREG + nop ; RCREG1=0x47, ignore conservatism for standard hwOS + dcfsnz WREG + movff RCREG1, opt_diveTimeout ; RCREG1=0x48 + dcfsnz WREG + bra comm_write_button_polarity ; RCREG1=0x49 + dcfsnz WREG + movff RCREG1, char_I_PSCR_drop ; RCREG1=0x4A + dcfsnz WREG + movff RCREG1, char_I_PSCR_lungratio ; RCREG1=0x4B + dcfsnz WREG + movff RCREG1, char_I_ppO2_max_deco ; RCREG1=0x4C + dcfsnz WREG + movff RCREG1, char_I_ppO2_min_loop ; RCREG1=0x4D + dcfsnz WREG + movff RCREG1, char_I_tank_size+0 ; RCREG1=0x4E + dcfsnz WREG + movff RCREG1, char_I_tank_size+1 ; RCREG1=0x4F + dcfsnz WREG + movff RCREG1, char_I_tank_size+2 ; RCREG1=0x50 + dcfsnz WREG + movff RCREG1, char_I_tank_size+3 ; RCREG1=0x51 + dcfsnz WREG + movff RCREG1, char_I_tank_size+4 ; RCREG1=0x52 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+0 ; RCREG1=0x53 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+1 ; RCREG1=0x54 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+2 ; RCREG1=0x55 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+3 ; RCREG1=0x56 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+4 ; RCREG1=0x57 + dcfsnz WREG + movff RCREG1, char_I_cc_max_frac_o2 ; RCREG1=0x58 + dcfsnz WREG + movff RCREG1, opt_sim_setpoint_number ; RCREG1=0x59 + dcfsnz WREG + movff RCREG1, opt_calc_asc_gasvolume ; RCREG1=0x5A + dcfsnz WREG + movff RCREG1, opt_sim_use_aGF ; RCREG1=0x5B + dcfsnz WREG + movff RCREG1, char_I_altitude_wait ; RCREG1=0x5C + dcfsnz WREG + movff RCREG1, opt_enable_IBCD ; RCREG1=0x5D + dcfsnz WREG + movff RCREG1, opt_sat_multiplier_gf ; RCREG1=0x5E + dcfsnz WREG + movff RCREG1, opt_desat_multiplier_gf ; RCREG1=0x5F - ; NEW - dcfsnz WREG - movff RCREG1, char_I_ppO2_min_loop ; RCREG1=0x4D ## CCR/pSCR min ppO2 limiter MODIFIED ## V2.94 - dcfsnz WREG - movff RCREG1, char_I_tank_size+0 ; RCREG1=0x4E ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_size+1 ; RCREG1=0x4F ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_size+2 ; RCREG1=0x50 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_size+3 ; RCREG1=0x51 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_size+4 ; RCREG1=0x52 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_pres_fill+0 ; RCREG1=0x53 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_pres_fill+1 ; RCREG1=0x54 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_pres_fill+2 ; RCREG1=0x55 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_pres_fill+3 ; RCREG1=0x56 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_tank_pres_fill+4 ; RCREG1=0x57 ## bailout gas needs - dcfsnz WREG - movff RCREG1, char_I_cc_max_frac_o2 ; RCREG1=0x58 ## CCR max ppO2 limiter - dcfsnz WREG - movff RCREG1, opt_sim_setpoint_number ; RCREG1=0x59 ## deco calculator enhancement - dcfsnz WREG - movff RCREG1, opt_calc_asc_gasvolume ; RCREG1=0x5A ## bailout gas needs - dcfsnz WREG - movff RCREG1, opt_sim_use_aGF ; RCREG1=0x5B ## deco calculator enhancement - dcfsnz WREG - movff RCREG1, char_I_altitude_wait ; RCREG1=0x5C ## no fly altitude - dcfsnz WREG - movff RCREG1, opt_enable_IBCD ; RCREG1=0x5D ## TBCD - dcfsnz WREG - movff RCREG1, opt_sat_multiplier_gf ; RCREG1=0x5E - dcfsnz WREG - movff RCREG1, opt_desat_multiplier_gf ; RCREG1=0x5F - - 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" - goto comm_download_mode0 ; Done. Loop with timeout reset + ; 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" + goto comm_download_mode0 ; Done. Loop with timeout reset 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 ;----------------------------------------------------------------------------- @@ -1553,25 +1523,25 @@ movlw "n" ; send echo movwf TXREG1 rcall comm_rs232_wait_tx ; Wait for UART - WIN_SMALL comm_string_column, comm_string_row + WIN_SMALL comm_string_column, comm_string_row movlw .16 movwf lo ; counter comm_send_string_loop: call comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_send_string_abort ; No, abort! + btfsc rs232_receive_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 + goto comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- comm_check_day: - movff RCREG1, day - movff month,lo ; new month + movff RCREG1,day + movff month,lo ; new month dcfsnz lo,F movlw .31 dcfsnz lo,F @@ -1596,23 +1566,23 @@ movlw .30 dcfsnz lo,F movlw .31 - cpfsgt day ; day ok? - return ; OK - movlw .1 ; not OK, set to 1st + cpfsgt day ; day ok? + return ; OK + movlw .1 ; not OK, set to 1st movwf day - return + return comm_write_button_polarity: ; Store RCREG1 into EEPROM .897 - movlw LOW .897 + movlw LOW .897 movwf EEADR - movlw HIGH .897 + movlw HIGH .897 movwf EEADRH movff RCREG1,EEDATA - movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) - call write_eeprom ; EEDATA into EEPROM@EEADR - clrf EEADRH ; Reset EEADRH - goto comm_download_mode0 ; Done. Loop with timeout reset - + movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) + call write_eeprom ; EEDATA into EEPROM@EEADR + clrf EEADRH ; Reset EEADRH + goto comm_download_mode0 ; Done. Loop with timeout reset + ;---------------------------------------------------------------------------- - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/compass_ops.asm --- a/src/compass_ops.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/compass_ops.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,105 +1,123 @@ -#include "hwos.inc" -#include "i2c.inc" -#include "tft_outputs.inc" -#include "isr.inc" +;============================================================================= +; +; File compass_ops.asm V2.98 +; +; Compass Operations +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= + +#include "hwos.inc" +#include "i2c.inc" +#include "tft_outputs.inc" +#include "isr.inc" #include "tft.inc" #include "strings.inc" -#include "wait.inc" ; speed_* -#include "surfmode.inc" -#include "divemode.inc" -#include "math.inc" -#include "convert.inc" +#include "wait.inc" ; speed_* +#include "surfmode.inc" +#include "divemode.inc" +#include "math.inc" +#include "convert.inc" ; Make sure symbols from the .inc are available to the C code: - ; Filtered data - global compass_DX_f, compass_DY_f, compass_DZ_f - global accel_DX_f, accel_DY_f, accel_DZ_f + ; Filtered data + global compass_DX_f + global compass_DY_f + global compass_DZ_f - ; Calibration data - global compass_CX_f - global compass_CY_f - global compass_CZ_f + global accel_DX_f + global accel_DY_f + global accel_DZ_f + + ; Calibration data + global compass_CX_f + global compass_CY_f + global compass_CZ_f - ; Tmp values to pass Q15 arithmetics around - global compass_a - global compass_b + ; Tmp values to pass Q15 arithmetics around + global compass_a + global compass_b - ; Result - global compass_heading; , compass_roll, compass_pitch + ; Result + global compass_heading +; global compass_roll +; global compass_pitch - extern compass - extern compass_reset_calibration - extern compass_add_calibration - extern compass_solve_calibration - extern menu_processor_bottom_line + extern compass + extern compass_reset_calibration + extern compass_add_calibration + extern compass_solve_calibration + extern menu_processor_bottom_line + extern option_save_all + extern compass + compass_ops code + +;============================================================================= + ;----------------------------------------------------------------------------- ; Filter compass values ; ; Apply linear filtering to input parameters. -; Apply filtering formula: -; reg_f += (reg - reg_f) / 4 -FILTER16 MACRO reg, reg_f - movf reg_f+0,W - subwf reg+0,W - movwf PRODL - movf reg_f+1,W - subwfb reg+1,W - rcall filter_16_common - addwf reg_f+0,F - movf PRODH,W - addwfc reg_f+1,F - ENDM +; Apply filtering formula: reg_f += (reg - reg_f) / 4 +FILTER16 MACRO reg, reg_f + movf reg_f+0,W + subwf reg+0,W + movwf PRODL + movf reg_f+1,W + subwfb reg+1,W + rcall filter_16_common + addwf reg_f+0,F + movf PRODH,W + addwfc reg_f+1,F + ENDM filter_16_common: - movwf PRODH - - bcf STATUS,C ; Copy sign bit into carry - btfsc PRODH,7 - bsf STATUS,C - rrcf PRODH,F ; 16bit shift right - rrcf PRODL,F + movwf PRODH + bcf STATUS,C ; Copy sign bit into carry + btfsc PRODH,7 + bsf STATUS,C + rrcf PRODH,F ; 16bit shift right + rrcf PRODL,F + bcf STATUS,C ; Copy sign bit into carry + btfsc PRODH,7 + bsf STATUS,C + rrcf PRODH,F ; 16bit shift right + rrcf PRODL,W + return - bcf STATUS,C ; Copy sign bit into carry - btfsc PRODH,7 - bsf STATUS,C - rrcf PRODH,F ; 16bit shift right - rrcf PRODL,W - return - - global compass_filter + global compass_filter compass_filter: - banksel compass_DX - - FILTER16 compass_DX, compass_DX_f - FILTER16 compass_DY, compass_DY_f - FILTER16 compass_DZ, compass_DZ_f - FILTER16 accel_DX, accel_DX_f - FILTER16 accel_DY, accel_DY_f - FILTER16 accel_DZ, accel_DZ_f - banksel common - return + banksel compass_DX + FILTER16 compass_DX, compass_DX_f + FILTER16 compass_DY, compass_DY_f + FILTER16 compass_DZ, compass_DZ_f + FILTER16 accel_DX, accel_DX_f + FILTER16 accel_DY, accel_DY_f + FILTER16 accel_DZ, accel_DZ_f + banksel common + return ;----------------------------------------------------------------------------- compass_filter_init: - movff compass_DX+0, compass_DX_f+0 - movff compass_DX+1, compass_DX_f+1 - movff compass_DY+0, compass_DY_f+0 - movff compass_DY+1, compass_DY_f+1 - movff compass_DZ+0, compass_DZ_f+0 - movff compass_DZ+1, compass_DZ_f+1 - movff accel_DX+0, accel_DX_f+0 - movff accel_DX+1, accel_DX_f+1 - movff accel_DY+0, accel_DY_f+0 - movff accel_DY+1, accel_DY_f+1 - movff accel_DZ+0, accel_DZ_f+0 - movff accel_DZ+1, accel_DZ_f+1 - return + movff compass_DX+0, compass_DX_f+0 + movff compass_DX+1, compass_DX_f+1 + movff compass_DY+0, compass_DY_f+0 + movff compass_DY+1, compass_DY_f+1 + movff compass_DZ+0, compass_DZ_f+0 + movff compass_DZ+1, compass_DZ_f+1 + movff accel_DX+0, accel_DX_f+0 + movff accel_DX+1, accel_DX_f+1 + movff accel_DY+0, accel_DY_f+0 + movff accel_DY+1, accel_DY_f+1 + movff accel_DZ+0, accel_DZ_f+0 + movff accel_DZ+1, accel_DZ_f+1 + return ;----------------------------------------------------------------------------- ; Q15 fractional numbers: a * b / 2**16 (UNSIGNED) @@ -112,1345 +130,1333 @@ ; ; (a/2**15) * (b/2**15) = a*b / 2**30 = (a*b/2**16) / 2**14. ; So to get back a Q15 number, we need a shift-left... - global compass_umul + global compass_umul compass_umul: - rcall compass_mul_16 + rcall compass_mul_16 ; The 2x time, by left-shifting inserting the missing bit: compass_mul_2: - rlcf compass_r+2,F ; Missing bit into carry - rlcf compass_r+0,F - rlcf compass_r+1,F - movff compass_r+0,PRODL ; return value into ProdH:L - movff compass_r+1,PRODH - return + rlcf compass_r+2,F ; Missing bit into carry + rlcf compass_r+0,F + rlcf compass_r+1,F + movff compass_r+0,PRODL ; return value into ProdH:L + movff compass_r+1,PRODH + return ; The 16x16-> multiply: compass_mul_16: - banksel compass_a + banksel compass_a - movf compass_a+1,W ; Block ah*bh - mulwf compass_b+1 - movff PRODL,compass_r+0 ; and copy - movff PRODH,compass_r+1 + movf compass_a+1,W ; Block ah*bh + mulwf compass_b+1 + movff PRODL,compass_r+0 ; and copy + movff PRODH,compass_r+1 - movf compass_a+0,W ; Block al*bl - mulwf compass_b+0 - movff PRODH,compass_r+2 ; Into fraction byte + movf compass_a+0,W ; Block al*bl + mulwf compass_b+0 + movff PRODH,compass_r+2 ; Into fraction byte - movf compass_a+1,W ; Block ah*bl - mulwf compass_b+0 - movf PRODL,W - addwf compass_r+2,F ; Fraction part to carry. - movf PRODH,W ; and add16 - addwfc compass_r+0,F - movlw 0 - addwfc compass_r+1,F + movf compass_a+1,W ; Block ah*bl + mulwf compass_b+0 + movf PRODL,W + addwf compass_r+2,F ; Fraction part to carry. + movf PRODH,W ; and add16 + addwfc compass_r+0,F + movlw 0 + addwfc compass_r+1,F - movf compass_a+0,W ; Block al*bh - mulwf compass_b+1 - movf PRODL,W - addwf compass_r+2,F ; Fraction part to carry. - movf PRODH,W ; and add16 - addwfc compass_r+0,F - movlw 0 - addwfc compass_r+1,F + movf compass_a+0,W ; Block al*bh + mulwf compass_b+1 + movf PRODL,W + addwf compass_r+2,F ; Fraction part to carry. + movf PRODH,W ; and add16 + addwfc compass_r+0,F + movlw 0 + addwfc compass_r+1,F - return + return ;----------------------------------------------------------------------------- ; Q15 fractional numbers: a * b / 2**16 (SIGNED) - global compass_imul + global compass_imul compass_imul: - rcall compass_mul_16 + rcall compass_mul_16 - btfss compass_b+1,7 - bra compass_mul_3 + btfss compass_b+1,7 + bra compass_mul_3 - movf compass_a+0,W - subwf compass_r+0,F - movf compass_a+1,W - subwfb compass_r+1,F + movf compass_a+0,W + subwf compass_r+0,F + movf compass_a+1,W + subwfb compass_r+1,F compass_mul_3: - btfss compass_a+1,7 - bra compass_mul_4 + btfss compass_a+1,7 + bra compass_mul_4 - movf compass_b+0,W - subwf compass_r+0,F - movf compass_b+1,W - subwfb compass_r+1,F + movf compass_b+0,W + subwf compass_r+0,F + movf compass_b+1,W + subwfb compass_r+1,F compass_mul_4: - bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x - btfsc compass_r+1,7 - bsf compass_r+1,6 - bra compass_mul_2 + bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x + btfsc compass_r+1,7 + bsf compass_r+1,6 + bra compass_mul_2 - global compass_calibration_loop -compass_calibration_loop: ; Compass calibration - bsf no_sensor_int ; No Sensor ISR - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass - call TFT_ClearScreen - ; Mask - WIN_COLOR color_greenish - WIN_SMALL .16,.0 - STRCPY_TEXT_PRINT tCompassMenu - btfss switch_right2 ; wait until button is released - bra $-4 + global compass_calibration_loop +compass_calibration_loop: ; Compass calibration + bsf no_sensor_int ; No Sensor ISR + call I2C_sleep_accelerometer ; Stop accelerometer + call I2C_sleep_compass ; Stop compass + call TFT_ClearScreen + ; Mask + WIN_COLOR color_greenish + WIN_SMALL .16,.0 + STRCPY_TEXT_PRINT tCompassMenu + btfss switch_right2 ; wait until button is released + bra $-4 - call TFT_standard_color -; WIN_SMALL .0,.215 -; STRCPY_TEXT_PRINT tExit - WAITMS d'255' - WAITMS d'255' - - movlw .7 ; Gain init - movff WREG,opt_compass_gain -compass_calibration_gainset: ; Reduce the gain, set bank here! - banksel opt_compass_gain - decf opt_compass_gain,F ; Reduce by one - btfsc STATUS,N ; <0? - clrf opt_compass_gain ; Yes, keep at zero + call TFT_standard_color +; WIN_SMALL .0,.215 +; STRCPY_TEXT_PRINT tExit + WAITMS d'255' + WAITMS d'255' - banksel common - call I2C_init_accelerometer - call I2C_init_compass - -; btfsc compass_type ; compass1? -; bra compass_calibration_loop1 ; Yes, skip gain stuff + movlw .7 ; Gain init + movff WREG,opt_compass_gain +compass_calibration_gainset: ; Reduce the gain, set bank here! + banksel opt_compass_gain + decf opt_compass_gain,F ; Reduce by one + btfsc STATUS,N ; <0? + clrf opt_compass_gain ; Yes, keep at zero - rcall TFT_compass_show_gain ; Show the current compass gain + banksel common + call I2C_init_accelerometer + call I2C_init_compass + +; btfsc compass_type ; compass1? +; bra compass_calibration_loop1 ; Yes, skip gain stuff + + rcall TFT_compass_show_gain ; show the current compass gain - WAITMS d'250' - WAITMS d'250' ; Wait for first reading... + WAITMS d'250' + WAITMS d'250' ; wait for first reading... - clrf timeout_counter2 - clrf timeout_counter3 + clrf timeout_counter2 +; clrf timeout_counter3 ; not used / required [rl] - call speed_fastest - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; read Accelerometer + call speed_fastest + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; read Accelerometer - ; Test all axes for +4096 (Hi byte=16) - banksel compass_DX+1 - movlw .16 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset + ; Test all axes for +4096 (Hi byte=16) + banksel compass_DX+1 + movlw .16 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset - ; Test all axes for -4096 (Hi byte=240) - movlw .240 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset - banksel common + ; Test all axes for -4096 (Hi byte=240) + movlw .240 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset + banksel common -compass_calibration_loop1: ; Done with Gain - rcall compass_filter_init ; set DX_f values - call compass_reset_calibration ; Reset CX_f values - banksel common +compass_calibration_loop1: ; Done with Gain + rcall compass_filter_init ; set DX_f values + call compass_reset_calibration ; Reset CX_f values + banksel common compass_calibration_loop2: - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; Test Accelerometer - rcall compass_filter ; Filter compass raw data - banksel common + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; Test Accelerometer + rcall compass_filter ; Filter compass raw data + banksel common - ; Twice - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; Test Accelerometer - rcall compass_filter ; Filter compass raw data - banksel common - -; btfsc compass_type ; compass1? -; bra compass_calibration_loop3 ; Yes, skip gain stuff + ; Twice + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; Test Accelerometer + rcall compass_filter ; Filter compass raw data + banksel common + +; btfsc compass_type ; compass1? +; bra compass_calibration_loop3 ; Yes, skip gain stuff - ; Test all axes for +4096 (Hi byte=16) - banksel compass_DX+1 - movlw .16 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset + ; Test all axes for +4096 (Hi byte=16) + banksel compass_DX+1 + movlw .16 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset - ; Test all axes for -4096 (Hi byte=240) - movlw .240 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset - banksel common + ; Test all axes for -4096 (Hi byte=240) + movlw .240 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset + banksel common ; -; ; Three -; call I2C_RX_compass ; read compass -; call I2C_RX_accelerometer ; Test Accelerometer -; call compass_filter ; Filter compass raw data -; banksel common +; ; Three +; call I2C_RX_compass ; read compass +; call I2C_RX_accelerometer ; Test Accelerometer +; call compass_filter ; Filter compass raw data +; banksel common ; -; ; Four times to get cleaner values -; call I2C_RX_compass ; read compass -; call I2C_RX_accelerometer ; Test Accelerometer -; call compass_filter ; Filter compass raw data +; ; Four times to get cleaner values +; call I2C_RX_compass ; read compass +; call I2C_RX_accelerometer ; Test Accelerometer +; call compass_filter ; Filter compass raw data compass_calibration_loop3: - ; And register only one value out of four: - call compass_add_calibration ; check and store new max/min values - banksel common + ; And register only one value out of four: + call compass_add_calibration ; check and store new max/min values + banksel common - rcall TFT_compass_fast ; show values + rcall TFT_compass_fast ; show values - btfsc sleepmode ; Sleepmode active? - bra compass_calibration_exit ; Yes, exit + btfsc sleepmode ; Sleepmode active? + bra compass_calibration_exit ; Yes, exit - btfss onesecupdate ; do every second tasks? - bra compass_calibration_loop2 ; no, loop here + btfss onesecupdate ; do every second tasks? + bra compass_calibration_loop2 ; no, loop here - movlw .60 - call timeout_testmode ; check timeout - movlw .60 - rcall TFT_show_timeout_testmode ; Show the timeout - - bcf onesecupdate ; clear flag + movlw .60 + call timeout_testmode ; check timeout + movlw .60 + rcall TFT_show_timeout_testmode ; Show the timeout - bra compass_calibration_loop2 ; loop here + bcf onesecupdate ; clear flag + + bra compass_calibration_loop2 ; loop here compass_calibration_exit: - call compass_solve_calibration - banksel common - ; Done. - extern option_save_all - call option_save_all ; save all settings into EEPROM - bcf sleepmode ; Clear the flag before exiting to surfacemode - movlw .6 - movwf customview_surfmode ; Set to compass view... - goto surfloop ; ...and exit + call compass_solve_calibration + banksel common + ; Done. + call option_save_all ; save all settings into EEPROM + bcf sleepmode ; Clear the flag before exiting to surface mode + movlw .6 + movff WREG,customview_surfmode ; Set to compass view... + goto surfloop ; ...and exit - global TFT_compass_fast + global TFT_compass_fast TFT_compass_fast: WIN_TINY .20,.50 - STRCPY "X:" - movff compass_DX+0,lo - movff compass_DX+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 - STRCAT " Y:" - movff compass_DY+0,lo - movff compass_DY+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 - STRCAT " Z:" - movff compass_DZ+0,lo - movff compass_DZ+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 + STRCPY "X:" + movff compass_DX+0,lo + movff compass_DX+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 + STRCAT " Y:" + movff compass_DY+0,lo + movff compass_DY+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 + STRCAT " Z:" + movff compass_DZ+0,lo + movff compass_DZ+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 STRCAT_PRINT " " - return + return -TFT_show_timeout_testmode: ; With timeout in WREG... - movwf hi - WIN_TINY .20,.68 - STRCPY "T:" - movf timeout_counter2,W ; current timeout - subwf hi,W ; subtract from timeout value - addlw .1 ; +1 - movwf lo - bsf leftbind - output_8 ; Display timeout - bcf leftbind - STRCAT_PRINT "s " - return - +TFT_show_timeout_testmode: ; With timeout in WREG... + movwf hi + WIN_TINY .20,.68 + STRCPY "T:" + movf timeout_counter2,W ; current timeout + subwf hi,W ; subtract from timeout value + addlw .1 ; +1 + movwf lo + bsf leftbind + output_8 ; Display timeout + bcf leftbind + STRCAT_PRINT "s " + return -TFT_compass_show_gain: ; Show the current compass gain -; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) -; tstfsz lo -; return ; Do not show unless gain=0 - WIN_TINY .20,.86 - STRCPY_TEXT tCompassGain - movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "" - return +TFT_compass_show_gain: ; Show the current compass gain +; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) +; tstfsz lo +; return ; Do not show unless gain=0 + WIN_TINY .20,.86 + STRCPY_TEXT tCompassGain + movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "" + return TFT_surface_compass_bearing: - WIN_SMALL surf_compass_bear_column,surf_compass_bear_row - movff compass_bearing+0,lo - movff compass_bearing+1,hi - PUTC "(" - bsf leftbind - output_16dp .2 ; Result is "0.000" - bcf leftbind - ; rearrange figures to "000" - movff buffer+3,buffer+1 - movff buffer+4,buffer+2 - movff buffer+5,buffer+3 - lfsr FSR2,buffer+4 - STRCAT "° " - rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 - STRCAT_PRINT ")" - return + WIN_SMALL surf_compass_bear_column,surf_compass_bear_row + movff compass_bearing+0,lo + movff compass_bearing+1,hi + PUTC "(" + bsf leftbind + output_16dp .2 ; Result is "0.000" + bcf leftbind + ; rearrange figures to "000" + movff buffer+3,buffer+1 + movff buffer+4,buffer+2 + movff buffer+5,buffer+3 + lfsr FSR2,buffer+4 + STRCAT "° " + rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 + STRCAT_PRINT ")" + return - global TFT_surface_compass_mask + global TFT_surface_compass_mask TFT_surface_compass_mask: - WIN_SMALL surf_compass_mask_column,surf_compass_mask_row + WIN_SMALL surf_compass_mask_column,surf_compass_mask_row call TFT_standard_color - STRCPY_TEXT_PRINT tHeading ; Heading: - return + STRCPY_TEXT_PRINT tHeading ; Heading: + return - global TFT_dive_compass_mask + global TFT_dive_compass_mask TFT_dive_compass_mask: - WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 - return + WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 + return - global TFT_surface_compass_heading + global TFT_surface_compass_heading TFT_surface_compass_heading: - rcall compass_heading_common - WIN_STD surf_compass_head_column,surf_compass_head_row + rcall compass_heading_common + WIN_STD surf_compass_head_column,surf_compass_head_row call TFT_standard_color -TFT_surface_compass_heading_com: ; Show "000° N" - movff compass_heading+0,lo - movff compass_heading+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required +TFT_surface_compass_heading_com: ; Show "000° N" + movff compass_heading+0,lo + movff compass_heading+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - ; Shown and actual identical? - movff compass_heading_shown+0,WREG - cpfseq lo - bra TFT_surface_compass_heading_com1 ; Not equal - movff compass_heading_shown+1,WREG - cpfseq hi - bra TFT_surface_compass_heading_com1 ; Not equal - bra TFT_surface_compass_heading_com3 ; equal, skip smoothing + ; Shown and actual identical? + movff compass_heading_shown+0,WREG + cpfseq lo + bra TFT_surface_compass_heading_com1 ; Not equal + movff compass_heading_shown+1,WREG + cpfseq hi + bra TFT_surface_compass_heading_com1 ; Not equal + bra TFT_surface_compass_heading_com3 ; equal, skip smoothing TFT_surface_compass_heading_com1: - movff lo,sub_a+0 - movff hi,sub_a+1 - movff compass_heading_shown+0,sub_b+0 - movff compass_heading_shown+1,sub_b+1 - call subU16 - btfsc neg_flag - bra TFT_surface_compass_heading_com2 ; shown > actual - ; shown < actual - banksel compass_heading_shown - infsnz compass_heading_shown+0,F - incf compass_heading_shown+1,F ; +1 - bra TFT_surface_compass_heading_com3 + movff lo,sub_a+0 + movff hi,sub_a+1 + movff compass_heading_shown+0,sub_b+0 + movff compass_heading_shown+1,sub_b+1 + call subU16 + btfsc neg_flag + bra TFT_surface_compass_heading_com2 ; shown > actual + ; shown < actual + banksel compass_heading_shown + infsnz compass_heading_shown+0,F + incf compass_heading_shown+1,F ; +1 + bra TFT_surface_compass_heading_com3 TFT_surface_compass_heading_com2: - banksel compass_heading_shown - movlw d'1' - subwf compass_heading_shown+0,F - movlw d'0' - subwfb compass_heading_shown+1,F ; -1 + banksel compass_heading_shown + movlw d'1' + subwf compass_heading_shown+0,F + movlw d'0' + subwfb compass_heading_shown+1,F ; -1 TFT_surface_compass_heading_com3: - banksel common - movff compass_heading_shown+0,lo - movff compass_heading_shown+1,hi - bsf leftbind - output_16dp .2 ; Result is "0.000" - bcf leftbind - ; rearrange figures to "000" - movff buffer+2,buffer+0 - movff buffer+3,buffer+1 - movff buffer+4,buffer+2 - lfsr FSR2,buffer+3 - STRCAT "° " - rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 - clrf WREG - movff WREG,buffer+.7 ; limit to 7 chars - STRCAT_PRINT "" + banksel common + movff compass_heading_shown+0,lo + movff compass_heading_shown+1,hi + bsf leftbind + output_16dp .2 ; Result is "0.000" + bcf leftbind + ; rearrange figures to "000" + movff buffer+2,buffer+0 + movff buffer+3,buffer+1 + movff buffer+4,buffer+2 + lfsr FSR2,buffer+3 + STRCAT "° " + rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 + clrf WREG + movff WREG,buffer+.7 ; limit to 7 chars + STRCAT_PRINT "" - btfsc divemode - return ; Done for divemode. - ; Show bearing on the surface? - btfss compass_bearing_set - return ; No, return - btfsc premenu ; "Bearing?" shown? - return ; Yes, return - bra TFT_surface_compass_bearing + btfsc divemode + return ; Done for divemode + ; Show bearing on the surface? + btfss compass_bearing_set + return ; No, return + btfsc premenu ; "Bearing?" shown? + return ; Yes, return + bra TFT_surface_compass_bearing - global TFT_dive_compass_heading + global TFT_dive_compass_heading TFT_dive_compass_heading: - rcall compass_heading_common -; ; ToDo - these are for development only, hardcoding the bearing position -; ; 244° : SW - W -; movlw low(d'244') -; movff WREG,compass_bearing+0 -; movlw high(d'244') -; movff WREG,compass_bearing+1 + rcall compass_heading_common +; ; ToDo - these are for development only, hard-coding the bearing position +; ; 244° : SW - W +; movlw low(d'244') +; movff WREG,compass_bearing+0 +; movlw high(d'244') +; movff WREG,compass_bearing+1 - movff compass_heading_shown+0,xA+0 - movff compass_heading_shown+1,xA+1 - ; xRD and xRDlft - ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale - movlw high(d'292') - movff WREG,sub_a+1 - movlw low(d'292') - movff WREG,sub_a+0 - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xA>292 - bra TFT_dive_compass_heading_1 ;yes - ; no, xA<=292 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 + movff compass_heading_shown+0,xA+0 + movff compass_heading_shown+1,xA+1 + ; xRD and xRDlft + ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale + movlw high(d'292') + movff WREG,sub_a+1 + movlw low(d'292') + movff WREG,sub_a+0 + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xA > 292 ? + bra TFT_dive_compass_heading_1 ; yes + ; no, xA<=292 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 TFT_dive_compass_heading_1: - ; 2. -80: left pixel offset from the center - movlw low( d'80' ) - subwf xA+0,1 - btfss STATUS,C - decf xA+1 - ; 3. save it to xRD - movff xA+0,xRD+0 - movff xA+1,xRD+1 - ; 4. add 160 (display px width) - movlw high(d'160') - addwf xA+1,1 - movlw low(d'160') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - ; 5. save it to xRDr - movff xA+0,xRDr+0 - movff xA+1,xRDr+1 + ; 2. -80: left pixel offset from the center + movlw low( d'80' ) + subwf xA+0,1 + btfss STATUS,C + decf xA+1 + ; 3. save it to xRD + movff xA+0,xRD+0 + movff xA+1,xRD+1 + ; 4. add 160 (display px width) + movlw high(d'160') + addwf xA+1,1 + movlw low(d'160') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + ; 5. save it to xRDr + movff xA+0,xRDr+0 + movff xA+1,xRDr+1 - btfss compass_bearing_set - bra TFT_dive_compass_ruler ; no value in the bearing, skip calc + btfss compass_bearing_set + bra TFT_dive_compass_ruler ; no value in the bearing, skip calc - ; we have bearing set, we will need xRD180 calculated - ; xRD180 is xRDr-180 - movff xRDr+1,sub_a+1 - movff xRDr+0,sub_a+0 - movlw high(d'180') - movff WREG,sub_b+1 - movlw low(d'180') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xRD180+1 - movff sub_c+0,xRD180+0 + ; we have bearing set, we will need xRD180 calculated + ; xRD180 is xRDr-180 + movff xRDr+1,sub_a+1 + movff xRDr+0,sub_a+0 + movlw high(d'180') + movff WREG,sub_b+1 + movlw low(d'180') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xRD180+1 + movff sub_c+0,xRD180+0 TFT_dive_compass_bearing_1: - ; calculate bearing position and visibility (ahead or behind) - bcf compass_bearing_vis ; default is not-visibly - bcf compass_bearing_ahd ; default is behind - ; get the bearing virtual display offset, store it to divA - movff compass_bearing+0,xA+0 - movff compass_bearing+1,xA+1 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - ; save it to reuse for upper/lower turns and ahead/behind checks - movff xA+1,divA+1 - movff xA+0,divA+0 + ; calculate bearing position and visibility (ahead or behind) + bcf compass_bearing_vis ; default is not-visibly + bcf compass_bearing_ahd ; default is behind + ; get the bearing virtual display offset, store it to divA + movff compass_bearing+0,xA+0 + movff compass_bearing+1,xA+1 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + ; save it to reuse for upper/lower turns and ahead/behind checks + movff xA+1,divA+1 + movff xA+0,divA+0 - ; check if it's ahead - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's ahead with an upper turn - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - movlw high(d'360') - addwf sub_b+1,1 - movlw low(d'360') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead with an upper turn + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + movlw high(d'360') + addwf sub_b+1,1 + movlw low(d'360') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's ahead with a lower turn - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - movlw high(d'360') - addwf sub_a+1,1 - movlw low(d'360') - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead with a lower turn + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + movlw high(d'360') + addwf sub_a+1,1 + movlw low(d'360') + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; marker is not ahead of us, check if it's behind us - ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display - ; load the display offset back to sub_a - movff xRD180+0,sub_a+0 - movff xRD180+1,sub_a+1 - ; load the marker's offset into sub_b - movff divA+0,sub_b+0 - movff divA+1,sub_b+1 - rcall TFT_dive_compass_bearing_bp - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; marker is not ahead of us, check if it's behind us + ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display + ; load the display offset back to sub_a + movff xRD180+0,sub_a+0 + movff xRD180+1,sub_a+1 + ; load the marker's offset into sub_b + movff divA+0,sub_b+0 + movff divA+1,sub_b+1 + rcall TFT_dive_compass_bearing_bp + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ;check if it's behind with the lower turn - movff xRD180+0,sub_a+0 - movff xRD180+1,sub_a+1 - movlw high(d'360') - addwf sub_a+1,1 - movlw low(d'360') - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - ; load the marker's offset into sub_b - movff divA+0,sub_b+0 - movff divA+1,sub_b+1 - rcall TFT_dive_compass_bearing_bp - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ;check if it's behind with the lower turn + movff xRD180+0,sub_a+0 + movff xRD180+1,sub_a+1 + movlw high(d'360') + addwf sub_a+1,1 + movlw low(d'360') + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + ; load the marker's offset into sub_b + movff divA+0,sub_b+0 + movff divA+1,sub_b+1 + rcall TFT_dive_compass_bearing_bp + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's behind with the upper turn - movff divA+1,sub_b+1 - movff divA+0,sub_b+0 - movlw high(d'360') - addwf sub_b+1,1 - movlw low(d'360') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - rcall TFT_dive_compass_bearing_bp - bra TFT_dive_compass_bearing_dir + ; check if it's behind with the upper turn + movff divA+1,sub_b+1 + movff divA+0,sub_b+0 + movlw high(d'360') + addwf sub_b+1,1 + movlw low(d'360') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + rcall TFT_dive_compass_bearing_bp + bra TFT_dive_compass_bearing_dir TFT_dive_compass_bearing_ap: - ; xCM received in sub_a - ; xRD received in sub_b - ; 1/a. check if it's viewable from the left side - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xRD>divA - return ;no, - ; yes, store the RO=RP-RD for drawing - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 - ; 1/b. check if it's viewable from the right side? - movlw d'2' ; avoid thin mess on the side of the display - addwf sub_a+0,1 - btfsc STATUS, C - incf sub_a+1 - ; load the display offset right side into sub_b - movlw high(d'158') - addwf sub_b+1,1 - movlw low(d'158') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xRDr>xA(+2) - return ; no, - ; print the bearing lines on the screen - movff xC+0,xCM - bsf compass_bearing_vis ; set visible - bsf compass_bearing_ahd ; set ahead - return ; done, + ; xCM received in sub_a + ; xRD received in sub_b + ; 1/a. check if it's viewable from the left side + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xRD>divA + return ; no + ; yes, store the RO=RP-RD for drawing + movff sub_c+0,xC+0 + movff sub_c+1,xC+1 + ; 1/b. check if it's viewable from the right side? + movlw d'2' ; avoid thin mess on the side of the display + addwf sub_a+0,1 + btfsc STATUS, C + incf sub_a+1 + ; load the display offset right side into sub_b + movlw high(d'158') + addwf sub_b+1,1 + movlw low(d'158') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xRDr > xA(+2) ? + return ; no + ; print the bearing lines on the screen + movff xC+0,xCM + bsf compass_bearing_vis ; set visible + bsf compass_bearing_ahd ; set ahead + return ; done, TFT_dive_compass_bearing_bp: - ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display - ; the marker's offset received in sub_b - ; the xRD180 display offset received in sub_a - ; xRD180 - xCM - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; CM>xRD180 - return ; no, not on screen - ; 160 - (X) - movlw high(d'158') - movff WREG,sub_a+1 - movlw low(d'158') - movff WREG,sub_a+0 - movff sub_c+1,sub_b+1 - movff sub_c+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; X>160 - return ; no, not on screen - ; check if not overflow - this sounds a double check... - movlw d'1' - cpfslt sub_c+1 - return ; high set, >160 - movlw d'158' - cpfslt sub_c+0 - return ; low >160 - ; print the bearing lines on the screen - movff sub_c+0,xCM - bsf compass_bearing_vis - return ; done + ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display + ; the marker's offset received in sub_b + ; the xRD180 display offset received in sub_a + ; xRD180 - xCM + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; CM > xRD180 ? + return ; no, not on screen + ; 160 - (X) + movlw high(d'158') + movff WREG,sub_a+1 + movlw low(d'158') + movff WREG,sub_a+0 + movff sub_c+1,sub_b+1 + movff sub_c+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; X>160 + return ; no, not on screen + ; check if not overflow - this sounds a double check... + movlw d'1' + cpfslt sub_c+1 + return ; high set, >160 + movlw d'158' + cpfslt sub_c+0 + return ; low >160 + ; print the bearing lines on the screen + movff sub_c+0,xCM + bsf compass_bearing_vis + return ; done TFT_dive_compass_bearing_dir: - ; check if bearing to heading, and calculate the direction - bcf compass_bearing_eq - btfss compass_bearing_vis - bra TFT_dive_compass_bearing_lr - btfss compass_bearing_ahd - bra TFT_dive_compass_bearing_lr - movff xCM,xA+0 - movlw d'80' - cpfseq xA+0 - bra TFT_dive_compass_bearing_lr - bsf compass_bearing_eq - bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler + ; check if bearing to heading, and calculate the direction + bcf compass_bearing_eq + btfss compass_bearing_vis + bra TFT_dive_compass_bearing_lr + btfss compass_bearing_ahd + bra TFT_dive_compass_bearing_lr + movff xCM,xA+0 + movlw d'80' + cpfseq xA+0 + bra TFT_dive_compass_bearing_lr + bsf compass_bearing_eq + bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler TFT_dive_compass_bearing_lr: - ; get the bearing virtual display offset - movff compass_bearing+0,xA+0 - movff compass_bearing+1,xA+1 - ; divA =IF (U10>292;U10;U10+360) - movlw high(d'292') - movff WREG,sub_a+1 - movlw low(d'292') - movff WREG,sub_a+0 - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xA>292 - bra TFT_dive_compass_bearing_lr_1 ;yes - ; no, xA<=292 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 + ; get the bearing virtual display offset + movff compass_bearing+0,xA+0 + movff compass_bearing+1,xA+1 + ; divA =IF (U10>292;U10;U10+360) + movlw high(d'292') + movff WREG,sub_a+1 + movlw low(d'292') + movff WREG,sub_a+0 + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xA > 292 ? + bra TFT_dive_compass_bearing_lr_1 ; yes + ; no, xA <= 292 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 TFT_dive_compass_bearing_lr_1: - ; 1. calculate whether bearing is to left or to right - bsf compass_bearing_lft ; to the left by default - ; xC: save center value to compare the direction to front value - movff xA+1,xC+1 - movff xA+0,xC+0 - ; xB: we need the left side for comparism... left = -180 - movff xA+1,sub_a+1 - movff xA+0,sub_a+0 - movlw high(d'180') - movff WREG,sub_b+1 - movlw low(d'180') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center - movff sub_c+0,xB+0 - ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) - movff xC+1,sub_a+1 - movff xC+0,sub_a+0 - movlw d'100' - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - movff xRD+1,sub_b+1 - movff xRD+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xRD>xC+100 - bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 - ; no, xA = xRD+80 - movff xRD+1,xA+1 - movff xRD+0,xA+0 - movlw d'80' - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - bra TFT_dive_compass_bearing_lr_c + ; 1. calculate whether bearing is to left or to right + bsf compass_bearing_lft ; to the left by default + ; xC: save center value to compare the direction to front value + movff xA+1,xC+1 + movff xA+0,xC+0 + ; xB: we need the left side for comparison... left = -180 + movff xA+1,sub_a+1 + movff xA+0,sub_a+0 + movlw high(d'180') + movff WREG,sub_b+1 + movlw low(d'180') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center + movff sub_c+0,xB+0 + ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) + movff xC+1,sub_a+1 + movff xC+0,sub_a+0 + movlw d'100' + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + movff xRD+1,sub_b+1 + movff xRD+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xRD>xC+100 + bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 + ; no, xA = xRD+80 + movff xRD+1,xA+1 + movff xRD+0,xA+0 + movlw d'80' + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + bra TFT_dive_compass_bearing_lr_c TFT_dive_compass_bearing_lr_2: - ; xA=xRD-280 - movff xRD+1,sub_a+1 - movff xRD+0,sub_a+0 - movlw high(d'280') - movff WREG,sub_b+1 - movlw low(d'280') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xA+1 - movff sub_c+0,xA+0 - ;bra TFT_dive_compass_bearing_lr_c + ; xA=xRD-280 + movff xRD+1,sub_a+1 + movff xRD+0,sub_a+0 + movlw high(d'280') + movff WREG,sub_b+1 + movlw low(d'280') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xA+1 + movff sub_c+0,xA+0 + ;bra TFT_dive_compass_bearing_lr_c TFT_dive_compass_bearing_lr_c: - ; xB < xA < xC => right, otherwise left (default) - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - movff xB+1,sub_a+1 - movff xB+0,sub_a+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xA>xB ? - bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left - movff xA+1,sub_a+1 - movff xA+0,sub_a+0 - movff xC+1,sub_b+1 - movff xC+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xC>xA ? - bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left - bcf compass_bearing_lft + ; xB < xA < xC => right, otherwise left (default) + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + movff xB+1,sub_a+1 + movff xB+0,sub_a+0 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xA>xB ? + bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left + movff xA+1,sub_a+1 + movff xA+0,sub_a+0 + movff xC+1,sub_b+1 + movff xC+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xC>xA ? + bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left + bcf compass_bearing_lft TFT_dive_compass_ruler: - ; calculate mod15 for the ticks - movff xRD+0,xA+0 - movff xRD+1,xA+1 + ; calculate mod15 for the ticks + movff xRD+0,xA+0 + movff xRD+1,xA+1 movlw d'15' movwf xB+0 clrf xB+1 - call div16x16 ;xA/xB=xC with xA+0 as remainder - ; check xA+0, it has the remainder - movlw d'0' - cpfsgt xA+0 ; mod15 > 0 - bra TFT_dive_compass_ruler_1 ; no, RM = 0 - ; yes RM = 15 - RDmod15 - movlw d'15' - subfwb xA+0,1 + call div16x16 ; xA/xB=xC with xA+0 as remainder + ; check xA+0, it has the remainder + movlw d'0' + cpfsgt xA+0 ; mod15 > 0 + bra TFT_dive_compass_ruler_1 ; no, RM = 0 + ; yes RM = 15 - RDmod15 + movlw d'15' + subfwb xA+0,1 TFT_dive_compass_ruler_1: - ; xA+0 holds the RM, store it to 'lo' - movff xA+0,lo - ; init DD to zero, store it to 'hi' - clrf hi + ; xA+0 holds the RM, store it to 'lo' + movff xA+0,lo + ; init DD to zero, store it to 'hi' + clrf hi TFT_dive_compass_ruler_loop: - ; 1. check if we run of from the display - movlw d'159' ; Looks like 159 works because TFT_box limits the dispay - cpfslt lo,1 - bra TFT_dive_compass_ruler_lend ; xRM >= W - ; 2. Clear the tick area from DD to RM - in segments to avoid blinking - ; don't do a clear if we are at 0 (zero) otherwise it will blink - ; because of the width underflow - movlw d'0' - cpfsgt lo,1 - bra TFT_dive_compass_ruler_loop_zz - rcall TFT_dive_compass_clr_ruler + ; 1. check if we run of from the display + movlw d'159' ; Looks like 159 works because TFT_box limits the display + cpfslt lo,1 + bra TFT_dive_compass_ruler_lend ; xRM >= W + ; 2. Clear the tick area from DD to RM - in segments to avoid blinking + ; don't do a clear if we are at 0 (zero) otherwise it will blink + ; because of the width underflow + movlw d'0' + cpfsgt lo,1 + bra TFT_dive_compass_ruler_loop_zz + rcall TFT_dive_compass_clr_ruler TFT_dive_compass_ruler_loop_zz: - ; 3. Draw the markers @ RM - ; we receive RM in lo and DD in hi - movlw dm_custom_compass_tick_top_top - movwf win_top - movlw dm_custom_compass_tick_height - movwf win_height - movlw d'2' - movwf win_width+0 - clrf win_width+1 - movwf win_bargraph - movff lo,win_leftx2 ; 0..159 - call TFT_standard_color - call TFT_box - movlw dm_custom_compass_tick_bot_top - movwf win_top - movlw dm_custom_compass_tick_height - movwf win_height - call TFT_standard_color ; color in WREG is trashed, must be set again! - call TFT_box - ; 4. If D<82 and RM>79: means we put something over the center line - ; redraw the center line - movlw d'82' - cpfslt hi,1 - bra TFT_dive_compass_ruler_loop_zz2 - movlw d'79' - cpfsgt lo,1 - bra TFT_dive_compass_ruler_loop_zz2 - ;enough to print cline as bearing marker is not in the ticker area - movlw color_yellow - WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow + ; 3. Draw the markers @ RM + ; we receive RM in lo and DD in hi + movlw dm_custom_compass_tick_top_top + movwf win_top + movlw dm_custom_compass_tick_height + movwf win_height + movlw d'2' + movwf win_width+0 + clrf win_width+1 + movwf win_bargraph + movff lo,win_leftx2 ; 0..159 + call TFT_standard_color + call TFT_box + movlw dm_custom_compass_tick_bot_top + movwf win_top + movlw dm_custom_compass_tick_height + movwf win_height + call TFT_standard_color ; color in WREG is trashed, must be set again! + call TFT_box + ; 4. If D<82 and RM>79: means we put something over the center line + ; redraw the center line + movlw d'82' + cpfslt hi,1 + bra TFT_dive_compass_ruler_loop_zz2 + movlw d'79' + cpfsgt lo,1 + bra TFT_dive_compass_ruler_loop_zz2 + ; enough to print cline as bearing marker is not in the ticker area + movlw color_yellow + WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow TFT_dive_compass_ruler_loop_zz2: - ; 5. set D = RM + 2 : position after the 2px tick - movff lo,hi - movlw d'2' - addwf hi,F - ; 6. set RM = RM + 15 : position to the next tick - movlw d'15' - addwf lo,F - ; 7. loop - bra TFT_dive_compass_ruler_loop + ; 5. set D = RM + 2 : position after the 2px tick + movff lo,hi + movlw d'2' + addwf hi,F + ; 6. set RM = RM + 15 : position to the next tick + movlw d'15' + addwf lo,F + ; 7. loop + bra TFT_dive_compass_ruler_loop -TFT_dive_compass_ruler_lend: ; loop end - ; 8. clear the rest of the tick area if D<160 - movlw d'160' - cpfslt hi - bra TFT_dive_compass_ruler_lend2 ; D >= W - ; 9. position left to end of display to clear the remaining area - movlw d'159' - movwf lo - ; 10. clear it - rcall TFT_dive_compass_clr_ruler +TFT_dive_compass_ruler_lend: ; loop end + ; 8. clear the rest of the tick area if D<160 + movlw d'160' + cpfslt hi + bra TFT_dive_compass_ruler_lend2 ; D >= W + ; 9. position left to end of display to clear the remaining area + movlw d'159' + movwf lo + ; 10. clear it + rcall TFT_dive_compass_clr_ruler TFT_dive_compass_ruler_lend2: - ; done with the compass ruler, put the labels on the screen - ; get the RD abck to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - ; hi stores the display position - clrf hi - clrf xHI - ; lo stores the last item's display position - clrf lo - clrf xLO - - movlw low( d'219' ) ; position of the label - movwf sub_a+0 - movlw high( d'219' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_1 - STRCPY_TEXT_PRINT tSW ; yes - print it -dcr_1: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'267' ) ; position of the label - movwf sub_a+0 - movlw high( d'267' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_2 - STRCPY_TEXT_PRINT tW ; yes - print it -dcr_2: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'309' ) ; position of the label - movwf sub_a+0 - movlw high( d'309' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_3 - STRCPY_TEXT_PRINT tNW ; yes - print it -dcr_3: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'358' ) ; position of the label - movwf sub_a+0 - movlw high( d'358' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_4 - STRCPY_TEXT_PRINT tN ; yes - print it -dcr_4: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'399' ) ; position of the label - movwf sub_a+0 - movlw high( d'399' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_5 - STRCPY_TEXT_PRINT tNE ; yes - print it -dcr_5: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; done with the compass ruler, put the labels on the screen + ; get the RD abck to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + ; hi stores the display position + clrf hi + clrf xHI + ; lo stores the last item's display position + clrf lo + clrf xLO - movlw low( d'448' ) ; position of the label - movwf sub_a+0 - movlw high( d'448' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_6 - STRCPY_TEXT_PRINT tE ; yes - print it + movlw low( d'219' ) ; position of the label + movwf sub_a+0 + movlw high( d'219' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_1 + STRCPY_TEXT_PRINT tSW ; yes - print it +dcr_1: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'267' ) ; position of the label + movwf sub_a+0 + movlw high( d'267' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_2 + STRCPY_TEXT_PRINT tW ; yes - print it +dcr_2: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'309' ) ; position of the label + movwf sub_a+0 + movlw high( d'309' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_3 + STRCPY_TEXT_PRINT tNW ; yes - print it +dcr_3: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'358' ) ; position of the label + movwf sub_a+0 + movlw high( d'358' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_4 + STRCPY_TEXT_PRINT tN ; yes - print it +dcr_4: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'399' ) ; position of the label + movwf sub_a+0 + movlw high( d'399' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_5 + STRCPY_TEXT_PRINT tNE ; yes - print it +dcr_5: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'448' ) ; position of the label + movwf sub_a+0 + movlw high( d'448' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_6 + STRCPY_TEXT_PRINT tE ; yes - print it dcr_6: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'489' ) ; position of the label - movwf sub_a+0 - movlw high( d'489' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_7 - STRCPY_TEXT_PRINT tSE ; yes - print it + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'489' ) ; position of the label + movwf sub_a+0 + movlw high( d'489' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_7 + STRCPY_TEXT_PRINT tSE ; yes - print it dcr_7: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'538' ) ; position of the label - movwf sub_a+0 - movlw high( d'538' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_8 - STRCPY_TEXT_PRINT tS ; yes - print it + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'538' ) ; position of the label + movwf sub_a+0 + movlw high( d'538' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_8 + STRCPY_TEXT_PRINT tS ; yes - print it dcr_8: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'579' ) ; position of the label + movwf sub_a+0 + movlw high( d'579' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_9 + STRCPY_TEXT_PRINT tSW ; yes - print it +dcr_9: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'627' ) ; position of the label + movwf sub_a+0 + movlw high( d'627' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_10 + STRCPY_TEXT_PRINT tW ; yes - print it +dcr_10: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'669' ) ; position of the label + movwf sub_a+0 + movlw high( d'669' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_11 + STRCPY_TEXT_PRINT tNW ; yes - print it +dcr_11: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - movlw low( d'579' ) ; position of the label - movwf sub_a+0 - movlw high( d'579' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_9 - STRCPY_TEXT_PRINT tSW ; yes - print it -dcr_9: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'627' ) ; position of the label - movwf sub_a+0 - movlw high( d'627' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_10 - STRCPY_TEXT_PRINT tW ; yes - print it -dcr_10: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'669' ) ; position of the label - movwf sub_a+0 - movlw high( d'669' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_11 - STRCPY_TEXT_PRINT tNW ; yes - print it -dcr_11: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'718' ) ; position of the label - movwf sub_a+0 - movlw high( d'718' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_12 - STRCPY_TEXT_PRINT tN ; yes - print it + movlw low( d'718' ) ; position of the label + movwf sub_a+0 + movlw high( d'718' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_12 + STRCPY_TEXT_PRINT tN ; yes - print it dcr_12: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker TFT_dive_compass_label_end: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - ; restore lo and hi for the final cleanup - movff xLO,lo - movff xHI,hi - ; clear the rest of the SQ area if there are more space - movlw d'159' - cpfslt hi - bra TFT_dive_compass_label_end2 ; D >= 160, no more space - ; position left to end of display to clear the remaining area - movlw d'158' - movwf lo - ; clear it - rcall TFT_dive_compass_clr_label + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; restore lo and hi for the final cleanup + movff xLO,lo + movff xHI,hi + ; clear the rest of the SQ area if there are more space + movlw d'159' + cpfslt hi + bra TFT_dive_compass_label_end2 ; D >= 160, no more space + ; position left to end of display to clear the remaining area + movlw d'158' + movwf lo + ; clear it + rcall TFT_dive_compass_clr_label TFT_dive_compass_label_end2: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - ; do we have bearing set? - btfsc compass_bearing_set - bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) - rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) - rcall TFT_dive_compass_dir_rclr - bra TFT_dive_compass_text + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; do we have bearing set? + btfsc compass_bearing_set + bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) + rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) + rcall TFT_dive_compass_dir_rclr + bra TFT_dive_compass_text TFT_dive_compass_dir_text: - ; bearing set, but does it point to heading? - btfss compass_bearing_eq - bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir - rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers - rcall TFT_dive_compass_dir_rclr - bra TFT_dive_compass_text + ; bearing set, but does it point to heading? + btfss compass_bearing_eq + bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir + rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers + rcall TFT_dive_compass_dir_rclr + bra TFT_dive_compass_text TFT_dive_compass_dir_text_2: - movlw color_green - call TFT_set_color - btfsc compass_bearing_lft - bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker + movlw color_green + call TFT_set_color + btfsc compass_bearing_lft + bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker ;TFT_dive_compass_text_rdir: - WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT ">>" - ; do not forget to clear the left - rcall TFT_dive_compass_dir_lclr - bra TFT_dive_compass_text + WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT ">>" + ; do not forget to clear the left + rcall TFT_dive_compass_dir_lclr + bra TFT_dive_compass_text TFT_dive_compass_dir_ldir: - WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT "<<" - ; do not forget to clear the right - rcall TFT_dive_compass_dir_rclr - ;bra TFT_dive_compass_text + WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT "<<" + ; do not forget to clear the right + rcall TFT_dive_compass_dir_rclr + ;bra TFT_dive_compass_text TFT_dive_compass_text: - ; Clear some unused space on the right mH - WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right + ; Clear some unused space on the right mH + WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right - ; Text output - call TFT_standard_color - WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row - rcall TFT_surface_compass_heading_com ; Show "000° N" - return + ; Text output + call TFT_standard_color + WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row + rcall TFT_surface_compass_heading_com ; Show "000° N" + return TFT_dive_compass_dir_lclr: - WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT " " - return + WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT " " + return TFT_dive_compass_dir_rclr: - WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT " " - return + WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT " " + return TFT_dive_compass_label_proc: - movwf sub_a+1 - movlw d'14' - movwf up ; cardinal width in px - bcf print_compass_label - ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? - ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; >=0? - return ; No - ; store the RO=RP-RD for drawing - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 + movwf sub_a+1 + movlw d'14' + movwf up ; cardinal width in px + bcf print_compass_label + ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? + ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; >=0? + return ; No + ; store the RO=RP-RD for drawing + movff sub_c+0,xC+0 + movff sub_c+1,xC+1 - ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 - ; if already above, no need to process the rest of the labels - movff up,WREG ; take care about the width - addwf sub_a+0,1 - btfsc STATUS, C - incf sub_a+1 + ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 + ; if already above, no need to process the rest of the labels + movff up,WREG ; take care about the width + addwf sub_a+0,1 + btfsc STATUS, C + incf sub_a+1 - movff xRDr+0,sub_b+0 - movff xRDr+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; ? <0 - bra TFT_dive_compass_label_end ; No + movff xRDr+0,sub_b+0 + movff xRDr+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; ? <0 + bra TFT_dive_compass_label_end ; No - ; 2. restore RO=RP-RD from 1/a. - movff xC+0,lo + ; 2. restore RO=RP-RD from 1/a. + movff xC+0,lo - ; 3. Clear the segment from DD(hi) to lo - ; don't do a clear if we are at 0 (zero) otherwise it will blink - ; ?because of the width underflow? - movlw d'1' - cpfsgt lo - bra TFT_dive_compass_label_proc_p - rcall TFT_dive_compass_clr_label + ; 3. Clear the segment from DD(hi) to lo + ; don't do a clear if we are at 0 (zero) otherwise it will blink + ; ?because of the width underflow? + movlw d'1' + cpfsgt lo + bra TFT_dive_compass_label_proc_p + rcall TFT_dive_compass_clr_label TFT_dive_compass_label_proc_p: - ; 4. print the SQ on the screen - call TFT_standard_color - bsf print_compass_label + ; 4. print the SQ on the screen + call TFT_standard_color + bsf print_compass_label ;TFT_dive_compass_label_print: - movlw dm_custom_compass_label_row - movff WREG,win_top - movff lo,win_leftx2 - movlw FT_SMALL - movff WREG,win_font - ; 6. retain the new display positions - movff lo,hi - movff up,WREG - addwf hi,F - movff lo,xLO - movff hi,xHI - return + movlw dm_custom_compass_label_row + movff WREG,win_top + movff lo,win_leftx2 + movlw FT_SMALL + movff WREG,win_font + ; 6. retain the new display positions + movff lo,hi + movff up,WREG + addwf hi,F + movff lo,xLO + movff hi,xHI + return TFT_dive_compass_c_mk: - ; Common task to draw center line and marker - ; until a proper implementation make it simple: - rcall TFT_dive_compass_mk - movlw color_yellow - WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow - return + ; Common task to draw center line and marker + ; until a proper implementation make it simple: + rcall TFT_dive_compass_mk + movlw color_yellow + WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow + return TFT_dive_compass_mk: - ; draw the bearing on the screen if visible and if we just put something over it - btfss compass_bearing_set - return ; bearing_set=0 nothing to display + ; draw the bearing on the screen if visible and if we just put something over it + btfss compass_bearing_set + return ; bearing_set=0 nothing to display - btfss compass_bearing_vis - return ; bearing set but not visible + btfss compass_bearing_vis + return ; bearing set but not visible - ; save lo/hi from trashing - movff lo,xA+0 - movff hi,xA+1 + ; save lo/hi from trashing + movff lo,xA+0 + movff hi,xA+1 - ; did we just update the marker's position? - ; DD.......DD - ; CM+2>=DD(old) or CM-2<=DD - ; ToDo + ; did we just update the marker's position? + ; DD.......DD + ; CM+2>=DD(old) or CM-2<=DD + ; ToDo - btfss compass_bearing_ahd - bra TFT_dive_compass_mk_rear + btfss compass_bearing_ahd + bra TFT_dive_compass_mk_rear ;TFT_dive_compass_mk_front: - clrf lo - movff xCM,lo - bsf print_compass_label ; set=green marker - rcall TFT_dive_compass_mk_print - bcf print_compass_label - bra TFT_dive_compass_mk_end + clrf lo + movff xCM,lo + bsf print_compass_label ; set=green marker + rcall TFT_dive_compass_mk_print + bcf print_compass_label + bra TFT_dive_compass_mk_end TFT_dive_compass_mk_rear: - clrf lo - movff xCM,lo - bcf print_compass_label ; set=red marker - rcall TFT_dive_compass_mk_print + clrf lo + movff xCM,lo + bcf print_compass_label ; set=red marker + rcall TFT_dive_compass_mk_print TFT_dive_compass_mk_end: - movff xA+0,lo - movff xA+1,hi - return + movff xA+0,lo + movff xA+1,hi + return TFT_dive_compass_mk_print: - movlw d'1' - cpfsgt lo - bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line - movlw d'2' - subwf lo,0 -; movff WREG,win_leftx2 - rcall TFT_dive_compass_mk_print_3 + movlw d'1' + cpfsgt lo + bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line + movlw d'2' + subwf lo,0 +; movff WREG,win_leftx2 + rcall TFT_dive_compass_mk_print_3 TFT_dive_compass_mk_print_2: - ; save hi/lo - movff hi,divA+1 - movff lo,divA+0 - ; clear the middle of the bearing marker - movff lo,hi - movlw d'2' - addwf lo,1 - rcall TFT_dive_compass_clr_label - ; restore hi/lo - movff divA+1,hi - movff divA+0,lo - ; print a dot on the middle - movff lo,WREG - rcall TFT_dive_compass_mk_print_dot - ; finally print the right marker line - movlw d'2' - addwf lo,0 -; rcall TFT_dive_compass_mk_print_3 -; return + ; save hi/lo + movff hi,divA+1 + movff lo,divA+0 + ; clear the middle of the bearing marker + movff lo,hi + movlw d'2' + addwf lo,1 + rcall TFT_dive_compass_clr_label + ; restore hi/lo + movff divA+1,hi + movff divA+0,lo + ; print a dot on the middle + movff lo,WREG + rcall TFT_dive_compass_mk_print_dot + ; finally print the right marker line + movlw d'2' + addwf lo,0 +; rcall TFT_dive_compass_mk_print_3 +; return TFT_dive_compass_mk_print_3: - movwf win_leftx2 - movlw dm_custom_compass_label_row - movwf win_top - movlw dm_custom_compass_label_height-.2 - movwf win_height - bra TFT_dive_compass_mk_print_4 + movwf win_leftx2 + movlw dm_custom_compass_label_row + movwf win_top + movlw dm_custom_compass_label_height-.2 + movwf win_height + bra TFT_dive_compass_mk_print_4 TFT_dive_compass_mk_print_dot: - movwf win_leftx2 - movlw dm_custom_compass_label_row + .9 - movwf win_top - movlw d'4' - movwf win_height + movwf win_leftx2 + movlw dm_custom_compass_label_row + .9 + movwf win_top + movlw d'4' + movwf win_height TFT_dive_compass_mk_print_4: - movlw .158 - cpfslt win_leftx2 - bra TFT_dive_compass_mk_print_5 - movlw d'2' - movwf win_width+0 - clrf win_width+1 - movwf win_bargraph - movlw color_green - btfss print_compass_label - movlw color_red - call TFT_set_color - call TFT_box + movlw .158 + cpfslt win_leftx2 + bra TFT_dive_compass_mk_print_5 + movlw d'2' + movwf win_width+0 + clrf win_width+1 + movwf win_bargraph + movlw color_green + btfss print_compass_label + movlw color_red + call TFT_set_color + call TFT_box TFT_dive_compass_mk_print_5: - banksel common - return + banksel common + return TFT_dive_compass_clr_label: - movlw dm_custom_compass_label_row-.2 ; set top & height - movff WREG,win_top - movlw dm_custom_compass_label_height+.2 - movff WREG,win_height - rcall TFT_dive_compass_clear - return + movlw dm_custom_compass_label_row-.2 ; set top & height + movff WREG,win_top + movlw dm_custom_compass_label_height+.2 + movff WREG,win_height + rcall TFT_dive_compass_clear + return TFT_dive_compass_clr_ruler: - ; top tick - movlw dm_custom_compass_tick_top_top ; set top & height - movff WREG,win_top - movlw dm_custom_compass_tick_height - movff WREG,win_height - rcall TFT_dive_compass_clear - ;bottom tick - movlw dm_custom_compass_tick_bot_top ; set top & height - movff WREG,win_top - movlw dm_custom_compass_tick_height - movff WREG,win_height -; rcall TFT_dive_compass_clear -; return + ; top tick + movlw dm_custom_compass_tick_top_top ; set top & height + movff WREG,win_top + movlw dm_custom_compass_tick_height + movff WREG,win_height + rcall TFT_dive_compass_clear + ;bottom tick + movlw dm_custom_compass_tick_bot_top ; set top & height + movff WREG,win_top + movlw dm_custom_compass_tick_height + movff WREG,win_height +; rcall TFT_dive_compass_clear +; return TFT_dive_compass_clear: - ; we receive RM in lo and DD in hi - ; calculate width = RM-D - movff hi,WREG - subwf lo,W - bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do - movwf win_width+0 ; RM-DD - movwf win_bargraph - clrf win_width+1 - movlw .1 - cpfsgt win_width+0 - bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) - movff hi,win_leftx2 - movlw color_black - call TFT_set_color - call TFT_box + ; we receive RM in lo and DD in hi + ; calculate width = RM-D + movff hi,WREG + subwf lo,W + bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do + movwf win_width+0 ; RM-DD + movwf win_bargraph + clrf win_width+1 + movlw .1 + cpfsgt win_width+0 + bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) + movff hi,win_leftx2 + movlw color_black + call TFT_set_color + call TFT_box TFT_dive_compass_clear3: - return + return tft_compass_cardinal: - btfsc hi,0 ; Heading >255°? - bra tft_compass_cardinal2 ; Yes must be W, NW or N - ; No, Must be W, SW, S, SE, E, NE or N - movlw .23 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_N - movlw .68 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_NE - movlw .113 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_E - movlw .158 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_SE - movlw .203 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_S - movlw .248 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_SW - bra tft_compass_cardinal_W + btfsc hi,0 ; Heading >255°? + bra tft_compass_cardinal2 ; Yes must be W, NW or N + ; No, Must be W, SW, S, SE, E, NE or N + movlw .23 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_N + movlw .68 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_NE + movlw .113 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_E + movlw .158 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_SE + movlw .203 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_S + movlw .248 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_SW + bra tft_compass_cardinal_W tft_compass_cardinal2: - movlw .37 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_W - movlw .82 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_NW -; bra tft_compass_cardinal_N + movlw .37 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_W + movlw .82 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_NW +; bra tft_compass_cardinal_N + tft_compass_cardinal_N: - STRCAT_TEXT tN - return + STRCAT_TEXT tN + return tft_compass_cardinal_NE: - STRCAT_TEXT tNE - return + STRCAT_TEXT tNE + return tft_compass_cardinal_E: - STRCAT_TEXT tE - return + STRCAT_TEXT tE + return tft_compass_cardinal_SE: - STRCAT_TEXT tSE - return + STRCAT_TEXT tSE + return tft_compass_cardinal_S: - STRCAT_TEXT tS - return + STRCAT_TEXT tS + return tft_compass_cardinal_SW: - STRCAT_TEXT tSW - return + STRCAT_TEXT tSW + return tft_compass_cardinal_W: - STRCAT_TEXT tW - return + STRCAT_TEXT tW + return tft_compass_cardinal_NW: - STRCAT_TEXT tNW - return + STRCAT_TEXT tNW + return compass_heading_common: call speed_normal - movlw compass_averaging ; numbers of extra averaging - movwf up + movlw compass_averaging ; numbers of extra averaging + movwf up compass_heading_common2: - rcall TFT_get_compass - decfsz up,F - bra compass_heading_common2 - extern compass - call compass ; Do compass corrections. - banksel common + rcall TFT_get_compass + decfsz up,F + bra compass_heading_common2 + call compass ; Do compass corrections. + banksel common - ; More then compass_fast_treshold? - movff compass_heading_old+0,sub_a+0 - movff compass_heading_old+1,sub_a+1 - movff compass_heading+0,sub_b+0 - movff compass_heading+1,sub_b+1 - call sub16 - btfss neg_flag ; <0? - bra compass_heading_common3 ; No, test for threshold - ; Yes, subtract the other way round - movff compass_heading+0,sub_a+0 - movff compass_heading+1,sub_a+1 - movff compass_heading_old+0,sub_b+0 - movff compass_heading_old+1,sub_b+1 - call sub16 + ; More then compass_fast_treshold? + movff compass_heading_old+0,sub_a+0 + movff compass_heading_old+1,sub_a+1 + movff compass_heading+0,sub_b+0 + movff compass_heading+1,sub_b+1 + call sub16 + btfss neg_flag ; <0? + bra compass_heading_common3 ; No, test for threshold + ; Yes, subtract the other way round + movff compass_heading+0,sub_a+0 + movff compass_heading+1,sub_a+1 + movff compass_heading_old+0,sub_b+0 + movff compass_heading_old+1,sub_b+1 + call sub16 compass_heading_common3: - movff compass_heading+0,compass_heading_old+0 ; copy new "old" - movff compass_heading+1,compass_heading_old+1 + movff compass_heading+0,compass_heading_old+0 ; copy new "old" + movff compass_heading+1,compass_heading_old+1 - bcf compass_fast_mode - movlw compass_fast_treshold - cpfslt sub_c+0 ; > compass_fast_treshold? - bsf compass_fast_mode ; Yes! + bcf compass_fast_mode + movlw compass_fast_treshold + cpfslt sub_c+0 ; > compass_fast_treshold? + bsf compass_fast_mode ; Yes! - btfss compass_fast_mode ; In fast mode? - return ; No. - ; Yes. - movff compass_heading+0,lo - movff compass_heading+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - movff lo,compass_heading_shown+0 - movff hi,compass_heading_shown+1 - return + btfss compass_fast_mode ; In fast mode? + return ; No. + ; Yes. + movff compass_heading+0,lo + movff compass_heading+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + movff lo,compass_heading_shown+0 + movff hi,compass_heading_shown+1 + return TFT_get_compass: - call I2C_RX_compass ; Test Compass - call I2C_RX_accelerometer ; Test Accelerometer - call compass_filter ; Filter Raw compass + accel readings. - banksel common - return + call I2C_RX_compass ; Test Compass + call I2C_RX_accelerometer ; Test Accelerometer + call compass_filter ; Filter Raw compass + accel readings. + banksel common + return - global TFT_surf_set_bearing + global TFT_surf_set_bearing TFT_surf_set_bearing: - btfsc premenu - return ; Already shown, return - bsf premenu ; set flag - WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right - WIN_SMALL surf_compass_bear_column,surf_compass_bear_row - WIN_COLOR color_yellow - bsf win_invert - STRCPY_TEXT_PRINT tSetHeading ; 7 chars - bcf win_invert - return + btfsc premenu + return ; Already shown, return + bsf premenu ; set flag + WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right + WIN_SMALL surf_compass_bear_column,surf_compass_bear_row + WIN_COLOR color_yellow + bsf win_invert + STRCPY_TEXT_PRINT tSetHeading ; 7 chars + bcf win_invert + return - END + END diff -r f5de1ff88814 -r b455b31ce022 src/convert.asm --- a/src/convert.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/convert.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File convert.asm +; File convert.asm ## V2.98 ; ; Converts register values to string ; @@ -11,298 +11,270 @@ ; 2010-12-10 : [jDG] Optimize macro size ; -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; Mandatory header + +basic CODE ;============================================================================= - CBLOCK tmp+0x09 ; space for aa_wordprocessor - temp3 - temp4 - cvt_flags2 - ; Reserved to tmp+0x11... - ENDC - -#define pre_zero_flag cvt_flags2,0 -#define all_zeros_flag cvt_flags2,1 -#define DP_done cvt_flags2,2 -#define DP_done2 cvt_flags2,3 -#define show_last3 cvt_flags2,4 -#define leading_zeros cvt_flags2,5 -#define show_last4 cvt_flags2,6 - -basic CODE - -;============================================================================= - global output99_call + global output99_call output99_call: clrf ignore_digits incf ignore_digits,F - clrf temp4 + clrf cvt_temp4 - global output99 + + global output99 output99: movlw d'99' cpfslt lo movwf lo ; Limit to 99 - movff lo,lo_temp + movff lo,lo_temp clrf hi_temp - bcf pre_zero_flag ; do not display leading zeros + bcf pre_zero_flag ; do not display leading zeros -LCD_val99_2: - movlw b'00001010' ; 10 - movwf temp2 - clrf temp3 +LCD_val99_2: + movlw .10 ; 10 + movwf cvt_temp2 + clrf cvt_temp3 rcall DEC2ASCII - movlw b'00000001' ; 1 - movwf temp2 - clrf temp3 - bsf pre_zero_flag ; last figure, display zero (0) + movlw .1 ; 1 + movwf cvt_temp2 + clrf cvt_temp3 + bsf pre_zero_flag ; last figure, display zero (0) rcall DEC2ASCII - RETURN + return global output99x_call - output99x_call: clrf ignore_digits incf ignore_digits,F - clrf temp4 + clrf cvt_temp4 movlw d'99' cpfslt lo movwf lo ; Limit to 99 - movff lo, lo_temp + movff lo, lo_temp clrf hi_temp - bsf pre_zero_flag ; display leading zeros - bra LCD_val99_2 - + bsf pre_zero_flag ; display leading zeros + bra LCD_val99_2 + + global output8_call - -output8_call: - clrf ignore_digits +output8_call: + clrf ignore_digits incf ignore_digits,F - clrf temp4 + clrf cvt_temp4 output8: - movff lo, lo_temp + movff lo, lo_temp clrf hi_temp - bcf pre_zero_flag ; do not display leading zeros - - movlw b'01100100' ; 100 - movwf temp2 - clrf temp3 + bcf pre_zero_flag ; do not display leading zeros + movlw .100 ; 100 + movwf cvt_temp2 + clrf cvt_temp3 rcall DEC2ASCII - bra LCD_val99_2 + bra LCD_val99_2 + global output16_4_call -output16_4_call: ; limit to 9999 +output16_4_call: ; limit to 9999 bsf show_last4 - ; 9999 = 27 0F = [39][15] - movlw .40 - cpfslt hi ; hi < 40 ? - bra output16_4_call_2 ; No, hi >= 40, do limit - ; Yes, hi <= 39 - movlw .39 - cpfseq hi ; hi = 39 ? - bra output16_4_call_3 ; No, hi < 39, no limit needed - ; Yes, hi = 39 - movlw .15 - cpfslt lo ; lo < 15 - movwf lo ; No, lo >= 15, set lo = 15. - ; Yes, lo <= 14 or lo set to =15 - bra output16_4_call_3 ; done. -output16_4_call_2: ; Set to 9999 - movlw LOW .9999 - movwf lo - movlw HIGH .9999 - movwf hi + ; 9999 = 27 0F = [39][15] + movlw .40 + cpfslt hi ; hi < 40 ? + bra output16_4_call_2 ; No, hi >= 40, do limit + ; Yes, hi <= 39 + movlw .39 + cpfseq hi ; hi = 39 ? + bra output16_4_call_3 ; No, hi < 39, no limit needed + ; Yes, hi = 39 + movlw .15 + cpfslt lo ; lo < 15 + movwf lo ; No, lo >= 15, set lo = 15. + ; Yes, lo <= 14 or lo set to =15 + bra output16_4_call_3 ; done. +output16_4_call_2: ; Set to 9999 + movlw LOW .9999 + movwf lo + movlw HIGH .9999 + movwf hi output16_4_call_3: - bra output16_call + bra output16_call global output16_3_call global output16_call global output16 -output16_3_call: ; limit to 999 +output16_3_call: ; limit to 999 bsf show_last3 - ; Limit to 3 - movlw .4 - cpfslt hi - bra output16_3_call_2 - movlw .3 - cpfseq hi ; =3? - bra output16_3_call_3 ; No, done. - movlw .231 ; Limit to 231(+768=999...) - cpfslt lo - movwf lo - bra output16_3_call_3 ; done. -output16_3_call_2: ; Set to .999 - movlw LOW .999 - movwf lo - movlw HIGH .999 - movwf hi + ; Limit to 3 + movlw .4 + cpfslt hi + bra output16_3_call_2 + movlw .3 + cpfseq hi ; =3? + bra output16_3_call_3 ; No, done. + movlw .231 ; Limit to 231(+768=999...) + cpfslt lo + movwf lo + bra output16_3_call_3 ; done. +output16_3_call_2: ; Set to .999 + movlw LOW .999 + movwf lo + movlw HIGH .999 + movwf hi output16_3_call_3: output16_call: clrf ignore_digits incf ignore_digits,F clrf WREG output16: - movwf temp4 ; Passed from output16dp macro, cleared by others. - - bcf all_zeros_flag ; do not display any zero from here unless there was at least one figure /zero - + movwf cvt_temp4 ; Passed from output16dp macro, cleared by others. + bcf all_zeros_flag ; do not display any zero from here unless there was at least one figure /zero bsf leading_zeros - tstfsz temp4 ; Display leading zeros at all? + tstfsz cvt_temp4 ; Display leading zeros at all? bcf leading_zeros - - bsf DP_done2 - tstfsz temp4 - bcf DP_done2 ; decimal point not yet set - - movff lo, lo_temp - movff hi, hi_temp - bcf pre_zero_flag ; do not display leading zeros - - movlw b'00010000' ; 10000s - movwf temp2 + bsf DP_done2 + tstfsz cvt_temp4 + bcf DP_done2 ; decimal point not yet set + movff lo, lo_temp + movff hi, hi_temp + bcf pre_zero_flag ; do not display leading zeros + movlw b'00010000' ; 10000s + movwf cvt_temp2 movlw b'00100111' - movwf temp3 - btfsc show_last3 ; display only last three figures? - bra output16_sk5 - btfsc show_last4 ; display only last four figures? - bra output16_sk5 - rcall DEC2ASCII ; No, show all. Here: 5th order digit + movwf cvt_temp3 + btfsc show_last3 ; display only last three figures? + bra output16_sk5 + btfsc show_last4 ; display only last four figures? + bra output16_sk5 + rcall DEC2ASCII ; No, show all. Here: 5th order digit output16_sk5: - bcf show_last4 - movlw b'11101000' ; 1000s - movwf temp2 + bcf show_last4 + movlw b'11101000' ; 1000s + movwf cvt_temp2 movlw b'00000011' - movwf temp3 - btfsc DP_done2 ; Is there a decimal point at all? - bra output16_2 ; no, use normal display mode + movwf cvt_temp3 + btfsc DP_done2 ; Is there a decimal point at all? + bra output16_2 ; no, use normal display mode - btfsc all_zeros_flag ; display any zero from here - bra output16_1 ; there was a figure /zero already + btfsc all_zeros_flag ; display any zero from here + bra output16_1 ; there was a figure /zero already - bsf pre_zero_flag ; display figure if zero? - decfsz temp4,W - bcf pre_zero_flag ; No + bsf pre_zero_flag ; display figure if zero? + decfsz cvt_temp4,W + bcf pre_zero_flag ; No output16_1: - btfsc DP_done ; Decimal point set already? - bsf pre_zero_flag ; Yes, so display the rest + btfsc DP_done ; Decimal point set already? + bsf pre_zero_flag ; Yes, so display the rest output16_2: - btfss show_last3 ; display only last three figures? - rcall DEC2ASCII ; No, show all. Here: 4th order digit - bcf show_last3 ; Yes, so display the rest - - movlw b'01100100' ; 100s - movwf temp2 - clrf temp3 - - btfsc ignore_digit3 ; Ignore 3rd-5th digit? - bra output16_5 ; Yes, skip the rest - - btfsc DP_done2 ; Is there a decimal point at all? - bra output16_3 ; no, use normal display mode - - btfsc all_zeros_flag ; display any zero from here - bra output16_2_1 ; there was a figure /zero already - - bsf pre_zero_flag ; display figure if zero? - decfsz temp4,W - bcf pre_zero_flag ; No + btfss show_last3 ; display only last three figures? + rcall DEC2ASCII ; No, show all. Here: 4th order digit + bcf show_last3 ; Yes, so display the rest + movlw b'01100100' ; 100s + movwf cvt_temp2 + clrf cvt_temp3 + btfsc ignore_digit3 ; Ignore 3rd-5th digit? + bra output16_5 ; Yes, skip the rest + btfsc DP_done2 ; Is there a decimal point at all? + bra output16_3 ; no, use normal display mode + btfsc all_zeros_flag ; display any zero from here + bra output16_2_1 ; there was a figure /zero already + bsf pre_zero_flag ; display figure if zero? + decfsz cvt_temp4,W + bcf pre_zero_flag ; No output16_2_1: - btfsc DP_done ; Decimal point set already? - bsf pre_zero_flag ; Yes, so display the rest - btfsc DP_done2 ; Is there a decimal point at all? - bsf pre_zero_flag ; No, so display the rest + btfsc DP_done ; Decimal point set already? + bsf pre_zero_flag ; Yes, so display the rest + btfsc DP_done2 ; Is there a decimal point at all? + bsf pre_zero_flag ; No, so display the rest output16_3: - rcall DEC2ASCII ;3th order digit... - - movlw b'00001010' ; 10s - movwf temp2 - clrf temp3 - btfsc DP_done2 - bra output16_4 - - btfsc all_zeros_flag ; display any zero from here - bra output16_3_1 ; there was a figure /zero already - + rcall DEC2ASCII ; 3th order digit... + movlw b'00001010' ; 10s + movwf cvt_temp2 + clrf cvt_temp3 + btfsc DP_done2 + bra output16_4 + btfsc all_zeros_flag ; display any zero from here + bra output16_3_1 ; there was a figure /zero already bsf pre_zero_flag - decfsz temp4,W + decfsz cvt_temp4,W bcf pre_zero_flag output16_3_1: - btfsc DP_done + btfsc DP_done + bsf pre_zero_flag + btfsc DP_done2 bsf pre_zero_flag - btfsc DP_done2 - bsf pre_zero_flag output16_4: - btfsc ignore_digit4 ; Ignore 4-5th digit? - bra output16_5 ; Yes, skip the rest - rcall DEC2ASCII ; 2nd order digit + btfsc ignore_digit4 ; Ignore 4-5th digit? + bra output16_5 ; Yes, skip the rest + rcall DEC2ASCII ; 2nd order digit - movlw b'00000001' ; 1s - movwf temp2 - clrf temp3 + movlw b'00000001' ; 1s + movwf cvt_temp2 + clrf cvt_temp3 bsf pre_zero_flag - btfss ignore_digit5 ; Ignore 5th digit? - rcall DEC2ASCII ; 1st order digit - bcf ignore_digit5 ; yes, and clear flag + btfss ignore_digit5 ; Ignore 5th digit? + rcall DEC2ASCII ; 1st order digit + bcf ignore_digit5 ; yes, and clear flag output16_5: - bcf ignore_digit4 ; Clear flag - bcf ignore_digit3 ; Clear flag + bcf ignore_digit4 ; Clear flag + bcf ignore_digit3 ; Clear flag clrf ignore_digits incf ignore_digits,F bcf DP_done - RETURN ; Done with convert.asm... - -DEC2ASCII clrf temp1 ; converts into ASCII code -DEC2ASCII_2 movf temp3,W + RETURN ; Done with convert.asm... + + +DEC2ASCII: + clrf cvt_temp1 ; converts into ASCII code +DEC2ASCII_2: + movf cvt_temp3,W subwf hi_temp,W - btfss STATUS,C - bra DEC2ASCII_4 - bnz DEC2ASCII_3 - - movf temp2,W + btfss STATUS,C + bra DEC2ASCII_4 + bnz DEC2ASCII_3 + movf cvt_temp2,W subwf lo_temp,W btfss STATUS,C bra DEC2ASCII_4 - -DEC2ASCII_3 movf temp3,W +DEC2ASCII_3: + movf cvt_temp3,W subwf hi_temp,F - movf temp2,W + movf cvt_temp2,W subwf lo_temp,F btfss STATUS,C decf hi_temp,F - incf temp1,F + incf cvt_temp1,F bsf pre_zero_flag bra DEC2ASCII_2 - -DEC2ASCII_4 +DEC2ASCII_4: decfsz ignore_digits,F return - incf ignore_digits,F ; so ignore_digits stays zero for the test above - movlw '0' ; Offset for Ascii-value - addwf temp1,W - btfsc pre_zero_flag ; is this a leading zero? - bra DEC2ASCII_4_1 ; no + incf ignore_digits,F ; so ignore_digits stays zero for the test above + movlw '0' ; Offset for ASCII-value + addwf cvt_temp1,W + btfsc pre_zero_flag ; is this a leading zero? + bra DEC2ASCII_4_1 ; no btfsc leftbind bra DEC2ASCII_6 - movlw ' ' ; instead of leading zeros a space! + movlw ' ' ; instead of leading zeros a space! bra DEC2ASCII_5 DEC2ASCII_4_1: - bsf all_zeros_flag ; display any zero from here -DEC2ASCII_5 + bsf all_zeros_flag ; display any zero from here +DEC2ASCII_5: movwf POSTINC2 -DEC2ASCII_6 - decfsz temp4,F ; Set decimal point? - RETURN ; No - movlw "." ; Yes +DEC2ASCII_6: + decfsz cvt_temp4,F ; Set decimal point? + RETURN ; No + movlw "." ; Yes movwf POSTINC2 bsf DP_done - RETURN - - END \ No newline at end of file + return + + END diff -r f5de1ff88814 -r b455b31ce022 src/convert.inc --- a/src/convert.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/convert.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File convert.inc +; File convert.inc ## V2.98 ; ; Converts register values to string ; @@ -9,40 +9,40 @@ ; HISTORY ; 2007-10-07 : [MH] Creation for OSTC sources ; 2010-12-10 : [jDG] Optimize macro size -; + - extern output16_3_call -output_16_3 macro ; displays only last three figures from a 16Bit value (0-999) - call output16_3_call + extern output16_3_call +output_16_3 macro ; displays only last three figures from a 16Bit value (0-999) + call output16_3_call endm - extern output16_4_call -output_16_4 macro ; displays only last four figures from a 16Bit value (0-9999) - call output16_4_call + extern output16_4_call +output_16_4 macro ; displays only last four figures from a 16Bit value (0-9999) + call output16_4_call + endm + + extern output16 +output_16dp macro dp_position ; 16 Bit with decimal point + movlw dp_position + call output16 endm - extern output16 -output_16dp macro temp4 ; 16Bit with decimal point - movlw temp4 ; Temp4 stores position for decimal point - call output16 - endm + extern output16_call +output_16 macro ; 16Bit Normal + call output16_call + endm - extern output16_call -output_16 macro ; 16Bit Normal - call output16_call + extern output8_call +output_8 macro ; 8 Bit Normal + call output8_call endm - extern output8_call -output_8 macro ; 8 Bit Normal - call output8_call + extern output99_call +output_99 macro ; displays only last two figures from a 8Bit value (0-99) + call output99_call endm - extern output99_call -output_99 macro ; displays only last two figures from a 8Bit value (0-99) - call output99_call + extern output99x_call +output_99x macro ; displays only last two figures from a 8Bit value with leading zero (00-99) + call output99x_call endm - - extern output99x_call -output_99x macro ; displays only last two figures from a 8Bit value with leading zero (00-99) - call output99x_call - endm diff -r f5de1ff88814 -r b455b31ce022 src/customview.asm --- a/src/customview.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/customview.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File customview.asm REFACTORED VERSION V2.95 +; File customview.asm REFACTORED VERSION V2.98 ; ; Customview in Surfacemode and Divemode ; @@ -11,87 +11,94 @@ ;============================================================================= -#include "hwos.inc" ; Mandatory header -#include "tft_outputs.inc" -#include "strings.inc" -#include "tft.inc" -#include "isr.inc" -#include "wait.inc" -#include "surfmode.inc" -#include "convert.inc" -#include "divemode.inc" -#include "i2c.inc" -#include "start.inc" +#include "hwos.inc" ; Mandatory header +#include "tft_outputs.inc" +#include "strings.inc" +#include "tft.inc" +#include "isr.inc" +#include "wait.inc" +#include "surfmode.inc" +#include "convert.inc" +#include "divemode.inc" +#include "i2c.inc" +#include "start.inc" -gui CODE + + extern gaslist_strcat_gas_mod + extern char_I_deco_model + extern TFT_sensor_mV + extern TFT_surface_compass_mask + extern TFT_dive_compass_mask + + +gui CODE ;============================================================================= ; Do every-second tasks for the custom view area (Dive mode) global customview_second customview_second: - movff menupos3,WREG ; copy current view (1-...) + movff menupos3,WREG ; copy current view (1-...) dcfsnz WREG,F - goto TFT_update_ppo2_sensors ; Update Sensor data ; and return + goto TFT_update_ppo2_sensors ; Update Sensor data ; and return dcfsnz WREG,F - goto TFT_update_avr_stopwatch ; Update average depth and stopwatch; and return + goto TFT_update_avr_stopwatch ; Update average depth and stopwatch; and return dcfsnz WREG,F - goto TFT_decoplan ; Show decoplan ; and return + goto TFT_decoplan ; Show decoplan ; and return dcfsnz WREG,F - goto TFT_battinfo_tissues_clock ; Update Battery, Tissues and clock ; and return + goto TFT_battinfo_tissues_clock ; Update Battery, Tissues and clock ; and return dcfsnz WREG,F - goto TFT_gf_info ; Update GF informations ; and return + goto TFT_gf_info ; Update GF informations ; and return dcfsnz WREG,F - return ; Compass updated separately (faster) in divemode; + return ; Compass updated separately (faster) in divemode; dcfsnz WREG,F - nop ; ex goto TFT_dyn_gaslist + nop ; ex goto TFT_dyn_gaslist dcfsnz WREG,F - goto TFT_CNS ; Show CNS values for end-of-dive, ex goto TFT_hud_voltages + goto TFT_CNS ; Show CNS values for end-of-dive, ex goto TFT_hud_voltages dcfsnz WREG,F - bra customview_1sec_view9 ; Make sure to change value in "check_ppo2_display:" when moving around custom views + bra customview_1sec_view9 ; Make sure to change value in "check_ppo2_display:" when moving around custom views dcfsnz WREG,F - goto TFT_sensor_check ; Show ppO2 of O2 and Diluent ; and return + goto TFT_sensor_check ; Show ppO2 of O2 and Diluent ; and return dcfsnz WREG,F - goto TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS; and return + goto TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS; and return dcfsnz WREG,F - goto TFT_pscr_info ; Show ppO2, drop and lung ratio; and return + goto TFT_pscr_info ; Show ppO2, drop and lung ratio; and return dcfsnz WREG,F - goto TFT_gas_needs ; Show gas needs + goto TFT_gas_needs ; Show gas needs ; Menupos3=0, do nothing return -customview_1sec_view9: ; Ceiling - call TFT_ceiling ; Show Ceiling - call TFT_display_pure_ppo2 ; ppO2 value - extern char_I_deco_model ; current GF value - TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - return ; No GF info for non-GF modes - goto TFT_gf_info ; Update GF informations ; and return +customview_1sec_view9: ; Ceiling + call TFT_ceiling ; Show Ceiling + call TFT_display_pure_ppo2 ; ppO2 value + TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + return ; No GF info for non-GF modes + goto TFT_gf_info ; Update GF informations ; and return - global customview_alternative_second -customview_alternative_second: - movff menupos3,WREG ; copy current view (1-...) + global customview_alternative_second +customview_alternative_second: + movff menupos3,WREG ; copy current view (1-...) dcfsnz WREG,F bra customview_alt_second_view1 ; View 1 dcfsnz WREG,F - nop ; View 2 + nop ; View 2 ; Menupos3=0, do nothing return - + customview_alt_second_view1: - bsf FLAG_TFT_max_depth_alt - bsf FLAG_TFT_big_deco_alt - return + bsf FLAG_TFT_max_depth_alt + bsf FLAG_TFT_big_deco_alt + return ;============================================================================= ; Do every-minute tasks for the custom view area global customview_minute customview_minute: - return -; movff menupos3,WREG ; copy + return +; movff menupos3,WREG ; copy ; dcfsnz WREG,F ; bra customview_1min_view1 ; dcfsnz WREG,F @@ -128,609 +135,575 @@ ;customview_1min_view9: ;customview_1min_view10: ;customview_1min_view11: -; return +;return - global surf_customview_toggle + global surf_customview_toggle surf_customview_toggle: bcf switch_right - incf menupos3,F ; Number of customview to show - movlw d'9' ; Max number of customsviews in surface mode - cpfsgt menupos3 ; Max reached? - bra surf_customview_mask ; No, show - movlw .1 - movwf menupos3 ; Reset to one (Always one custom view visible) + incf menupos3,F ; Number of customview to show + movlw d'9' ; Max number of customsviews in surface mode + cpfsgt menupos3 ; Max reached? + bra surf_customview_mask ; No, show + movlw .1 + movwf menupos3 ; Reset to one (Always one custom view visible) - global surf_customview_mask + global surf_customview_mask surf_customview_mask: - WIN_BOX_BLACK .50,surf_warning1_row-1, .0, surf_decotype_column-.1 ; top, bottom, left, right - ; Prepare title - WIN_TINY surf_customview_title_column,surf_customview_title_row - WIN_COLOR color_greenish - movff menupos3,WREG ; Menupos3 holds number of customview function + WIN_BOX_BLACK .50,surf_warning1_row-1, .0, surf_decotype_column-.1 ; top, bottom, left, right + ; Prepare title + WIN_TINY surf_customview_title_column,surf_customview_title_row + WIN_COLOR color_greenish + movff menupos3,WREG ; Menupos3 holds number of customview function dcfsnz WREG,F - bra surf_customview_init_view1 ; OC Gas list + bra surf_customview_init_view1 ; OC Gas list dcfsnz WREG,F - bra surf_customview_init_view2 ; CC Dil list + bra surf_customview_init_view2 ; CC Dil list dcfsnz WREG,F - bra surf_customview_init_view3 ; CC SP list + bra surf_customview_init_view3 ; CC SP list dcfsnz WREG,F - bra surf_customview_init_view4 ; Custom Text + bra surf_customview_init_view4 ; Custom Text dcfsnz WREG,F - bra surf_customview_init_view5 ; Tissue Diagram + bra surf_customview_init_view5 ; Tissue Diagram dcfsnz WREG,F - bra surf_customview_init_view6 ; Compass + bra surf_customview_init_view6 ; Compass dcfsnz WREG,F - bra surf_customview_init_view7 ; Deco settings + bra surf_customview_init_view7 ; Deco settings dcfsnz WREG,F - bra surf_customview_init_view8 ; Last Dive info + bra surf_customview_init_view8 ; Last Dive info dcfsnz WREG,F - bra surf_customview_init_view9 ; Sensor mV readings + bra surf_customview_init_view9 ; Sensor mV readings - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass + call I2C_sleep_accelerometer ; Stop accelerometer + call I2C_sleep_compass ; Stop compass - movlw .1 - movwf menupos3 ; Reset to one (Always one custom view visible) + movlw .1 + movwf menupos3 ; Reset to one (Always one custom view visible) -surf_customview_init_view1: ; View1: OC Gas list - btfsc FLAG_gauge_mode - bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle - btfsc FLAG_ccr_mode - bra surf_customview_init_view1_bail ; Bailout version of "OC Gas List" - btfsc FLAG_pscr_mode - bra surf_customview_init_view1_bail ; Bailout version of "OC Gas List" - STRCPY_TEXT_PRINT tGaslist ; Title of customview - call TFT_standard_color - call TFT_gaslist_surfmode ; Show gas list - bra customview_toggle_exit ; Done. +surf_customview_init_view1: ; View1: OC Gas list + btfsc FLAG_gauge_mode + bra surf_customview_toggle + btfsc FLAG_apnoe_mode + bra surf_customview_toggle + btfsc FLAG_ccr_mode + bra surf_customview_init_view1_bail ; Bailout version of "OC Gas List" + btfsc FLAG_pscr_mode + bra surf_customview_init_view1_bail ; Bailout version of "OC Gas List" + STRCPY_TEXT_PRINT tGaslist ; Title of customview + call TFT_standard_color + call TFT_gaslist_surfmode ; Show gas list + bra customview_toggle_exit ; Done. surf_customview_init_view1_bail: - STRCPY_TEXT_PRINT tDiveBailout ; Title of customview - call TFT_standard_color - call TFT_gaslist_surfmode ; Show gas list - bra customview_toggle_exit ; Done. + STRCPY_TEXT_PRINT tDiveBailout ; Title of customview + call TFT_standard_color + call TFT_gaslist_surfmode ; Show gas list + bra customview_toggle_exit ; Done. -surf_customview_init_view2: ; View2: CC Dil list - btfsc FLAG_pscr_mode - bra surf_customview_init_view2_2 - btfss FLAG_ccr_mode - bra surf_customview_toggle - btfsc FLAG_gauge_mode - bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle -surf_customview_init_view2_2: - STRCPY_TEXT_PRINT tGaslistCC ; Title of customview - call TFT_standard_color - call TFT_dillist_surfmode ; Show diluent list - bra customview_toggle_exit ; Done. +surf_customview_init_view2: ; View2: CC Dil list + btfsc FLAG_pscr_mode + bra surf_customview_init_view2_2 + btfss FLAG_ccr_mode + bra surf_customview_toggle + btfsc FLAG_gauge_mode + bra surf_customview_toggle + btfsc FLAG_apnoe_mode + bra surf_customview_toggle +surf_customview_init_view2_2: + STRCPY_TEXT_PRINT tGaslistCC ; Title of customview + call TFT_standard_color + call TFT_dillist_surfmode ; Show diluent list + bra customview_toggle_exit ; Done. + +surf_customview_init_view3: ; View3: CC SP list + btfss FLAG_ccr_mode + bra surf_customview_toggle + btfsc FLAG_gauge_mode + bra surf_customview_toggle + btfsc FLAG_apnoe_mode + bra surf_customview_toggle + STRCPY_TEXT_PRINT tFixedSetpoints ; Title of customview + call TFT_standard_color + call TFT_splist_surfmode ; Show Setpoint list + bra customview_toggle_exit ; Done. -surf_customview_init_view3: ; View3: CC SP list - btfss FLAG_ccr_mode - bra surf_customview_toggle - btfsc FLAG_gauge_mode - bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle - STRCPY_TEXT_PRINT tFixedSetpoints ; Title of customview - call TFT_standard_color - call TFT_splist_surfmode ; Show Setpoint list - bra customview_toggle_exit ; Done. - -surf_customview_init_view9: ; View 9: Sensor mV on the surface - btfsc FLAG_ccr_mode - bra surf_customview_init_view9a ; we are in CCR mode - btfsc FLAG_pscr_mode - bra surf_customview_init_view9a ; we are in PSCR mode - bra surf_customview_toggle ; we are not in any rebreather mode, so skip +surf_customview_init_view9: ; View 9: Sensor mV on the surface + btfsc FLAG_ccr_mode + bra surf_customview_init_view9a ; we are in CCR mode + btfsc FLAG_pscr_mode + bra surf_customview_init_view9a ; we are in PSCR mode + bra surf_customview_toggle ; we are not in any rebreather mode, so skip surf_customview_init_view9a: - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz surf_customview_toggle ; sorry, no sensors, skip again - STRCPY_TEXT_PRINT tSensorMilliVolt ; Title of customview - call TFT_standard_color - extern TFT_sensor_mV - call TFT_sensor_mV ; write sensor mV readings to screen - bra customview_toggle_exit ; Done. + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz surf_customview_toggle ; sorry, no sensors, skip again + STRCPY_TEXT_PRINT tSensorMilliVolt ; Title of customview + call TFT_standard_color + call TFT_sensor_mV ; write sensor mV readings to screen + bra customview_toggle_exit ; Done. -surf_customview_init_view4: ; View4: Custom text - call TFT_standard_color - call TFT_custom_text ; Show the custom text - bra customview_toggle_exit ; Done. +surf_customview_init_view4: ; View4: Custom text + call TFT_standard_color + call TFT_custom_text ; Show the custom text + bra customview_toggle_exit ; Done. -surf_customview_init_view5: ; View5: Tissue Diagram - btfsc FLAG_gauge_mode - bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle - call TFT_standard_color - call TFT_surface_tissues ; Show Tissue diagram - bra customview_toggle_exit ; Done. +surf_customview_init_view5: ; View5: Tissue Diagram + btfsc FLAG_gauge_mode + bra surf_customview_toggle + btfsc FLAG_apnoe_mode + bra surf_customview_toggle + call TFT_standard_color + call TFT_surface_tissues ; Show Tissue diagram + bra customview_toggle_exit ; Done. -surf_customview_init_view6: ; View6: Compass - call I2C_init_accelerometer ; Start accelerometer - call I2C_init_compass ; Start compass - extern TFT_surface_compass_mask - call TFT_surface_compass_mask ; Show compass - bra customview_toggle_exit ; Done. - +surf_customview_init_view6: ; View6: Compass + call I2C_init_accelerometer ; Start accelerometer + call I2C_init_compass ; Start compass + call TFT_surface_compass_mask ; Show compass + bra customview_toggle_exit ; Done. + surf_customview_init_view7: - btfsc FLAG_gauge_mode ; View7: Deco settings - bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle - - call TFT_surface_decosettings ; Show all deco settings - bra customview_toggle_exit ; Done. + btfsc FLAG_gauge_mode ; View7: Deco settings + bra surf_customview_toggle + btfsc FLAG_apnoe_mode + bra surf_customview_toggle + + call TFT_surface_decosettings ; Show all deco settings + bra customview_toggle_exit ; Done. + +surf_customview_init_view8: ; View8: Last dive info + call TFT_surface_lastdive ; Show last dive interval + bra customview_toggle_exit ; Done. + -surf_customview_init_view8: ; View8: Last dive info - call TFT_surface_lastdive ; Show last dive interval - bra customview_toggle_exit ; Done. - - - global menuview_toggle -menuview_toggle: ; Show Menu or the simulator tasks - btfss alternative_divelayout ; In alternative layout mode? - bra menuview_toggle2 ; No - ; Switch back to normal mode for any menu tasks - bcf alternative_divelayout ; clear flag - bsf FLAG_TFT_divemode_mask ; Set flag for mask - bsf FLAG_TFT_max_depth ; set flag - btfss decostop_active ; deco? - bsf FLAG_TFT_display_ndl_mask ; NDL - btfsc decostop_active ; deco? - bsf FLAG_TFT_display_deko_mask ; Deco - call TFT_ClearScreen ; Clear screen - rcall customview_mask ; Re-Draw customview - + global menuview_toggle +menuview_toggle: ; Show Menu or the simulator tasks + btfss alternative_divelayout ; In alternative layout mode? + bra menuview_toggle2 ; No + ; Switch back to normal mode for any menu tasks + bcf alternative_divelayout ; clear flag + bsf FLAG_TFT_divemode_mask ; Set flag for mask + bsf FLAG_TFT_max_depth ; set flag + btfss decostop_active ; deco? + bsf FLAG_TFT_display_ndl_mask ; NDL + btfsc decostop_active ; deco? + bsf FLAG_TFT_display_deko_mask ; Deco + call TFT_ClearScreen ; Clear screen + rcall customview_mask ; Re-Draw customview + menuview_toggle2: - movlw divemode_menuview_timeout - movwf timeout_counter3 - bsf menuview - bcf switch_left - incf menupos2,F ; Number of options to show - movlw d'10' ; Max number of options in divemode - cpfsgt menupos2 ; Max reached? - bra menuview_mask ; No, show - global menuview_toggle_reset -menuview_toggle_reset: ; Timeout occurred - clrf menupos2 - bcf menuview + movlw divemode_menuview_timeout + movwf timeout_counter2 + bsf menuview + bcf switch_left + incf menupos2,F ; Number of options to show + movlw d'10' ; Max number of options in divemode + cpfsgt menupos2 ; Max reached? + bra menuview_mask ; No, show + global menuview_toggle_reset +menuview_toggle_reset: ; Timeout occurred + clrf menupos2 + bcf menuview menuview_mask: - WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.49 ; top, bottom, left, right - btfss FLAG_gauge_mode - bra menuview_mask2 - ; Clear some more in gauge mode -- "Reset Avg." text is longer than normal simtext - WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column+.50, dm_simtext_column+.70 ; top, bottom, left, right + WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.49 ; top, bottom, left, right + btfss FLAG_gauge_mode + bra menuview_mask2 + ; Clear some more in gauge mode -- "Reset Avg." text is longer than normal simtext + WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column+.50, dm_simtext_column+.70 ; top, bottom, left, right menuview_mask2: - call TFT_draw_gassep_line - movlw color_yellow - call TFT_set_color - bsf win_invert ; Set invert flag - WIN_SMALL dm_simtext_column,dm_simtext_row - movff menupos2,WREG ; Menupos2 holds number of menu option to show + call TFT_draw_gassep_line + movlw color_yellow + call TFT_set_color + bsf win_invert ; Set invert flag + WIN_SMALL dm_simtext_column,dm_simtext_row + movff menupos2,WREG ; Menupos2 holds number of menu option to show dcfsnz WREG,F - bra menuview_view_gaschange ; If a better gas is indicated + bra menuview_view_gaschange ; If a better gas is indicated dcfsnz WREG,F - bra menuview_view1 ; "Menu?" (Not in Gauge and Anpnoe) + bra menuview_view1 ; "Menu?" (Not in Gauge and Anpnoe) dcfsnz WREG,F - bra menuview_view2 ; "Quit Simulation?" (Sim only) + bra menuview_view2 ; "Quit Simulation?" (Sim only) dcfsnz WREG,F - bra menuview_view3 ; "Descent 1m" (Sim only) + bra menuview_view3 ; "Descent 1m" (Sim only) dcfsnz WREG,F - bra menuview_view4 ; "Ascend 1m" (Sim only) + bra menuview_view4 ; "Ascend 1m" (Sim only) dcfsnz WREG,F - bra menuview_view5 ; "Quit Apnea mode?" (Apnea only) + bra menuview_view5 ; "Quit Apnea mode?" (Apnea only) dcfsnz WREG,F - bra menuview_view6 ; "Reset Avr." (Gauge only) + bra menuview_view6 ; "Reset Avr." (Gauge only) dcfsnz WREG,F - bra menuview_view7 ; "Sim:+5mins" (Sim only) + bra menuview_view7 ; "Sim:+5mins" (Sim only) dcfsnz WREG,F - bra menuview_view8 ; "Heading" (When compass is shown) + bra menuview_view8 ; "Heading" (When compass is shown) dcfsnz WREG,F - bra menuview_view9 ; "Layout" (Alternative Layout, aka Blind mode) - + bra menuview_view9 ; "Layout" (Alternative Layout, aka Blind mode) + menuview_exit: - call TFT_standard_color - bcf win_invert ; Reset invert flag - return ; Menupos2 = 0, Show nothing + call TFT_standard_color + bcf win_invert ; Reset invert flag + return ; Menupos2 = 0, Show nothing menuview_view_gaschange: - extern gaslist_strcat_gas_mod - btfss better_gas_available ; =1: A better gas is available - bra menuview_toggle ; No, call next option - btfsc divemode_gaschange ; Skip if the last gas change is not done yet. - bra menuview_toggle - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - movff better_gas_number,PRODL ; number (1-5) of the "better gas" in divemode, =0: no better gas available - decf PRODL,F - call gaslist_strcat_gas_mod ; Append gas description of gas #PRODL (0-4) to current string - movlw .5 - movwf FSR2L ; Point to char 6 (5 chars gas description only) - STRCAT_PRINT "?" - bra menuview_exit ; Done. + btfss better_gas_available ; =1: A better gas is available + bra menuview_toggle ; No, call next option + btfsc divemode_gaschange ; Skip if the last gas change is not done yet. + bra menuview_toggle + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + movff better_gas_number,PRODL ; number (1-5) of the "better gas" in divemode, =0: no better gas available + decf PRODL,F + call gaslist_strcat_gas_mod ; Append gas description of gas #PRODL (0-4) to current string + movlw .5 + movwf FSR2L ; Point to char 6 (5 chars gas description only) + STRCAT_PRINT "?" + bra menuview_exit ; Done. menuview_view1: - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra menuview_toggle ; Call next option - btfsc FLAG_gauge_mode ; In Gauge mode? - bra menuview_toggle ; Call next option - STRCPY_TEXT_PRINT tDivePreMenu ; "Menu?" - bra menuview_exit ; Done. + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra menuview_toggle ; Call next option + btfsc FLAG_gauge_mode ; In Gauge mode? + bra menuview_toggle ; Call next option + STRCPY_TEXT_PRINT tDivePreMenu ; "Menu?" + bra menuview_exit ; Done. menuview_view2: - btfss simulatormode_active ; View only for simulator mode - bra menuview_toggle ; Call next option - STRCPY_TEXT_PRINT tQuitSim ; "Quit Simulation?" - bra menuview_exit ; Done. + btfss simulatormode_active ; View only for simulator mode + bra menuview_toggle ; Call next option + STRCPY_TEXT_PRINT tQuitSim ; "Quit Simulation?" + bra menuview_exit ; Done. menuview_view3: - btfss simulatormode_active ; View only for simulator mode - bra menuview_toggle ; Call next option - STRCPY_PRINT "Sim-1m" ; CHANGED, now "-" for going down - bra menuview_exit ; Done. + btfss simulatormode_active ; View only for simulator mode + bra menuview_toggle ; Call next option + STRCPY_PRINT "Sim-1m" ; "-" for going down + bra menuview_exit ; Done. menuview_view4: - btfss simulatormode_active ; View only for simulator mode - bra menuview_toggle ; Call next option - STRCPY_PRINT "Sim+1m" ; CHANGED, now "+" for going up - bra menuview_exit ; Done. + btfss simulatormode_active ; View only for simulator mode + bra menuview_toggle ; Call next option + STRCPY_PRINT "Sim+1m" ; "+" for going up + bra menuview_exit ; Done. menuview_view5: - btfss FLAG_apnoe_mode ; In Apnoe mode? - bra menuview_toggle ; No, call next option - btfss FLAG_active_descent ; Are we descending? - bra menuview_toggle ; Yes + btfss FLAG_apnoe_mode ; In Apnoe mode? + bra menuview_toggle ; No, call next option + btfss FLAG_active_descent ; Are we descending? + bra menuview_toggle ; Yes ; We are at the surface: - STRCPY_TEXT_PRINT tQuitSim ; "Quit Apnea mode?" - bra menuview_exit ; Done. + STRCPY_TEXT_PRINT tQuitSim ; "Quit Apnea mode?" + bra menuview_exit ; Done. menuview_view6: - btfss FLAG_gauge_mode ; In Gauge mode? - bra menuview_toggle ; No, call next option - STRCPY_TEXT_PRINT tDivemenu_ResetAvg ; "Reset Avg." - bra menuview_exit ; Done. + btfss FLAG_gauge_mode ; In Gauge mode? + bra menuview_toggle ; No, call next option + STRCPY_TEXT_PRINT tDivemenu_ResetAvg; "Reset Avg." + bra menuview_exit ; Done. menuview_view7: - btfss simulatormode_active ; View only for simulator mode - bra menuview_toggle ; Call next option - btfsc FLAG_gauge_mode ; In Gauge mode? - bra menuview_toggle ; Yes, call next option - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra menuview_toggle ; Yes, call next option - STRCPY_PRINT "Sim+5'" - bra menuview_exit ; Done. + btfss simulatormode_active ; View only for simulator mode + bra menuview_toggle ; Call next option + btfsc FLAG_gauge_mode ; In Gauge mode? + bra menuview_toggle ; Yes, call next option + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra menuview_toggle ; Yes, call next option + STRCPY_PRINT "Sim+5'" + bra menuview_exit ; Done. menuview_view8: - movlw .6 - cpfseq menupos3 ; in compass view? - bra menuview_toggle ; No, call next option - STRCPY_TEXT_PRINT tSetHeading ; "Heading" - bra menuview_exit ; Done. + movlw .6 + cpfseq menupos3 ; in compass view? + bra menuview_toggle ; No, call next option + STRCPY_TEXT_PRINT tSetHeading ; "Heading" + bra menuview_exit ; Done. menuview_view9: - STRCPY_PRINT "Layout" - bra menuview_exit ; Done. + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra menuview_toggle ; Yes, call next option + btfsc FLAG_gauge_mode ; In Gauge mode? + bra menuview_toggle ; Yes, call next option + STRCPY_PRINT "Layout" + bra menuview_exit ; Done. + +;============================================================================= + +customview_toggle_alternative: + movlw d'1' ; Max number of customviews in divemode, alternative layout + cpfsgt menupos3 ; Max reached? + bra customview_mask_alternative ; No, show + movlw .1 + movwf menupos3 ; Reset to one, always one customview visible in alternative layout +customview_mask_alternative: + ; Clear custom view area in divemode + WIN_BOX_BLACK dm_customview_row, .239, .0, .159 ; top, bottom, left, right + call TFT_standard_color + movff menupos3,WREG ; Menupos3 holds number of customview function + dcfsnz WREG,F + bra customview_alt_init_view1 ; View 1: Big deco/ndl and max. depth + dcfsnz WREG,F + bra customview_alt_init_view2 ; View 2: + + ;bra customview_alternative_toggle_exit ; No view (menupos3=0) + +customview_alt_toggle_exit: + call TFT_standard_color + bcf toggle_customview ; Clear flag + return + +customview_alt_init_view1: ; View 1: Big deco/ndl and max. depth + call TFT_max_depth_alternative + call TFT_big_deco_alt + bra customview_alt_toggle_exit + +customview_alt_init_view2: + ; /* Just for test... + call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + call TFT_update_avr_stopwatch ; Update average depth and stopwatch + ; ...Just for test */ + bra customview_alt_toggle_exit - - -;============================================================================= - -customview_toggle_alternative: - movlw d'1' ; Max number of customviews in divemode, alternative layout - cpfsgt menupos3 ; Max reached? - bra customview_mask_alternative ; No, show - movlw .1 - movwf menupos3 ; Reset to one, always one customview visible in alternative layout -customview_mask_alternative: - ; Clear custom view area in divemode - WIN_BOX_BLACK dm_customview_row, .239, .0, .159 ; top, bottom, left, right - call TFT_standard_color - movff menupos3,WREG ; Menupos3 holds number of customview function - dcfsnz WREG,F - bra customview_alt_init_view1 ; View 1: Big deco/ndl and max. depth - dcfsnz WREG,F - bra customview_alt_init_view2 ; View 2: - - ;bra customview_alternative_toggle_exit ; No view (menupos3=0) - -customview_alt_toggle_exit: - call TFT_standard_color - bcf toggle_customview ; Clear flag - return - -customview_alt_init_view1: ; View 1: Big deco/ndl and max. depth - call TFT_max_depth_alternative - call TFT_big_deco_alt - bra customview_alt_toggle_exit - -customview_alt_init_view2: - ; /* Just for test... - call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch - call TFT_update_avr_stopwatch ; Update average depth and stopwatch - ; ...Just for test */ - - bra customview_alt_toggle_exit - - ; Show next customview (and delete this flag) global customview_toggle customview_toggle: bcf switch_right - incf menupos3,F ; Number of customview to show - - btfsc alternative_divelayout ; In alternative layout mode? + incf menupos3,F ; Number of customview to show + + btfsc alternative_divelayout ; In alternative layout mode? bra customview_toggle_alternative ; Yes, use the big ones instead - - movlw d'13' ; Max number of customviews in divemode - cpfsgt menupos3 ; Max reached? - bra customview_mask ; No, show - clrf menupos3 ; Reset to zero (Zero=no custom view) - global customview_mask + movlw d'13' ; Max number of customviews in divemode + cpfsgt menupos3 ; Max reached? + bra customview_mask ; No, show + clrf menupos3 ; Reset to zero (Zero=no custom view) + + global customview_mask customview_mask: - ; Clear custom view area in divemode - WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt ; top, bottom, left, right - WIN_SMALL dm_customview_column,dm_customview_row + ; Clear custom view area in divemode + WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt ; top, bottom, left, right + WIN_SMALL dm_customview_column,dm_customview_row call TFT_standard_color - movff menupos3,WREG ; Menupos3 holds number of customview function + movff menupos3,WREG ; Menupos3 holds number of customview function dcfsnz WREG,F - bra customview_init_view1 ; Update Sensor data + bra customview_init_view1 ; Update Sensor data dcfsnz WREG,F - bra customview_init_view2 ; average depth and stopwatch + bra customview_init_view2 ; average depth and stopwatch dcfsnz WREG,F - bra customview_init_view3 ; Decoplan + bra customview_init_view3 ; Decoplan dcfsnz WREG,F - bra customview_init_view4 ; Battery info, Tissues and clock + bra customview_init_view4 ; Battery info, Tissues and clock dcfsnz WREG,F - bra customview_init_view5 ; GF informations + bra customview_init_view5 ; GF informations dcfsnz WREG,F - bra customview_init_view6 ; Compass + bra customview_init_view6 ; Compass dcfsnz WREG,F - bra customview_init_view7 ; Dynamic gaslist + bra customview_init_view7 ; Dynamic gaslist dcfsnz WREG,F - bra customview_init_view8 ; HIJACKED for CNS (ex HUD voltages) + bra customview_init_view8 ; CNS dcfsnz WREG,F - bra customview_init_view9 ; ppO2, Ceiling and current GF + bra customview_init_view9 ; ppO2, Ceiling and current GF dcfsnz WREG,F - bra customview_init_view10 ; Sensor check + bra customview_init_view10 ; Sensor check dcfsnz WREG,F - bra customview_init_view11 ; ppO2, END/EAD and CNS + bra customview_init_view11 ; ppO2, END/EAD and CNS dcfsnz WREG,F - bra customview_init_view12 ; PSCR Info - ; NEW ## bailout gas needs + bra customview_init_view12 ; PSCR Info dcfsnz WREG,F - bra customview_init_view13 ; Gas needs - + bra customview_init_view13 ; Gas needs + customview_init_nocustomview: - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass - bra customview_toggle_exit + call I2C_sleep_accelerometer ; Stop accelerometer + call I2C_sleep_compass ; Stop compass + bra customview_toggle_exit customview_init_view1: - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_pscr_mode ; In PSCR mode? - bra customview_init_view1a ; Yes - btfss FLAG_ccr_mode ; In CC mode? - bra customview_toggle ; no, Call next view... - -customview_init_view1a: - movf hardware_flag,W - sublw 0x11 ; 2 with BLE - btfsc STATUS,Z - bra customview_toggle ; no, Call next view... - movf hardware_flag,W - sublw 0x13 ; + - btfsc STATUS,Z - bra customview_toggle ; no, Call next view... + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_pscr_mode ; In PSCR mode? + bra customview_init_view1a ; Yes + btfss FLAG_ccr_mode ; In CC mode? + bra customview_toggle ; no, Call next view... - call TFT_hud_mask ; Setup HUD mask - call TFT_update_ppo2_sensors ; Update Sensor data - bra customview_toggle_exit +customview_init_view1a: + btfsc analog_o2_input ; do we have an analog input? + bra customview_init_view1b ; YES - show this view + btfss s8_digital ; NO - do we have a digital input? + bra customview_toggle ; NO - call next view... + ; YES - show this view +customview_init_view1b: + call TFT_hud_mask ; Setup HUD mask + call TFT_update_ppo2_sensors ; Update Sensor data + bra customview_toggle_exit customview_init_view2: - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; Yes, Call next view... - call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch - call TFT_update_avr_stopwatch ; Update average depth and stopwatch - bra customview_toggle_exit + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; Yes, Call next view... + call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + call TFT_update_avr_stopwatch ; Update average depth and stopwatch + bra customview_toggle_exit customview_init_view3: - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; Yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - call TFT_decoplan ; Show decoplan - bra customview_toggle_exit + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; Yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... + call TFT_decoplan ; Show decoplan + bra customview_toggle_exit customview_init_view4: - call TFT_battinfo_tissues_clock_mask ; Setup Mask - call TFT_battinfo_tissues_clock ; Show Battery info, Tissues and clock - bra customview_toggle_exit + call TFT_battinfo_tissues_clock_mask ; Setup Mask + call TFT_battinfo_tissues_clock ; Show Battery info, Tissues and clock + bra customview_toggle_exit customview_init_view5: - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; Yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - - extern char_I_deco_model - TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - bra customview_toggle ; No GF info for non-GF modes + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; Yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... - call TFT_gf_mask ; Setup Mask - call TFT_gf_info ; Show GF informations - bra customview_toggle_exit + TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + bra customview_toggle ; No GF info for non-GF modes -customview_init_view6: ; Compass (View 6) - call I2C_init_accelerometer ; Start accelerometer - call I2C_init_compass ; Start compass - extern TFT_dive_compass_mask - call TFT_dive_compass_mask ; Show compass - bra customview_toggle_exit + call TFT_gf_mask ; Setup Mask + call TFT_gf_info ; Show GF informations + bra customview_toggle_exit -; MODIFIED - view disabled ## memory -customview_init_view7: ; Dynamic gaslist (View 7) -; btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; Yes, Call next view... -; btfsc FLAG_ccr_mode ; In CC mode? -; bra customview_toggle ; Yes, Call next view... -; call TFT_dyn_gaslist ; Show the dyn gaslist -; bra customview_toggle_exit +customview_init_view6: ; Compass (View 6) + call I2C_init_accelerometer ; Start accelerometer + call I2C_init_compass ; Start compass + call TFT_dive_compass_mask ; Show compass + bra customview_toggle_exit -customview_init_view8: ; HIJACKED for CNS outputs (ex Sensor millivolts) - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - ; REPLACE ## CNS at end-of-dive - ; btfsc FLAG_pscr_mode ; In PSCR mode? - ; bra customview_init_view8a ; Yes - ; btfss FLAG_ccr_mode ; In CC mode? - ; bra customview_toggle ; no, Call next view... -; customview_init_view8a: - ; movf hardware_flag,W - ; sublw 0x13 ; + - ; btfsc STATUS,Z - ; bra customview_toggle ; no, Call next view... - ; movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - ; sublw .1 ; opt_ccr_mode = 1 (Sensor)? - ; bnz customview_toggle ; no, Call next view... - ; call TFT_hud_mask ; Setup HUD mask - ; call TFT_hud_voltages ; Show HUD details - ; BY +customview_init_view7: ; view disabled + bra customview_toggle + +customview_init_view8: ; CNS at end of dive + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... call TFT_CNS_mask call TFT_CNS - - goto customview_toggle_exit + goto customview_toggle_exit -customview_init_view9: ; ppO2, Ceiling and current GF - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - call TFT_ceiling_mask ; Setup mask - call TFT_ceiling ; Show Ceiling +customview_init_view9: ; ppO2, Ceiling and current GF + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... + call TFT_ceiling_mask ; Setup mask + call TFT_ceiling ; Show Ceiling - ; ppO2 value - call TFT_mask_ppo2 - call TFT_display_pure_ppo2 + ; ppO2 value + call TFT_mask_ppo2 + call TFT_display_pure_ppo2 - ; current GF value - extern char_I_deco_model - TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - bra customview_toggle_exit ; No GF info for non-GF modes - ; current GF value - call TFT_gf_mask_cGF ; Setup Mask - current GF only - call TFT_gf_info ; Show GF informations - bra customview_toggle_exit + ; current GF value + TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + bra customview_toggle_exit ; No GF info for non-GF modes + ; current GF value + call TFT_gf_mask_cGF ; Setup Mask - current GF only + call TFT_gf_info ; Show GF informations + bra customview_toggle_exit -customview_init_view10: ; Sensor check - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - btfss FLAG_ccr_mode ; In CC mode? - bra customview_toggle ; no, Call next view... +customview_init_view10: ; Sensor check + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... + btfss FLAG_ccr_mode ; In CC mode? + bra customview_toggle ; no, Call next view... - call TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask - call TFT_sensor_check ; Show ppO2 of O2 and Diluent - bra customview_toggle_exit + call TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask + call TFT_sensor_check ; Show ppO2 of O2 and Diluent + bra customview_toggle_exit -customview_init_view11: ; ppO2, END/EAD and CNS - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... +customview_init_view11: ; ppO2, END/EAD and CNS + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... - call TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask - call TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS - goto customview_toggle_exit + call TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask + call TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + goto customview_toggle_exit -customview_init_view12: ; PSCR Info - btfss FLAG_pscr_mode ; In PSCR mode? - bra customview_toggle ; No, Call next view... - - call TFT_pscr_info_mask ; Show ppO2, drop and lung ratio - call TFT_pscr_info ; Show ppO2, drop and lung ratio - bra customview_toggle_exit +customview_init_view12: ; PSCR Info + btfss FLAG_pscr_mode ; In PSCR mode? + bra customview_toggle ; No, Call next view... + + call TFT_pscr_info_mask ; Show ppO2, drop and lung ratio + call TFT_pscr_info ; Show ppO2, drop and lung ratio + bra customview_toggle_exit -; NEW ## bailout gas needs -customview_init_view13: ; Gas Needs - TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculations is switched on - bra customview_toggle ; NO - Call next view... - call TFT_gas_needs_mask ; YES - Show the mask for gas needs - call TFT_gas_needs ; Show the gas needs - bra customview_toggle_exit - +customview_init_view13: ; Gas Needs + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculations is switched on + bra customview_toggle ; NO - Call next view... + call TFT_gas_needs_mask ; YES - Show the mask for gas needs + call TFT_gas_needs ; Show the gas needs + bra customview_toggle_exit + customview_toggle_exit: - btfsc divemode ; In Dive Mode? - bsf FLAG_TFT_temp_divemode ; Set flag to redraw temp - call TFT_standard_color - bcf toggle_customview ; Clear flag - return + btfsc divemode ; In Dive Mode? + bsf FLAG_TFT_temp_divemode ; Set flag to redraw temp + call TFT_standard_color + bcf toggle_customview ; Clear flag + return - global customview_show_change_depth -customview_show_change_depth: ; Put " lom" or " loft" into Postinc2 - PUTC " " - TSTOSS opt_units ; 0=m, 1=ft + global customview_show_change_depth +customview_show_change_depth: ; Put " lom" or " loft" into Postinc2 + PUTC " " + TSTOSS opt_units ; 0=m, 1=ft bra customview_show_mix_metric - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - bsf leftbind - output_16 ; Change depth in lo:hi - bcf leftbind - STRCAT_TEXT tFeets - return + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16 ; Change depth in lo:hi + bcf leftbind + STRCAT_TEXT tFeets + return customview_show_mix_metric: - output_99 ; Change depth in lo - STRCAT_TEXT tMeters - return + output_99 ; Change depth in lo + STRCAT_TEXT tMeters + return - global customview_show_mix -customview_show_mix: ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - tstfsz hi ; He=0? - bra customview_show_mix5 ; No, Show a TX + global customview_show_mix +customview_show_mix: ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + tstfsz hi ; He=0? + bra customview_show_mix5 ; No, Show a TX movlw .21 - cpfseq lo ; Air? - bra customview_show_mix2 ; No - STRCAT_TEXT tSelectAir ; Yes, show "Air" - bra customview_show_mix4b + cpfseq lo ; Air? + bra customview_show_mix2 ; No + STRCAT_TEXT tSelectAir ; Yes, show "Air" + bra customview_show_mix4b customview_show_mix2: movlw .100 - cpfseq lo ; O2? - bra customview_show_mix3 ; No - STRCAT_TEXT tSelectO2 ; Yes, show "O2" - bra customview_show_mix4b + cpfseq lo ; O2? + bra customview_show_mix3 ; No + STRCAT_TEXT tSelectO2 ; Yes, show "O2" + bra customview_show_mix4b customview_show_mix3: movlw .21 - cpfslt lo ; < Nx21? - bra customview_show_mix4 ; No - STRCAT_TEXT tGasErr ; Yes, show "Err" - output_99 ; O2 ratio is still in "lo" - bra customview_show_mix4c + cpfslt lo ; < Nx21? + bra customview_show_mix4 ; No + STRCAT_TEXT tGasErr ; Yes, show "Err" + output_99 ; O2 ratio is still in "lo" + bra customview_show_mix4c customview_show_mix4: - STRCAT_TEXT tSelectNx ; Show "Nx" - output_99 ; O2 ratio is still in "lo" + STRCAT_TEXT tSelectNx ; Show "Nx" + output_99 ; O2 ratio is still in "lo" customview_show_mix4b: - STRCAT " " + STRCAT " " customview_show_mix4c: - btfsc divemode ; In divemode - return ; Yes - STRCAT " " - return + btfsc divemode ; In divemode + return ; Yes + STRCAT " " + return customview_show_mix5: - btfsc divemode - bra customview_show_mix6 - STRCAT_TEXT tSelectTx ; Show "Tx" + btfsc divemode + bra customview_show_mix6 + STRCAT_TEXT tSelectTx ; Show "Tx" customview_show_mix6: - output_99 ; O2 ratio is still in "lo" - PUTC "/" - movff hi,lo - output_99 ; He ratio - return + output_99 ; O2 ratio is still in "lo" + PUTC "/" + movff hi,lo + output_99 ; He ratio + return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/divemenu_tree.asm --- a/src/divemenu_tree.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/divemenu_tree.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemenu_tree.asm REFACTORED VERSION V2.96a +; File divemenu_tree.asm REFACTORED VERSION V2.98 ; ; OSTC dive mode menu ; @@ -9,144 +9,135 @@ ; HISTORY ; 2013-02-02 : [mH] Made out of menu_tree.asm -#include "hwos.inc" ; Mandatory header -#include "menu_processor.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "tft_outputs.inc" -#include "customview.inc" -#include "strings.inc" -#include "calibrate.inc" +#include "hwos.inc" ; Mandatory header +#include "menu_processor.inc" +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "tft_outputs.inc" +#include "customview.inc" +#include "strings.inc" +#include "calibrate.inc" + + extern timeout_divemode_menu2 + extern diveloop_loop4 -divegui CODE +divegui CODE + ;============================================================================= ; Main Menu - global do_main_divemenu + global do_main_divemenu do_main_divemenu: - call menu_processor_reset ; restart from first icon. - -do_continue_main_divemenu: - call menu_processor_pop ; drop exit line. - call menu_processor_pop ; drop exit line. - + call menu_processor_reset ; restart from first icon + movlw .1 + movwf menupos1 ; set to first option in divemode menu btfsc FLAG_ccr_mode bra main_divemenu_loop ; goto CCR / pSCR Menu menu btfsc FLAG_pscr_mode bra main_divemenu_loop ; goto CCR / pSCR Menu menu -main_divemenu_OC: +main_divemenu_OC: bcf ccr_diluent_setup bcf is_bailout_menu - movlw .1 - movwf menupos ; Set to first option in divemode menu - - MENU_BEGIN tMainMenu, .5 - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_reset_average - MENU_CALL tDivemenu_ToggleGF, do_toggle_gf - MENU_CALL tDivemenu_Marker, do_set_marker - MENU_CALL tExit, do_exit_divemode_menu + + MENU_BEGIN tMainMenu, .5 + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_CALL tExit, do_exit_divemode_menu MENU_END main_divemenu_loop: - bsf ccr_diluent_setup ; default to operations on diluents + bsf ccr_diluent_setup ; default to operations on diluents bcf is_bailout_menu ; default to none-bailout menu - movlw .1 - movwf menupos ; Set to first option in divemode menu - - btfsc FLAG_pscr_mode - bra main_divemenu_pscr ; PSCR Menu - - MENU_BEGIN tMainMenu, .6 - MENU_CALL tDiveBailout, do_divemode_gaslist_bail - MENU_CALL tDivemenu_Setpoint, do_divemode_splist - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_reset_average - MENU_CALL tDivemenu_ToggleGF, do_toggle_gf - MENU_CALL tExit, do_exit_divemode_menu - MENU_END - + btfsc FLAG_pscr_mode + bra main_divemenu_pscr ; PSCR Menu + + MENU_BEGIN tMainMenu, .6 + MENU_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tDivemenu_Setpoint, do_divemode_splist + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + main_divemenu_pscr: - movf hardware_flag,W - sublw 0x11 ; 2 with BLE - btfsc STATUS,Z - bra main_divemenu_pscr_no_sensors - movf hardware_flag,W - sublw 0x13 ; + - btfsc STATUS,Z - bra main_divemenu_pscr_no_sensors - - MENU_BEGIN tMainMenu, .6 - MENU_CALL tDiveBailout, do_divemode_gaslist_bail - MENU_CALL tCCRSensor, do_divemode_setpoint_pscr - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_reset_average - MENU_CALL tDivemenu_ToggleGF, do_toggle_gf - MENU_CALL tExit, do_exit_divemode_menu - MENU_END + btfsc analog_o2_input ; do we have an analog input? + bra main_divemenu_pscr_sensors ; YES + btfsc s8_digital ; do we have a digital input? + bra main_divemenu_pscr_sensors ; YES main_divemenu_pscr_no_sensors: - MENU_BEGIN tMainMenu, .6 - MENU_CALL tDiveBailout, do_divemode_gaslist_bail - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_reset_average - MENU_CALL tDivemenu_ToggleGF, do_toggle_gf - MENU_CALL tDivemenu_Marker, do_set_marker - MENU_CALL tExit, do_exit_divemode_menu - MENU_END - + MENU_BEGIN tMainMenu, .6 + MENU_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + +main_divemenu_pscr_sensors: + MENU_BEGIN tMainMenu, .6 + MENU_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tCCRSensor, do_divemode_setpoint_pscr + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + do_toggle_gf: - movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF - decfsz WREG,W ; Toggle GF only in GF modes - in GF mode? - bra do_continue_main_divemenu ; No, do nothing and return - TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater - bra do_continue_main_divemenu ; No, do nothing and return - movlw .4 ; Set customview to 5 (GF informations) + movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF + decfsz WREG,W ; Toggle GF only in GF modes - in GF mode? + bra do_main_divemenu ; No, do nothing and return + TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater + bra do_main_divemenu ; No, do nothing and return + movlw .4 ; Set customview to 5 (GF informations) movwf menupos3 ; Customview to come-1 bsf toggle_customview ; Set flag, the customview will be toggled very soon now... movlw .1 - movwf menupos ; Set to first option in divemode menu - - MENU_BEGIN tDivemenu_ToggleGF, .2 - MENU_CALL tDivemenu_ToggleGF, do_togglegf - MENU_CALL tExit, do_continue_main_divemenu - MENU_END + movwf menupos1 ; Set to first option in divemode menu + + MENU_BEGIN tDivemenu_ToggleGF, .2 + MENU_CALL tDivemenu_ToggleGF, do_togglegf + MENU_CALL tBack, do_main_divemenu + MENU_END do_togglegf: - ;TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater ## check is now done before entering menu + ;TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater ; check is now done before entering menu ;bra do_exit_divemode_menu ; continue with exiting menu code bsf toggle_gf ; Set flag... bra do_exit_divemode_menu ; continue with exiting menu code - - + + do_set_marker: - movlw d'6' ; Type of Alarm (Manual Marker) - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - bra do_exit_divemode_menu ; And exit + bsf FLAG_set_marker ; set flag... + bra do_exit_divemode_menu ; ... and exit + - do_reset_average: - bsf reset_average_depth ; Set Flag - bra do_exit_divemode_menu ; continue with exiting menu code + bsf reset_average_depth ; Set Flag + bra do_exit_divemode_menu ; continue with exiting menu code - + do_switch_sensor: ; entry point when coming from switch to sensor - movlw .1 ; Switch to Sensor - movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP - ; enable all sensors - bsf use_O2_sensor1 - bsf use_O2_sensor2 - bsf use_O2_sensor3 - bra do_switch_sp_com ; continue with common part - + movlw .1 ; Switch to Sensor + movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP + ; enable all sensors + bsf use_O2_sensor1 + bsf use_O2_sensor2 + bsf use_O2_sensor3 + bra do_switch_sp_com ; continue with common part + do_switch_sp: ; entry point when coming from manual setpoint selection (CCR) - decf menupos,W ; 1-5 -> 0-4 - lfsr FSR1,char_I_setpoint_cbar - movff PLUSW1,char_I_const_ppO2 ; setup fixed setpoint - movff char_I_const_ppO2,WREG - call transmit_setpoint ; tansmit current setpoint from WREG (in cbar) to external electronics + decf menupos1,W ; 1-5 -> 0-4 + lfsr FSR1,char_I_setpoint_cbar + movff PLUSW1,char_I_const_ppO2 ; setup fixed setpoint + movff char_I_const_ppO2,WREG + call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics bcf setpoint_fallback ; clear fallback condition (stops fallback warning) clrf WREG ; Switch to fixed SP movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP @@ -154,81 +145,84 @@ do_switch_sp_calc: ; entry point when coming from switch to calculated ppO2 (pSCR) bcf setpoint_fallback ; clear fallback condition (stops fallback warning) - clrf WREG ; Switch to fixed SP - movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP + clrf WREG ; Switch to fixed SP + movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP movff WREG,char_I_const_ppO2 ; set setpoint to 0, this forces deco engine to take the computed ppO2 do_switch_sp_com: ; merge point to common part - bsf event_occured ; set global event byte - bsf setpoint_changed ; set flag (for profile) + bsf event_occured ; set global event byte + bsf setpoint_changed ; set flag (for profile) + + ; Clear some flags in case we were in bailout before... + bcf is_bailout ; end bailout mode + ;bcf is_bailout_menu ; not needed + bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode + bcf blinking_better_gas ; clear blinking flag + call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: - ; Clear some flags in case we were in bailout before... - bcf is_bailout ; end bailout mode - ;bcf is_bailout_menu ; not needed - bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode - bcf blinking_better_gas ; clear blinking flag - call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: - - movff active_diluent,menupos ; reconfigure last diluent (menupos is transfer register for selected gas/diluent towards gas_switched_common:) - bsf divemode_gaschange ; initiate reconfiguration to loop mode on last diluent - - bra do_exit_divemode_menu ; continue with exiting menu code + bsf FLAG_back_to_loop ; indicate that it is a switchback from OC bailout to CCR/pSCR loop + bsf divemode_gaschange ; initiate reconfiguration to loop mode on last diluent + + bra do_exit_divemode_menu ; continue with exiting menu code + - do_divemode_gaslist_bail: ; entry point from CCR/pSCR to bailout to OC gases - bcf ccr_diluent_setup ; switch to OC gases - bsf is_bailout_menu ; flag it is a bailout action + bcf ccr_diluent_setup ; switch to OC gases + bsf is_bailout_menu ; flag it is a bailout action do_divemode_gaslist: ; entry point for switching: OC -> gases, loop -> diluents - btfsc is_bailout ; in bailout mode? - bcf ccr_diluent_setup ; yes - for safety reasons, redirect to OC (bailout) gases + btfsc is_bailout ; in bailout mode? + bcf ccr_diluent_setup ; yes - for safety reasons, redirect to OC (bailout) gases +do_divemode_gaslist_com: bsf short_gas_decriptions movlw .1 - movwf menupos ; Set to first option in divemode menu - MENU_BEGIN tGaslist, .6 - MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_CALL tMore, do_divemode_gaslist_more - MENU_END + movwf menupos1 ; Set to first option in divemode menu + MENU_BEGIN tGaslist, .6 + MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas + MENU_CALL tMore, do_divemode_gaslist_more + MENU_END + do_divemode_gaslist_more: movlw .1 - movwf menupos ; Set to first option in divemode menu - + movwf menupos1 ; Set to first option in divemode menu + movff char_I_O2_ratio,gas6_O2_ratio ; initialize gas6 with currently breathed gas - O2 ratio movff char_I_He_ratio,gas6_He_ratio ; initialize gas6 with currently breathed gas - He ratio - -do_divemode_gaslist_more_loop: - MENU_BEGIN tGaslist, .6 - MENU_CALL tO2Plus, do_dive_pO2 - MENU_CALL tO2Minus, do_dive_mO2 - MENU_CALL tHePlus, do_dive_pHe - MENU_CALL tHeMinus, do_dive_mHe - MENU_DYNAMIC gaslist_strcat_gas6, do_switch_gas6 - MENU_CALL tDivemenu_LostGas, do_lost_gas - MENU_END + +do_divemode_gaslist_more_common: + MENU_BEGIN tGaslist, .6 + MENU_CALL tO2Plus, do_dive_pO2 + MENU_CALL tO2Minus, do_dive_mO2 + MENU_CALL tHePlus, do_dive_pHe + MENU_CALL tHeMinus, do_dive_mHe + MENU_DYNAMIC gaslist_strcat_gas6, do_switch_gas6 + MENU_CALL tDivemenu_LostGas, do_lost_gas + MENU_END + do_lost_gas: movlw .1 - movwf menupos ; Set to first option in divemode menu -do_lost_gas_loop: + movwf menupos1 ; Set to first option in divemode menu +do_lost_gas_common: bsf short_gas_decriptions - MENU_BEGIN tDivemenu_LostGas, .6 - MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_CALL tExit, do_exit_divemode_menu - MENU_END + MENU_BEGIN tDivemenu_LostGas, .6 + MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active + MENU_CALL tExit, do_exit_divemode_menu + MENU_END do_switch_gas6: - movlw .6 ; gas 6 - movwf menupos ; transfer register for selected gas towards gas_switched_common: - bsf gas6_changed ; set flag for profile recording + movlw .6 ; gas 6 + movwf menupos1 ; transfer register for selected gas towards gas_switched_common: + bsf gas6_changed ; set flag for profile recording ;bra do_switch_gas ; continue with common gas-switched code do_switch_gas: @@ -237,44 +231,42 @@ bsf is_bailout ; begin bailout mode call customview_mask ; update custom view mask to (eventually) rewrite ppO2(Dil): to ppO2: ;bra do_exit_divemode_menu ; continue with exiting menu code - + do_exit_divemode_menu: - extern timeout_divemode_menu2 call timeout_divemode_menu2 clrf STKPTR - extern diveloop_loop4 goto diveloop_loop4 do_toggle_active: extern restart_deco_engine_wo_ceiling call restart_deco_engine_wo_ceiling - movlw .5 - btfsc ccr_diluent_setup ; diluents? - addwf menupos,F ; yes 1-5 -> 6-10 - decf menupos,W ; -> 0-4 for gases / 5-9 for diluents - lfsr FSR1,opt_gas_type+0 - movff PLUSW1,lo - tstfsz lo ; Already disabled? - bra do_toggle_active2 ; No, disable now! - lfsr FSR1,opt_gas_type_backup+0 ; copy opt_gas_type_backup+W back to opt_gas_type+W - movff PLUSW1,lo - lfsr FSR1,opt_gas_type+0 - movff lo,PLUSW1 - lfsr FSR1,opt_OC_bail_gas_change_backup+0 ; copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W - movff PLUSW1,lo - lfsr FSR1,opt_OC_bail_gas_change+0 - movff lo,PLUSW1 - bra do_toggle_active3 + movlw .5 + btfsc ccr_diluent_setup ; diluents? + addwf menupos1,F ; yes 1-5 -> 6-10 + decf menupos1,W ; -> 0-4 for gases / 5-9 for diluents + lfsr FSR1,opt_gas_type+0 + movff PLUSW1,lo + tstfsz lo ; Already disabled? + bra do_toggle_active2 ; No, disable now! + lfsr FSR1,opt_gas_type_backup+0 ; copy opt_gas_type_backup+W back to opt_gas_type+W + movff PLUSW1,lo + lfsr FSR1,opt_gas_type+0 + movff lo,PLUSW1 + lfsr FSR1,opt_OC_bail_gas_change_backup+0 ; copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W + movff PLUSW1,lo + lfsr FSR1,opt_OC_bail_gas_change+0 + movff lo,PLUSW1 + bra do_toggle_active3 do_toggle_active2: - clrf PLUSW1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - lfsr FSR1,opt_OC_bail_gas_change+0 - clrf PLUSW1 ; also delete change depth here to have the menu updated immediately + clrf PLUSW1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + lfsr FSR1,opt_OC_bail_gas_change+0 + clrf PLUSW1 ; also delete change depth here to have the menu updated immediately do_toggle_active3: - movlw .5 - btfsc ccr_diluent_setup ; use OC gases? - subwf menupos,F ; Back to 1-5 - bra do_lost_gas_loop ; Return to list and show updated result + movlw .5 + btfsc ccr_diluent_setup ; use OC gases? + subwf menupos1,F ; back to 1-5 + bra do_lost_gas ; return to list and show updated result do_dive_pO2: @@ -284,118 +276,117 @@ addwf gas6_O2_ratio,W movwf gas6_temp movlw .101 - cpfslt gas6_temp ; O2+He<101? - decf gas6_O2_ratio,F ; O2-- (Unchanged) - banksel common - bra do_divemode_gaslist_more_loop - + cpfslt gas6_temp ; O2 + He < 101 ? + decf gas6_O2_ratio,F ; O2-- (unchanged) + banksel common + bra do_divemode_gaslist_more_common + do_dive_mO2: - banksel gas6_O2_ratio - decf gas6_O2_ratio,F ; O2-- - movlw gaslist_min_o2 - cpfslt gas6_O2_ratio - bra do_dive_mO2_done - movlw gaslist_min_o2 - movwf gas6_O2_ratio + banksel gas6_O2_ratio + decf gas6_O2_ratio,F ; O2-- + movlw gaslist_min_o2 + cpfslt gas6_O2_ratio ; O2 < minimum allowed %O2? + bra do_dive_mO2_done ; NO + movlw gaslist_min_o2 ; YES - restore minimum + movwf gas6_O2_ratio do_dive_mO2_done: - banksel common - bra do_divemode_gaslist_more_loop + banksel common + bra do_divemode_gaslist_more_common do_dive_pHe: - banksel gas6_O2_ratio - incf gas6_He_ratio,F ; He++ - movf gas6_He_ratio,W - addwf gas6_O2_ratio,W - movwf lo - movlw .101 - cpfslt lo ; O2+He<101? - decf gas6_He_ratio,F ; Yes, He-- (Unchanged) - banksel common - bra do_divemode_gaslist_more_loop + banksel gas6_O2_ratio + incf gas6_He_ratio,F ; He++ + movf gas6_He_ratio,W + addwf gas6_O2_ratio,W + movwf lo + movlw .101 + cpfslt lo ; O2 + He < 101 ? + decf gas6_He_ratio,F ; Yes, He-- (Unchanged) + banksel common + bra do_divemode_gaslist_more_common do_dive_mHe: banksel gas6_O2_ratio - decf gas6_He_ratio,F ; He-- - bnn do_dive_mHe_done - clrf gas6_He_ratio + decf gas6_He_ratio,F ; He-- + bnn do_dive_mHe_done ; H2 < 0? + clrf gas6_He_ratio ; YES - reset to 0 do_dive_mHe_done: - banksel common - bra do_divemode_gaslist_more_loop + banksel common + bra do_divemode_gaslist_more_common + do_divemode_splist: bsf short_gas_decriptions movlw .1 - movwf menupos ; Set to first option in divemode menu - - movf hardware_flag,W - sublw 0x11 ; 2 with BLE - btfsc STATUS,Z - bra do_divemode_splist_no_sensor ; no sensor - movf hardware_flag,W - sublw 0x13 ; + - btfsc STATUS,Z - bra do_divemode_splist_no_sensor ; no sensor + movwf menupos1 ; set to first option in divemode menu -do_divemode_splist_with_sensor: - MENU_BEGIN tGaslist, .6 - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_CALL tCCRSensor, do_divemode_sensor - MENU_END +do_divemode_splist_common: + btfsc analog_o2_input ; do we have an analog input? + bra do_divemode_splist_sensor ; YES + btfsc s8_digital ; do we have a digital input? + bra do_divemode_splist_sensor ; YES do_divemode_splist_no_sensor: - MENU_BEGIN tGaslist, .5 - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_END + MENU_BEGIN tGaslist, .5 + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_END + +do_divemode_splist_sensor: + MENU_BEGIN tGaslist, .6 + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp + MENU_CALL tCCRSensor, do_divemode_sensor + MENU_END do_divemode_sensor: clrf menupos3 ; show customview 1 (HUD Data) bsf toggle_customview - movlw .1 - movwf menupos ; Set to 1st option: use sensors -do_divemode_sensor_loop: - MENU_BEGIN tGaslist, .6 - MENU_CALL tDivemenu_UseSensor, do_switch_sensor + movlw .1 + movwf menupos1 ; Set to 1st option: use sensors + +do_return_divemode_sensor: + MENU_BEGIN tGaslist, .6 + MENU_CALL tDivemenu_UseSensor, do_switch_sensor MENU_CALL tBack, do_divemode_splist - MENU_CALL tExit, do_exit_divemode_menu + MENU_CALL tExit, do_exit_divemode_menu MENU_CALL tDiveHudMask1, do_toggle_sensor MENU_CALL tDiveHudMask2, do_toggle_sensor MENU_CALL tDiveHudMask3, do_toggle_sensor - MENU_END + MENU_END do_divemode_setpoint_pscr: - movlw .1 - movwf menupos ; Set to 1st option: use calculated ppO2 - MENU_BEGIN tGaslist, .6 + movlw .1 + movwf menupos1 ; Set to 1st option: use calculated ppO2 + MENU_BEGIN tGaslist, .6 MENU_CALL tCalculated, do_switch_sp_calc - MENU_CALL tDivemenu_UseSensor, do_switch_sensor - MENU_CALL tExit, do_continue_main_divemenu + MENU_CALL tDivemenu_UseSensor, do_switch_sensor + MENU_CALL tExit, do_exit_divemode_menu MENU_CALL tDiveHudMask1, do_toggle_sensor MENU_CALL tDiveHudMask2, do_toggle_sensor MENU_CALL tDiveHudMask3, do_toggle_sensor - MENU_END + MENU_END + do_toggle_sensor: - movff menupos,lo ; backup position - decf menupos,f ; 4, 5, 6 -> 3, 4, 5 - decf menupos,f ; 3, 4, 5 -> 2, 3, 4 - decf menupos,f ; 2, 3, 4 -> 1, 2, 3 - dcfsnz menupos ; 1, 2, 3 -> 0, 1, 2 - btg use_O2_sensor1 ; = - dcfsnz menupos ; 0, 1, 2 -> -1, 0, 1 - btg use_O2_sensor2 ; = - dcfsnz menupos ; -1,0, 1 -> -2,-1, 0 - btg use_O2_sensor3 ; = - movff lo,menupos ; reload position - bra do_divemode_sensor_loop + movff menupos1,lo ; backup position + decf menupos1,f ; 4, 5, 6 -> 3, 4, 5 + decf menupos1,f ; 3, 4, 5 -> 2, 3, 4 + decf menupos1,f ; 2, 3, 4 -> 1, 2, 3 + dcfsnz menupos1 ; 1, 2, 3 -> 0, 1, 2 + btg use_O2_sensor1 ; = + dcfsnz menupos1 ; 0, 1, 2 -> -1, 0, 1 + btg use_O2_sensor2 ; = + dcfsnz menupos1 ; -1,0, 1 -> -2,-1, 0 + btg use_O2_sensor3 ; = + movff lo,menupos1 ; restore position + bra do_return_divemode_sensor - - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/divemode.asm --- a/src/divemode.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/divemode.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.asm REFACTORED VERSION V2.96a +; File divemode.asm REFACTORED VERSION V2.98 ; ; Divemode ; @@ -9,99 +9,119 @@ ; HISTORY ; 2011-08-15 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "tft_outputs.inc" -#include "strings.inc" -#include "tft.inc" -#include "eeprom_rs232.inc" -#include "isr.inc" -#include "math.inc" -#include "wait.inc" -#include "customview.inc" -#include "start.inc" -#include "adc_lightsensor.inc" -#include "ghostwriter.inc" -#include "i2c.inc" -#include "calibrate.inc" -#include "convert.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "tft_outputs.inc" +#include "strings.inc" +#include "tft.inc" +#include "eeprom_rs232.inc" +#include "isr.inc" +#include "math.inc" +#include "wait.inc" +#include "customview.inc" +#include "start.inc" +#include "adc_lightsensor.inc" +#include "ghostwriter.inc" +#include "i2c.inc" +#include "calibrate.inc" +#include "convert.inc" + -gui CODE + extern TFT_dive_compass_heading + extern do_line_menu + extern do_main_divemenu + extern option_save_all + extern init_recording_params + + + ;---- Private local variables ------------------------------------------------- + + CBLOCK local1 ; max size is 16 Byte !!! + apnoe_timeout_counter ; timeout counter for apnoe mode + average_depth_hold:4 ; used in calculation of the average depth + sensor_setpoint ; sensor ppo2 in 0.01bar for deco routine + active_diluent ; backup of diluent gas for when switching back from bailout to CCR/pSCR loop + average_depth_hold_total:4 ; used to calculate the average depth + ENDC ; used: 11 byte, remaining: 5 byte + +gui CODE + +;============================================================================= global diveloop diveloop: - banksel common - call speed_normal - call diveloop_boot ; Boot tasks for all modes + banksel common + call speed_normal + call diveloop_boot ; Boot tasks for all modes - ; Startup Tasks for all modes - call TFT_boot ; Initialize TFT (includes clear screen) - bsf FLAG_TFT_divemode_mask ; Display mask - movff customview_divemode,menupos3; Reload last customview - call customview_mask ; Redraw last custom view + ; Startup Tasks for all modes + call TFT_boot ; Initialize TFT (includes clear screen) + bsf FLAG_TFT_divemode_mask ; Display mask + movff customview_divemode,menupos3; Reload last customview + call customview_mask ; Redraw last custom view - btfsc FLAG_apnoe_mode - bsf realdive ; Set Realdive flag in Apnoe mode + btfsc FLAG_apnoe_mode + bsf realdive ; Set Realdive flag in Apnoe mode - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - bra diveloop_loop_start - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - bra diveloop_loop_start + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + bra diveloop_loop_start + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + bra diveloop_loop_start - bsf FLAG_TFT_display_ndl_mask ; display "NDL" + bsf FLAG_TFT_display_ndl_mask ; display "NDL" ; +@5 init - clrf WREG ; WAIT marker: display "---" - movff WREG,char_I_sim_advance_time; bank safe clrf - movff WREG,int_O_alternate_ascenttime+0 + clrf WREG ; WAIT marker: display "---" + movff WREG,char_I_sim_advance_time + movff WREG,int_O_alternate_ascenttime+0 bsf WREG,int_not_yet_computed bsf WREG,int_invalid_flag - movff WREG,int_O_alternate_ascenttime+1 + movff WREG,int_O_alternate_ascenttime+1 diveloop_loop_start: - btfsc FLAG_TFT_display_ndl_mask - call TFT_display_ndl_mask + btfsc FLAG_TFT_display_ndl_mask + call TFT_display_ndl_mask diveloop_loop: ; The diveloop starts here - btfss quarter_second_update - bra diveloop_loop4a + btfss quarter_second_update + bra diveloop_loop1 + + ; tasks any 1/4 second, any mode + bcf quarter_second_update ; clear flag - ; tasks any 1/4 second, any mode - bcf quarter_second_update ; clear flag - - movlw .6 - cpfseq menupos3 ; in compass view? - bra diveloop_loop4a ; No, done. + movlw .6 + cpfseq menupos3 ; in compass view? + bra diveloop_loop1 ; No, done. - btfsc alternative_divelayout ; In alternative layout mode? - bra diveloop_loop4a ; Yes, done. No Compass. + btfsc alternative_divelayout ; In alternative layout mode? + bra diveloop_loop1 ; Yes, done. No Compass. -; TFT Output routines - extern TFT_dive_compass_heading - call TFT_dive_compass_heading ; Yes, update compass heading value - bsf FLAG_TFT_temp_divemode ; Redraw temperature (Is slighty affected from compass heading arrow) -; TFT Output routines +; TFT Output routines + call TFT_dive_compass_heading ; Yes, update compass heading value + bsf FLAG_TFT_temp_divemode ; Redraw temperature (is slightly affected from compass heading arrow) +; TFT Output routines -diveloop_loop4a: - btfss onesecupdate +diveloop_loop1: + btfss onesecupdate bra diveloop_loop3 - + ; tasks any new second... - bcf onesecupdate ; one seconds update, clear flag here in case it's set again in ISR before all tasks are done. + bcf onesecupdate ; one seconds update, clear flag here in case it's set again in ISR before all tasks are done. - ;bsf LEDg ; ### DEBUG - used to measure the time used by all deco code to see if there is enough margin each second ### + ;bsf LEDg ; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ### ; display depth based on full seconds interval (nicer blinking) - btfss alternative_divelayout - rcall TFT_output4_normal - btfsc alternative_divelayout - rcall TFT_output4_alternative - + btfss alternative_divelayout + rcall TFT_output4_normal + btfsc alternative_divelayout + rcall TFT_output4_alternative + btfsc FLAG_apnoe_mode ; Only in apnoe mode - bra diveloop_loop1b ; One Second Tasks in Apnoe mode - + bra diveloop_loop1_nonedeco ; One Second Tasks in Apnoe mode + ; tasks any new second - only for deco modes +diveloop_loop1_decomodes: bsf FLAG_TFT_divemins ; Display (new) divetime! btfsc show_safety_stop ; Show the safety stop? bsf FLAG_TFT_show_safety_stop ; Yes, show/delete if done. @@ -111,9 +131,9 @@ btfsc alternative_divelayout rcall TFT_output1_alternative - btfsc FLAG_ccr_mode ; In CCR mode... - call check_dive_autosp ; ...check for Auto-SP - + btfsc FLAG_ccr_mode ; in CCR mode... + call check_dive_autosp ; ...check for Auto-SP + call calc_deko_divemode ; calculate decompression and set resulting display flags btfss alternative_divelayout @@ -123,20 +143,19 @@ call divemode_check_for_warnings ; Check for any warnings - bra diveloop_loop1x ; Common Tasks + bra diveloop_loop2 ; Common Tasks + - ; tasks any new second - only for apnoe mode -diveloop_loop1b: +diveloop_loop1_nonedeco: rcall divemode_apnoe_tasks ; 1 sec. Apnoe tasks call customview_second ; Do every-second tasks for the custom view area - - ;bra diveloop_loop1x ; Common Tasks + ;bra diveloop_loop2 ; Common Tasks ; continue tasks any new second, any mode -diveloop_loop1x: +diveloop_loop2: rcall timeout_divemode ; ** menu timeout? ** This routine sets the required flags - rcall set_dive_modes ; tests if depth>threshold + rcall set_dive_modes ; tests if depth > threshold rcall set_min_temp ; store min. temp if required (Future hardware will need this to be checked 1/second...) btfsc oneminupdate ; one minute tasks @@ -147,75 +166,78 @@ btfsc alternative_divelayout rcall TFT_output3_alternative - ;bcf LEDg ; ### DEBUG - used to measure the time used by all deco code to see if there is enough margin each second ### + ;bcf LEDg ; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ### ; tasks any round, any mode diveloop_loop3: - call test_switches_divemode ; Check switches in divemode - - global diveloop_loop4 + call test_switches_divemode ; Check switches in divemode + + global diveloop_loop4 diveloop_loop4: ; Menu-Exit returns here... btfsc divemode_menu ; in the big divemode menu? bra diveloop_loop4b ; YES - no space for CCR/pSCR info btfsc menuview ; NO - in the small yellow menu? - bra diveloop_loop4b ; YES - no space for CCR/pSCR info - btfsc alternative_divelayout ; NO - in the alternative layout? - bra diveloop_loop4b ; YES - no space for CCR/pSCR info - call TFT_show_mode_divemode ; NO - (re)write CCR/pSCR mode info to display + bra diveloop_loop4b ; YES - no space for CCR/pSCR info + btfsc alternative_divelayout ; NO - in the alternative layout? + bra diveloop_loop4b ; YES - no space for CCR/pSCR info + call TFT_show_mode_divemode ; NO - (re)write CCR/pSCR mode info to display diveloop_loop4b: - btfsc toggle_customview ; Next view? - call customview_toggle ; Yes, show next customview (and delete this flag) + btfsc toggle_customview ; Next view? + call customview_toggle ; Yes, show next customview (and delete this flag) - btfsc store_sample ; store new sample? - call store_dive_data ; Store profile data + btfsc divemode_gaschange ; Gas switch flag set? + call gas_switched_common ; YES - btfss divemode ; Dive finished? - goto ghostwriter_end_dive ; Dive finished! + btfsc toggle_gf ; Toggle GF/aGF? + rcall divemodemode_togglegf ; YES - btfsc divemode_gaschange ; Gas switch flag set? - call gas_switched_common ; Yes + btfsc FLAG_set_marker ; shall a marker be set? + call set_logbook_marker ; YES + + btfsc store_sample ; store new sample? + call store_dive_data ; Store profile data + + btfss divemode ; Dive finished? + goto ghostwriter_end_dive ; Dive finished! - btfsc toggle_gf ; =1: Toggle GF/aGF - rcall divemodemode_togglegf ; Toggle aGF/GF - - btfsc pressure_refresh ; new pressure available? - rcall set_max_depth ; update max. depth if required - btfsc pressure_refresh ; new pressure available? - bsf FLAG_TFT_depth ; Yes, update depth asap - bcf pressure_refresh ; clear flag + btfsc pressure_refresh ; new pressure available? + rcall set_max_depth ; update max. depth if required + btfsc pressure_refresh ; new pressure available? + bsf FLAG_TFT_depth ; Yes, update depth + bcf pressure_refresh ; clear flag - btfsc temp_changed - bsf FLAG_TFT_temp_divemode ; Displays temperature + btfsc temp_changed + bsf FLAG_TFT_temp_divemode ; Displays temperature ; display depth based on as-fast-as-possible (no nice blinking) - ;btfss alternative_divelayout - ;rcall TFT_output4_normal - ;btfsc alternative_divelayout - ;rcall TFT_output4_alternative - - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - bra diveloop_loop5 - bra diveloop_loop6 + ;btfss alternative_divelayout + ;rcall TFT_output4_normal + ;btfsc alternative_divelayout + ;rcall TFT_output4_alternative + + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + bra diveloop_loop5 + bra diveloop_loop6 diveloop_loop5: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag - call rs232_get_byte - btfsc rs232_recieve_overflow - bra diveloop_loop6 - movlw "l" - cpfseq RCREG1 - bra diveloop_loop6 - call TFT_dump_screen ; Dump the screen contents - + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag + call rs232_get_byte + btfsc rs232_receive_overflow + bra diveloop_loop6 + movlw "l" + cpfseq RCREG1 + bra diveloop_loop6 + call TFT_dump_screen ; Dump the screen contents + diveloop_loop6: bra diveloop_loop ; Loop the divemode - + ;-------------------------------------------------------------------------------------------------------- - -TFT_output1_normal: ; beginning of any new second - only for deco modes - btfsc FLAG_TFT_divemode_mask - call TFT_divemode_mask + +TFT_output1_normal: ; beginning of any new second - only for deco modes + btfsc FLAG_TFT_divemode_mask + call TFT_divemode_mask btfsc FLAG_TFT_divemins call TFT_divemins ; Display (new) divetime! call customview_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH @@ -224,20 +246,20 @@ btfsc FLAG_TFT_clear_safety_stop call TFT_clear_safety_stop ; Clear safety stop return - + TFT_output1_alternative: ; beginning of any new second - only for deco modes btfsc FLAG_TFT_divemins call TFT_divemins_alternative ; Display (new) divetime! btfsc FLAG_TFT_divemode_mask_alt - call TFT_divemode_mask_alternative ; Alt. mask - call customview_alternative_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH + call TFT_divemode_mask_alternative ; Alt. mask + call customview_alternative_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH return - -TFT_output2_normal: ; any new second - only for deco modes - btfsc FLAG_TFT_display_ndl_mask - call TFT_display_ndl_mask - btfsc FLAG_TFT_display_ndl - call TFT_display_ndl + +TFT_output2_normal: ; any new second - only for deco modes + btfsc FLAG_TFT_display_ndl_mask + call TFT_display_ndl_mask + btfsc FLAG_TFT_display_ndl + call TFT_display_ndl btfsc FLAG_TFT_display_deko_mask call TFT_display_deko_mask btfsc FLAG_TFT_display_deko @@ -246,10 +268,10 @@ call TFT_display_tts return -TFT_output2_alternative: ; any new second - only for deco modes +TFT_output2_alternative: ; any new second - only for deco modes return - -TFT_output3_normal: ; tasks any new second, any mode + +TFT_output3_normal: ; tasks any new second, any mode btfsc FLAG_TFT_max_depth call TFT_max_depth ; use normal max. depth btfsc FLAG_TFT_divemode_warning @@ -257,14 +279,14 @@ btfsc FLAG_TFT_divemode_warning_clear call TFT_divemode_warning_clear btfsc FLAG_TFT_active_gas_divemode - call TFT_active_gas_divemode ; Display gas/Setpoint + call TFT_active_gas_divemode ; Display gas/Setpoint btfsc FLAG_TFT_dive_warning_text_clear - call TFT_clear_warning_text ; clear complete warnings area - btfsc FLAG_TFT_dive_warning_text_clr2 - call TFT_clear_warning_text_2nd_row ; clear 2nd row of warnings + call TFT_clear_warning_text ; clear complete warnings area + btfsc FLAG_TFT_dive_warning_text_clr2 + call TFT_clear_warning_text_2nd_row; clear 2nd row of warnings return - -TFT_output3_alternative: ; tasks any new second, any mode + +TFT_output3_alternative: ; tasks any new second, any mode btfsc FLAG_TFT_max_depth_alt call TFT_max_depth_alternative ; big max. depth btfsc FLAG_TFT_dive_warning_text_clear @@ -276,16 +298,16 @@ TFT_output4_normal: ; tasks any round, any mode btfsc FLAG_TFT_depth call TFT_depth ; Displays new depth - btfsc FLAG_TFT_temp_divemode + btfsc FLAG_TFT_temp_divemode call TFT_temp_divemode ; Update temperature return - -TFT_output4_alternative: ; tasks any round, any mode - btfsc FLAG_TFT_depth + +TFT_output4_alternative: ; tasks any round, any mode + btfsc FLAG_TFT_depth call TFT_depth ; Displays new depth return - - + + ;-------------------------------------------------------------------------------------------------------- divemode_apnoe_tasks: ; 1 sec. Apnoe tasks @@ -305,11 +327,11 @@ clrf apnoe_surface_secs incf apnoe_surface_mins,F -divemode_apnoe_tasks1: - bcf FLAG_active_descent ; Clear flag +divemode_apnoe_tasks1: + bcf FLAG_active_descent ; Clear flag btfsc divemode2 ; Time running? return ; Yes, return - bsf FLAG_active_descent ; Set Flag + bsf FLAG_active_descent ; Set Flag return divemode_apnoe_tasks2: @@ -337,7 +359,7 @@ call subU16 ; sub_c = sub_a - sub_b ; apnoe_max_pressure neg_flag=1 ; max_pressure<=apnoe_max_pressure -> neg_flag=0 - btfss neg_flag + btfss neg_flag return ;apnoe_max_pressure threshold (every two seconds) call set_reset_safety_stop ; Set flags for safety stop and/or reset safety stop @@ -369,7 +391,7 @@ ; Check for a gas change goto check_gas_change ; Checks if a better gas should be selected (by user) and return... - + calc_deko_divemode2: btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode return @@ -377,23 +399,23 @@ btfsc FLAG_ccr_mode ; In CCR mode? rcall calc_deko_divemode_sensor ; do sensor data acquisition if applicable by OSTC model - btfsc FLAG_pscr_mode ; In PSCR mode? - rcall calc_deko_divemode_sensor ; do sensor data acquisition if applicable by OSTC model - + btfsc FLAG_pscr_mode ; In PSCR mode? + rcall calc_deko_divemode_sensor ; do sensor data acquisition if applicable by OSTC model + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine ; check deco engine state and switch between normal and alternative plan calculations ; ; Remark: Any reconfigurations done here do only affect the ascent & deco calculation settings, - ; not the settings for the calculations done on the real tissues. The later ones are only - ; altered in case of a gas change, or in case of a real bailout or switchback to setpoint - ; or sensor, respectively. - ; In case of a gas change or real bailout/switchback, the settings for the deco calculations - ; are also changed to match the settings for the real tissues. This is done on signal through - ; 'divemode_gaschange' and will also leave the deco engine status in state as if having done - ; the alternative plan last. - + ; not the settings for the calculations done on the real tissues. The later ones are only + ; altered in case of a gas change, or in case of a real bailout or switchback to setpoint + ; or sensor, respectively. + ; In case of a gas change or real bailout/switchback, the settings for the deco calculations + ; are also changed to match the settings for the real tissues. This is done on signal through + ; 'divemode_gaschange' and will also leave the deco engine status in state as if having done + ; the alternative plan last. + ; check state of ascent/deco calculations movff char_O_deco_status,lo ; get a working copy of char_O_deco_status into bank common movlw DECO_STATUS_MASK ; load bit mask covering the deco status bits @@ -405,7 +427,7 @@ ; The PLAN bit is set, i.e. an alternative plan was computed in the last cycle, or the deco engine has ; been restarted because of a gas change etc. --> Reconfigure to normal plan for next computation cycle. - + ; reset flags for special calculations bcf lo,DECO_PLAN_FLAG ; clear flag for alternative plan bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation @@ -428,75 +450,67 @@ btfsc is_bailout ; YES - check if a real bailout situation is present bra calc_deko_divemode2e ; YES - OC gases have been set by bailout action then, start normal plan movff active_gas,WREG ; NO - switch back to loop calculation: get current (diluent) gas, ... - call deco_setup_cc_diluents ; ... set up deco calculations in CCR/pSCR mode with diluents, - bra calc_deko_divemode2e ; ... and start in normal plan mode + call deco_setup_cc_diluents ; ... set up deco calculations in CCR/pSCR mode with diluents, + bra calc_deko_divemode2e ; ... and start in normal plan mode ; The PLAN bit was cleared, i.e. a normal plan was computed in the last cycle. For the next ; computation cycle the mode may be switched to alternative plan, or stay in normal mode... - + calc_deko_divemode2b: bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation (for safety only) btfsc is_bailout ; check if a real bailout situation is present bra calc_deko_divemode2c ; YES - stay in normal plan mode and preclude delayed ascent calculation movff char_I_extra_time,hi ; NO - get the delayed ascent setting - tstfsz hi ; check if delayed ascent calculation is enabled - bsf lo,DECO_ASCENT_FLAG ; YES - set flag for delayed ascent calculation - tstfsz hi ; check if delayed ascent calculation is enabled (again) - bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan + tstfsz hi ; check if delayed ascent calculation is enabled + bsf lo,DECO_ASCENT_FLAG ; YES - set flag for delayed ascent calculation + tstfsz hi ; check if delayed ascent calculation is enabled (again) + bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan ; check if a gas needs calculation shall be done calc_deko_divemode2c: bsf lo,DECO_VOLUME_FLAG ; set gas needs calculation flag (may be cleared again next) - TSTOSS opt_calc_asc_gasvolume ; check if gas needs calculation is enabled + TSTOSS opt_calc_asc_gasvolume ; check if gas needs calculation is enabled bcf lo,DECO_VOLUME_FLAG ; NO - reset flag again movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface - TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is enabled (again) + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is enabled (again) bra calc_deko_divemode2e ; NO - no volume calculation, no simulated bailout plan in no case - + ; check if conditions are met to calculate a bailout plan btfsc is_bailout ; check if a real bailout situation is present bra calc_deko_divemode2e ; YES - normal plan already does bailout (OC) calculation "for real" btfss lo,DECO_MODE_LOOP_FLAG ; NO - have loop mode calculation been done during the normal plan? bra calc_deko_divemode2e ; NO - when not in loop mode, no simulated bailout to be done bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan - movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface - call get_first_gas_to_WREG ; get first OC gas, ... + movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface + call get_first_gas_to_WREG ; get first OC gas, ... call deco_setup_oc_gases ; ... set up deco calculations in OC mode with OC gases, ;bra calc_deko_divemode2e ; ... and start in alternative plan mode calc_deko_divemode2e: - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H + clrf TMR5L + clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H call deco_calc_hauptroutine ; calc_tissue - banksel common - - ; Check if deco stops are necessary ? - movff char_O_first_deco_depth,wait_temp ; copy ceiling to temp register - tstfsz wait_temp ; Ceiling<0m? - bra calc_deko_divemode3 ; Yes! + banksel common - btfsc decostop_active ; Already in nodeco mode ? - bsf FLAG_TFT_display_ndl_mask ; No, Clear deco data, display nostop time - bcf decostop_active ; clear flag (again) - - ; Copy for profile recording - clrf decodata+0 - movff char_O_nullzeit,decodata+1 ; NDL - - bsf FLAG_TFT_display_ndl ; display no deco limit + ; Check if deco stops are necessary + movff char_O_first_deco_depth,WREG; get ceiling + tstfsz WREG ; ceiling < 0m (aka in deco) ? + bra calc_deko_divemode3 ; YES + ; NO - within NDL + btfsc decostop_active ; already in no deco mode ? + bsf FLAG_TFT_display_ndl_mask ; NO - clear deco data, display NDL time + bsf FLAG_TFT_display_ndl ; display NDL time + bcf decostop_active ; clear flag (again) return calc_deko_divemode3: - btfss decostop_active ; Already in deco mode ? - bsf FLAG_TFT_display_deko_mask ; No, clear nostop time, display decodata - bsf decostop_active ; Set flag (again) - - ; Copy for profile recording - movff char_O_first_deco_depth,decodata+0 ; ceiling - movff char_O_first_deco_time,decodata+1 ; length of first stop in minutes - bsf FLAG_TFT_display_deko ; display decodata - bsf FLAG_TFT_display_tts ; display TTS + ; YES - in deco + btfss decostop_active ; already in deco mode ? + bsf FLAG_TFT_display_deko_mask ; NO - clear NDL time, display deco data + bsf FLAG_TFT_display_deko ; display deco data + bsf FLAG_TFT_display_tts ; display TTS + bsf decostop_active ; set flag (again) return ; -------------------------------------------------------------------------------------- @@ -504,48 +518,50 @@ global calc_deko_divemode_sensor calc_deko_divemode_sensor: ; sensor acquisition code - btfss s8_digital ; check if we have digital interface to the sensors - bra calc_deko_divemode_sensor_analog ; NO - use analog interface - btfss new_s8_data_available ; YES - check if a new data frame was received - bra calc_deko_divemode_sensor_common ; NO - use old values - call compute_mvolts_for_all_sensors ; YES - compute mV values from digital data - bra calc_deko_divemode_sensor_common + btfss s8_digital ; check if we have a digital interface to the sensors + bra calc_deko_divemode_sensor_analog ; NO - check if we have an analog interface + btfss new_s8_data_available ; YES - check if a new data frame was received + bra calc_deko_divemode_sensor_common ; NO - use old values -- TODO: add timeout for no new data + call compute_mvolts_for_all_sensors ; YES - compute mV values from digital data + bra calc_deko_divemode_sensor_common calc_deko_divemode_sensor_analog: - call get_analog_inputs ; TODO: abort when OSTC model does not have analog inputs + btfss analog_o2_input ; do we have an analog input? + return ; NO - return + call get_analog_inputs ; YES - get the analog voltages and continue with the common part calc_deko_divemode_sensor_common: ; Check for each sensor if it is calibrated and if its mv value is within min_mv and max_mv limits. - ; If ok: compute o2_ppo2_sensorX := o2_mv_sensorX * opt_x_sX / 1000. - ; If not ok: reset o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before. + ; If ok: compute o2_ppo2_sensorX := o2_mv_sensorX * opt_x_sX / 1000 + ; If not ok: reset o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before ; Check min_mv of sensor 1 - btfss sensor1_calibrated_ok ; check if sensor is usable at all - bra check_sensor_1_fail ; NO - handle it as failed - movff o2_mv_sensor1+0, sub_a+0 ; load sensor mV value + btfss sensor1_calibrated_ok ; check if sensor is usable at all + bra check_sensor_1_fail ; NO - handle it as failed + movff o2_mv_sensor1+0, sub_a+0 ; load sensor mV value movff o2_mv_sensor1+1, sub_a+1 - movlw LOW min_mv ; load minimum mV value + movlw LOW min_mv ; load minimum mV value movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv - btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv - bra check_sensor_1_fail ; YES - declare sensor as failed - ; Check max_mv of sensor 1 NO - continue with next check + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_1_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 1 ; NO - continue with next check movff o2_mv_sensor1+0, sub_a+0 movff o2_mv_sensor1+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv - btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv - bra check_sensor_1_fail ; NO - declare sensor as failed - ; Check HUD data, if available YES - continue with next check - btfss hud_connection_ok ; check if there is a HUD connected - bra check_sensor_1_ok ; NO - all checks done then and positive - btfss sensor1_active ; YES - check HUD report on sensor - bra check_sensor_1_fail ; HUD reports a fail + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv + bra check_sensor_1_fail ; NO - declare sensor as failed + ; Check HUD data, if available ; YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_1_ok ; NO - all checks done then and positive + btfss sensor1_active ; YES - check HUD report on sensor + bra check_sensor_1_fail ; HUD reports a fail check_sensor_1_ok: ; o2_ppo2_sensor1 := o2_mv_sensor1:2 * opt_x_s1:2 / 1000 @@ -554,46 +570,46 @@ movff opt_x_s1+0,xB+0 movff opt_x_s1+1,xB+1 rcall compute_ppo2_helper - movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar - bra check_sensor_2 ; continue with next sensor + movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar + bra check_sensor_2 ; continue with next sensor check_sensor_1_fail: clrf WREG - movff WREG,o2_ppo2_sensor1 ; set ppO2 reading to zero - btfss use_O2_sensor1 ; check if sensor was in use before - bra check_sensor_1_fail_1 ; NO - no new news then - call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met + movff WREG,o2_ppo2_sensor1 ; set ppO2 reading to zero + btfss use_O2_sensor1 ; check if sensor was in use before + bra check_sensor_1_fail_1 ; NO - no new news then + call check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met check_sensor_1_fail_1: - bcf use_O2_sensor1 ; revoke sensor from usage - ;bra check_sensor_2 ; continue with next sensor + bcf use_O2_sensor1 ; revoke sensor from usage + ;bra check_sensor_2 ; continue with next sensor -check_sensor_2: ; Check min_mv of sensor 2 - btfss sensor2_calibrated_ok ; check if sensor is usable at all - bra check_sensor_2_fail ; NO - handle it as failed - movff o2_mv_sensor2+0, sub_a+0 ; load sensor mV value +check_sensor_2: ; Check min_mv of sensor 2 + btfss sensor2_calibrated_ok ; check if sensor is usable at all + bra check_sensor_2_fail ; NO - handle it as failed + movff o2_mv_sensor2+0, sub_a+0 ; load sensor mV value movff o2_mv_sensor2+1, sub_a+1 - movlw LOW min_mv ; load minimum mV value + movlw LOW min_mv ; load minimum mV value movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv - btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv - bra check_sensor_2_fail ; YES - declare sensor as failed - ; Check max_mv of sensor 2 NO - continue with next check + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_2_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 2 ; NO - continue with next check movff o2_mv_sensor2+0, sub_a+0 movff o2_mv_sensor2+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv - btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv - bra check_sensor_2_fail ; NO - declare sensor as failed - ; Check HUD data, if available YES - continue with next check - btfss hud_connection_ok ; check if there is a HUD connected - bra check_sensor_2_ok ; NO - all checks done then and positive - btfss sensor2_active ; YES - check HUD report on sensor - bra check_sensor_2_fail ; HUD reports a fail + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv + bra check_sensor_2_fail ; NO - declare sensor as failed + ; Check HUD data, if available ; YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_2_ok ; NO - all checks done then and positive + btfss sensor2_active ; YES - check HUD report on sensor + bra check_sensor_2_fail ; HUD reports a fail check_sensor_2_ok: ; o2_ppo2_sensor2 := o2_mv_sensor2:2 * opt_x_s2:2 / 1000 @@ -602,46 +618,46 @@ movff opt_x_s2+0,xB+0 movff opt_x_s2+1,xB+1 rcall compute_ppo2_helper - movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar - bra check_sensor_3 ; continue with next sensor + movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar + bra check_sensor_3 ; continue with next sensor check_sensor_2_fail: clrf WREG - movff WREG,o2_ppo2_sensor2 ; set ppO2 reading to zero - btfss use_O2_sensor2 ; check if sensor was in use before - bra check_sensor_2_fail_1 ; NO - no new news then - call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met + movff WREG,o2_ppo2_sensor2 ; set ppO2 reading to zero + btfss use_O2_sensor2 ; check if sensor was in use before + bra check_sensor_2_fail_1 ; NO - no new news then + call check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met check_sensor_2_fail_1: - bcf use_O2_sensor2 ; revoke sensor from usage - ;bra check_sensor_3 ; continue with next sensor + bcf use_O2_sensor2 ; revoke sensor from usage + ;bra check_sensor_3 ; continue with next sensor -check_sensor_3: ; Check min_mv of sensor 2 - btfss sensor3_calibrated_ok ; check if sensor is usable at all - bra check_sensor_3_fail ; NO - handle it as failed - movff o2_mv_sensor3+0, sub_a+0 ; load sensor mV value +check_sensor_3: ; Check min_mv of sensor 2 + btfss sensor3_calibrated_ok ; check if sensor is usable at all + bra check_sensor_3_fail ; NO - handle it as failed + movff o2_mv_sensor3+0, sub_a+0 ; load sensor mV value movff o2_mv_sensor3+1, sub_a+1 - movlw LOW min_mv ; load minimum mV value + movlw LOW min_mv ; load minimum mV value movwf sub_b+0 - movlw HIGH min_mv + movlw HIGH min_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv - btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv - bra check_sensor_3_fail ; YES - declare sensor as failed - ; Check max_mv of sensor 2 NO - continue with next check + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_3_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 2 ; NO - continue with next check movff o2_mv_sensor3+0, sub_a+0 movff o2_mv_sensor3+1, sub_a+1 - movlw LOW max_mv + movlw LOW max_mv movwf sub_b+0 - movlw HIGH max_mv + movlw HIGH max_mv movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv - btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv - bra check_sensor_3_fail ; NO - declare sensor as failed - ; Check HUD data, if available YES - continue with next check - btfss hud_connection_ok ; check if there is a HUD connected - bra check_sensor_3_ok ; NO - all checks done then and positive - btfss sensor3_active ; YES - check HUD report on sensor - bra check_sensor_3_fail ; HUD reports a fail + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv + bra check_sensor_3_fail ; NO - declare sensor as failed + ; Check HUD data, if available ; YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_3_ok ; NO - all checks done then and positive + btfss sensor3_active ; YES - check HUD report on sensor + bra check_sensor_3_fail ; HUD reports a fail check_sensor_3_ok: ; o2_ppo2_sensor3 := o2_mv_sensor3:2 * opt_x_s1:2 / 1000 @@ -650,420 +666,423 @@ movff opt_x_s3+0,xB+0 movff opt_x_s3+1,xB+1 rcall compute_ppo2_helper - movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar - bra calc_deko_divemode_sensor1 ; continue with calculating sensor average + movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar + bra calc_deko_divemode_sensor1 ; continue with calculating sensor average check_sensor_3_fail: clrf WREG - movff WREG,o2_ppo2_sensor3 ; set ppO2 reading to zero - btfss use_O2_sensor3 ; check if sensor was in use before - bra check_sensor_3_fail_1 ; NO - no new news then - call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met + movff WREG,o2_ppo2_sensor3 ; set ppO2 reading to zero + btfss use_O2_sensor3 ; check if sensor was in use before + bra check_sensor_3_fail_1 ; NO - no new news then + call check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met check_sensor_3_fail_1: - bcf use_O2_sensor3 ; revoke sensor from usage - ;bra calc_deko_divemode_sensor1 ; continue with calculating sensor average - -calc_deko_divemode_sensor1: ; calculate sensor average + bcf use_O2_sensor3 ; revoke sensor from usage + ;bra calc_deko_divemode_sensor1 ; continue with calculating sensor average + +calc_deko_divemode_sensor1: ; calculate sensor average ; exit here if not in divemode btfss divemode return ; compute sensor_setpoint := average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true - ; sum up sensor values (in xA:2) and active sensors in (xB:2) - clrf xB+0 - clrf xB+1 - clrf xA+0 - clrf xA+1 - btfss use_O2_sensor1 ; Sensor1 active? - bra divemode_setup_sensor_values2 ; No - movf o2_ppo2_sensor1,W - addwf xA+0 - movlw .0 - addwfc xA+1 ; Add into xA:2 - incf xB+0,F ; Add a sensor + ; sum up sensor values (in xA:2) and active sensors in (xB:2) + clrf xB+0 + clrf xB+1 + clrf xA+0 + clrf xA+1 + btfss use_O2_sensor1 ; Sensor1 active? + bra divemode_setup_sensor_values2 ; No + movf o2_ppo2_sensor1,W + addwf xA+0 + movlw .0 + addwfc xA+1 ; Add into xA:2 + incf xB+0,F ; Add a sensor divemode_setup_sensor_values2: - btfss use_O2_sensor2 ; Sensor2 active? - bra divemode_setup_sensor_values3 ; No - movf o2_ppo2_sensor2,W - addwf xA+0 - movlw .0 - addwfc xA+1 ; Add into xA:2 - incf xB+0,F ; Add a sensor + btfss use_O2_sensor2 ; Sensor2 active? + bra divemode_setup_sensor_values3 ; No + movf o2_ppo2_sensor2,W + addwf xA+0 + movlw .0 + addwfc xA+1 ; Add into xA:2 + incf xB+0,F ; Add a sensor divemode_setup_sensor_values3: - btfss use_O2_sensor3 ; Sensor3 active? - bra divemode_setup_sensor_values4 ; No - movf o2_ppo2_sensor3,W - addwf xA+0 - movlw .0 - addwfc xA+1 ; Add into xA:2 - incf xB+0,F ; Add a sensor + btfss use_O2_sensor3 ; Sensor3 active? + bra divemode_setup_sensor_values4 ; No + movf o2_ppo2_sensor3,W + addwf xA+0 + movlw .0 + addwfc xA+1 ; Add into xA:2 + incf xB+0,F ; Add a sensor ; Divide sum of sensor values by number of active sensors found. divemode_setup_sensor_values4: - call div16x16 ; xA/xB=xC with xA+0 as remainder - movff xC+0,sensor_setpoint ; copy result - + call div16x16 ; xA/xB=xC with xA+0 as remainder + movff xC+0,sensor_setpoint ; copy result + ; set default value for pSCR mode: 0 = let p2_deco.c compute the ppO2 based on current dil gas and depth ; will be overwritten later in case we are in sensor mode and have at least one usable sensor - clrf WREG ; preload a zero - btfsc FLAG_pscr_mode ; check if we are in pSCR mode - movff WREG,char_I_const_ppO2 ; YES - write 0 to char_I_const_ppo2, - ; it will be overwritten if we have a usable sensor reading - - btfsc is_bailout ; check if we are in bailout - bra calc_deko_divemode_sensor2 ; YES - no sensor data transfer to char_I_const_ppO2 in this case - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz calc_deko_divemode_sensor2 ; not in sensor mode - no transfer of sensor data to char_I_const_ppO2 - tstfsz xB+0 ; check if we have found at least one usable sensor - bra calc_deko_divemode_sensor1a ; YES - we have at least one usable sensor - bsf setpoint_fallback ; NO - we have NO usable sensors -> initiate fallback - btfss FLAG_ccr_mode ; check if we are in CCR mode - bra calc_deko_divemode_sensor2 ; NO - continue with voting logic flags + clrf WREG ; preload a zero + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + movff WREG,char_I_const_ppO2 ; YES - write 0 to char_I_const_ppo2, + ; it will be overwritten if we have a usable sensor reading + + btfsc is_bailout ; check if we are in bailout + bra calc_deko_divemode_sensor2 ; YES - no sensor data transfer to char_I_const_ppO2 in this case + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz calc_deko_divemode_sensor2 ; not in sensor mode - no transfer of sensor data to char_I_const_ppO2 + tstfsz xB+0 ; check if we have found at least one usable sensor + bra calc_deko_divemode_sensor1a ; YES - we have at least one usable sensor + bsf setpoint_fallback ; NO - we have NO usable sensors -> initiate fallback + btfss FLAG_ccr_mode ; check if we are in CCR mode + bra calc_deko_divemode_sensor2 ; NO - continue with voting logic flags movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; YES - select fixed setpoint no. 1 for fallback - bra calc_deko_divemode_sensor2 ; done - continue with voting logic flags -calc_deko_divemode_sensor1a: ; we have at least one usable sensor with a value > 0 - bcf setpoint_fallback ; clear fallback condition + bra calc_deko_divemode_sensor2 ; done - continue with voting logic flags +calc_deko_divemode_sensor1a: ; we have at least one usable sensor with a value > 0 + bcf setpoint_fallback ; clear fallback condition movff sensor_setpoint,char_I_const_ppO2 ; transfer average sensor value to p2_deco.c code - ; bra calc_deko_divemode_sensor2 + ;bra calc_deko_divemode_sensor2 calc_deko_divemode_sensor2: - bsf voting_logic_sensor1 - movff o2_ppo2_sensor1,temp1 - rcall check_sensor_voting_helper - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor1 ; No, ignore this sensor + bsf voting_logic_sensor1 + movff o2_ppo2_sensor1,lo + rcall check_sensor_voting_helper + incfsz WREG ; Was WREG = 255? + bcf voting_logic_sensor1 ; No, ignore this sensor - bsf voting_logic_sensor2 - movff o2_ppo2_sensor2,temp1 - rcall check_sensor_voting_helper - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor2 ; No, ignore this sensor + bsf voting_logic_sensor2 + movff o2_ppo2_sensor2,lo + rcall check_sensor_voting_helper + incfsz WREG ; Was WREG=255? + bcf voting_logic_sensor2 ; No, ignore this sensor - bsf voting_logic_sensor3 - movff o2_ppo2_sensor3,temp1 - rcall check_sensor_voting_helper - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor3 ; No, ignore this sensor - + bsf voting_logic_sensor3 + movff o2_ppo2_sensor3,lo + rcall check_sensor_voting_helper + incfsz WREG ; Was WREG=255? + bcf voting_logic_sensor3 ; No, ignore this sensor + ; check if a warning shall be issued on sensor disagreement - btfsc FLAG_ccr_mode ; check if we are in CCR mode - bra check_warn_sensor_1 ; YES - continue with further checks - btfsc FLAG_pscr_mode ; check if we are in pSCR mode - bra check_warn_sensor_1 ; YES - continue with further checks - bra check_warn_sensor_agree ; not in CCR and not in pSCR, so no warning -check_warn_sensor_1: ; we are in CCR or pSCR mode - btfsc is_bailout ; check if we are in bailout - bra check_warn_sensor_agree ; YES - no warning in this case - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz check_warn_sensor_agree ; not in sensor mode - no warning in this case - ; check sensor 1 - btfss sensor1_calibrated_ok ; check if sensor has a valid calibration - bra check_warn_sensor_2 ; NO - sensor can not cause a warning then - btfss use_O2_sensor1 ; YES - check if sensor is in use - bra check_warn_sensor_2 ; NO - sensor can not cause a warning then - btfsc voting_logic_sensor1 ; YES - check if sensor value is within agreement range - bra check_warn_sensor_2 ; YES - continue with next sensor - bcf sensors_agree ; NO - issue a warning + btfsc FLAG_ccr_mode ; check if we are in CCR mode + bra check_warn_sensor_1 ; YES - continue with further checks + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + bra check_warn_sensor_1 ; YES - continue with further checks + bra check_warn_sensor_agree ; not in CCR and not in pSCR, so no warning +check_warn_sensor_1: ; we are in CCR or pSCR mode + btfsc is_bailout ; check if we are in bailout + bra check_warn_sensor_agree ; YES - no warning in this case + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz check_warn_sensor_agree ; not in sensor mode - no warning in this case + ; check sensor 1 + btfss sensor1_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_2 ; NO - sensor can not cause a warning then + btfss use_O2_sensor1 ; YES - check if sensor is in use + bra check_warn_sensor_2 ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor1 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_2 ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning return -check_warn_sensor_2: ; check sensor 2 - btfss sensor2_calibrated_ok ; check if sensor has a valid calibration - bra check_warn_sensor_3 ; NO - sensor can not cause a warning then - btfss use_O2_sensor2 ; YES - check if sensor is in use - bra check_warn_sensor_3 ; NO - sensor can not cause a warning then - btfsc voting_logic_sensor2 ; YES - check if sensor value is within agreement range - bra check_warn_sensor_3 ; YES - continue with next sensor - bcf sensors_agree ; NO - issue a warning +check_warn_sensor_2: ; check sensor 2 + btfss sensor2_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_3 ; NO - sensor can not cause a warning then + btfss use_O2_sensor2 ; YES - check if sensor is in use + bra check_warn_sensor_3 ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor2 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_3 ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning return - -check_warn_sensor_3: ; check sensor 2 - btfss sensor3_calibrated_ok ; check if sensor has a valid calibration - bra check_warn_sensor_agree ; NO - sensor can not cause a warning then - btfss use_O2_sensor3 ; YES - check if sensor is in use - bra check_warn_sensor_agree ; NO - sensor can not cause a warning then - btfsc voting_logic_sensor3 ; YES - check if sensor value is within agreement range - bra check_warn_sensor_agree ; YES - continue with next sensor - bcf sensors_agree ; NO - issue a warning + +check_warn_sensor_3: ; check sensor 2 + btfss sensor3_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_agree ; NO - sensor can not cause a warning then + btfss use_O2_sensor3 ; YES - check if sensor is in use + bra check_warn_sensor_agree ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor3 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_agree ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning return - + check_warn_sensor_agree: bsf sensors_agree return compute_ppo2_helper: - call mult16x16 ;xA:2*xB:2=xC:4 - movlw LOW .1000 + call mult16x16 ; xA:2*xB:2=xC:4 + movlw LOW .1000 movwf xB+0 - movlw HIGH .1000 + movlw HIGH .1000 movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movlw d'1' - addwf xC+0,W ; we are just interessed in the carry flag + addwf xC+0,W ; we are just interested in the carry flag movlw d'0' - addwfc xC+1,W ; we are still just interessed in the carry flag - tstfsz WREG ; ppO2 is higher than 2.55bar? - setf xC+0 ; Yes. - return + addwfc xC+1,W ; we are still just interested in the carry flag + tstfsz WREG ; ppO2 is higher than 2.55bar? + setf xC+0 ; Yes. + return check_sensor_custview_helper: - btfss divemode ; check if we are in divemode - return ; NO - not in dive mode, return - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensors)? - bnz check_sensor_helper_1 ; NO - not using the sensors in the moment - clrf menupos3 ; YES - arm customview 1 (sensor values) - bsf toggle_customview ; and request a customview toggle + btfss divemode ; check if we are in divemode + return ; NO - not in dive mode, return + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensors)? + bnz check_sensor_helper_1 ; NO - not using the sensors in the moment + clrf menupos3 ; YES - arm customview 1 (sensor values) + bsf toggle_customview ; and request a customview toggle check_sensor_helper_1: return - + check_sensor_voting_helper: - movf temp1,W - cpfsgt sensor_setpoint - bra check_sensor_voting_common2 ; temp1sensor_setpoint - movf temp1,W - subwf sensor_setpoint,W - movwf temp1 + movf lo,W + cpfsgt sensor_setpoint + bra check_sensor_voting_common2 ; lo < sensor_setpoint + ; lo > sensor_setpoint + movf lo,W + subwf sensor_setpoint,W + movwf lo check_sensor_voting_common1: - movlw sensor_voting_logic_threshold ; Threshold in 0.01 bar - cpfsgt temp1 - retlw .255 ; Within range - retlw .0 ; Out of range + movlw sensor_voting_logic_threshold ; Threshold in 0.01 bar + cpfsgt lo + retlw .255 ; Within range + retlw .0 ; Out of range check_sensor_voting_common2: - ; temp1 neg_flag=1 - ; rel_pressure<=max_pressure -> neg_flag=0 - btfss neg_flag + SAFE_2BYTE_COPY rel_pressure, sub_b + call subU16 ; sub_c = sub_a - sub_b + ; max_pressure neg_flag=1 + ; rel_pressure<=max_pressure -> neg_flag=0 + btfss neg_flag return - ; max_pressure neg_flag=1 - ; T<=minimum_temperature -> neg_flag=0 - btfsc neg_flag + SAFE_2BYTE_COPY temperature,sub_b + call sub16 ; sub_c = sub_a - sub_b + ; minimum_temperature neg_flag=1 + ; T<=minimum_temperature -> neg_flag=0 + btfsc neg_flag return - ; minimum_temperature>=T + ; minimum_temperature >= T movff sub_b+0,minimum_temperature+0 movff sub_b+1,minimum_temperature+1 return @@ -1131,20 +1152,20 @@ bra set_dive_modes3 ; Yes! set_dive_modes0: - movlw LOW start_dive_threshold + movlw LOW start_dive_threshold movwf sub_a+0 ; dive_treshold is in cm - movlw HIGH start_dive_threshold + movlw HIGH start_dive_threshold movwf sub_a+1 ; dive_treshold is in cm set_dive_modes1: - SAFE_2BYTE_COPY rel_pressure, sub_b + SAFE_2BYTE_COPY rel_pressure, sub_b call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - bra set_dive_modes2 ; too shallow (rel_pressure this is a real dive -> Use start_dive_threshold or ascend - movlw HIGH high_altitude_dive_threshold + movlw LOW high_altitude_dive_threshold + movwf sub_a+0 + movlw HIGH high_altitude_dive_threshold movwf sub_a+1 - movlw LOW high_altitude_dive_threshold - movwf sub_a+0 bra set_dive_modes1 set_powersafe: - movlw color_code_battery_low+1; [%] - cpfslt batt_percent + movlw color_code_battery_low+1; [%] + cpfslt batt_percent return movlw d'7' ; Type of Alarm (Battery Low) movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - movlw .0 - movff WREG,opt_brightness ; Set Brightness to ECO + bsf event_occured ; set event flag + movlw .0 + movff WREG,opt_brightness ; Set Brightness to ECO return ; return calc_average_depth: @@ -1184,10 +1205,10 @@ rcall reset_average1 ; Reset the resettable average depth ; 1. Add new 2xdepth to the Sum of depths registers - SAFE_2BYTE_COPY rel_pressure, xB ; Buffer... - bcf STATUS,C - rlcf xB+0,F - rlcf xB+1,F ; x2 + SAFE_2BYTE_COPY rel_pressure,xB ; Buffer... + bcf STATUS,C + rlcf xB+0,F + rlcf xB+1,F ; x2 movf xB+0,w addwf average_depth_hold+0,F @@ -1195,7 +1216,7 @@ addwfc average_depth_hold+1,F movlw d'0' addwfc average_depth_hold+2,F - addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar + addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar ; Do the same for the _total registers (Non-Resettable) movf xB+0,w @@ -1204,7 +1225,7 @@ addwfc average_depth_hold_total+1,F movlw d'0' addwfc average_depth_hold_total+2,F - addwfc average_depth_hold_total+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar + addwfc average_depth_hold_total+3,F; Will work up to 9999mbar*60*60*24=863913600mbar ; 2. Compute Average Depth on base of average_divesecs:2 movff average_divesecs+0,xB+0 @@ -1214,21 +1235,21 @@ movff average_depth_hold+2,xC+2 movff average_depth_hold+3,xC+3 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,avg_rel_pressure+0 movff xC+1,avg_rel_pressure+1 - btfss divemode2 ; displayed divetime is running? - return ; No (e.g. too shallow) + btfss divemode2 ; displayed divetime is running? + return ; No (e.g. too shallow) ; 3. Compute Total Average Depth on base of total_divetime_seconds:2 movff total_divetime_seconds+0,xB+0 - movff total_divetime_seconds+1,xB+1 ; Copy + movff total_divetime_seconds+1,xB+1 ; Copy movff average_depth_hold_total+0,xC+0 movff average_depth_hold_total+1,xC+1 movff average_depth_hold_total+2,xC+2 movff average_depth_hold_total+3,xC+3 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,avg_rel_pressure_total+0 movff xC+1,avg_rel_pressure_total+1 return @@ -1245,53 +1266,52 @@ return test_switches_divemode: ; checks switches in divemode - btfsc divemode_menu ; Divemode menu shown? - bra test_switches_divemode_menu ; Yes, use menu processor + btfsc divemode_menu ; Divemode menu shown? + bra test_switches_divemode_menu ; Yes, use menu processor btfsc switch_left - ; bra test_switches_divemode2 ; Enter button pressed, check if we need to do something - goto menuview_toggle ; Menu or Simulator tasks; and return... + ;bra test_switches_divemode2 ; Enter button pressed, check if we need to do something + goto menuview_toggle ; Menu or Simulator tasks; and return... btfss switch_right - return ; No button press - tstfsz menupos2 ; any option shown? - bra test_switches_divemode1 ; Yes, do option tasks - bsf toggle_customview ; No, toggle custom view - return + return ; No button press + tstfsz menupos2 ; any option shown? + bra test_switches_divemode1 ; Yes, do option tasks + bsf toggle_customview ; No, toggle custom view + return test_switches_divemode_menu: btfsc switch_left - bra test_switches_divemode_menu2 ; Move cursor + bra test_switches_divemode_menu2; Move cursor btfsc switch_right - bra test_switches_divemode_menu3 ; Enter submenu or do something - return ; No button press + bra test_switches_divemode_menu3; Enter submenu or do something + return ; No button press test_switches_divemode_menu1: - clrf menupos + clrf menupos1 test_switches_divemode_menu2: - incf menupos,F - incf menupos4,W ; menupos4+1 -> WREG - cpfslt menupos ; >menupos4 (Set in menu_processor.asm)? - bra test_switches_divemode_menu1; > Yes, set to 1 - call TFT_divemode_menu_cursor ; Update the cursor - bcf switch_left - movlw divemode_menu_timeout ; Reload timeout - movwf timeout_counter3 ; timeout for divemode menu - return + incf menupos1,F + incf menupos4,W ; menupos4+1 -> WREG + cpfslt menupos1 ; > menupos4 (Set in menu_processor.asm)? + bra test_switches_divemode_menu1; > Yes, set to 1 + call TFT_divemode_menu_cursor ; Update the cursor + bcf switch_left + movlw divemode_menu_timeout ; Reload timeout + movwf timeout_counter2 ; timeout for divemode menu + return -test_switches_divemode_menu3: ; Enter submenu or do something - bcf switch_right -; decf menupos,F ; menu_processor needs 0-5... - extern do_line_menu - goto do_line_menu ; Warning! Trashes STKPTR and returns to diveloop_loop4: +test_switches_divemode_menu3: ; Enter submenu or do something + bcf switch_right +; decf menupos1,F ; menu_processor needs 0-5... + goto do_line_menu ; Warning! Trashes STKPTR and returns to diveloop_loop4: test_switches_divemode1: bcf switch_right - movlw divemode_menuview_timeout - movwf timeout_counter3 ; Reload timeout - movff menupos2,WREG ; menupos2 holds number of customview/divemode menu function + movlw divemode_menuview_timeout + movwf timeout_counter2 ; Reload timeout + movff menupos2,WREG ; menupos2 holds number of customview/divemode menu function dcfsnz WREG,F - bra divemode_option_gaschange ; Switch to the indicated "better gas" + bra divemode_option_gaschange ; Switch to the indicated "better gas" dcfsnz WREG,F - bra divemode_option0 ; Start/Setup Divemode menu + bra divemode_option0 ; Start/Setup Divemode menu dcfsnz WREG,F bra divemode_option1 ; Quit Simulation? dcfsnz WREG,F @@ -1308,89 +1328,95 @@ bra divemode_option7 ; Store heading dcfsnz WREG,F bra divemode_option8 ; Switch to alt. layout - return + return gas_switched_common: - bcf divemode_gaschange ; Clear flag - tstfsz menupos ; menupos=0? - bra gas_switched_common1 ; No - return ; Yes, do not switch gas (there is no Gas #0 !) + bcf divemode_gaschange ; Clear flag + btfss FLAG_back_to_loop ; check if it is a switchback from OC bailout to loop + bra gas_switched_common0 ; NO - continue with checking if selected gas is valid + bcf FLAG_back_to_loop ; YES - clear flag + movff active_diluent,menupos1 ; reload last diluent + bra gas_switched_common1 ; continue with common part +gas_switched_common0: + tstfsz menupos1 ; menupos1=0? + bra gas_switched_common1 ; NO - valid gas + return ; YES - something went wrong, invalid gas, abort gas_switched_common1: - movf menupos,W ; get selected gas into WREG (1-6) + movf menupos1,W ; get selected gas into WREG (1-6) - btfsc FLAG_ccr_mode ; in CCR mode? + btfsc FLAG_ccr_mode ; in CCR mode? bra gas_switched_common2 ; YES - configure diluent or bailout - btfsc FLAG_pscr_mode ; in pSCR mode? + btfsc FLAG_pscr_mode ; in pSCR mode? bra gas_switched_common2 ; YES - configure diluent or bailout - + ; OC rcall setup_gas_registers ; With WREG = Gas 1-6 - rcall deco_setup_oc_gases ; With WREG = Gas 1-6 + rcall deco_setup_oc_gases ; With WREG = Gas 1-6 bra gas_switched_common3 - ; Loop or Bailout + ; loop or bailout gas_switched_common2: - rcall setup_dil_registers ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases - rcall deco_setup_cc_diluents ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases - + rcall setup_dil_registers ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases + rcall deco_setup_cc_diluents ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases + gas_switched_common3: - bsf FLAG_TFT_active_gas_divemode ; Redraw gas/setpoint/diluent - call restart_deco_engine_wo_ceiling ; abort any running deco calculations and restart the deco engine + bsf FLAG_TFT_active_gas_divemode ; Redraw gas/setpoint/diluent + call restart_deco_engine_wo_ceiling ; abort any running deco calculations and restart the deco engine - ; Set flags for profile recording - bsf event_occured ; Set global event byte - btfsc is_bailout ; Choose OC Bailouts (OC Gases) - bsf bailoutgas_event ; Bailout gas change - btfss is_bailout ; Choose OC Bailouts (OC Gases) + ; Set flags for profile recording + bsf event_occured ; set event flag + btfsc is_bailout ; Choose OC Bailouts (OC Gases) + bsf bailoutgas_event ; Bailout gas change + btfss is_bailout ; Choose OC Bailouts (OC Gases) bsf stored_gas_changed ; OC gas change return ; Code to pass all parameters to the C code - global get_first_gas_to_WREG + global get_first_gas_to_WREG get_first_gas_to_WREG: ; Gets first gas (1-5) into WREG - lfsr FSR1,opt_gas_type ; Point to gas types - clrf lo ; start with Gas0 + lfsr FSR1,opt_gas_type ; Point to gas types + clrf lo ; start with Gas0 get_first_gas_to_WREG2: - movf lo,W - movf PLUSW1,W ; Get Type of Gas #lo - sublw .1 ; it is = 1 (First Gas) - bz get_first_gas_to_WREG3 ; Found the first gas! - incf lo,F ; ++ - movlw NUM_GAS+1 - cpfseq lo ; All done? - bra get_first_gas_to_WREG2 ; Not yet + movf lo,W + movf PLUSW1,W ; Get Type of Gas #lo + sublw .1 ; it is = 1 (First Gas) + bz get_first_gas_to_WREG3 ; Found the first gas! + incf lo,F ; ++ + movlw NUM_GAS+1 + cpfseq lo ; All done? + bra get_first_gas_to_WREG2 ; Not yet ; No first gas found, use #1 - movlw .0 - movff WREG,opt_gas_type+0 ; Set Gas1 to First + movlw .0 + movff WREG,opt_gas_type+0 ; Set Gas1 to First incf WREG,W ; 0 -> 1 return get_first_gas_to_WREG3: - movf lo,W ; Put into Wreg + movf lo,W ; Put into Wreg incf WREG,W ; 0-4 -> 1-5 return ; Done - global get_first_dil_to_WREG + global get_first_dil_to_WREG get_first_dil_to_WREG: ; Gets first dil (1-5) into WREG - lfsr FSR1,opt_dil_type ; Point to dil types - clrf lo ; start with Gas0 + lfsr FSR1,opt_dil_type ; Point to dil types + clrf lo ; start with Gas0 get_first_dil_to_WREG2: - movf lo,W - movf PLUSW1,W ; Get Type of Dil #lo - sublw .1 ; it is = 1 (First Dil) - bz get_first_dil_to_WREG3 ; Found the first dil! - incf lo,F ; ++ - movlw NUM_GAS+1 - cpfseq lo ; All done? - bra get_first_dil_to_WREG2 ; Not yet + movf lo,W + movf PLUSW1,W ; Get Type of Dil #lo + sublw .1 ; it is = 1 (First Dil) + bz get_first_dil_to_WREG3 ; Found the first dil! + incf lo,F ; ++ + movlw NUM_GAS+1 + cpfseq lo ; All done? + bra get_first_dil_to_WREG2 ; Not yet ; No first dil found, use #1 - movlw .0 - movff WREG,opt_dil_type+0 ; Set Dil1 to First + movlw .0 + movff WREG,opt_dil_type+0 ; Set Dil1 to First incf WREG,W ; 0 -> 1 return get_first_dil_to_WREG3: - movf lo,W ; Put into Wreg + movf lo,W ; Put into Wreg incf WREG,W ; 0-4 -> 1-5 return ; Done @@ -1398,110 +1424,105 @@ deco_setup_oc_gases: ; with currently breathed gas in WREG (1-5 or 6) movff WREG,char_I_current_gas ; gas to start with when doing the deco calculations - movff opt_gas_He_ratio+0,char_I_deco_He_ratio+0 - movff opt_gas_O2_ratio+0,char_I_deco_O2_ratio+0 - banksel opt_gas_type+0 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+0 ; Gas is deco type? - clrf opt_OC_bail_gas_change+0 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common + banksel opt_gas_type ; opt_gas_type[] and opt_OC_bail_gas_change[] are together in bank common2 + + movff opt_gas_He_ratio+0,char_I_deco_He_ratio+0 + movff opt_gas_O2_ratio+0,char_I_deco_O2_ratio+0 - movff opt_gas_He_ratio+1,char_I_deco_He_ratio+1 - movff opt_gas_O2_ratio+1,char_I_deco_O2_ratio+1 - banksel opt_gas_type+1 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+1 ; Gas is deco type? - clrf opt_OC_bail_gas_change+1 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common + movlw .3 ; 3=Deco + cpfseq opt_gas_type+0 ; Gas is deco type? + clrf opt_OC_bail_gas_change+0 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + + movff opt_gas_He_ratio+1,char_I_deco_He_ratio+1 + movff opt_gas_O2_ratio+1,char_I_deco_O2_ratio+1 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+1 ; Gas is deco type? + clrf opt_OC_bail_gas_change+1 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - movff opt_gas_He_ratio+2,char_I_deco_He_ratio+2 - movff opt_gas_O2_ratio+2,char_I_deco_O2_ratio+2 - banksel opt_gas_type+2 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+2 ; Gas is deco type? - clrf opt_OC_bail_gas_change+2 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common + movff opt_gas_He_ratio+2,char_I_deco_He_ratio+2 + movff opt_gas_O2_ratio+2,char_I_deco_O2_ratio+2 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+2 ; Gas is deco type? + clrf opt_OC_bail_gas_change+2 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - movff opt_gas_He_ratio+3,char_I_deco_He_ratio+3 - movff opt_gas_O2_ratio+3,char_I_deco_O2_ratio+3 - banksel opt_gas_type+3 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+3 ; Gas is deco type? - clrf opt_OC_bail_gas_change+3 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common + movff opt_gas_He_ratio+3,char_I_deco_He_ratio+3 + movff opt_gas_O2_ratio+3,char_I_deco_O2_ratio+3 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+3 ; Gas is deco type? + clrf opt_OC_bail_gas_change+3 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - movff opt_gas_He_ratio+4,char_I_deco_He_ratio+4 - movff opt_gas_O2_ratio+4,char_I_deco_O2_ratio+4 - banksel opt_gas_type+4 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+4 ; Gas is deco type? - clrf opt_OC_bail_gas_change+4 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + movff opt_gas_He_ratio+4,char_I_deco_He_ratio+4 + movff opt_gas_O2_ratio+4,char_I_deco_O2_ratio+4 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+4 ; Gas is deco type? + clrf opt_OC_bail_gas_change+4 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common ; Setup char_I_deco_gas_change array - movff opt_OC_bail_gas_change+0, char_I_deco_gas_change+0 - movff opt_OC_bail_gas_change+1, char_I_deco_gas_change+1 - movff opt_OC_bail_gas_change+2, char_I_deco_gas_change+2 - movff opt_OC_bail_gas_change+3, char_I_deco_gas_change+3 - movff opt_OC_bail_gas_change+4, char_I_deco_gas_change+4 + movff opt_OC_bail_gas_change+0, char_I_deco_gas_change+0 + movff opt_OC_bail_gas_change+1, char_I_deco_gas_change+1 + movff opt_OC_bail_gas_change+2, char_I_deco_gas_change+2 + movff opt_OC_bail_gas_change+3, char_I_deco_gas_change+3 + movff opt_OC_bail_gas_change+4, char_I_deco_gas_change+4 ; switch to oc mode movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status - + return - + global deco_setup_cc_diluents deco_setup_cc_diluents: ; with currently breathed gas in WREG (1-5 or 6) btfsc is_bailout ; check if in bailout condition bra deco_setup_oc_gases ; revert to setting up OC gases in bailout condition - + movff WREG,char_I_current_gas ; gas to start with when doing the deco calculations - movff opt_dil_He_ratio+0,char_I_deco_He_ratio+0 - movff opt_dil_O2_ratio+0,char_I_deco_O2_ratio+0 - movff opt_dil_type+0,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+0 ; Yes, clear char_I_deco_gas_change (Bank safe) + movff opt_dil_He_ratio+0,char_I_deco_He_ratio+0 + movff opt_dil_O2_ratio+0,char_I_deco_O2_ratio+0 + movff opt_dil_type+0,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+0 ; Yes, clear char_I_deco_gas_change (Bank safe) - movff opt_dil_He_ratio+1,char_I_deco_He_ratio+1 - movff opt_dil_O2_ratio+1,char_I_deco_O2_ratio+1 - movff opt_dil_type+1,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+1 ; Yes, clear char_I_dil_change + movff opt_dil_He_ratio+1,char_I_deco_He_ratio+1 + movff opt_dil_O2_ratio+1,char_I_deco_O2_ratio+1 + movff opt_dil_type+1,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+1 ; Yes, clear char_I_dil_change - movff opt_dil_He_ratio+2,char_I_deco_He_ratio+2 - movff opt_dil_O2_ratio+2,char_I_deco_O2_ratio+2 - movff opt_dil_type+2,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+2 ; Yes, clear char_I_dil_change + movff opt_dil_He_ratio+2,char_I_deco_He_ratio+2 + movff opt_dil_O2_ratio+2,char_I_deco_O2_ratio+2 + movff opt_dil_type+2,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+2 ; Yes, clear char_I_dil_change - movff opt_dil_He_ratio+3,char_I_deco_He_ratio+3 - movff opt_dil_O2_ratio+3,char_I_deco_O2_ratio+3 - movff opt_dil_type+3,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+3 ; Yes, clear char_I_dil_change + movff opt_dil_He_ratio+3,char_I_deco_He_ratio+3 + movff opt_dil_O2_ratio+3,char_I_deco_O2_ratio+3 + movff opt_dil_type+3,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+3 ; Yes, clear char_I_dil_change - movff opt_dil_He_ratio+4,char_I_deco_He_ratio+4 - movff opt_dil_O2_ratio+4,char_I_deco_O2_ratio+4 - movff opt_dil_type+4,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+4 ; Yes, clear char_I_dil_change + movff opt_dil_He_ratio+4,char_I_deco_He_ratio+4 + movff opt_dil_O2_ratio+4,char_I_deco_O2_ratio+4 + movff opt_dil_type+4,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+4 ; Yes, clear char_I_dil_change ; Setup char_I_deco_gas_change array - movff char_I_dil_change+0, char_I_deco_gas_change+0 - movff char_I_dil_change+1, char_I_deco_gas_change+1 - movff char_I_dil_change+2, char_I_deco_gas_change+2 - movff char_I_dil_change+3, char_I_deco_gas_change+3 - movff char_I_dil_change+4, char_I_deco_gas_change+4 + movff char_I_dil_change+0, char_I_deco_gas_change+0 + movff char_I_dil_change+1, char_I_deco_gas_change+1 + movff char_I_dil_change+2, char_I_deco_gas_change+2 + movff char_I_dil_change+3, char_I_deco_gas_change+3 + movff char_I_dil_change+4, char_I_deco_gas_change+4 ; switch to CCR / pSCR mode movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common @@ -1510,159 +1531,158 @@ btfsc FLAG_pscr_mode ; check if we are in pSCR mode bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status - + return - global setup_gas_registers -setup_gas_registers: ; with currently breathed gas in WREG (1-5 or 6) - movwf active_gas ; set as current gas + global setup_gas_registers +setup_gas_registers: ; with currently breathed gas in WREG (1-5 or 6) + movwf active_gas ; set as current gas movlw .6 - cpfseq active_gas ; gas = gas6 ? - bra setup_gas_registers_15 ; NO - load gas 1-5 - movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine - movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine - bra setup_gas_registers_com ; continue with common part + cpfseq active_gas ; gas = gas6 ? + bra setup_gas_registers_15 ; NO - load gas 1-5 + movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine + movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine + bra setup_gas_registers_com ; continue with common part setup_gas_registers_15: - decf active_gas,W ; 1-5 -> 0-4 + decf active_gas,W ; 1-5 -> 0-4 lfsr FSR1,opt_gas_O2_ratio+0 - movff PLUSW1,char_I_O2_ratio ; copy gas 1-5 O2 ratio to deco engine + movff PLUSW1,char_I_O2_ratio ; copy gas 1-5 O2 ratio to deco engine lfsr FSR1,opt_gas_He_ratio+0 - movff PLUSW1,char_I_He_ratio ; copy gas 1-5 He ratio to deco engine + movff PLUSW1,char_I_He_ratio ; copy gas 1-5 He ratio to deco engine setup_gas_registers_com: - ;lfsr FSR1,opt_gas_type ; commented out - currently not used anywhere - ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff char_O_main_status,lo ; working copy of char_O_main_status in bank common - bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) - bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag - movff lo,char_O_main_status ; bank safe write-back of char_O_main_status - movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) + ;lfsr FSR1,opt_gas_type ; commented out - currently not used anywhere + ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff char_O_main_status,lo ; working copy of char_O_main_status in bank common + bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) + bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag + movff lo,char_O_main_status ; bank safe write-back of char_O_main_status + movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) return - global setup_dil_registers -setup_dil_registers: ; with currently breathed gas in WREG (1-5 or 6) - btfsc is_bailout ; check if in bailout condition - bra setup_gas_registers ; revert to setting up OC gases in bailout condition - movwf active_gas ; set as current gas - movff WREG,active_diluent ; remember for when switching back from bailout to loop + global setup_dil_registers +setup_dil_registers: ; with currently breathed gas in WREG (1-5 or 6) + btfsc is_bailout ; check if in bailout condition + bra setup_gas_registers ; revert to setting up OC gases in bailout condition + movwf active_gas ; set as current gas + movff WREG,active_diluent ; remember for when switching back from bailout to loop movlw .6 - cpfseq active_gas ; diluent = gas6 ? - bra setup_dil_registers_15 ; NO - load diluent 1-5 - movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine - movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine - bra setup_dil_registers_com ; continue with common part + cpfseq active_gas ; diluent = gas6 ? + bra setup_dil_registers_15 ; NO - load diluent 1-5 + movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine + movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine + bra setup_dil_registers_com ; continue with common part setup_dil_registers_15: - decf active_gas,W ; 1-5 -> 0-4 + decf active_gas,W ; 1-5 -> 0-4 lfsr FSR1,opt_dil_O2_ratio+0 - movff PLUSW1,char_I_O2_ratio ; copy diluent 1-5 O2 ratio to deco engine + movff PLUSW1,char_I_O2_ratio ; copy diluent 1-5 O2 ratio to deco engine lfsr FSR1,opt_dil_He_ratio+0 - movff PLUSW1,char_I_He_ratio ; copy diluent 1-5 He ratio to deco engine + movff PLUSW1,char_I_He_ratio ; copy diluent 1-5 He ratio to deco engine setup_dil_registers_com: - ;lfsr FSR1,opt_dil_type ; commented out - currently not used anywhere - ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Normal (there is no type 3 for diluents) - movff char_O_main_status,lo ; working copy of char_O_main_status in bank common - bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode - bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default - btfsc FLAG_pscr_mode ; check if we are in pSCR mode - bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode - movff lo,char_O_main_status ; bank safe write-back of char_O_main_status - movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) + ;lfsr FSR1,opt_dil_type ; commented out - currently not used anywhere + ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Normal (there is no type 3 for diluents) + movff char_O_main_status,lo ; working copy of char_O_main_status in bank common + bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode + bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode + movff lo,char_O_main_status ; bank safe write-back of char_O_main_status + movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) return -divemode_option_gaschange: ; Switch to the better gas - movff better_gas_number,menupos ; 1-5 - bsf divemode_gaschange ; Change the gas in the dive mode loop... - call menuview_toggle_reset ; Reset to zero (Zero=no menuview) - bcf better_gas_available ; Clear flag immediately +divemode_option_gaschange: ; Switch to the better gas + movff better_gas_number,menupos1 ; 1-5 + bsf divemode_gaschange ; Change the gas in the dive mode loop... + call menuview_toggle_reset ; Reset to zero (Zero=no menuview) + bcf better_gas_available ; Clear flag immediately return -divemode_option0: ; Start/Setup Divemode menu - call TFT_clear_divemode_menu ; Clear menu area - bcf menuview - extern do_main_divemenu +divemode_option0: ; Start/Setup Divemode menu + call TFT_clear_divemode_menu ; Clear menu area + bcf menuview call do_main_divemenu - global divemode_option0_return + global divemode_option0_return divemode_option0_return: -; movlw .1 -; movwf menupos ; Set to first option in divemode menu - call TFT_divemode_menu_cursor; Show the cursor +; movlw .1 +; movwf menupos1 ; Set to first option in divemode menu + call TFT_divemode_menu_cursor ; Show the cursor movlw divemode_menu_timeout - movwf timeout_counter3 ; timeout for divemode menu - bsf divemode_menu ; Set flag - clrf menupos2 ; Clear option counter - goto diveloop_loop4 ; Goto back to diveloop (Menuprocessor trashes STKPTR!) + movwf timeout_counter2 ; timeout for divemode menu + bsf divemode_menu ; Set flag + clrf menupos2 ; Clear option counter + goto diveloop_loop4 ; Goto back to diveloop (menu processor trashes STKPTR!) divemode_option4: - movlw d'58' ; two seconds left - movwf timeout_counter - movlw apnoe_timeout-1 ; apnoe timeout [min] + movlw d'58' ; two seconds left + movwf timeout_counter1+0 + movlw apnoe_timeout-1 ; apnoe timeout [min] movwf apnoe_timeout_counter - btfss simulatormode_active ; in simulator mode? - return ; No -divemode_option1: ; Quit simulation mode + btfss simulatormode_active ; in simulator mode? + return ; No +divemode_option1: ; Quit simulation mode banksel isr_backup - movlw low .1000 - movwf sim_pressure+0 - movlw high .1000 - movwf sim_pressure+1 ; Set to 0m -> End of Dive - banksel common - call menuview_toggle_reset ; Reset to zero (Zero=no menuview) - - btfss FLAG_apnoe_mode ; In Apnoe mode? - return ; No - movlw d'58' ; two seconds left - movwf timeout_counter - movlw apnoe_timeout-1 ; apnoe timeout [min] + movlw LOW .1000 + movwf sim_pressure+0 + movlw HIGH .1000 + movwf sim_pressure+1 ; Set to 0m -> End of Dive + banksel common + call menuview_toggle_reset ; Reset to zero (Zero=no menuview) + + btfss FLAG_apnoe_mode ; In Apnoe mode? + return ; No + movlw d'58' ; two seconds left + movwf timeout_counter1+0 + movlw apnoe_timeout-1 ; apnoe timeout [min] movwf apnoe_timeout_counter return -divemode_option3: ; minus 1m +divemode_option3: ; minus 1m banksel isr_backup movlw d'100' subwf sim_pressure+0 movlw .0 subwfb sim_pressure+1 rcall divemode_simulator_check_limits - banksel common + banksel common return -divemode_option2: ; plus 1m +divemode_option2: ; plus 1m banksel isr_backup movlw d'100' addwf sim_pressure+0 movlw .0 addwfc sim_pressure+1 rcall divemode_simulator_check_limits - banksel common + banksel common return divemode_option5: - call menuview_toggle_reset ; Reset to zero (Zero=no menuview) - bsf reset_average_depth ; Set Flag - return + call menuview_toggle_reset ; Reset to zero (Zero=no menuview) + bsf reset_average_depth ; Set Flag + return divemode_option6: - bcf divemode2 ; Stop divetime - movlw .5 - addwf divemins+0,F - movlw .0 - addwfc divemins+1,F ; Add 5 mins - movlw LOW (.5*.60) - addwf average_divesecs+0,F - movlw HIGH (.5*.60) - addwfc average_divesecs+1,F ; Add 5*60 seconds - movlw LOW (.5*.60) - addwf total_divetime_seconds+0,F - movlw HIGH (.5*.60) - addwfc total_divetime_seconds+1,F ; Add 5*60 seconds + bcf divemode2 ; Stop divetime + movlw .5 + addwf divemins+0,F + movlw .0 + addwfc divemins+1,F ; Add 5 mins + movlw LOW (.5*.60) + addwf average_divesecs+0,F + movlw HIGH (.5*.60) + addwfc average_divesecs+1,F ; Add 5*60 seconds + movlw LOW (.5*.60) + addwf total_divetime_seconds+0,F + movlw HIGH (.5*.60) + addwfc total_divetime_seconds+1,F ; Add 5*60 seconds - ; 1. Add 300xdepth to the Sum of depths registers - SAFE_2BYTE_COPY rel_pressure, xB ; Buffer... - movlw LOW (.5*.60) - movwf xA+0 - movlw HIGH (.5*.60) - movwf xA+1 - call mult16x16 ; xA*xB=xC + ; 1. Add 300xdepth to the sum of depths registers + SAFE_2BYTE_COPY rel_pressure, xB ; Buffer... + movlw LOW (.5*.60) + movwf xA+0 + movlw HIGH (.5*.60) + movwf xA+1 + call mult16x16 ; xA*xB=xC movf xC+0,w addwf average_depth_hold+0,F @@ -1670,7 +1690,7 @@ addwfc average_depth_hold+1,F movf xC+2,w addwfc average_depth_hold+2,F - movf xC+3,w + movf xC+3,w addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar ; Do the same for the _total registers (Non-Resettable) @@ -1685,50 +1705,50 @@ movlw .5 ; + 5 minutes movff WREG,char_I_sim_advance_time; copy to mailbox - bsf divemode2 ; continue divetime + bsf divemode2 ; continue divetime call restart_deco_engine - goto menuview_toggle_reset ; and return... + goto menuview_toggle_reset ; and return... divemode_option7: - ; Store heading for compass view - movff compass_heading_shown+0,compass_bearing+0 - movff compass_heading_shown+1,compass_bearing+1 - bsf compass_bearing_set ; set flag - goto menuview_toggle_reset ; Done and return... - + ; Store heading for compass view + movff compass_heading_shown+0,compass_bearing+0 + movff compass_heading_shown+1,compass_bearing+1 + bsf compass_bearing_set ; set flag + goto menuview_toggle_reset ; Done and return... + divemode_option8: - bsf alternative_divelayout ; Set flag for mode - bsf FLAG_TFT_divemode_mask_alt ; Set flag for mask - movlw .1 - movwf menupos3 ; For the customviews... - call TFT_ClearScreen ; Clear screen - goto menuview_toggle_reset ; Done and return... + bsf alternative_divelayout ; Set flag for mode + bsf FLAG_TFT_divemode_mask_alt ; Set flag for mask + movlw .1 + movwf menupos3 ; For the customviews... + call TFT_ClearScreen ; Clear screen + goto menuview_toggle_reset ; Done and return... divemode_simulator_check_limits: ; Check limits (150m and 0m) - movlw LOW d'16000' ; Compare to 16bar=16000mbar (150m). - subwf sim_pressure+0,W - movlw HIGH d'16000' - subwfb sim_pressure+1,W - bnc divemode_simulator_check_limits2 ; No-carry = borrow = not deeper + movlw LOW d'16000' ; Compare to 16bar=16000mbar (150m). + subwf sim_pressure+0,W + movlw HIGH d'16000' + subwfb sim_pressure+1,W + bnc divemode_simulator_check_limits2 ; No-carry = borrow = not deeper ; Too deep, limit to 150m - movlw LOW d'16000' + movlw LOW d'16000' movwf sim_pressure+0 - movlw HIGH d'16000' + movlw HIGH d'16000' movwf sim_pressure+1 return divemode_simulator_check_limits2: - movlw LOW d'1000' ; Compare to 1bar == 0m == 1000 mbar. - subwf sim_pressure+0,W - movlw HIGH d'1000' - subwfb sim_pressure+1,W - btfsc STATUS,C ; No-carry = borrow = not deeper. - return ; Deeper than 0m == Ok. + movlw LOW d'1000' ; Compare to 1bar == 0m == 1000 mbar. + subwf sim_pressure+0,W + movlw HIGH d'1000' + subwfb sim_pressure+1,W + btfsc STATUS,C ; No-carry = borrow = not deeper. + return ; Deeper than 0m == Ok. ; Too shallow, limit to 0m - movlw LOW d'1000' + movlw LOW d'1000' movwf sim_pressure+0 - movlw HIGH d'1000' + movlw HIGH d'1000' movwf sim_pressure+1 return @@ -1737,277 +1757,286 @@ ; ; Output: better_gas_available, better_gas_number ; -check_gas_change: ; Checks if a better gas should be selected (by user) - bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode - clrf better_gas_number ; Clear better gas register +check_gas_change: ; Checks if a better gas should be selected (by user) + bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode + clrf WREG + movff WREG,better_gas_number ; clear better gas register - SAFE_2BYTE_COPY rel_pressure,xA + SAFE_2BYTE_COPY rel_pressure,xA movlw d'100' movwf xB+0 clrf xB+1 - call div16x16 ; compute depth in full m -> result in xC+0 + call div16x16 ; compute depth in full m -> result in xC+0 - btfsc FLAG_pscr_mode ; In PSCR mode... - bra check_gas_change2 ; Yes, check for diluents - btfss FLAG_ccr_mode ; In CCR mode... - bra check_gas_change_OC_bail; No, check for OC or bailout + btfsc FLAG_pscr_mode ; in PSCR mode? + bra check_gas_change2 ; YES - check for diluents + btfss FLAG_ccr_mode ; in CCR mode? + bra check_gas_change_OC_bail ; NO - check for OC check_gas_change2: - btfsc is_bailout ; Bailout? - bra check_gas_change_OC_bail; Yes, check for OC or bailout + btfsc is_bailout ; in bailout? + bra check_gas_change_OC_bail ; YES - check for OC - ; Check Diluents - movlw .0 - rcall check_dil_common ; With Gas 0-4 in WREG - movlw .1 - rcall check_dil_common ; With Gas 0-4 in WREG - movlw .2 - rcall check_dil_common ; With Gas 0-4 in WREG - movlw .3 - rcall check_dil_common ; With Gas 0-4 in WREG - movlw .4 - rcall check_dil_common ; With Gas 0-4 in WREG - bra check_gas_change_exit + ; Check Diluents + movlw .0 + rcall check_dil_common ; With Gas 0-4 in WREG + movlw .1 + rcall check_dil_common ; With Gas 0-4 in WREG + movlw .2 + rcall check_dil_common ; With Gas 0-4 in WREG + movlw .3 + rcall check_dil_common ; With Gas 0-4 in WREG + movlw .4 + rcall check_dil_common ; With Gas 0-4 in WREG + bra check_gas_change_exit check_gas_change_OC_bail: - movlw .0 - rcall check_gas_common ; With Gas 0-4 in WREG - movlw .1 - rcall check_gas_common ; With Gas 0-4 in WREG - movlw .2 - rcall check_gas_common ; With Gas 0-4 in WREG - movlw .3 - rcall check_gas_common ; With Gas 0-4 in WREG - movlw .4 - rcall check_gas_common ; With Gas 0-4 in WREG -; bra check_gas_change_exit + movlw .0 + rcall check_gas_common ; With Gas 0-4 in WREG + movlw .1 + rcall check_gas_common ; With Gas 0-4 in WREG + movlw .2 + rcall check_gas_common ; With Gas 0-4 in WREG + movlw .3 + rcall check_gas_common ; With Gas 0-4 in WREG + movlw .4 + rcall check_gas_common ; With Gas 0-4 in WREG + ;bra check_gas_change_exit check_gas_change_exit: - btfss better_gas_available ; Is a better gas available - bcf blinking_better_gas ; No, Clear blinking flag - btfss better_gas_available ; Is a better gas available - clrf better_gas_number ; No, Clear better_gas_number (For gaslist display) - bsf FLAG_TFT_active_gas_divemode; Redraw gas/setpoint/diluent - return + bsf FLAG_TFT_active_gas_divemode; redraw gas/setpoint/diluent + btfss better_gas_available ; is a better gas available? + bcf blinking_better_gas ; NO - clear blinking flag + btfsc better_gas_available ; is a better gas available? + return ; YES + clrf WREG ; NO - clear better_gas_number (for gaslist display) + movff WREG,better_gas_number + return -check_gas_common: ; With Gas 0-4 in WREG - btfsc better_gas_available ; Better Gas already found? - return ; Yes, return - lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco - btfss PLUSW1,0 ; Test for Bit0 and 1 -> type=3 -> Deco - return ; No - btfss PLUSW1,1 ; Test for Bit0 and 1 -> type=3 -> Deco - return ; No - incf WREG,W ; 1-5 - cpfseq active_gas ; is this gas current gas? - bra check_gas_common2 ; No - return ; Yes, skip test for active gas +check_gas_common: ; With Gas 0-4 in WREG + btfsc better_gas_available ; Better Gas already found? + return ; Yes, return + lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco + btfss PLUSW1,0 ; Test for Bit0 and 1 -> type=3 -> Deco + return ; No + btfss PLUSW1,1 ; Test for Bit0 and 1 -> type=3 -> Deco + return ; No + incf WREG,W ; 1-5 + cpfseq active_gas ; is this gas current gas? + bra check_gas_common2 ; No + return ; Yes, skip test for active gas check_gas_common2: - decf WREG,W ; 0-4 - movwf hi ; Save tested gas 0-4 - lfsr FSR1,opt_OC_bail_gas_change - movff PLUSW1,lo ; Change depth into lo + decf WREG,W ; 0-4 + movwf hi ; Save tested gas 0-4 + lfsr FSR1,opt_OC_bail_gas_change + movff PLUSW1,lo ; Change depth into lo movlw minimum_change_depth - cpfsgt lo ; Change depth>minimum_change_depth? - return ; No, Change depth not deep enough, skip! - movf xC+0,W ; load depth in m into WREG - cpfsgt lo ; gas_change_depth < current depth? - bra check_gas_common3 ; No, check if we are within the better_gas_window_pos window - incf hi,W ; 1-5 - movwf better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available + cpfsgt lo ; Change depth>minimum_change_depth? + return ; No, Change depth not deep enough, skip! + movf xC+0,W ; load depth in m into WREG + cpfsgt lo ; gas_change_depth < current depth? + bra check_gas_common3 ; No, check if we are within the better_gas_window_pos window + incf hi,W ; 1-5 + movff WREG,better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available movlw better_gas_window_neg - subwf lo,W ; Change depth-better_gas_window_neg - cpfslt xC+0 ; current depthChange depth+better_gas_window_pos? - bra check_gas_common4 ; Ok, now check the better gas ppO2Change depth+better_gas_window_pos? + bra check_gas_common4 ; Ok, now check the better gas ppO2 65536, ppO2>6,55bar? - return ; Done. - ; Check if ppO2>3,30bar - btfsc xC+1,7 - return ; Done. + ; Check very high ppO2 manually + tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? + return ; Done. + ; Check if ppO2>3,30bar + btfsc xC+1,7 + return ; Done. - ; Check for low ppo2 + ; Check for low ppo2 movff xC+0,sub_b+0 movff xC+1,sub_b+1 - movff char_I_ppO2_min,WREG - mullw d'100' ; char_I_ppO2_min*100 + movff char_I_ppO2_min,WREG + mullw d'100' ; char_I_ppO2_min*100 movff PRODL,sub_a+0 movff PRODH,sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - return ; Done (Too low). + return ; Done (Too low). ;check if we are within our warning thresholds! movff xC+0,sub_a+0 movff xC+1,sub_a+1 movff char_I_ppO2_max_deco,WREG ; ppO2 max for MOD calculation and color coding in divemode - addlw .1 ; e.g. >1.60 - mullw d'100' ; char_I_ppO2_max*100 + addlw .1 ; e.g. >1.60 + mullw d'100' ; char_I_ppO2_max*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode - return ; Done. + bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode + return ; Done. + -check_dil_common: ; With Dil 0-4 in WREG - btfsc better_gas_available ; Better Diluent already found? - return ; Yes, return - lfsr FSR1,opt_dil_type ; 0=Disabled, 1=First, 2=Normal - tstfsz PLUSW1 ; =0? - bra check_dil_common1 ; No - return ; Yes, skip inactive diluents for test +check_dil_common: ; With Dil 0-4 in WREG + btfsc better_gas_available ; Better Diluent already found? + return ; Yes, return + lfsr FSR1,opt_dil_type ; 0=Disabled, 1=First, 2=Normal + tstfsz PLUSW1 ; =0? + bra check_dil_common1 ; No + return ; Yes, skip inactive diluents for test check_dil_common1: - incf WREG,W ; 1-5 - cpfseq active_gas ; is this the current diluent? - bra check_dil_common2 ; No - return ; Yes, skip test for active diluent + incf WREG,W ; 1-5 + cpfseq active_gas ; is this the current diluent? + bra check_dil_common2 ; No + return ; Yes, skip test for active diluent check_dil_common2: - decf WREG,W ; 0-4 - movwf hi ; Save tested diluent 0-4 - lfsr FSR1,char_I_dil_change - movff PLUSW1,lo ; Change depth into lo + decf WREG,W ; 0-4 + movwf hi ; Save tested diluent 0-4 + lfsr FSR1,char_I_dil_change + movff PLUSW1,lo ; Change depth into lo movlw minimum_change_depth - cpfsgt lo ; Change depth>minimum_change_depth? - return ; No, Change depth not deep enough, skip! - movf xC+0,W ; load depth in m into WREG - cpfsgt lo ; gas_change_depth < current depth? - return ; No, check next gas - incf hi,W ; 1-5 - movwf better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available + cpfsgt lo ; Change depth>minimum_change_depth? + return ; No, Change depth not deep enough, skip! + movf xC+0,W ; load depth in m into WREG + cpfsgt lo ; gas_change_depth < current depth? + return ; No, check next gas + incf hi,W ; 1-5 + movff WREG,better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available movlw better_gas_window_neg - subwf lo,W ; Change depth-better_gas_window_neg - cpfslt xC+0 ; current depth result in xC+0 - ; Check SP2 - btfsc sp2_switched ; =1: This setpoint has been autoselected already - bra check_dive_autosp3 ; Skip check - movff char_I_setpoint_change+1,lo ; Get depth in m - tstfsz lo ; =0? - bra check_dive_autosp2a ; No, continue - bra check_dive_autosp3 ; Skip check + call div16x16 ; compute depth in full m -> result in xC+0 + ; Check SP2 + btfsc sp2_switched ; =1: This setpoint has been autoselected already + bra check_dive_autosp3 ; Skip check + movff char_I_setpoint_change+1,lo ; Get depth in m + tstfsz lo ; =0? + bra check_dive_autosp2a ; No, continue + bra check_dive_autosp3 ; Skip check check_dive_autosp2a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp3 ; lower depth, do not switch - ; auto switch to SP2 + decf lo,W ; -1 -> WREG + cpfsgt xC+0 ; Compare with depth + bra check_dive_autosp3 ; lower depth, do not switch + ; auto switch to SP2 movff char_I_setpoint_cbar+1,char_I_const_ppO2 ; Use SetPoint - rcall xmit_sp_set_flag - bsf sp2_switched ; Set flag + rcall xmit_sp_set_flag + bsf sp2_switched ; Set flag check_dive_autosp3: - ; Check SP3 - btfsc sp3_switched ;=1: This setpoint has been autoselected already - bra check_dive_autosp4 ; Skip check - movff char_I_setpoint_change+2,lo ; Get depth in m - tstfsz lo ; =0? - bra check_dive_autosp3a ; No, continue - bra check_dive_autosp4 ; Skip check + ; Check SP3 + btfsc sp3_switched ;=1: This setpoint has been autoselected already + bra check_dive_autosp4 ; Skip check + movff char_I_setpoint_change+2,lo ; Get depth in m + tstfsz lo ; =0? + bra check_dive_autosp3a ; No, continue + bra check_dive_autosp4 ; Skip check check_dive_autosp3a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp4 ; lower depth, do not switch - ; auto switch to SP3 + decf lo,W ; -1 -> WREG + cpfsgt xC+0 ; Compare with depth + bra check_dive_autosp4 ; lower depth, do not switch + ; auto switch to SP3 movff char_I_setpoint_cbar+2,char_I_const_ppO2 ; Use SetPoint - rcall xmit_sp_set_flag - bsf sp3_switched ; Set flag + rcall xmit_sp_set_flag + bsf sp3_switched ; Set flag check_dive_autosp4: - ; Check SP4 - btfsc sp4_switched ;=1: This setpoint has been autoselected already - bra check_dive_autosp5 ; Skip check - movff char_I_setpoint_change+3,lo ; Get depth in m - tstfsz lo ; =0? - bra check_dive_autosp4a ; No, continue - bra check_dive_autosp5 ; Skip check + ; Check SP4 + btfsc sp4_switched ;=1: This setpoint has been autoselected already + bra check_dive_autosp5 ; Skip check + movff char_I_setpoint_change+3,lo ; Get depth in m + tstfsz lo ; =0? + bra check_dive_autosp4a ; No, continue + bra check_dive_autosp5 ; Skip check check_dive_autosp4a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp5 ; lower depth, do not switch - ; auto switch to SP4 - movff char_I_setpoint_cbar+3,char_I_const_ppO2 ; Use SetPoint - rcall xmit_sp_set_flag - bsf sp4_switched ; Set flag + decf lo,W ; -1 -> WREG + cpfsgt xC+0 ; Compare with depth + bra check_dive_autosp5 ; lower depth, do not switch + ; auto switch to SP4 + movff char_I_setpoint_cbar+3,char_I_const_ppO2 ; Use SetPoint + rcall xmit_sp_set_flag + bsf sp4_switched ; Set flag check_dive_autosp5: - ; Check SP5 - btfsc sp5_switched ;=1: This setpoint has been autoselected already - bra check_dive_autosp6 ; Skip check - movff char_I_setpoint_change+4,lo ; Get depth in m - tstfsz lo ; =0? - bra check_dive_autosp5a ; No, continue - bra check_dive_autosp6 ; Skip check + ; Check SP5 + btfsc sp5_switched ;=1: This setpoint has been autoselected already + bra check_dive_autosp6 ; Skip check + movff char_I_setpoint_change+4,lo ; Get depth in m + tstfsz lo ; =0? + bra check_dive_autosp5a ; No, continue + bra check_dive_autosp6 ; Skip check check_dive_autosp5a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp6 ; lower depth, do not switch - ; auto switch to SP5 - movff char_I_setpoint_cbar+4,char_I_const_ppO2 ; Use SetPoint - rcall xmit_sp_set_flag - bsf sp5_switched ; Set flag + decf lo,W ; -1 -> WREG + cpfsgt xC+0 ; Compare with depth + bra check_dive_autosp6 ; lower depth, do not switch + ; auto switch to SP5 + movff char_I_setpoint_cbar+4,char_I_const_ppO2 ; Use SetPoint + rcall xmit_sp_set_flag + bsf sp5_switched ; Set flag check_dive_autosp6: - return + return xmit_sp_set_flag: - movff char_I_const_ppO2,WREG - call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics - bsf setpoint_changed ; Set flag (For profile) - bsf event_occured ; Set global event byte - return + movff char_I_const_ppO2,WREG + call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + bsf setpoint_changed ; Set flag (for profile) + bsf event_occured ; Set event flag + return + +set_logbook_marker: + bcf FLAG_set_marker ; clear flag + movlw d'6' ; set type of Alarm (manual marker) + movwf AlarmType ; copy to Alarm Register + bsf event_occured ; Set event flag + return ;============================================================================= ; Setup everything to enter divemode. ; dive_boot_oc: - rcall get_first_gas_to_WREG ; Gets first gas (1-5) into WREG - rcall setup_gas_registers ; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5) - rcall deco_setup_oc_gases ; set-up of gas list for deco calculations (with WREG = gas 1-5) - return + rcall get_first_gas_to_WREG ; Gets first gas (1-5) into WREG + rcall setup_gas_registers ; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5) + rcall deco_setup_oc_gases ; set-up of gas list for deco calculations (with WREG = gas 1-5) + return dive_boot_cc: - bcf is_bailout ; =1: Bailout - bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - bcf blinking_setpoint ; Reset blinking SP flag + bcf is_bailout ; =1: Bailout + bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure + bcf blinking_setpoint ; Reset blinking SP flag ; revoke sensors from usage if they do not have a valid calibration bsf use_O2_sensor1 @@ -2019,363 +2048,337 @@ bcf use_O2_sensor2 btfss sensor3_calibrated_ok bcf use_O2_sensor3 - + ; In pSCR mode, only settings 0 (calculated ppO2) and 1 (ppO2 from sensors) are defined. ; In case we still have 3 (auto SP) selected out of previous ccr mode, we reset to 0. btfss FLAG_pscr_mode bra dive_boot_cc_1 - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .2 ; opt_ccr_mode = 1 (Auto SP)? - bnz dive_boot_cc_1 + movff opt_ccr_mode,WREG ; =0: Fixed SP (CCR) / calculated SP (pSCR), =1: Sensor, =2: Auto SP + sublw .2 ; opt_ccr_mode = 1 (Auto SP)? + bnz dive_boot_cc_1 movlw .0 movff WREG,opt_ccr_mode dive_boot_cc_1: - bsf setpoint_changed ; Set flag (For profile) - bcf sp2_switched ; =1: This setpoint has been autoselected already - bcf sp3_switched ; =1: This setpoint has been autoselected already - bcf sp4_switched ; =1: This setpoint has been autoselected already - bcf sp5_switched ; =1: This setpoint has been autoselected already + bsf setpoint_changed ; set flag (for profile) + bcf sp2_switched ; =1: This setpoint has been auto-selected already + bcf sp3_switched ; =1: This setpoint has been auto-selected already + bcf sp4_switched ; =1: This setpoint has been auto-selected already + bcf sp5_switched ; =1: This setpoint has been auto-selected already - rcall get_first_dil_to_WREG ; get first gas (1-5) into WREG - rcall setup_dil_registers ; set-up of gas parameters for currently breathed gas (with WREG = current gas 1-5) - rcall deco_setup_cc_diluents ; set-up of gas list for deco calculations (with WREG = current gas 1-5) + rcall get_first_dil_to_WREG ; get first gas (1-5) into WREG + rcall setup_dil_registers ; set-up of gas parameters for currently breathed gas (with WREG = current gas 1-5) + rcall deco_setup_cc_diluents ; set-up of gas list for deco calculations (with WREG = current gas 1-5) ; Start with SP1 (CCR) or 0 (pSCR) as default. ; If in sensor mode, this value will be overwritten by calc_deko_divemode_sensor - clrf WREG ; preload WREG with setpoint value 0 for pSCR calculated - btfss FLAG_ccr_mode ; are we in CCR mode? - bra dive_boot_cc_2 ; NO - keep preloaded value - movff char_I_setpoint_cbar+0,WREG ; YES - get value of setpoint 1 + clrf WREG ; preload WREG with setpoint value 0 for pSCR calculated + btfss FLAG_ccr_mode ; are we in CCR mode? + bra dive_boot_cc_2 ; NO - keep preloaded value + movff char_I_setpoint_cbar+0,WREG ; YES - get value of setpoint 1 dive_boot_cc_2: - movff WREG,char_I_const_ppO2 ; write setpoint to deco engine - call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics - goto calc_deko_divemode_sensor ; read & process sensor data (and return) + movff WREG,char_I_const_ppO2 ; write setpoint to deco engine + call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics + goto calc_deko_divemode_sensor ; read & process sensor data (and return) diveloop_boot: call restart_set_modes_and_flags - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass + call I2C_sleep_accelerometer ; stop accelerometer + call I2C_sleep_compass ; stop compass clrf WREG - movff WREG,max_pressure+0 ; clear some variables + movff WREG,max_pressure+0 ; clear some variables movff WREG,max_pressure+1 - + ; init in invalid data state - clrf WREG ; set WREG to 0 - bsf WREG,int_invalid_flag ; set invalid flag - bsf WREG,int_is_zero ; set zero flag - movff WREG,int_O_tank_pres_need+1 ; Set flags for tank pressure needs = 0 before p2_deco.c - movff WREG,int_O_tank_pres_need+3 ; can do it. If this is not done here and the gas needs - movff WREG,int_O_tank_pres_need+5 ; custom view is shown before p2_deco.c completes the first - movff WREG,int_O_tank_pres_need+7 ; deco calculation, some rubbish numbers from last dive of - movff WREG,int_O_tank_pres_need+9 ; simulation may be shown - + clrf WREG ; set WREG to 0 + bsf WREG,int_invalid_flag ; set invalid flag + bsf WREG,int_is_zero ; set zero flag + movff WREG,int_O_tank_pres_need+1 ; Set flags for tank pressure needs = 0 before p2_deco.c + movff WREG,int_O_tank_pres_need+3 ; can do it. If this is not done here and the gas needs + movff WREG,int_O_tank_pres_need+5 ; custom view is shown before p2_deco.c completes the first + movff WREG,int_O_tank_pres_need+7 ; deco calculation, some rubbish numbers from last dive of + movff WREG,int_O_tank_pres_need+9 ; simulation may be shown + ; configure the deco engine: - movff char_O_deco_status,WREG ; bank-safe copy - bsf WREG,DECO_STATUS_0_FLAG ; configure init ... - bsf WREG,DECO_STATUS_1_FLAG ; ... state, - bcf WREG,DECO_PLAN_FLAG ; normal plan mode, - bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), - bcf WREG,DECO_VOLUME_FLAG ; disable gas volume calculation, and - bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation - movff WREG,char_O_deco_status ; bank-safe copy back - + movff char_O_deco_status,WREG ; bank-safe copy + bsf WREG,DECO_STATUS_0_FLAG ; configure init ... + bsf WREG,DECO_STATUS_1_FLAG ; ... state, + bcf WREG,DECO_PLAN_FLAG ; normal plan mode, + bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), + bcf WREG,DECO_VOLUME_FLAG ; disable gas volume calculation, and + bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff WREG,char_O_deco_status ; bank-safe copy back + clrf WREG - movff WREG,char_O_main_status ; reset char_O_main_status + movff WREG,char_O_main_status ; reset char_O_main_status movlw deco_distance movff WREG,char_I_deco_distance movff opt_last_stop,char_I_depth_last_deco movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage - - bcf use_agf ; Start with normal GF set - bcf divemode_menu ; clear divemode menu flag - - bcf alternative_divelayout ; Start with default layout - - bcf blinking_depth_prev ; clear flag for blinking depth ## NEW BUGFIX - bcf blinking_depth_warning ; clear flag for blinking depth ## NEW BUGFIX - bcf blinking_depth_toggle ; clear flag for blinking depth ## NEW BUGFIX - + + bcf use_agf ; Start with normal GF set + bcf divemode_menu ; clear divemode menu flag + + bcf alternative_divelayout ; Start with default layout + + bcf blinking_depth_prev ; clear flag for blinking depth + bcf blinking_depth_warning ; clear flag for blinking depth + bcf blinking_depth_toggle ; clear flag for blinking depth + movlw d'1' movwf apnoe_max_pressure+0 clrf apnoe_max_pressure+1 ; clrf apnoe_surface_mins -; clrf apnoe_surface_secs +; clrf apnoe_surface_secs clrf apnoe_mins clrf divemins+0 clrf divemins+1 - + ; Copy date and time for logbook - movff year,start_year - movff month,start_month - movff day,start_day - movff hours,start_hours - movff mins,start_mins - - movff int_O_CNS_fraction+0,CNS_start+0 ; save CNS value at beginning of dive - movff int_O_CNS_fraction+1,WREG ; get high byte to WREG - bcf WREG,int_warning_flag ; clear warning flag bit - movff WREG,CNS_start+1 ; move high byte on - movff int_O_gradient_factor+0,GF_start ; save GF value at beginning of dive (only lower byte used for value) + movff year,start_year + movff month,start_month + movff day,start_day + movff hours,start_hours + movff mins,start_mins + + movff int_O_CNS_fraction+0,CNS_start+0 ; save CNS value at beginning of dive + movff int_O_CNS_fraction+1,WREG ; get high byte to WREG + bcf WREG,int_warning_flag ; clear warning flag bit + movff WREG,CNS_start+1 ; move high byte on + movff int_O_gradient_factor+0,GF_start ; save GF value at beginning of dive (only lower byte used for value) - bcf no_more_divesecs ; =1: do no longer show seconds in divemode + bcf no_more_divesecs ; =1: do no longer show seconds in divemode bcf divemode_menu_active - clrf menupos - clrf menupos2 ; Reset to zero (Zero=no premenu or simulator task) - bsf sensors_agree ; init of sensors disagree warning system - - btfsc FLAG_ccr_mode - bra diveloop_boot_cc - btfsc FLAG_pscr_mode - bra diveloop_boot_cc - rcall dive_boot_oc - bra diveloop_boot_cont + clrf menupos1 + clrf menupos2 ; Reset to zero (Zero=no premenu or simulator task) + bsf sensors_agree ; init of sensors disagree warning system + + btfsc FLAG_ccr_mode + bra diveloop_boot_cc + btfsc FLAG_pscr_mode + bra diveloop_boot_cc + rcall dive_boot_oc + bra diveloop_boot_cont diveloop_boot_cc: - rcall dive_boot_cc - + rcall dive_boot_cc + diveloop_boot_cont: - ; Copy opt_dil_types into backup (For "lost gas" feature) - movff opt_dil_type+0,opt_dil_type_backup+0 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+1,opt_dil_type_backup+1 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+2,opt_dil_type_backup+2 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+3,opt_dil_type_backup+3 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+4,opt_dil_type_backup+4 ; 0=Disabled, 1=First, 2=Normal - ; Copy opt_gas_types into backup (For "lost gas" feature) - movff opt_gas_type+0,opt_gas_type_backup+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+1,opt_gas_type_backup+1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+2,opt_gas_type_backup+2 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+3,opt_gas_type_backup+3 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+4,opt_gas_type_backup+4 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - ; Also copy change depths into backup (For "lost gas" feature) - movff char_I_dil_change+0,opt_dil_change_backup+0 ; Gas change depths Diluents - movff char_I_dil_change+1,opt_dil_change_backup+1 ; Gas change depths Diluents - movff char_I_dil_change+2,opt_dil_change_backup+2 ; Gas change depths Diluents - movff char_I_dil_change+3,opt_dil_change_backup+3 ; Gas change depths Diluents - movff char_I_dil_change+4,opt_dil_change_backup+4 ; Gas change depths Diluents - ; Also copy change depths into backup (For "lost gas" feature) - movff opt_OC_bail_gas_change+0,opt_OC_bail_gas_change_backup+0; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+1,opt_OC_bail_gas_change_backup+1; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+2,opt_OC_bail_gas_change_backup+2; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+3,opt_OC_bail_gas_change_backup+3; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+4,opt_OC_bail_gas_change_backup+4; Gas change depths OC/Bailout + ; Copy opt_dil_types into backup (For "lost gas" feature) + movff opt_dil_type+0,opt_dil_type_backup+0 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+1,opt_dil_type_backup+1 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+2,opt_dil_type_backup+2 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+3,opt_dil_type_backup+3 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+4,opt_dil_type_backup+4 ; 0=Disabled, 1=First, 2=Normal + ; Copy opt_gas_types into backup (For "lost gas" feature) + movff opt_gas_type+0,opt_gas_type_backup+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+1,opt_gas_type_backup+1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+2,opt_gas_type_backup+2 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+3,opt_gas_type_backup+3 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+4,opt_gas_type_backup+4 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + ; Also copy change depths into backup (For "lost gas" feature) + movff char_I_dil_change+0,opt_dil_change_backup+0 ; Gas change depths Diluents + movff char_I_dil_change+1,opt_dil_change_backup+1 ; Gas change depths Diluents + movff char_I_dil_change+2,opt_dil_change_backup+2 ; Gas change depths Diluents + movff char_I_dil_change+3,opt_dil_change_backup+3 ; Gas change depths Diluents + movff char_I_dil_change+4,opt_dil_change_backup+4 ; Gas change depths Diluents + ; Also copy change depths into backup (For "lost gas" feature) + movff opt_OC_bail_gas_change+0,opt_OC_bail_gas_change_backup+0; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+1,opt_OC_bail_gas_change_backup+1; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+2,opt_OC_bail_gas_change_backup+2; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+3,opt_OC_bail_gas_change_backup+3; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+4,opt_OC_bail_gas_change_backup+4; Gas change depths OC/Bailout - clrf better_gas_number ; Clear better gas register + clrf WREG + movff WREG,better_gas_number ; clear better gas register bcf show_safety_stop ; =1: Show the safety stop clrf safety_stop_countdown ; Clear count-down - clrf samplesecs + clrf samplesecs clrf apnoe_timeout_counter ; timeout in minutes - clrf timeout_counter ; takes care of the timeout (Low byte) - clrf timeout_counter2 ; takes care of the timeout (High byte) + clrf timeout_counter1+0 ; takes care of the timeout (low byte) + clrf timeout_counter1+1 ; takes care of the timeout (high byte) clrf AlarmType ; Clear all alarms bcf event_occured ; clear flag clrf average_depth_hold_total+0 clrf average_depth_hold_total+1 clrf average_depth_hold_total+2 clrf average_depth_hold_total+3 ; Clear Non-Resettable Average - rcall reset_average1 ; Reset the resettable average depth - bcf decostop_active - bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode + rcall reset_average1 ; Reset the resettable average depth + bcf decostop_active + bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode call ghostwriter_short_header ; Write short header with divenumber into profile memory - btfsc simulatormode_active - bra diveloop_boot_1 - ; Normal mode = Surface pressure is the pressure 30mn before dive. + btfsc simulatormode_active + bra diveloop_boot_1 + ; Normal mode = Surface pressure is the pressure 30mn before dive. SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ;copy surfacepressure to deco routine SAFE_2BYTE_COPY last_surfpressure_30min, last_surfpressure ;copy surfacepressure to last_surfpressure for correct depth - bra diveloop_boot_2 + bra diveloop_boot_2 diveloop_boot_1: - ; Simulator mode: Surface pressure is 1bar. - movlw LOW .1000 - movff WREG,int_I_pres_surface+0 ; LOW copy surfacepressure to deco routine - movlw HIGH .1000 - movff WREG,int_I_pres_surface+1 ; HIGH copy surfacepressure to deco routine + ; Simulator mode: Surface pressure is 1bar. + movlw LOW .1000 + movff WREG,int_I_pres_surface+0 ; LOW copy surface pressure to deco routine + movlw HIGH .1000 + movff WREG,int_I_pres_surface+1 ; HIGH copy surface pressure to deco routine diveloop_boot_2: - SAFE_2BYTE_COPY temperature,minimum_temperature ; Reset Min-Temp registers + SAFE_2BYTE_COPY temperature,minimum_temperature ; Reset Min-Temp registers -; Init profile recording parameters - movff samplingrate,samplesecs_value ; to avoid EEPROM access in the ISR - movlw div_temperature - movwf divisor_temperature ; load divisors for profile storage - movlw div_deco - movwf divisor_deco - movlw div_gf - movwf divisor_gf - movlw div_ppo2_sensors - movwf divisor_ppo2_sensors - movlw div_decoplan - movwf divisor_decoplan - movlw div_cns - movwf divisor_cns - movlw div_tank - movwf divisor_tank + call init_recording_params ; set up all the divisors - btfss FLAG_apnoe_mode ; In Apnoe mode? - bra divemode_boot1 - - ; Overwrite some parameters in Apnoe mode.... - movlw samplingrate_apnoe - movwf samplesecs_value ; to avoid EEPROM access in the ISR - -divemode_boot1: - bsf ccr_diluent_setup ; For CCR mode (Required to have better gas working) - btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - bra divemode_boot2 - btfsc FLAG_pscr_mode - bra divemode_boot2 - - ; in OC Mode, disable ppO2 logging - movlw .0 - movwf divisor_ppo2_sensors - - bcf ccr_diluent_setup ; For OC mode (Required to have better gas working) + bsf ccr_diluent_setup ; For CCR mode (Required to have better gas working) + btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bra divemode_boot2 + btfsc FLAG_pscr_mode + bra divemode_boot2 + bcf ccr_diluent_setup ; For OC mode (Required to have better gas working) divemode_boot2: - bcf LEDg - bcf LEDr + bcf LEDg ; switch off green LED / release reset to RX circuitry + bcf LEDr ; switch off red LED bcf realdive - btfss simulatormode_active ; do not disable in simulator mode! - call disable_rs232 ; Disable RS232 - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - call enable_rs232 ; Also sets to speed_normal ... - ; Reset divetime seconds - movlw .2 ; Start at 2seconds - movwf total_divetime_seconds+0 - clrf total_divetime_seconds+1 - movwf divesecs - movwf apnoe_secs - bsf divemode2 ; displayed divetime is running (Divetime starts HERE) - return ; Done with divemode boot + btfss simulatormode_active ; do not disable in simulator mode! + call disable_rs232 ; Disable RS232 + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + call enable_rs232 ; Also sets to speed_normal ... + ; Reset divetime seconds + movlw .2 ; Start at 2seconds + movwf total_divetime_seconds+0 + clrf total_divetime_seconds+1 + movwf divesecs + movwf apnoe_secs + bsf divemode2 ; displayed divetime is running (Divetime starts HERE) + return ; Done with divemode boot + divemode_check_for_warnings: - movlw .1 ; One warning at a time in alt. layout mode - btfss alternative_divelayout - movlw .2 ; Two warnings at a time in default layout mode - cpfsgt warning_counter ; only one (or two) warnings active? - bra divemode_check_for_warnings1 ; Yes, update every second + movlw .1 ; One warning at a time in alt. layout mode + btfss alternative_divelayout + movlw .2 ; Two warnings at a time in default layout mode + cpfsgt warning_counter ; only one (or two) warnings active? + bra divemode_check_for_warnings1 ; Yes, update every second - btfss secs,0 ; Every two seconds... - return - btfss secs,1 ; Every four seconds... - return + btfss secs,0 ; Every two seconds... + return + btfss secs,1 ; Every four seconds... + return divemode_check_for_warnings1: - bcf warning_active ; Clear flag - clrf warning_counter ; Clear counter + bcf warning_active ; Clear flag + clrf warning_counter ; Clear counter ; warnings sorted by severity, highest severity first - - ; Warnings for all modes - call check_warn_battery ; Check if the battery level should be displayed/warned - call check_divetimeout ; Not actually a warning. Check and show the divemode timeout + + ; Warnings for all modes + call check_warn_battery ; Check if the battery level should be displayed/warned + call check_divetimeout ; Not actually a warning. Check and show the divemode timeout + + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + bra divemode_check_for_warnings2 + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + bra divemode_check_for_warnings2 - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - bra divemode_check_for_warnings2 - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - bra divemode_check_for_warnings2 + ; Warnings only in deco modes + rcall check_ppO2 ; check ppO2 and displays warning, if required - ; Warnings only in deco modes - rcall check_ppO2 ; check ppO2 and displays warning, if required - - btfss sensors_agree ; are the sensor values within the threshold range? - rcall check_warn_sensors_disagree ; NO - further evaluate - btfsc sensors_agree ; are the sensor values within the threshold range? - bcf sensor_warning ; YES - revoke memorized sensor warning + btfss sensors_agree ; are the sensor values within the threshold range? + rcall check_warn_sensors_disagree ; NO - further evaluate + btfsc sensors_agree ; are the sensor values within the threshold range? + bcf sensor_warning ; YES - revoke memorized sensor warning + + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,outside_warning_lock ; are we outside of the ZH-L16 model? + rcall warn_outside ; YES - movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings - btfsc WREG,outside_warning_lock ; are we outside of the ZH-L16 model? - rcall warn_outside ; YES - - rcall check_IBCD ; check for IBCD attention or warning - - btfsc decostop_active ; In deco mode? - rcall check_and_store_gf_violation ; Yes, sets warnings, if required + rcall check_IBCD ; check for IBCD attention or warning + + btfsc decostop_active ; In deco mode? + rcall check_and_store_gf_violation; Yes, sets warnings, if required + + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? + rcall warn_mbubbles ; YES + + rcall check_cns_violation ; Check CNS value and display it, if required - movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings - btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? - rcall warn_mbubbles ; YES - - rcall check_cns_violation ; Check CNS value and display it, if required - - ;btfsc decostop_active ; In deco mode? - rcall check_gas_needs ; show gas needs warning if any gas need is > threshold + ;btfsc decostop_active ; In deco mode? + rcall check_gas_needs ; show gas needs warning if any gas need is > threshold + + rcall check_eod_cns_violation ; Check CNS values for end-of-dive and display warning, if required + + call TFT_display_ftts ; Show @+x time - rcall check_eod_cns_violation ; Check CNS values for end-of-dive and display warning, if required - - call TFT_display_ftts ; Show @+x time - - btfsc use_agf ; In aGF mode? - rcall warn_agf ; Yes, show a warning for it + btfsc use_agf ; In aGF mode? + rcall warn_agf ; Yes, show a warning for it - btfsc setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - rcall warn_fallback ; Show the warning - + btfsc setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure + rcall warn_fallback ; Show the warning + divemode_check_for_warnings2: ; Display the warning icon? - btfsc warning_active ; Any warning active? - bsf FLAG_TFT_divemode_warning ; Yes - btfss warning_active ; Any warning active? - bsf FLAG_TFT_divemode_warning_clear ; No, clear warning icon + btfsc warning_active ; Any warning active? + bsf FLAG_TFT_divemode_warning ; Yes + btfss warning_active ; Any warning active? + bsf FLAG_TFT_divemode_warning_clear ; No, clear warning icon ; Setup warning_page number - incf warning_page,F - movf warning_page,W - bcf STATUS,C - btfss alternative_divelayout - rlcf warning_page,W ; *2 (But only in standard layout mode) - cpfsgt warning_counter ; > warning_counter - clrf warning_page ; No, clear - + incf warning_page,F + movf warning_page,W + bcf STATUS,C + btfss alternative_divelayout + rlcf warning_page,W ; *2 (But only in standard layout mode) + cpfsgt warning_counter ; > warning_counter + clrf warning_page ; No, clear + ; Clear both rows of warnings if there is nothing to show at all - tstfsz warning_counter ; any warnings? - bra divemode_check_for_warnings3 ; YES - look if second row needs to be cleared - bsf FLAG_TFT_dive_warning_text_clear ; Set flag + tstfsz warning_counter ; any warnings? + bra divemode_check_for_warnings3 ; YES - look if second row needs to be cleared + bsf FLAG_TFT_dive_warning_text_clear ; Set flag return divemode_check_for_warnings3: - - + + ; Clear 2nd row of warnings if there is nothing to show (on this page) - btfss second_row_warning ; =1: The second row contains a warning - bsf FLAG_TFT_dive_warning_text_clr2 ; Set flag for 2nd row - return ; Done. + btfss second_row_warning ; =1: The second row contains a warning + bsf FLAG_TFT_dive_warning_text_clr2 ; Set flag for 2nd row + return ; Done. - global check_warn_battery + global check_warn_battery check_warn_battery: - movff batt_percent,lo - movlw battery_show_level+1 - cpfslt lo - return ; No Display, no warning - ; Display Battery, but warn? - movff batt_percent,lo - movlw color_code_battery_low+1 - cpfsgt lo ; - bsf warning_active ; Set Warning flag - - movlw .4 - cpfseq menupos3 ; battery shown in Custom View 4? - bra check_warn_battery2 ; No - return ; Yes, do not show twice (in custom view and in warning area) + movff batt_percent,lo + movlw battery_show_level+1 + cpfslt lo + return ; No Display, no warning + ; Display Battery, but warn? + movff batt_percent,lo + movlw color_code_battery_low+1 + cpfsgt lo + bsf warning_active ; Set Warning flag + + movlw .4 + cpfseq menupos3 ; battery shown in Custom View 4? + bra check_warn_battery2 ; No + return ; Yes, do not show twice (in custom view and in warning area) check_warn_battery2: - incf warning_counter,F ; increase counter - goto TFT_update_batt_percent_divemode ; Show percent (And return) + incf warning_counter,F ; increase counter + goto TFT_update_batt_percent_divemode ; Show percent (And return) check_divetimeout: - btfsc divemode2 - return ; displayed divetime is not running - incf warning_counter,F ; increase counter - goto TFT_divetimeout ; Show timeout counter (and return) + btfsc divemode2 + return ; displayed divetime is not running + incf warning_counter,F ; increase counter + goto TFT_divetimeout ; Show timeout counter (and return) check_ppO2: - btfsc FLAG_ccr_mode ; are we in CCR mode? + btfsc FLAG_ccr_mode ; are we in CCR mode? bra check_ppO2_loop ; YES btfsc FLAG_pscr_mode ; are we in pSCR mode? bra check_ppO2_loop ; YES @@ -2384,12 +2387,14 @@ btfsc is_bailout ; in bailout? bra check_ppO2_oc_1 ; YES - continue with OC movff int_O_pure_ppO2+1,hi ; NO - get upper part of int_O_pure_ppO2 - btfsc hi,int_warning_flag ; ppO2 of the pure diluent to low or high? - rcall check_ppO2_d ; YES - show warning and return on next line - bra check_ppO2_oc_2 ; skip pre-warning threshold test on breathed ppO2 + btfsc hi,int_warning_flag ; ppO2 of the pure diluent to low or high? + rcall check_ppo2_display ; YES - show warning and return on next line + btfsc hi,int_attention_flag ; ppO2 of the pure diluent close to setpoint? + rcall check_ppo2_display ; YES - show warning and return on next line + bra check_ppO2_oc_2 ; skip attention threshold test on breathed ppO2 check_ppO2_oc_1: movff int_O_breathed_ppO2+1,WREG ; get upper part of int_O_breathed_ppO2 - btfsc WREG,int_prewarning_flag ; breathed ppO2 just above pre-warning threshold? + btfsc WREG,int_attention_flag ; breathed ppO2 just above attention threshold? bra check_ppo2_display ; YES - show ppO2 check_ppO2_oc_2: movff int_O_breathed_ppO2+1,WREG ; get upper part of int_O_breathed_ppO2 (perhaps again) @@ -2397,193 +2402,192 @@ bra check_ppO2_low ; YES - record the warning and show ppO2 btfsc WREG,int_high_flag ; breathed ppO2 to high? bra check_ppO2_high ; YES - record the warning and show ppO2 - TSTOSS opt_showppo2 ; show ppO2 anyhow? (0 = no, 1 = show always) + TSTOSS opt_showppo2 ; show ppO2 anyhow? (0 = no, 1 = show always) return ; NO - no warnings, no show bra check_ppo2_display ; YES - just show ppO2 check_ppO2_low: - movlw d'4' ; set type of alarm (ppO2 low) - bra check_ppO2_common ; continue with common part + movlw d'4' ; set type of alarm (ppO2 low) + bra check_ppO2_common ; continue with common part check_ppO2_high: movlw d'5' ; set type of alarm (ppO2 high) check_ppO2_common: movwf AlarmType ; copy alarm type to alarm register - bsf event_occured ; set event flag + bsf event_occured ; set event flag bsf warning_active ; set warning flag btfsc is_bailout ; are we in bailout? bra check_ppo2_display ; YES - skip CCR/pSCR checks - btfsc FLAG_ccr_mode ; are we in CCR mode? + btfsc FLAG_ccr_mode ; are we in CCR mode? return ; YES - no extra warning required btfsc FLAG_pscr_mode ; are we in pSCR mode? return ; YES - no extra warning required check_ppo2_display: ; display warning if ppO2 is not already shown in custom view - movlw .9 - cpfseq menupos3 ; ppO2 shown in Custom View 9? - bra check_ppO2_a ; No - return ; Yes, do not show twice (in custom view and in warning area) + movlw .9 + cpfseq menupos3 ; ppO2 shown in Custom View 9? + bra check_ppO2_a ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_a: - movlw .11 - cpfseq menupos3 ; ppO2 shown in Custom View 11? - bra check_ppO2_b ; No - return ; Yes, do not show twice (in custom view and in warning area) + movlw .11 + cpfseq menupos3 ; ppO2 shown in Custom View 11? + bra check_ppO2_b ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_b: - movlw .12 - cpfseq menupos3 ; ppO2 shown in Custom View 12? - bra check_ppO2_c ; No - return ; Yes, do not show twice (in custom view and in warning area) + movlw .12 + cpfseq menupos3 ; ppO2 shown in Custom View 12? + bra check_ppO2_c ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_c: - movlw .10 - cpfseq menupos3 ; ppO2 shown in Custom View 10? - bra check_ppO2_d ; No - return ; Yes, do not show twice (in custom view and in warning area) -check_ppO2_d: - incf warning_counter,F ; increase counter - goto TFT_display_ppo2 ; show breathed gas or diluent ppO2 warning (and return) - + movlw .10 + cpfseq menupos3 ; ppO2 shown in Custom View 10? + bra check_ppO2_d ; No + return ; Yes, do not show twice (in custom view and in warning area) +check_ppO2_d: + incf warning_counter,F ; increase counter + goto TFT_display_ppo2 ; show breathed gas or diluent ppO2 warning (and return) + - global check_cns_violation + global check_cns_violation check_cns_violation: - ; Check if CNS should be displayed - movff int_O_CNS_fraction+1,WREG ; get high byte - btfsc WREG,int_warning_flag ; warning flag set? - bra check_cns_violation2 ; Yes - issue warning - btfsc WREG,int_prewarning_flag ; pre-warning flag set? + ; Check if CNS should be displayed + movff int_O_CNS_fraction+1,WREG ; get high byte + btfsc WREG,int_warning_flag ; warning flag set? + bra check_cns_violation2 ; Yes - issue warning + btfsc WREG,int_attention_flag ; attention flag set? bra display_cns_violation ; YES - just display CNS - return ; No - no display, no warning + return ; No - no display, no warning check_cns_violation2: bsf warning_active ; Set Warning flag display_cns_violation: ; Show CNS if not shown in the custom view - movlw .11 - cpfseq menupos3 ; CNS shown in Custom View? - bra display_cns_violation2 ; No - return ; Yes, do not show twice (in custom view and in warning area) + movlw .11 + cpfseq menupos3 ; CNS shown in Custom View? + bra display_cns_violation2 ; No + return ; Yes, do not show twice (in custom view and in warning area) display_cns_violation2: - movlw .8 - cpfseq menupos3 ; CNS shown through Custom View 8 right now? - bra display_cns_violation3 ; No - return ; Yes, do not show twice (in custom view and in warning area) + movlw .8 + cpfseq menupos3 ; CNS shown through Custom View 8 right now? + bra display_cns_violation3 ; No + return ; Yes, do not show twice (in custom view and in warning area) display_cns_violation3: - incf warning_counter,F ; increase counter - goto TFT_display_cns ; Show CNS (and return) + incf warning_counter,F ; increase counter + goto TFT_display_cns ; Show CNS (and return) + - - global check_eod_cns_violation ; check end-of-dive CNS values + global check_eod_cns_violation ; check end-of-dive CNS values check_eod_cns_violation: - movff int_O_CNS_fraction+1,WREG ; get high-byte of current CNS value - btfsc WREG,int_warning_flag ; current CNS value in warning state? - return ; YES - inhibit eod warning if current CNS is already in warning - movff int_O_normal_CNS_fraction+1,WREG + movff int_O_CNS_fraction+1,WREG ; get high-byte of current CNS value + btfsc WREG,int_warning_flag ; current CNS value in warning state? + return ; YES - inhibit eod warning if current CNS is already in warning + movff int_O_normal_CNS_fraction+1,WREG btfsc WREG,int_invalid_flag ; flag for invalid value set? bra check_eod_cns_violation1 ; YES - continue with checking the other CNS value - btfsc WREG,int_warning_flag ; NO - flag for warning set? - bra check_eod_cns_violation2 ; YES - issue warning -check_eod_cns_violation1: ; NO - continue with checking the other CNS value - movff int_O_alternate_CNS_fraction+1,WREG + btfsc WREG,int_warning_flag ; NO - flag for warning set? + bra check_eod_cns_violation2 ; YES - issue warning +check_eod_cns_violation1: ; NO - continue with checking the other CNS value + movff int_O_alternate_CNS_fraction+1,WREG btfsc WREG,int_invalid_flag ; flag for invalid value set? return ; YES - done with CNS checking btfsc WREG,int_warning_flag ; NO - flag for warning set? - bra check_eod_cns_violation2 ; Yes - issue warning - return ; NO - done with CNS checking + bra check_eod_cns_violation2 ; Yes - issue warning + return ; NO - done with CNS checking check_eod_cns_violation2: ; YES - issue warning bsf warning_active ; set Warning flag - movlw .8 ; issue textual warning if CNS values are not shown in the custom view right now - cpfseq menupos3 ; CNS values shown through Custom View 8 right now? - bra display_eod_cns_violation ; NO - issue textual warning + movlw .8 ; issue textual warning if CNS values are not shown in the custom view right now + cpfseq menupos3 ; CNS values shown through Custom View 8 right now? + bra display_eod_cns_violation ; NO - issue textual warning return ; YES - do not show twice (in custom view and in warning area) display_eod_cns_violation: - incf warning_counter,F ; increase counter - goto TFT_display_eod_cns ; issue CNS at end-of-dive warning (and return) + incf warning_counter,F ; increase counter + goto TFT_display_eod_cns ; issue CNS at end-of-dive warning (and return) - global check_and_store_gf_violation + global check_and_store_gf_violation check_and_store_gf_violation: movff int_O_gradient_factor+1,WREG ; get upper byte of gradient factor btfss WREG,int_warning_flag ; check if the warning flag is set - bra check_and_store_gf_violation2 ; NO - continue with checking for pre-warning - movlw d'2' ; YES - set type of alarm - movwf AlarmType ; copy to alarm register - bsf event_occured ; set event flag - bsf warning_active ; set warning flag + bra check_and_store_gf_violation2 ; NO - continue with checking for attention flag + movlw d'2' ; YES - set type of alarm + movwf AlarmType ; copy to alarm register + bsf event_occured ; set event flag + bsf warning_active ; set warning flag bra check_and_store_gf_violation3 ; show gf warning check_and_store_gf_violation2: - btfsc WREG,int_prewarning_flag ; check if the pre-warning flag is set - bra check_and_store_gf_violation3 ; YES - show gf + btfsc WREG,int_attention_flag ; check if the attention flag is set + bra check_and_store_gf_violation3 ; YES - show gf TSTOSS opt_enable_IBCD ; NO - IBCD warning activated? - bra check_and_store_gf_violation4 ; NO - continue checking of deco info - movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector - btfss WREG,IBCD_warning ; is the IBCD warning flag set? - bra check_and_store_gf_violation4 ; NO - continue checking for deco info -check_and_store_gf_violation3: ; YES - show gf + bra check_and_store_gf_violation4 ; NO - continue checking of deco info + movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector + btfss WREG,IBCD_warning ; is the IBCD warning flag set? + bra check_and_store_gf_violation4 ; NO - continue checking for deco info +check_and_store_gf_violation3: ; YES - show gf bsf warning_active ; set Warning flag incf warning_counter,F ; increase counter - goto TFT_warning_gf ; show GF (and return) + goto TFT_warning_gf ; show GF (and return) check_and_store_gf_violation4: ; check for deco info btfss divemode ; in divemode? return ; NO - done, return movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector - btfss WREG,deco_flag ; check if the deco flag is set - return ; NO - all done, return - incf warning_counter,F ; YES - increase counter - goto TFT_info_deco ; show deco info - - + btfss WREG,deco_flag ; check if the deco flag is set + return ; NO - all done, return + incf warning_counter,F ; YES - increase counter + goto TFT_info_deco ; show deco info + + warn_outside: incf warning_counter,F ; increase counter - bsf warning_active ; Set Warning flag - goto TFT_warning_outside ; show microbubbles warning (and return) + bsf warning_active ; Set Warning flag + goto TFT_warning_outside ; show outside warning (and return) - + global warn_mbubbles warn_mbubbles: incf warning_counter,F ; increase counter - bsf warning_active ; Set Warning flag - goto TFT_warning_mbubbles ; show microbubbles warning (and return) + bsf warning_active ; Set Warning flag + goto TFT_warning_mbubbles ; show microbubbles warning (and return) warn_agf: incf warning_counter,F ; increase counter - goto TFT_warning_agf ; Show aGF warning (and return) + goto TFT_warning_agf ; Show aGF warning (and return) warn_fallback: - incf warning_counter,F ; increase counter - bsf warning_active ; Set Warning flag - goto TFT_warning_fallback ; Show fallback warning (and return) + incf warning_counter,F ; increase counter + bsf warning_active ; Set Warning flag + goto TFT_warning_fallback ; Show fallback warning (and return) - + check_gas_needs: banksel int_O_tank_pres_need - movf int_O_tank_pres_need+1,w ; get HIGH(pres need of 1st tank) + movf int_O_tank_pres_need+1,w ; get HIGH(pres need of 1st tank) iorwf int_O_tank_pres_need+3,w ; inclusive or with HIGH(pres need of 2nd tank) iorwf int_O_tank_pres_need+5,w ; inclusive or with HIGH(pres need of 3rd tank) iorwf int_O_tank_pres_need+7,w ; inclusive or with HIGH(pres need of 4th tank) iorwf int_O_tank_pres_need+9,w ; inclusive or with HIGH(pres need of 5th tank) banksel common - btfsc WREG,int_invalid_flag ; check if invalid flag is set + btfsc WREG,int_invalid_flag ; check if invalid flag is set return ; YES - no further checking required btfsc WREG,int_warning_flag ; NO - check if any gas has a pres_need >= pres_fill bsf warning_active ; YES - set warning flag btfsc WREG,int_warning_flag ; NO - check if any gas has a pres_need >= pres_fill goto TFT_warning_gas_needs_warn ; Yes - show a warning - btfsc WREG,int_prewarning_flag ; NO - check if any gas has a pres_need >= pres_fill * threshold + btfsc WREG,int_attention_flag ; NO - check if any gas has a pres_need >= pres_fill * threshold goto TFT_warning_gas_needs_att ; YES - show an attention bcf gas_needs_attention ; NO - clear flag for a new attention bcf gas_needs_warning ; clear flag for a new warning return - + check_warn_sensors_disagree: - incf warning_counter,F ; increase counter + incf warning_counter,F ; increase counter bsf warning_active ; YES - set Warning flag - goto TFT_warning_sensor_disagree ; show sensor disagree warning (and return) + goto TFT_warning_sensor_disagree ; show sensor disagree warning (and return) check_IBCD: TSTOSS opt_enable_IBCD ; IBCD warning activated? return ; NO - done movff char_O_deco_warnings,WREG ; YES - get deco warnings vector - btfss WREG,IBCD_warning ; IBCD warning flag set? - return ; NO - return - incf warning_counter,F ; YES - increase counter - goto TFT_warning_IBCD ; write warning to display - + btfss WREG,IBCD_warning ; IBCD warning flag set? + return ; NO - return + incf warning_counter,F ; YES - increase counter + goto TFT_warning_IBCD ; write warning to display global restart_deco_engine @@ -2619,15 +2623,51 @@ movff int_O_tank_pres_need+1,WREG bsf WREG,int_invalid_flag movff WREG,int_O_tank_pres_need+1 - + ; restart deco engine - movff char_O_deco_status,WREG ; get current deco engine configuration - bcf WREG,DECO_STATUS_0_FLAG ; set status flags to... - bcf WREG,DECO_STATUS_1_FLAG ; ... DECO_STATUS_START - bsf WREG,DECO_PLAN_FLAG ; fake we came from alternative plan to force normal plan to be done next - movff WREG,char_O_deco_status ; write back new configuration to restart deco computations + movff char_O_deco_status,WREG ; get current deco engine configuration + bcf WREG,DECO_STATUS_0_FLAG ; set status flags to... + bcf WREG,DECO_STATUS_1_FLAG ; ... DECO_STATUS_START + bsf WREG,DECO_PLAN_FLAG ; fake we came from alternative plan to force normal plan to be done next + movff WREG,char_O_deco_status ; write back new configuration to restart deco computations + + return + +;============================================================================= +; simulator mode +; + + global do_demo_divemode +do_demo_divemode: + call option_save_all ; Save all settings into EEPROM before starting simulation + call deco_push_tissues_to_vault ; C-code: back-up status of the real tissues + banksel common ; Bank1 + + ; +++ COMMENTED OUT FOR TESTING PURPOSE ONLY !!! +++ + ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ + ; + bsf restore_deco_data ; Restore tissue and CNS after simulator use - return - - - END \ No newline at end of file + bcf pressure_refresh + btfss pressure_refresh ; Wait for sensor + bra $-2 + + bsf simulatormode_active ; Set Flag + ; Compute dive ambient conditions + banksel char_I_bottom_depth + movf char_I_bottom_depth,W + mullw .100 + movff PRODL,rel_pressure+0 + movff PRODH,rel_pressure+1 + movlw LOW (.1000) + addwf PRODL,W + movff WREG,sim_pressure+0 + movlw HIGH (.1000) + addwfc PRODH,W + movff WREG,sim_pressure+1 + banksel common ; Bank1 + + bsf divemode + goto diveloop ; Switch into Divemode! + + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/divemode.inc --- a/src/divemode.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/divemode.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.inc REFACTORED VERSION V2.91 +; File divemode.inc REFACTORED VERSION V2.97 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,10 +8,10 @@ ; HISTORY ; 2011-08-15 : [mH] moving from OSTC code - extern set_dive_modes - extern diveloop - extern apnoe_calc_maxdepth - extern calc_deko_divemode_sensor + extern set_dive_modes + extern diveloop + extern apnoe_calc_maxdepth + extern calc_deko_divemode_sensor ; Divemode layout: @@ -28,112 +28,108 @@ ; - header: has the titles (mask) ; - content: has the values ;******* Upper content / header row ******* -#DEFINE dm_mask_depth_row .0 -#DEFINE dm_mask_depth_column .12 -#DEFINE dm_mask_maxdepth_row .0 -#DEFINE dm_mask_maxdepth_column .73 -#DEFINE dm_mask_maxdepth_column_nvsi .63 -#DEFINE dm_mask_divetime_row .0 -#DEFINE dm_mask_divetime_column .122 +#DEFINE dm_mask_depth_row .0 +#DEFINE dm_mask_depth_column .12 +#DEFINE dm_mask_maxdepth_row .0 +#DEFINE dm_mask_maxdepth_column .73 +#DEFINE dm_mask_maxdepth_column_nvsi .63 +#DEFINE dm_mask_divetime_row .0 +#DEFINE dm_mask_divetime_column .122 ; The content row contains 3 columns: -; - depth and ascend rate warning -; - max depth and warning messages -; - dive time, apnea dive times and warning icon +; - depth and ascend rate warning +; - max depth and warning messages +; - dive time, apnea dive times and warning icon ; DIVEMODE_OFFSET=position below the title row ;******* Upper content / content row / 1st col ******* ; GLOBAL -#DEFINE dm_offset .14 ; 14 +#DEFINE dm_offset .14 ; 14 ; Depth -#DEFINE dm_depth_row dm_offset ; TOP - 14 - start position of the detph numbers -#DEFINE dm_depth_column .0 ; LEFT - 0 -#DEFINE dm_depth_bot dm_depth_row+.61 ; 75 -#DEFINE dm_depth_rgt dm_depth_column+.59 ; 59 -#DEFINE dm_depth_dm_row dm_depth_row+.25 ; 39 - if metric and d<100, decimeter shown as: ".5" -#DEFINE dm_depth_dm_column dm_depth_column+.40 ; 40 - bottom aligned so it has its own position (2nd content line only) +#DEFINE dm_depth_row dm_offset ; TOP - 14 - start position of the detph numbers +#DEFINE dm_depth_column .0 ; LEFT - 0 +#DEFINE dm_depth_bot dm_depth_row+.61 ; 75 +#DEFINE dm_depth_rgt dm_depth_column+.59 ; 59 +#DEFINE dm_depth_dm_row dm_depth_row+.25 ; 39 - if metric and d<100, decimeter shown as: ".5" +#DEFINE dm_depth_dm_column dm_depth_column+.40 ; 40 - bottom aligned so it has its own position (2nd content line only) ; Ascend rate -#DEFINE dm_velocity_text_row dm_depth_row+.62 ; 76 -#DEFINE dm_velocity_text_column dm_depth_column ; 0 -#DEFINE dm_velocity_text_bot dm_velocity_text_row+.23 ; 99 -#DEFINE dm_velocity_text_rgt dm_depth_rgt ; 61 +#DEFINE dm_velocity_text_row dm_depth_row+.62 ; 76 +#DEFINE dm_velocity_text_column dm_depth_column ; 0 +#DEFINE dm_velocity_text_bot dm_velocity_text_row+.23 ; 99 +#DEFINE dm_velocity_text_rgt dm_depth_rgt ; 61 ; Ascend/Descend bar -#DEFINE dm_velobar_top dm_offset ; 14 -#DEFINE dm_velobar_lft dm_depth_rgt+.1 ; 62 -#DEFINE dm_velobar_bot dm_offset+.70 ; 84 -#DEFINE dm_velobar_rgt .73 ; 73 -#DEFINE dm_velobar_width .12 +#DEFINE dm_velobar_top dm_offset ; 14 +#DEFINE dm_velobar_lft dm_depth_rgt+.1 ; 62 +#DEFINE dm_velobar_bot dm_offset+.70 ; 84 +#DEFINE dm_velobar_rgt .73 ; 73 +#DEFINE dm_velobar_width .12 ;******* Upper content / content row / 2nd col ******* -#DEFINE dm_upcnt_2ndcol .74 ; 74 -#DEFINE dm_upcnt_2ndcol_nvsi .64 ; 64 +#DEFINE dm_upcnt_2ndcol .74 ; 74 +#DEFINE dm_upcnt_2ndcol_nvsi .64 ; 64 ; Max depth -#DEFINE dm_max_depth_row dm_offset ; 14 -#DEFINE dm_max_depth_column dm_upcnt_2ndcol ; 74 -#DEFINE dm_max_depth_column_nvsi dm_upcnt_2ndcol_nvsi ; 64 -#DEFINE dm_max_depth_bot dm_max_depth_row+.34 ; 48 -#DEFINE dm_max_depth_rgt dm_max_depth_column+.36 ; 100 -#DEFINE dm_max_depth_dm_row dm_max_depth_row+.11 ; 25 -#DEFINE dm_max_depth_dm_column dm_max_depth_column+.23 ; 87 -#DEFINE dm_max_depth_dm_column_nvsi dm_max_depth_column_nvsi+.23 ; 77 -#DEFINE dm_max_alt_column .0 -#DEFINE dm_max_alt_row .170 -#DEFINE dm_max_dm_alt_column dm_max_alt_column+.60 +#DEFINE dm_max_depth_row dm_offset ; 14 +#DEFINE dm_max_depth_column dm_upcnt_2ndcol ; 74 +#DEFINE dm_max_depth_column_nvsi dm_upcnt_2ndcol_nvsi ; 64 +#DEFINE dm_max_depth_bot dm_max_depth_row+.34 ; 48 +#DEFINE dm_max_depth_rgt dm_max_depth_column+.36 ; 100 +#DEFINE dm_max_depth_dm_row dm_max_depth_row+.11 ; 25 +#DEFINE dm_max_depth_dm_column dm_max_depth_column+.23 ; 87 +#DEFINE dm_max_depth_dm_column_nvsi dm_max_depth_column_nvsi+.23 ; 77 +#DEFINE dm_max_alt_column .0 ; 0 +#DEFINE dm_max_alt_row .170 ; 170 +#DEFINE dm_max_dm_alt_column dm_max_alt_column+.60 ; 60 ; Warning area (combined) -#DEFINE dm_warning_row dm_offset+.36 ; 50 -#DEFINE dm_warning_column dm_upcnt_2ndcol ; 74 -#DEFINE dm_warning_bot dm_warning_row+.49 ; 99 -#DEFINE dm_warning_rgt dm_warning_column+.62 ; 136 -#DEFINE dm_warning_length .9 ; total string length +#DEFINE dm_warning_row dm_offset+.36 ; 50 +#DEFINE dm_warning_column dm_upcnt_2ndcol ; 74 +#DEFINE dm_warning_bot dm_warning_row+.49 ; 99 +#DEFINE dm_warning_rgt dm_warning_column+.62 ; 136 +#DEFINE dm_warning_length .9 ; total string length ; Warning row #1 -#DEFINE dm_warning1_row dm_warning_row ; 36/50 -#DEFINE dm_warning1_column dm_warning_column ; 64 -#DEFINE dm_warning1_bot dm_warning1_row+.23 ; 59/73 -#DEFINE dm_warning1_rgt dm_warning_rgt ; 136 +#DEFINE dm_warning1_row dm_warning_row ; 36/50 +#DEFINE dm_warning1_column dm_warning_column ; 64 +#DEFINE dm_warning1_bot dm_warning1_row+.23 ; 59/73 +#DEFINE dm_warning1_rgt dm_warning_rgt ; 136 ; Warning row #2 -#DEFINE dm_warning2_row dm_warning_row+.24 ; 60/74 -#DEFINE dm_warning2_column dm_warning_column ; 64 -#DEFINE dm_warning2_bot dm_warning2_row+.23 ; 83/97 -#DEFINE dm_warning2_rgt dm_warning_rgt ; 136 +#DEFINE dm_warning2_row dm_warning_row+.24 ; 60/74 +#DEFINE dm_warning2_column dm_warning_column ; 64 +#DEFINE dm_warning2_bot dm_warning2_row+.23 ; 83/97 +#DEFINE dm_warning2_rgt dm_warning_rgt ; 136 ;******* Upper content / content row / 3rd col ******* ; Dive time -#DEFINE dm_divetime_row dm_offset ; 14 -#DEFINE dm_divetime_column .115 ; 115 -#DEFINE dm_divetime_minsonly_column .111 ; 111 -#DEFINE dm_divetime_bot dm_divetime_row+.34 ; 48 -#DEFINE dm_divetime_rgt .159 ; 159 -#DEFINE dm_divetime_secs_row dm_divetime_row+.11 ; 25 -#DEFINE dm_divetime_secs_column dm_divetime_column+.24 ; 139 -#DEFINE dm_divetime_alt_row dm_offset ; 14 -#DEFINE dm_divetime_alt_column .68 +#DEFINE dm_divetime_row dm_offset ; 14 +#DEFINE dm_divetime_column .115 ; 115 +#DEFINE dm_divetime_minsonly_column .111 ; 111 +#DEFINE dm_divetime_bot dm_divetime_row+.34 ; 48 +#DEFINE dm_divetime_rgt .159 ; 159 +#DEFINE dm_divetime_secs_row dm_divetime_row+.11 ; 25 +#DEFINE dm_divetime_secs_column dm_divetime_column+.24 ; 139 +#DEFINE dm_divetime_alt_row dm_offset ; 14 +#DEFINE dm_divetime_alt_column .68 ; 68 ; Warning icon -#DEFINE dm_warning_icon_row dm_offset+.41 ; 55 -#DEFINE dm_warning_icon_column .137 ; 137 -#DEFINE dm_warning_icon_bot dm_warning_icon_row+.38 ; 93 -#DEFINE dm_warning_icon_rgt dm_warning_icon_column+.21 ; 156 +#DEFINE dm_warning_icon_row dm_offset+.41 ; 55 +#DEFINE dm_warning_icon_column .137 ; 137 +#DEFINE dm_warning_icon_bot dm_warning_icon_row+.38 ; 93 +#DEFINE dm_warning_icon_rgt dm_warning_icon_column+.21 ; 156 ; Apnea dive time -#DEFINE dm_divetime_apnoe_row dm_offset ; 14 -#DEFINE dm_divetime_apnoe_column .103 ; 103 -#DEFINE dm_divetime_apnoe_secs_row dm_divetime_apnoe_row+.11 ; 25 -#DEFINE dm_divetime_apnoe_secs_column dm_divetime_apnoe_column+.36 ; 139 +#DEFINE dm_divetime_apnoe_row dm_offset ; 14 +#DEFINE dm_divetime_apnoe_column .103 ; 103 +#DEFINE dm_divetime_apnoe_secs_row dm_divetime_apnoe_row+.11 ; 25 +#DEFINE dm_divetime_apnoe_secs_column dm_divetime_apnoe_column+.36 ; 139 ; Apnea total time -#DEFINE dm_apnoe_total_divetime_row dm_divetime_apnoe_row+.50 ; 64 -#DEFINE dm_apnoe_total_divetime_column dm_divetime_apnoe_column ; 103 -#DEFINE dm_apnoe_total_divetime_secs_row dm_apnoe_total_divetime_row+.11 ; 75 -#DEFINE dm_apnoe_total_divetime_secs_col dm_divetime_apnoe_column+.36 ; 139 -#DEFINE dm_total_apnoe_text_row dm_apnoe_total_divetime_row-.11 ; 53 -#DEFINE dm_total_apnoe_text_column .132 ; 132 +#DEFINE dm_apnoe_total_divetime_row dm_divetime_apnoe_row+.50 ; 64 +#DEFINE dm_apnoe_total_divetime_column dm_divetime_apnoe_column ; 103 +#DEFINE dm_apnoe_total_divetime_secs_row dm_apnoe_total_divetime_row+.11 ; 75 +#DEFINE dm_apnoe_total_divetime_secs_col dm_divetime_apnoe_column+.36 ; 139 +#DEFINE dm_total_apnoe_text_row dm_apnoe_total_divetime_row-.11 ; 53 +#DEFINE dm_total_apnoe_text_column .132 ; 132 ; I. End of the upper content row. (0-99) - - ; 1px space between the 1st and 2nd content rows -#DEFINE dm_sep_1_2_row dm_offset+.86 ; 100 - - +#DEFINE dm_sep_1_2_row dm_offset+.86 ; 100 ; II. Custom/selectable content row -; The costume view display area is: 101,163,0,159 (t,b,l,r), or 0,101->159,163 +; The costume view display area is: 101,163,0,159 (t,b,l,r), or 0,101->159,163 ; 1. Stopwatch with avarage depth ; 2. Decoplan - decompression stops up to 6 stops ; 3. Time, EAD/END and tissue saturation (graph) @@ -143,251 +139,248 @@ ; 7. Gas list ; 8. Ceiling (for GF_hi) ;******* Custom content / Global ******* -#DEFINE dm_customview_row dm_offset+.87 ; 101 -#DEFINE dm_customview_column .0 ; 0 -#DEFINE dm_customview_bot dm_customview_row+.62 ; 163 -#DEFINE dm_customview_rgt .159 ; 159 +#DEFINE dm_customview_row dm_offset+.87 ; 101 +#DEFINE dm_customview_column .0 ; 0 +#DEFINE dm_customview_bot dm_customview_row+.62 ; 163 +#DEFINE dm_customview_rgt .159 ; 159 ;******* Custom content / #1 - Avg depth, stopwatch and avg depth ******* ; Title -#DEFINE dm_custom_avr_stop_title_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_avr_stop_title_column1 .2 ; 2 -#DEFINE dm_custom_avr_stop_title_column2 .57 ; 57 -#DEFINE dm_custom_avr_stop_title_column3 .110 ; 110 +#DEFINE dm_custom_avr_stop_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_avr_stop_title_column1 .2 ; 2 +#DEFINE dm_custom_avr_stop_title_column2 .57 ; 57 +#DEFINE dm_custom_avr_stop_title_column3 .110 ; 110 ; Values -#DEFINE dm_custom_avr_stop_row dm_customview_row+.16 ; 117 -#DEFINE dm_custom_avr_stop_column1 .0 ; 0 -#DEFINE dm_custom_avr_stop_column2 .54 ; 54 -#DEFINE dm_custom_avr_stop_column3 .118 ; 118 +#DEFINE dm_custom_avr_stop_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_avr_stop_column1 .0 ; 0 +#DEFINE dm_custom_avr_stop_column2 .54 ; 54 +#DEFINE dm_custom_avr_stop_column3 .118 ; 118 ;******* Custom content / #2 - Decompressions stops ******* ; Title -#DEFINE dm_custom_decoplan_title_row dm_customview_row ; 101 -#DEFINE dm_custom_decoplan_title_column .65 ; 65 +#DEFINE dm_custom_decoplan_title_row dm_customview_row ; 101 +#DEFINE dm_custom_decoplan_title_column .65 ; 65 ; 1st col -#DEFINE dm_cust_dstop_2nd_stop_row dm_customview_row+.14 ; 115 -#DEFINE dm_cust_dstop_2nd_stop_column .0 ; 0 -#DEFINE dm_cust_dstop_3rd_stop_row dm_customview_row+.37 ; 138 -#DEFINE dm_cust_dstop_3rd_stop_column dm_cust_dstop_2nd_stop_column ; 0 +#DEFINE dm_cust_dstop_2nd_stop_row dm_customview_row+.14 ; 115 +#DEFINE dm_cust_dstop_2nd_stop_column .0 ; 0 +#DEFINE dm_cust_dstop_3rd_stop_row dm_customview_row+.37 ; 138 +#DEFINE dm_cust_dstop_3rd_stop_column dm_cust_dstop_2nd_stop_column ; 0 ; 2nd col -#DEFINE dm_cust_dstop_4th_stop_row dm_cust_dstop_2nd_stop_row ; 116 -#DEFINE dm_cust_dstop_4th_stop_column .56 ; 56 -#DEFINE dm_cust_dstop_5th_stop_row dm_cust_dstop_3rd_stop_row ; 140 -#DEFINE dm_cust_dstop_5th_stop_column dm_cust_dstop_4th_stop_column ; 56 +#DEFINE dm_cust_dstop_4th_stop_row dm_cust_dstop_2nd_stop_row ; 116 +#DEFINE dm_cust_dstop_4th_stop_column .56 ; 56 +#DEFINE dm_cust_dstop_5th_stop_row dm_cust_dstop_3rd_stop_row ; 140 +#DEFINE dm_cust_dstop_5th_stop_column dm_cust_dstop_4th_stop_column ; 56 ; 3rd col -#DEFINE dm_cust_dstop_6th_stop_row dm_cust_dstop_2nd_stop_row ; 116 -#DEFINE dm_cust_dstop_6th_stop_column .111 ; 111 -#DEFINE dm_cust_dstop_7th_stop_row dm_cust_dstop_3rd_stop_row ; 140 -#DEFINE dm_cust_dstop_7th_stop_column dm_cust_dstop_6th_stop_column ; 111 +#DEFINE dm_cust_dstop_6th_stop_row dm_cust_dstop_2nd_stop_row ; 116 +#DEFINE dm_cust_dstop_6th_stop_column .111 ; 111 +#DEFINE dm_cust_dstop_7th_stop_row dm_cust_dstop_3rd_stop_row ; 140 +#DEFINE dm_cust_dstop_7th_stop_column dm_cust_dstop_6th_stop_column ; 111 ;******* Custom content / #3 - Time, EAD/END and tissue saturation ******* ; Clock -#DEFINE dm_custom_clock_title_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_clock_row dm_customview_row+.16 ; 117 -#DEFINE dm_custom_clock_column .0 ; 0 -#DEFINE dm_custom_endtime_row dm_custom_clock_row+.23 ; 140 - not used -#DEFINE dm_custom_endtime_column dm_custom_clock_column ; 0 - not used +#DEFINE dm_custom_clock_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_clock_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_clock_column .0 ; 0 +#DEFINE dm_custom_endtime_row dm_custom_clock_row+.23 ; 140 - not used +#DEFINE dm_custom_endtime_column dm_custom_clock_column ; 0 - not used ; EAD/AND -#DEFINE dm_custom_eadend_title_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_ead_row dm_customview_row+.16 ; 117 -#DEFINE dm_custom_ead_column .50 ; 50 -#DEFINE dm_custom_end_row dm_custom_ead_row+.23 ; 140 -#DEFINE dm_custom_end_column dm_custom_ead_column ; 50 +#DEFINE dm_custom_eadend_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_ead_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_ead_column .50 ; 50 +#DEFINE dm_custom_end_row dm_custom_ead_row+.23 ; 140 +#DEFINE dm_custom_end_column dm_custom_ead_column ; 50 ; Tissue title -#DEFINE dm_custom_tissue_title_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_tissue_title_column .120 ; 120 +#DEFINE dm_custom_tissue_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_tissue_title_column .120 ; 120 ; N2 / He values -#DEFINE dm_custom_tissue_N2_row dm_custom_ead_row+.5 ; 122 -#DEFINE dm_custom_tissue_N2_column .105 ; 105 -#DEFINE dm_custom_tissue_He_row dm_custom_end_row+.5 ; 145 -#DEFINE dm_custom_tissue_He_column dm_custom_tissue_N2_column ; 105 +#DEFINE dm_custom_tissue_N2_row dm_custom_ead_row+.5 ; 122 +#DEFINE dm_custom_tissue_N2_column .105 ; 105 +#DEFINE dm_custom_tissue_He_row dm_custom_end_row+.5 ; 145 +#DEFINE dm_custom_tissue_He_column dm_custom_tissue_N2_column ; 105 ; Tissue diagram -#DEFINE dm_custom_tissue_diagram_top dm_customview_row+.16 ; 117 -#DEFINE dm_custom_tissue_diagram_bottom dm_custom_tissue_diagram_top+.43 ; 160 -#DEFINE dm_custom_tissue_diagram_left .116 ; 116 -#DEFINE dm_custom_tissue_diagram_frame_spacing .8 ; 8 +#DEFINE dm_custom_tissue_diagram_top dm_customview_row+.16 ; 117 +#DEFINE dm_custom_tissue_diagram_bottom dm_custom_tissue_diagram_top+.43; 160 +#DEFINE dm_custom_tissue_diagram_left .116 ; 116 +#DEFINE dm_custom_tissue_diagram_frame_spacing .8 ; 8 ;******* Custom content / #4 - GF-lo/hi, aGF-lo/hi, current GF value ******* ; Title -#DEFINE dm_custom_gf_title_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_gf_title_col1 .8 ; 8 -#DEFINE dm_custom_gf_title_col2 .62 ; 62 -#DEFINE dm_custom_gf_title_col3 .115 ; 115 +#DEFINE dm_custom_gf_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_gf_title_col1 .8 ; 8 +#DEFINE dm_custom_gf_title_col2 .62 ; 62 +#DEFINE dm_custom_gf_title_col3 .115 ; 115 ; GF -#DEFINE dm_custom_gf_row dm_customview_row+.18 ; 119 -#DEFINE dm_custom_gf_column .0 ; 0 +#DEFINE dm_custom_gf_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_gf_column .0 ; 0 ; aGF -#DEFINE dm_custom_agf_row dm_custom_gf_row ; 119 -#DEFINE dm_custom_agf_column .60 ; 60 +#DEFINE dm_custom_agf_row dm_custom_gf_row ; 119 +#DEFINE dm_custom_agf_column .60 ; 60 ; Current GF -#DEFINE dm_custom_currentgf_row dm_custom_gf_row ; 119 -#DEFINE dm_custom_currentgf_column .118 ; 118 +#DEFINE dm_custom_currentgf_row dm_custom_gf_row ; 119 +#DEFINE dm_custom_currentgf_column .118 ; 118 ;******* Custom content / #5 - Compass ******* ; Title -#DEFINE dm_custom_compass_mask_row dm_customview_row ; 101 -#DEFINE dm_custom_compass_mask_column .65 ; 65 +#DEFINE dm_custom_compass_mask_row dm_customview_row ; 101 +#DEFINE dm_custom_compass_mask_column .65 ; 65 ; Head and arrows -#DEFINE dm_custom_compass_head_row dm_customview_row+.39 ; 140 -#DEFINE dm_custom_compass_head_column .62 ; 62 -#DEFINE dm_custom_compass_ldir_column .5 ; 5 -#DEFINE dm_custom_compass_rdir_column .140 ; 140 +#DEFINE dm_custom_compass_head_row dm_customview_row+.39 ; 140 +#DEFINE dm_custom_compass_head_column .62 ; 62 +#DEFINE dm_custom_compass_ldir_column .5 ; 5 +#DEFINE dm_custom_compass_rdir_column .140 ; 140 ; Ruler -#DEFINE dm_custom_compass_graph_row dm_customview_row ; 101 -#DEFINE dm_custom_compass_graph_height .33 ; 33 -#DEFINE dm_custom_compass_tick_height .3 ; 3 -#DEFINE dm_custom_compass_tick_top_top dm_custom_compass_graph_row+.1 ; 102 -#DEFINE dm_custom_compass_tick_top_bot dm_custom_compass_graph_row+.4 ; 105 -#DEFINE dm_custom_compass_label_row dm_custom_compass_graph_row+.6 ; 107 -#DEFINE dm_custom_compass_label_height .24 ; 24 -#DEFINE dm_custom_compass_tick_bot_top dm_custom_compass_graph_row+.30 ; 131 -#DEFINE dm_custom_compass_tick_bot_bot dm_custom_compass_graph_row+.33 ; 134 +#DEFINE dm_custom_compass_graph_row dm_customview_row ; 101 +#DEFINE dm_custom_compass_graph_height .33 ; 33 +#DEFINE dm_custom_compass_tick_height .3 ; 3 +#DEFINE dm_custom_compass_tick_top_top dm_custom_compass_graph_row+.1 ; 102 +#DEFINE dm_custom_compass_tick_top_bot dm_custom_compass_graph_row+.4 ; 105 +#DEFINE dm_custom_compass_label_row dm_custom_compass_graph_row+.6 ; 107 +#DEFINE dm_custom_compass_label_height .24 ; 24 +#DEFINE dm_custom_compass_tick_bot_top dm_custom_compass_graph_row+.30 ; 131 +#DEFINE dm_custom_compass_tick_bot_bot dm_custom_compass_graph_row+.33 ; 134 ;******* Custom content / #6 - HUD / O2 sensor values ******* -#DEFINE dm_custom_hud_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_hud_column1 .10 ; 10 -#DEFINE dm_custom_hud_column2 .65 ; 65 -#DEFINE dm_custom_hud_column3 .120 ; 120 -#DEFINE dm_custom_hud_data_row dm_customview_row+.16 ; 117 -#DEFINE dm_custom_hud_sensor1_column .6 ; 6 -#DEFINE dm_custom_hud_sensor2_column .62 ; 62 -#DEFINE dm_custom_hud_sensor3_column .118 ; 118 +#DEFINE dm_custom_hud_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_hud_column1 .10 ; 10 +#DEFINE dm_custom_hud_column2 .65 ; 65 +#DEFINE dm_custom_hud_column3 .120 ; 120 +#DEFINE dm_custom_hud_data_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_hud_sensor1_column .6 ; 6 +#DEFINE dm_custom_hud_sensor2_column .62 ; 62 +#DEFINE dm_custom_hud_sensor3_column .118 ; 118 ;******* Custom content / #7 - Gas list ******* ; Title -#DEFINE dm_custom_dyn_gas_mask_row dm_customview_row ; 101 -#DEFINE dm_custom_dyn_gas_mask_column .59 ; 59 +#DEFINE dm_custom_dyn_gas_mask_row dm_customview_row ; 101 +#DEFINE dm_custom_dyn_gas_mask_column .59 ; 59 ; col #1 -#DEFINE dm_custom_dyn_gas_row1 dm_customview_row+.14 ; 115 -#DEFINE dm_custom_dyn_gas_column1 .0 ; 0 +#DEFINE dm_custom_dyn_gas_row1 dm_customview_row+.14 ; 115 +#DEFINE dm_custom_dyn_gas_column1 .0 ; 0 ; col #2 -#DEFINE dm_custom_dyn_gas_row2 dm_customview_row+.37 ; 138 -#DEFINE dm_custom_dyn_gas_column2 .80 ; 80 +#DEFINE dm_custom_dyn_gas_row2 dm_customview_row+.37 ; 138 +#DEFINE dm_custom_dyn_gas_column2 .80 ; 80 ;******* Custom content / #8 - Ceiling value for GF_hi ******* ; Title -#DEFINE dm_custom_ceiling_text_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_ceiling_text_column .68 ; 66 -#DEFINE dm_custom_ceiling_ppo2_column .8 ; 8 -#DEFINE dm_custom_ceiling_ppo2_col_dil .0 ; 0 NEW tuned position because text is longer ## (?) +#DEFINE dm_custom_ceiling_text_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_ceiling_text_column .68 ; 66 +#DEFINE dm_custom_ceiling_ppo2_column .8 ; 8 +#DEFINE dm_custom_ceiling_ppo2_col_dil .0 ; 0 ; Value -#DEFINE dm_custom_ceiling_value_row dm_customview_row+.18 ; 119 -#DEFINE dm_custom_ceiling_value_column .66 ; 64 -#DEFINE dm_custom_ceiling_ppo2_val_col .2 ; 2 +#DEFINE dm_custom_ceiling_value_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_ceiling_value_column .66 ; 64 +#DEFINE dm_custom_ceiling_ppo2_val_col .2 ; 2 ;******* Custom content / #10 - Sensor check view ******* ; Title -#DEFINE dm_custom_s_check_text_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_s_check_text_column .50 ; 50 -#DEFINE dm_custom_ppO2_text_column .115 ; 115 -#DEFINE dm_custom_ppDil_text_column .2 ; 2 +#DEFINE dm_custom_s_check_text_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_s_check_text_column .50 ; 50 +#DEFINE dm_custom_ppO2_text_column .115 ; 115 +#DEFINE dm_custom_ppDil_text_column .2 ; 2 ; Value -#DEFINE dm_custom_s_check_ppo2_o2_column .108 ; 108 -#DEFINE dm_custom_s_check_ppo2_dil_col .8 ; 8 -#DEFINE dm_custom_s_check_value_row dm_customview_row+.18 ; 119 - -;******* Custom content / #12 - PSCR Info ******* +#DEFINE dm_custom_s_check_ppo2_o2_column .108 ; 108 +#DEFINE dm_custom_s_check_ppo2_dil_col .8 ; 8 +#DEFINE dm_custom_s_check_value_row dm_customview_row+.18 ; 119 + +;******* Custom content / #12 - PSCR Info ******* ; Title -#DEFINE dm_custom_pscr_text_row dm_customview_row+.1 ; 102 -#DEFINE dm_custom_pscr_text_drop_column .55 -#DEFINE dm_custom_pscr_text_ratio_column .105 +#DEFINE dm_custom_pscr_text_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_pscr_text_drop_column .55 +#DEFINE dm_custom_pscr_text_ratio_column .105 ; Value -#DEFINE dm_custom_pscr_drop_column .66 -#DEFINE dm_custom_pscr_drop_row dm_customview_row+.18 -#DEFINE dm_custom_pscr_ratio_column .110 -#DEFINE dm_custom_pscr_ratio_row dm_customview_row+.18 - +#DEFINE dm_custom_pscr_drop_column .66 +#DEFINE dm_custom_pscr_drop_row dm_customview_row+.18 +#DEFINE dm_custom_pscr_ratio_column .110 +#DEFINE dm_custom_pscr_ratio_row dm_customview_row+.18 + ; II. End of the custom content row. (101-163) - - ; 1px space between the 2nd and 3rd content rows -#DEFINE dm_sep_2_3_row dm_offset+.150 ; 164 - +#DEFINE dm_sep_2_3_row dm_offset+.150 ; 164 ; III. The 3rd content row contains temperature, active gas, NDL/TTS time, -; simulator menu, active/dil gas, decostop, Apnea surface time and max depth +; simulator menu, active/dil gas, decostop, Apnea surface time and max depth ; The content row contains 2 columns: -; - temperature, gas names -; - NDL/TTS, DecoStop -#DEFINE dm_3rdrow_top dm_offset+.151 ; 165 -#DEFINE dm_3rdrow_bot .239 ; 239 -#DEFINE dm_3rdrow_lft .0 ; 0 -#DEFINE dm_3rdrow_rgt .159 ; 159 +; - temperature, gas names +; - NDL/TTS, DecoStop +#DEFINE dm_3rdrow_top dm_offset+.151 ; 165 +#DEFINE dm_3rdrow_bot .239 ; 239 +#DEFINE dm_3rdrow_lft .0 ; 0 +#DEFINE dm_3rdrow_rgt .159 ; 159 ;******* Bottom content / 1st col ******* ; Temperature -#DEFINE dm_temp_row dm_3rdrow_top-.4 ; 161 -#DEFINE dm_temp_column .0 ; 0 +#DEFINE dm_temp_row dm_3rdrow_top-.4 ; 161 +#DEFINE dm_temp_column .0 ; 0 ; Simulation text -#DEFINE dm_simtext_row dm_3rdrow_top ; 165 -#DEFINE dm_simtext_column .35 ; 35 +#DEFINE dm_simtext_row dm_3rdrow_top ; 165 +#DEFINE dm_simtext_column .35 ; 35 ; Diluent gas -#DEFINE dm_active_dil_row dm_3rdrow_top+.19 ; 185 -#DEFINE dm_active_dil_column .0 ; 0 +#DEFINE dm_active_dil_row dm_3rdrow_top+.19 ; 185 +#DEFINE dm_active_dil_column .0 ; 0 ; active gas for OC, blinking better gas, setpoint or bailout for CCR -#DEFINE dm_active_gas_row .208 ; 208 -#DEFINE dm_active_gas_column .0 ; 0 +#DEFINE dm_active_gas_row .208 ; 208 +#DEFINE dm_active_gas_column .0 ; 0 ;******* Bottom content / 2nd col ******* ; Next deco stop for TTS -#DEFINE dm_decostop_1st_stop_row dm_3rdrow_top ; 165 -#DEFINE dm_decostop_1st_stop_column .82 ; 82 +#DEFINE dm_decostop_1st_stop_row dm_3rdrow_top ; 165 +#DEFINE dm_decostop_1st_stop_column .82 ; 82 ; Safety Stop -#DEFINE dm_safetystop_row dm_3rdrow_top ; 165 (pre: 171) -#DEFINE dm_safetystop_column .118 ; 118 -#DEFINE dm_safetystop_bot dm_safetystop_row+.31 ; 196 -#DEFINE dm_safetystop_text_row dm_safetystop_row+.1 ; 166 (pre: 175) -#DEFINE dm_safetystop_text_column .80 ; 80 - for the 4char "Stop"!!! +#DEFINE dm_safetystop_row dm_3rdrow_top ; 165 +#DEFINE dm_safetystop_column .118 ; 118 +#DEFINE dm_safetystop_bot dm_safetystop_row+.31 ; 196 +#DEFINE dm_safetystop_text_row dm_safetystop_row+.1 ; 166 +#DEFINE dm_safetystop_text_column .80 ; 80 - for the 4char "Stop"!!! ; TTS -#DEFINE dm_tts_value_row dm_3rdrow_top+.32; ; 197 (pre: 207) -#DEFINE dm_tts_value_column .118 ; 118 -#DEFINE dm_tts_text_row dm_tts_value_row+.5 ; 202 (pre: 211) -#DEFINE dm_tts_text_column .85 ; 85 +#DEFINE dm_tts_value_row dm_3rdrow_top+.32; ; 197 (pre: 207) +#DEFINE dm_tts_value_column .118 ; 118 +#DEFINE dm_tts_text_row dm_tts_value_row+.5 ; 202 (pre: 211) +#DEFINE dm_tts_text_column .85 ; 85 ; NDL - the same position as TTS -#DEFINE dm_ndl_value_row dm_tts_value_row ; 197 -#DEFINE dm_ndl_value_column dm_tts_value_column ; 118 -#DEFINE dm_ndl_text_row dm_tts_text_row ; 202 -#DEFINE dm_ndl_text_column dm_tts_text_column ; 85 +#DEFINE dm_ndl_value_row dm_tts_value_row ; 197 +#DEFINE dm_ndl_value_column dm_tts_value_column ; 118 +#DEFINE dm_ndl_text_row dm_tts_text_row ; 202 +#DEFINE dm_ndl_text_column dm_tts_text_column ; 85 ; FTTS (only modded screen) -#DEFINE dm_ftts_value_row dm_3rdrow_top+.64 ; 215 -#DEFINE dm_ftts_value_column .97 ; 97 +#DEFINE dm_ftts_value_row dm_3rdrow_top+.64 ; 215 +#DEFINE dm_ftts_value_column .97 ; 97 ; Grid line (only modded screen) -#DEFINE dm_gassep_row dm_sep_2_3_row ; 164 -#DEFINE dm_gassep_bot .239 ; .239 -#DEFINE dm_gassep_column .78 ; .78 +#DEFINE dm_gassep_row dm_sep_2_3_row ; 164 +#DEFINE dm_gassep_bot .239 ; .239 +#DEFINE dm_gassep_column .78 ; .78 ;******* Bottom content / Apnea mode *******; -#DEFINE dm_apnoe_surface_time_text_row .190 ; 190 -#DEFINE dm_apnoe_surface_time_text_col .30 ; 30 -#DEFINE dm_apnoe_surface_time_row .204 ; 204 -#DEFINE dm_apnoe_surface_time_column .15 ; 15 -#DEFINE dm_apnoe_last_max_depth_text_row .190 ; 190 -#DEFINE dm_apnoe_last_max_depth_text_col .100 ; 100 -#DEFINE dm_apnoe_last_max_depth_row .204 ; 204 -#DEFINE dm_apnoe_last_max_depth_column .100 ; 100 +#DEFINE dm_apnoe_surface_time_text_row .190 ; 190 +#DEFINE dm_apnoe_surface_time_text_col .30 ; 30 +#DEFINE dm_apnoe_surface_time_row .204 ; 204 +#DEFINE dm_apnoe_surface_time_column .15 ; 15 +#DEFINE dm_apnoe_last_max_depth_text_row .190 ; 190 +#DEFINE dm_apnoe_last_max_depth_text_col .100 ; 100 +#DEFINE dm_apnoe_last_max_depth_row .204 ; 204 +#DEFINE dm_apnoe_last_max_depth_column .100 ; 100 ; IV. The last set of parameters are for the menus displayed in dive mode ; Divemode menu -#DEFINE dm_menu_row .164 ; 164 Upper row -- the frame's top line is the separator -#DEFINE dm_menu_lower .239 ; 239 Lower border -#DEFINE dm_menu_left .0 ; 0 Left -#DEFINE dm_menu_right .159 ; 159 Right +#DEFINE dm_menu_row .164 ; 164 Upper row -- the frame's top line is the separator +#DEFINE dm_menu_lower .239 ; 239 Lower border +#DEFINE dm_menu_left .0 ; 0 Left +#DEFINE dm_menu_right .159 ; 159 Right -#DEFINE dm_menu_item1_row dm_menu_row+.1 ; 165 -#DEFINE dm_menu_item1_column .9 ; 9 -#DEFINE dm_menu_item2_row dm_menu_item1_row+.24 ; 189 -#DEFINE dm_menu_item2_column dm_menu_item1_column ; 9 -#DEFINE dm_menu_item3_row dm_menu_item2_row+.24 ; 213 -#DEFINE dm_menu_item3_column dm_menu_item1_column ; 9 +#DEFINE dm_menu_item1_row dm_menu_row+.1 ; 165 +#DEFINE dm_menu_item1_column .9 ; 9 +#DEFINE dm_menu_item2_row dm_menu_item1_row+.24 ; 189 +#DEFINE dm_menu_item2_column dm_menu_item1_column ; 9 +#DEFINE dm_menu_item3_row dm_menu_item2_row+.24 ; 213 +#DEFINE dm_menu_item3_column dm_menu_item1_column ; 9 -#DEFINE dm_menu_item4_row dm_menu_row+.1 ; 165 -#DEFINE dm_menu_item4_column .89 ; 89 -#DEFINE dm_menu_item5_row dm_menu_item4_row+.24 ; 189 -#DEFINE dm_menu_item5_column dm_menu_item4_column ; 89 -#DEFINE dm_menu_item6_row dm_menu_item5_row+.24 ; 213 -#DEFINE dm_menu_item6_column dm_menu_item4_column ; 89 +#DEFINE dm_menu_item4_row dm_menu_row+.1 ; 165 +#DEFINE dm_menu_item4_column .89 ; 89 +#DEFINE dm_menu_item5_row dm_menu_item4_row+.24 ; 189 +#DEFINE dm_menu_item5_column dm_menu_item4_column ; 89 +#DEFINE dm_menu_item6_row dm_menu_item5_row+.24 ; 213 +#DEFINE dm_menu_item6_column dm_menu_item4_column ; 89 diff -r f5de1ff88814 -r b455b31ce022 src/eeprom_rs232.asm --- a/src/eeprom_rs232.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/eeprom_rs232.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File eeprom_rs232.asm +; File eeprom_rs232.asm V2.98 ; ; Internal EEPROM, RS232 ; @@ -11,26 +11,68 @@ #include "hwos.inc" #include "wait.inc" +#include "shared_definitions.h" +#include "rtc.inc" + +write_int_eeprom macro eeprom_address + movlw eeprom_address + call write_int_eeprom_1 + endm + +read_int_eeprom macro eeprom_address + movlw eeprom_address + call read_int_eeprom_1 + endm + +;============================================================================= +eeprom code 0xF00000+0x10 +; Skip SERIAL number. Should not be overwritten. + + global eeprom_serial_save + global eeprom_opt_backup + +eeprom_serial_save res 2 +eeprom_opt_backup res 0x3E ;============================================================================= -eeprom code 0xF00000+0x10 -; Skip SERIAL number. Should not be overwritten. - global eeprom_serial_save, eeprom_opt_backup -eeprom_serial_save res 2 -eeprom_opt_backup res 0x3E +basic CODE -;============================================================================= -basic CODE - - global write_int_eeprom_1 + global write_int_eeprom_1 write_int_eeprom_1: movwf EEADR - bra write_eeprom ; writes and "returns" after write +; bra write_eeprom ; writes and "returns" after write + +;============================================================================= +; writes into internal eeprom +; Input: EEADRH:EEADR = EEPROM address. +; EEDATA = byte to write. +; Trashed: WREG. + global write_eeprom +write_eeprom: + bcf EECON1,EEPGD + bcf EECON1,CFGS + bsf EECON1,WREN + + bcf INTCON,GIE ; Disable interrupts for the next 5 instructions + movlw 0x55 + movwf EECON2 + movlw 0xAA + movwf EECON2 + bsf EECON1,WR + bsf INTCON,GIE ; ...but the flag for the ISR routines were still set, so they will interrupt now! + +write_eep2: + btfsc EECON1,WR + bra write_eep2 ; wait about 4ms... + bcf EECON1,WREN + return + + global read_int_eeprom_1 read_int_eeprom_1: movwf EEADR - bra read_eeprom ; reads and "returns" after write +; bra read_eeprom ; reads and "returns" after write ;============================================================================= ; reads from internal eeprom @@ -38,180 +80,357 @@ ; Output: EEDATA. ; Trashed: NONE. global read_eeprom -read_eeprom: +read_eeprom: bcf EECON1,EEPGD bcf EECON1,CFGS bsf EECON1,RD return -;============================================================================= -; writes into internal eeprom -; Input: EEADRH:EEADR = EEPROM address. -; EEDATA = byte to write. -; Trashed: WREG. - global write_eeprom -write_eeprom: - bcf EECON1,EEPGD - bcf EECON1,CFGS - bsf EECON1,WREN - - bcf INTCON,GIE ; Disable interrups for the next 5 instructions - movlw 0x55 - movwf EECON2 - movlw 0xAA - movwf EECON2 - bsf EECON1,WR - bsf INTCON,GIE ; ...but the flag for the ISR routines were still set, so they will interrupt now! - -write_eep2: - btfsc EECON1,WR - bra write_eep2 ; wait about 4ms... - bcf EECON1,WREN + global disable_ir_s8 +disable_ir_s8: + banksel TXSTA2 + clrf TXSTA2 + clrf RCSTA2 + banksel common + bcf ir_power ; IR off + bcf mcp_power ; Power-down instrumentation amp + bsf s8_npower ; Power-down S8 HUD return - global disable_ir_s8 -disable_ir_s8: - banksel TXSTA2 - clrf TXSTA2 - clrf RCSTA2 - banksel common - bcf ir_power ; IR off - bcf mcp_power ; Power-down intrumentation amp - bsf s8_npower ; Power-down S8 HUD - return - global enable_ir_s8 + global enable_ir_s8 enable_ir_s8: ;init serial port2 (TRISG2) - btfsc analog_o2_input - bra enable_s8 ; Start S8 + btfsc analog_o2_input + bra enable_s8 ; Start S8 - banksel BAUDCON2 - movlw b'00100000' ; BRG16=0 ; inverted for IR + banksel BAUDCON2 + movlw b'00100000' ; BRG16=0 ; inverted for IR movwf BAUDCON2 - movlw b'00100000' ; BRGH=0, SYNC=0 - movwf TXSTA2 - movlw .102 ; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16MHz - movwf SPBRG2 - movlw b'10010000' - movwf RCSTA2 - banksel common - bsf ir_power ; Power-up IR - btfss ir_power - bra $-6 - return + movlw b'00100000' ; BRGH=0, SYNC=0 + movwf TXSTA2 + movlw .102 ; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16MHz + movwf SPBRG2 + movlw b'10010000' + movwf RCSTA2 + banksel common + bsf ir_power ; Power-up IR + btfss ir_power + bra $-6 + return enable_s8: - ; Check for Digital/Analog - bsf s8_npower ; Power-down S8 HUD - WAITMS d'1' ; Very short delay - bsf mcp_power ; Power-up intrumentation amp - btfss mcp_power - bra $-6 - banksel TXSTA2 - clrf TXSTA2 - clrf RCSTA2 - banksel common + ; Check for Digital/Analog + bsf s8_npower ; Power-down S8 HUD + WAITMS d'1' ; Very short delay + bsf mcp_power ; Power-up instrumentation amp + btfss mcp_power + bra $-6 + banksel TXSTA2 + clrf TXSTA2 + clrf RCSTA2 + banksel common - ; It may be digital, check for voltage when isolator is powered - bcf s8_npower ; Power S8 HUD - WAITMS d'1' ; Very short delay + ; It may be digital, check for voltage when isolator is powered + bcf s8_npower ; Power S8 HUD + WAITMS d'1' ; Very short delay - btfsc PORTG,2 ; RX2=1? - bra enable_s8_2 ; Yes, digital - WAITMS d'30' - btfsc PORTG,2 ; RX2=1? - bra enable_s8_2 ; Yes, digital - - ; Not found, set to analog (fail-safe) + btfsc PORTG,2 ; RX2=1? + bra enable_s8_2 ; Yes, digital + WAITMS d'30' + btfsc PORTG,2 ; RX2=1? + bra enable_s8_2 ; Yes, digital + + ; Not found, set to analog (fail-safe) enable_s8_analog: - ; S8 Analog - bsf s8_npower ; Power-down S8 HUD - bcf s8_digital ; Clear flag - return + ; S8 Analog + bsf s8_npower ; Power-down S8 HUD + bcf s8_digital ; Clear flag + return -enable_s8_2: ; S8 Digital - banksel BAUDCON2 - movlw b'00000000' ; BRG16=0 ; normal for S8 +enable_s8_2: ; S8 Digital + banksel BAUDCON2 + movlw b'00000000' ; BRG16=0 ; normal for S8 movwf BAUDCON2 - movlw b'00100000' ; BRGH=0, SYNC=0 - movwf TXSTA2 - movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16MHz - movwf SPBRG2 - movlw b'10010000' - movwf RCSTA2 - banksel common - bsf s8_digital ; Set flag - return + movlw b'00100000' ; BRGH=0, SYNC=0 + movwf TXSTA2 + movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16MHz + movwf SPBRG2 + movlw b'10010000' + movwf RCSTA2 + banksel common + bsf s8_digital ; Set flag + return ;============================================================================= + global enable_rs232 enable_rs232: - call speed_normal ; 16MHz + call speed_normal ; 16MHz enable_rs232_2: - movlw T2CON_NORMAL - cpfseq T2CON - bra enable_rs232_2 ; Wait until speed is normal - bcf PORTE,0 ; Start comms + movlw T2CON_NORMAL + cpfseq T2CON + bra enable_rs232_2 ; Wait until speed is normal + bcf PORTE,0 ; Start comms ;init serial port1 (TRISC6/7) - movlw b'00100100' ; BRGH=1, SYNC=0 - movwf TXSTA1 - movlw b'10010000' - movwf RCSTA1 + movlw b'00100100' ; BRGH=1, SYNC=0 + movwf TXSTA1 + movlw b'10010000' + movwf RCSTA1 return + global disable_rs232 disable_rs232: clrf RCSTA1 - clrf TXSTA1 ; UART disable - bcf PORTC,6 ; TX hard to GND - bsf PORTE,0 ; Stop comms + clrf TXSTA1 ; UART disable + bcf PORTC,6 ; TX hard to GND + bsf PORTE,0 ; Stop comms return - + global rs232_wait_tx rs232_wait_tx: - btfss TXSTA1,TRMT ; RS232 Busy? - bra rs232_wait_tx ; yes, wait... + btfss TXSTA1,TRMT ; RS232 Busy? + bra rs232_wait_tx ; yes, wait... + + btfss ble_available ; ble available? + return ; No, done. + + btfsc NRTS ; Wait for Bluetooth module + bra rs232_wait_tx ; yes, wait... + return ; Done. - btfss ble_available ; ble available? - return ; No, done. - - btfsc NRTS ; Wait for Bluetooth module - bra rs232_wait_tx ; yes, wait... - return ; Done. - global rs232_wait_tx2 + global rs232_wait_tx2 rs232_wait_tx2: - banksel TXSTA2 + banksel TXSTA2 rs232_wait_tx2_1: - btfss TXSTA2,TRMT ; RS232 Busy? - bra rs232_wait_tx2_1 ; yes, wait... - banksel common - return ; Done. + btfss TXSTA2,TRMT ; RS232 Busy? + bra rs232_wait_tx2_1 ; yes, wait... + banksel common + return ; Done. global rs232_get_byte rs232_get_byte: - bcf rs232_recieve_overflow ; clear flag - movlw .10 - movwf uart1_temp - clrf uart2_temp - clrf uart3_temp + bcf rs232_receive_overflow ; clear flag + movlw .10 + movwf uart1_temp + clrf uart2_temp + clrf uart3_temp rs232_get_byte2: - btfsc PIR1,RCIF ; data arrived? - return ; Yes - decfsz uart3_temp,F - bra rs232_get_byte2 - decfsz uart2_temp,F + btfsc PIR1,RCIF ; data arrived? + return ; Yes + decfsz uart3_temp,F bra rs232_get_byte2 - decfsz uart1_temp,F + decfsz uart2_temp,F + bra rs232_get_byte2 + decfsz uart1_temp,F bra rs232_get_byte2 - ; timeout occoured (about 400ms) - bsf rs232_recieve_overflow ; set flag + ; timeout occurred (about 400ms) + bsf rs232_receive_overflow ; set flag rs232_get_byte3: - bcf RCSTA1,CREN ; Clear receiver status + bcf RCSTA1,CREN ; Clear receiver status bsf RCSTA1,CREN - return ; and return anyway + return ; and return anyway + +;============================================================================= + + global do_logoffset_common_write +do_logoffset_common_write: + ; TODO: limit [lo:hi] to 9999 ? may arrive here as >= 10000 because of +10 increment option + ; SIMPLER WAY: return without writing to eeprom if hi == 0x27 -> 0x2700 = 9984, this is within + ; the save range for a +10 increment, shall do it... + ; mH + + movff lo,EEDATA + write_int_eeprom 0x0D + movff hi,EEDATA + write_int_eeprom 0x0E + return + + global do_logoffset_common_read +do_logoffset_common_read: + clrf EEADRH + read_int_eeprom 0x0D + movff EEDATA,lo + read_int_eeprom 0x0E + movff EEDATA,hi ; Existing logbook offset into lo:hi + return + + + global update_battery_registers +update_battery_registers: + ; save battery_gauge:6 into EEPROM 0x07-0x0C + clrf EEADRH + movff battery_gauge+0,EEDATA + write_int_eeprom 0x07 + movff battery_gauge+1,EEDATA + write_int_eeprom 0x08 + movff battery_gauge+2,EEDATA + write_int_eeprom 0x09 + movff battery_gauge+3,EEDATA + write_int_eeprom 0x0A + movff battery_gauge+4,EEDATA + write_int_eeprom 0x0B + movff battery_gauge+5,EEDATA + write_int_eeprom 0x0C + movff battery_type,EEDATA ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + write_int_eeprom 0x0F + return + + + global vault_decodata_into_eeprom +vault_decodata_into_eeprom: + ; Vault in EEPROM 512...1023 + ; Write 0xAA at 512 to indicate valid data in vault + ; Store last time/date + ; Store 0x700 to 0x780 (pres_tissue_N2 and pres_tissue_He) + movlw HIGH .512 ; =2 + movwf EEADRH + movlw 0xAA + movwf EEDATA + write_int_eeprom .0 + ; Store date/time + movff year,EEDATA + write_int_eeprom .1 + movff month,EEDATA + write_int_eeprom .2 + movff day,EEDATA + write_int_eeprom .3 + movff hours,EEDATA + write_int_eeprom .4 + movff mins,EEDATA + write_int_eeprom .5 + movff secs,EEDATA + write_int_eeprom .6 + + movff int_O_CNS_fraction+0,EEDATA + write_int_eeprom .7 + movff int_O_CNS_fraction+1,EEDATA + write_int_eeprom .8 + movff int_O_desaturation_time+0,EEDATA + write_int_eeprom .9 + movff int_O_desaturation_time+1,EEDATA + write_int_eeprom .10 + movff surface_interval+0,EEDATA + write_int_eeprom .11 + movff surface_interval+1,EEDATA + write_int_eeprom .12 + movff int_O_gradient_factor+0,EEDATA ; value limited to 255, only lower byte in use for value + write_int_eeprom .13 + movff int_O_nofly_time+0,EEDATA + write_int_eeprom .14 + movff int_O_nofly_time+1,EEDATA + write_int_eeprom .15 - END \ No newline at end of file + ; Tissue data from 16 to 144 + movlw .16 + movwf EEADR + movlw .128 + movwf lo + lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128Bytes +vault_decodata_into_eeprom2: + movff POSTINC1,EEDATA + call write_eeprom ; EEDATA into EEPROM@EEADR + incf EEADR,F + decfsz lo,F ; All done? + bra vault_decodata_into_eeprom2 ; No + clrf EEADRH + return + + global restore_decodata_from_eeprom +restore_decodata_from_eeprom: + movlw LOW .512 ; =0 + movwf EEADR + movlw HIGH .512 ; =2 + movwf EEADRH + + ; Restore date/time + read_int_eeprom .1 + movff EEDATA,year + read_int_eeprom .2 + movff EEDATA,month + read_int_eeprom .3 + movff EEDATA,day + read_int_eeprom .4 + movff EEDATA,hours + read_int_eeprom .5 + movff EEDATA,mins + read_int_eeprom .6 + movff EEDATA,secs + call rtc_set_rtc + + read_int_eeprom .7 + movff EEDATA,int_O_CNS_fraction+0 + read_int_eeprom .8 + movff EEDATA,int_O_CNS_fraction+1 + read_int_eeprom .9 + movff EEDATA,int_O_desaturation_time+0 + read_int_eeprom .10 + movff EEDATA,int_O_desaturation_time+1 + read_int_eeprom .11 + movff EEDATA,surface_interval+0 + read_int_eeprom .12 + movff EEDATA,surface_interval+1 + read_int_eeprom .13 + movff EEDATA,int_O_gradient_factor+0 + read_int_eeprom .14 + movff EEDATA,int_O_nofly_time+0 + read_int_eeprom .15 + movff EEDATA,int_O_nofly_time+1 + + ; Tissue data from 16 to 144 + movlw .16 + movwf EEADR + movlw .128 + movwf lo + lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128Bytes +restore_decodata_from_eeprom2: + call read_eeprom ; EEPROM@EEADR into EEDATA + movff EEDATA,POSTINC1 + incf EEADR,F + decfsz lo,F ; All done? + bra restore_decodata_from_eeprom2 ; No + clrf EEADRH + return + + + global reset_battery_internal_only +reset_battery_internal_only: + clrf EEADRH + clrf EEDATA ; Delete to zero + write_int_eeprom 0x07 + write_int_eeprom 0x08 + write_int_eeprom 0x09 + write_int_eeprom 0x0A + write_int_eeprom 0x0B + write_int_eeprom 0x0C + banksel battery_gauge+0 + clrf battery_gauge+0 + clrf battery_gauge+1 + clrf battery_gauge+2 + clrf battery_gauge+3 + clrf battery_gauge+4 + clrf battery_gauge+5 + banksel common + movlw .100 + movwf batt_percent + return + + + global eeprom_reset_logbook_pointers +eeprom_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 .16 + write_int_eeprom .17 ; And the backup counter, too + return + + END diff -r f5de1ff88814 -r b455b31ce022 src/eeprom_rs232.inc --- a/src/eeprom_rs232.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/eeprom_rs232.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File eeprom_rs232.inc +; File eeprom_rs232.inc V2.98 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,24 +8,34 @@ ; HISTORY ; 2011-08-03 : [mH] moving from OSTC code + write_int_eeprom macro eeprom_address movlw eeprom_address call write_int_eeprom_1 endm -read_int_eeprom macro eeprom_address +read_int_eeprom macro eeprom_address movlw eeprom_address call read_int_eeprom_1 endm + + extern enable_rs232 + extern disable_rs232 + extern rs232_get_byte + extern rs232_wait_tx + extern rs232_wait_tx2 + extern enable_ir_s8 + extern disable_ir_s8 + extern write_int_eeprom_1 extern read_int_eeprom_1 extern read_eeprom extern write_eeprom - extern enable_rs232 - extern disable_rs232 - extern rs232_get_byte - extern rs232_wait_tx - extern rs232_wait_tx2 - extern enable_ir_s8 - extern disable_ir_s8 + extern update_battery_registers + extern vault_decodata_into_eeprom + extern restore_decodata_from_eeprom + extern do_logoffset_common_write + extern do_logoffset_common_read + extern reset_battery_internal_only + extern eeprom_reset_logbook_pointers diff -r f5de1ff88814 -r b455b31ce022 src/external_flash.asm --- a/src/external_flash.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/external_flash.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File external_flash.asm +; File external_flash.asm ## V2.98 ; ; External flash ; @@ -12,333 +12,335 @@ #include "hwos.inc" #include "wait.inc" -basic CODE +basic CODE ;============================================================================= - global incf_ext_flash_address_p1 + global incf_ext_flash_address_p1 incf_ext_flash_address_p1: ; Increase by one movlw .1 global incf_ext_flash_address0 incf_ext_flash_address0: - addwf ext_flash_address+0,F ; increase address - movlw d'0' - addwfc ext_flash_address+1,F - addwfc ext_flash_address+2,F + addwf ext_flash_address+0,F ; increase address + movlw d'0' + addwfc ext_flash_address+1,F + addwfc ext_flash_address+2,F - movlw 0x40 - cpfseq ext_flash_address+2 ; at address 40FFFF? + movlw 0x40 + cpfseq ext_flash_address+2 ; at address 40FFFF? return ; No, return -; clrf ext_flash_address+0 -; clrf ext_flash_address+1 - clrf ext_flash_address+2 ; Yes, rollover to 0x000000 +; clrf ext_flash_address+0 +; clrf ext_flash_address+1 + clrf ext_flash_address+2 ; Yes, rollover to 0x000000 return - global incf_ext_flash_address0_p1_0x20 + + global incf_ext_flash_address0_p1_0x20 incf_ext_flash_address0_p1_0x20: ; Increase by one - movlw .1 + movlw .1 - global incf_ext_flash_address0_0x20 -incf_ext_flash_address0_0x20: ; with roll-over at 0x200000 to 0x000000 - addwf ext_flash_address+0,F ; increase address - movlw d'0' - addwfc ext_flash_address+1,F - addwfc ext_flash_address+2,F + global incf_ext_flash_address0_0x20 +incf_ext_flash_address0_0x20: ; with roll-over at 0x200000 to 0x000000 + addwf ext_flash_address+0,F ; increase address + movlw d'0' + addwfc ext_flash_address+1,F + addwfc ext_flash_address+2,F + movlw 0x20 + cpfseq ext_flash_address+2 ; at address 0x200000? + return ; No, return +; clrf ext_flash_address+0 +; clrf ext_flash_address+1 + clrf ext_flash_address+2 ; Yes, rollover to 0x000000 + return - movlw 0x20 - cpfseq ext_flash_address+2 ; at address 0x200000? - return ; No, return -; clrf ext_flash_address+0 -; clrf ext_flash_address+1 - clrf ext_flash_address+2 ; Yes, rollover to 0x000000 - return global decf_ext_flash_address0 decf_ext_flash_address0: - subwf ext_flash_address+0,F ; decrease address: do a 16-8bits substract. - movlw d'0' - subwfb ext_flash_address+1,F - movlw d'0' - subwfb ext_flash_address+2,F - - btfss ext_flash_address+2,7 ; Rollover to 0xFFFFFF? + subwf ext_flash_address+0,F ; decrease address: do a 16-8bits subtract + movlw d'0' + subwfb ext_flash_address+1,F + movlw d'0' + subwfb ext_flash_address+2,F + btfss ext_flash_address+2,7 ; Rollover to 0xFFFFFF? return ; No, return - clrf ext_flash_address+2 ; Set to 0x00FFFFF - setf ext_flash_address+1 - setf ext_flash_address+0 + clrf ext_flash_address+2 ; Set to 0x00FFFFF + setf ext_flash_address+1 + setf ext_flash_address+0 return - global ext_flash_byte_read_plus ; Return data read in WREG and SSP2BUF and -ext_flash_byte_read_plus: ; increase address after read + + global ext_flash_byte_read_plus ; Return data read in WREG and SSP2BUF and +ext_flash_byte_read_plus: ; increase address after read rcall ext_flash_byte_read - movwf temp1 ; store received data - bra incf_ext_flash_address_p1 ; +1 and return + movwf ext_flash_rw ; store received data + bra incf_ext_flash_address_p1 ; +1 and return - global ext_flash_byte_read_plus_0x20; Return data read in WREG and SSP2BUF and -ext_flash_byte_read_plus_0x20: ; increase address after read with banking at 0x200000 + + global ext_flash_byte_read_plus_0x20 ; Return data read in WREG and SSP2BUF and +ext_flash_byte_read_plus_0x20: ; increase address after read with banking at 0x200000 rcall ext_flash_byte_read - movwf temp1 ; store received data - bra incf_ext_flash_address0_p1_0x20 ;+1 and return + movwf ext_flash_rw ; store received data + bra incf_ext_flash_address0_p1_0x20 ;+1 and return - global ext_flash_byte_read ; Return data read in WREG + global ext_flash_byte_read ; Return data read in WREG ext_flash_byte_read: - movlw 0x03 ; Read command - rcall write_spi - rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI - rcall write_spi ; Dummy write to read data into WREG - bsf flash_ncs ; CS=1 - movwf temp1 - return ; Return data read in WREG and temp1 + movlw 0x03 ; Read command + rcall write_spi + rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI + rcall write_spi ; Dummy write to read data into WREG + bsf flash_ncs ; CS=1 + movwf ext_flash_rw + return ; Return data read in WREG and ext_flash_rw + -ext_flash_write_address: ; Write 24bit address ext_flash_address:3 via SPI - movf ext_flash_address+2,W ; 24Bit Address - rcall write_spi - movf ext_flash_address+1,W - rcall write_spi - movf ext_flash_address+0,W - bra write_spi ; And return.... +ext_flash_write_address: ; Write 24bit address ext_flash_address:3 via SPI + movf ext_flash_address+2,W ; 24Bit Address + rcall write_spi + movf ext_flash_address+1,W + rcall write_spi + movf ext_flash_address+0,W + bra write_spi ; And return.... + global ext_flash_read_block_start ; Return data read in WREG ext_flash_read_block_start: - movlw 0x03 ; Read command - rcall write_spi - rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI - rcall write_spi ; Dummy write to read data into WREG - return ; Return data read in WREG + movlw 0x03 ; Read command + rcall write_spi + rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI + rcall write_spi ; Dummy write to read data into WREG + return ; Return data read in WREG - global ext_flash_read_block ; Return data read in WREG + + global ext_flash_read_block ; Return data read in WREG ext_flash_read_block: - rcall incf_ext_flash_address_p1 ; Increase address +1 - bra write_spi1 ; Dummy write to read data into WREG and return + rcall incf_ext_flash_address_p1 ; Increase address +1 + bra write_spi1 ; Dummy write to read data into WREG and return + - global ext_flash_read_block_stop ; Return data read in WREG + global ext_flash_read_block_stop ; Return data read in WREG ext_flash_read_block_stop: - bsf flash_ncs ; CS=1 - return ; NO data in WREG + bsf flash_ncs ; CS=1 + return ; NO data in WREG + global write_byte_ext_flash_plus_header -write_byte_ext_flash_plus_header: ; Write from WREG and increase address after write - movwf temp1 ; store data +write_byte_ext_flash_plus_header: ; Write from WREG and increase address after write + movwf ext_flash_rw ; store data ; test if write is done at first byte of 4kB block ; if yes -> delete 4kB block first - tstfsz ext_flash_address+0 ; at 0x00? - bra write_byte_ext_flash_plus_h1 ; No, normal Write + tstfsz ext_flash_address+0 ; at 0x00? + bra write_byte_ext_flash_plus_h1 ; No, normal Write + movf ext_flash_address+1,W + andlw 0x0F ; Mask lower nibble + tstfsz WREG ; at 0x.0? + bra write_byte_ext_flash_plus_h1 ; No, normal Write + ; At beginning of 4kB block -> erase first! + rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 +write_byte_ext_flash_plus_h1: + movf ext_flash_rw,W + rcall ext_flash_byte_write ; Write the byte + bra incf_ext_flash_address_p1 ; +1 and return - movf ext_flash_address+1,W - andlw 0x0F ; Mask lower nibble - tstfsz WREG ; at 0x.0? - bra write_byte_ext_flash_plus_h1; No, normal Write - - ; At beginning of 4kB block -> rease first! - rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 -write_byte_ext_flash_plus_h1: - movf temp1,W - rcall ext_flash_byte_write ; Write the byte - bra incf_ext_flash_address_p1 ; +1 and return - global write_byte_ext_flash_plus_nocnt ; No increase of ext_flash_dive_counter:3 + global write_byte_ext_flash_plus_nocnt ; No increase of ext_flash_dive_counter:3 write_byte_ext_flash_plus_nocnt: - movwf temp1 ; store data - bra write_byte_ext_flash_plus2 + movwf ext_flash_rw ; store data + bra write_byte_ext_flash_plus2 + - global write_byte_ext_flash_plus_nodel ; Does NOT delete 4kB Page when required -write_byte_ext_flash_plus_nodel: ; Write from WREG and increase address after write with banking at 0x200000 - movwf temp1 ; store data - bra write_byte_ext_flash_plus1 ; Ignore possible begin of 4kB page, there have been written 0xFF already + global write_byte_ext_flash_plus_nodel ; Does NOT delete 4kB Page when required +write_byte_ext_flash_plus_nodel: ; Write from WREG and increase address after write with banking at 0x200000 + movwf ext_flash_rw ; store data + bra write_byte_ext_flash_plus1 ; Ignore possible begin of 4kB page, there have been written 0xFF already - global write_byte_ext_flash_plus ; Write from WREG and increase address after write with banking at 0x200000 + global write_byte_ext_flash_plus ; Write from WREG and increase address after write with banking at 0x200000 write_byte_ext_flash_plus: - movwf temp1 ; store data - - ; First, increase dive length counter - incf ext_flash_dive_counter+0,F - movlw .0 - addwfc ext_flash_dive_counter+1,F - addwfc ext_flash_dive_counter+2,F ; 24bit++ + movwf ext_flash_rw ; store data + ; First, increase dive length counter + incf ext_flash_dive_counter+0,F + movlw .0 + addwfc ext_flash_dive_counter+1,F + addwfc ext_flash_dive_counter+2,F ; 24bit++ write_byte_ext_flash_plus2: ; Now test if write is done at first byte of 4kB block ; if yes -> delete 4kB block first - tstfsz ext_flash_address+0 ; at 0x00? - bra write_byte_ext_flash_plus1 ; No, normal Write + tstfsz ext_flash_address+0 ; at 0x00? + bra write_byte_ext_flash_plus1 ; No, normal Write + movf ext_flash_address+1,W + andlw 0x0F ; Mask lower nibble + tstfsz WREG ; at 0x.0? + bra write_byte_ext_flash_plus1 ; No, normal Write + ; At beginning of 4kB block -> erase first! + rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 +write_byte_ext_flash_plus1: + movf ext_flash_rw,W + rcall ext_flash_byte_write ; Write the byte + bra incf_ext_flash_address0_p1_0x20 ; +1 and roll over at 0x200000 to 0x000000 and return - movf ext_flash_address+1,W - andlw 0x0F ; Mask lower nibble - tstfsz WREG ; at 0x.0? - bra write_byte_ext_flash_plus1 ; No, normal Write - - ; At beginning of 4kB block -> erase first! - rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 -write_byte_ext_flash_plus1: - movf temp1,W - rcall ext_flash_byte_write ; Write the byte - bra incf_ext_flash_address0_p1_0x20 ; +1 and roll over at 0x200000 to 0x000000 and return - global ext_flash_byte_write ; Write from WREG + global ext_flash_byte_write ; Write from WREG ext_flash_byte_write: - movwf temp1 ; store data byte - bsf flash_ncs ; CS=1 - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x02 ; Write (PP, Page-Program) command - rcall write_spi - rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI - movf temp1,W ; load data byte - rcall write_spi ; write one byte of data! - bra ext_flash_wait_write ; And return... + movwf ext_flash_rw ; store data byte + bsf flash_ncs ; CS=1 + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x02 ; Write (PP, Page-Program) command + rcall write_spi + rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI + movf ext_flash_rw,W ; load data byte + rcall write_spi ; write one byte of data! + bra ext_flash_wait_write ; And return... - global ext_flash_byte_write_comms ; without wait, ~86us fixed delay due to 115200 Bauds + + global ext_flash_byte_write_comms ; without wait, ~86us fixed delay due to 115200 Bauds ext_flash_byte_write_comms: - movwf temp1 ; store data byte - bsf flash_ncs ; CS=1 - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x02 ; Write (PP, Page-Program) command - rcall write_spi - rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI - movf temp1,W ; load data byte - rcall write_spi ; write one byte of data! - bsf flash_ncs ; CS=1 + movwf ext_flash_rw ; store data byte + bsf flash_ncs ; CS=1 + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x02 ; Write (PP, Page-Program) command + rcall write_spi + rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI + movf ext_flash_rw,W ; load data byte + rcall write_spi ; write one byte of data! + bsf flash_ncs ; CS=1 return - - global ext_flash_disable_protection ; Disable write protection -ext_flash_disable_protection: - ; unlock old memory - bsf flash_ncs ; CS=1 - movlw 0x50 ; EWSR command - rcall write_spi - bsf flash_ncs ; CS=1 + - movlw 0x01 ; WRSR command - rcall write_spi - movlw b'00000000' ; New status - rcall write_spi - bsf flash_ncs ; CS=1 - - ; unlock new memory - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x98 ; ULBPR command - rcall write_spi - bsf flash_ncs ; CS=1 - - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x42 ; WBPR command - rcall write_spi - movlw .18 - movwf temp2 + global ext_flash_disable_protection ; Disable write protection +ext_flash_disable_protection: + ; unlock old memory + bsf flash_ncs ; CS=1 + movlw 0x50 ; EWSR command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x01 ; WRSR command + rcall write_spi + movlw b'00000000' ; New status + rcall write_spi + bsf flash_ncs ; CS=1 + ; unlock new memory + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x98 ; ULBPR command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x42 ; WBPR command + rcall write_spi + movlw .18 + movwf lo ext_flash_disable_protection2: - movlw 0x00 - rcall write_spi - decfsz temp2,F ; 18 bytes with 0x00 - bra ext_flash_disable_protection2 - bsf flash_ncs ; CS=1 + movlw 0x00 + rcall write_spi + decfsz lo,F ; 18 bytes with 0x00 + bra ext_flash_disable_protection2 + bsf flash_ncs ; CS=1 return global ext_flash_enable_protection ext_flash_enable_protection: - ; lock old memory - bsf flash_ncs ; CS=1 - movlw 0x50 ; EWSR command - rcall write_spi - bsf flash_ncs ; CS=1 - - movlw 0x01 ; WRSR command - rcall write_spi - movlw b'00011100' ; New status (Write protect on) - rcall write_spi - bsf flash_ncs ; CS=1 - - ; lock new memory -; movlw 0x06 ; WREN command -; rcall write_spi -; bsf flash_ncs ; CS=1 -; movlw 0x8D ; LBPR command -; rcall write_spi -; bsf flash_ncs ; CS=1 - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x42 ; WBPR command - rcall write_spi - movlw .18 - movwf temp2 + ; lock old memory + bsf flash_ncs ; CS=1 + movlw 0x50 ; EWSR command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x01 ; WRSR command + rcall write_spi + movlw b'00011100' ; New status (Write protect on) + rcall write_spi + bsf flash_ncs ; CS=1 + ; lock new memory +; movlw 0x06 ; WREN command +; rcall write_spi +; bsf flash_ncs ; CS=1 +; movlw 0x8D ; LBPR command +; rcall write_spi +; bsf flash_ncs ; CS=1 + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x42 ; WBPR command + rcall write_spi + movlw .18 + movwf lo ext_flash_enable_protection2: - movlw 0xFF - rcall write_spi - decfsz temp2,F ; 18 bytes with 0xFF - bra ext_flash_enable_protection2 - bsf flash_ncs ; CS=1 + movlw 0xFF + rcall write_spi + decfsz lo,F ; 18 bytes with 0xFF + bra ext_flash_enable_protection2 + bsf flash_ncs ; CS=1 return - global ext_flash_erase4kB ; Erases 4kB sector + global ext_flash_erase4kB ; Erases 4kB sector ext_flash_erase4kB: - bsf flash_ncs ; CS=1 - movlw 0x06 ; WREN command - rcall write_spi - bsf flash_ncs ; CS=1 - movlw 0x20 ; Sector erase command - rcall write_spi - rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI -; bra ext_flash_wait_write ; Wait for write... and return + bsf flash_ncs ; CS=1 + movlw 0x06 ; WREN command + rcall write_spi + bsf flash_ncs ; CS=1 + movlw 0x20 ; Sector erase command + rcall write_spi + rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI +; bra ext_flash_wait_write ; Wait for write... and return ext_flash_wait_write: - bsf flash_ncs ; CS=1 -; WAITMS d'1' ; TBE/TSE=25ms... - movlw 0x05 ; RDSR command - rcall write_spi ; Read status - rcall write_spi ; Read status into WREG - bsf flash_ncs ; CS=1 - btfsc SSP2BUF,0 ; Write operation in process? - bra ext_flash_wait_write ; Yes, wait more.. + bsf flash_ncs ; CS=1 +; WAITMS d'1' ; TBE/TSE=25ms... + movlw 0x05 ; RDSR command + rcall write_spi ; Read status + rcall write_spi ; Read status into WREG + bsf flash_ncs ; CS=1 + btfsc SSP2BUF,0 ; Write operation in process? + bra ext_flash_wait_write ; Yes, wait more.. return - global ext_flash_erase_logbook ; erases logbook memory (000000h -> 2FFFFFh -> 3MByte -> 3145728 Bytes) + + global ext_flash_erase_logbook ; erases logbook memory (000000h -> 2FFFFFh -> 3MByte -> 3145728 Bytes) ext_flash_erase_logbook: - bsf flash_ncs ; CS=1 - clrf ext_flash_address+0 - clrf ext_flash_address+1 - clrf ext_flash_address+2 + bsf flash_ncs ; CS=1 + clrf ext_flash_address+0 + clrf ext_flash_address+1 + clrf ext_flash_address+2 - setf temp1 ; 256*12kB=3145728 Bytes + setf ext_flash_rw ; 256*12kB=3145728 Bytes ext_flash_erase_logbook_loop: - rcall ext_flash_erase4kB ; 4kB - rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB - rcall ext_flash_erase4kB ; 4kB - rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB - rcall ext_flash_erase4kB ; 4kB - rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB - decfsz temp1,F - bra ext_flash_erase_logbook_loop + rcall ext_flash_erase4kB ; 4kB + rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB + rcall ext_flash_erase4kB ; 4kB + rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB + rcall ext_flash_erase4kB ; 4kB + rcall ext_flash_add_4kB ; Increase ext_flash_address:3 by 4kB + decfsz ext_flash_rw,F + bra ext_flash_erase_logbook_loop return ext_flash_add_4kB: - movlw 0x10 - addwf ext_flash_address+1,F - movlw d'0' - addwfc ext_flash_address+2,F - return + movlw 0x10 + addwf ext_flash_address+1,F + movlw d'0' + addwfc ext_flash_address+2,F + return -write_spi: ; With data in WREG... - bcf flash_ncs ; CS +write_spi: ; With data in WREG... + bcf flash_ncs ; CS global write_spi1 -write_spi1: ; With data in WREG... - bcf SSP2STAT,WCOL ; Clear flag - movwf SSP2BUF ; Write to buffer - btfsc SSP2STAT,WCOL ; Was buffer full? - bra write_spi1 ; Yes, try again +write_spi1: ; With data in WREG... + bcf SSP2STAT,WCOL ; Clear flag + movwf SSP2BUF ; Write to buffer + btfsc SSP2STAT,WCOL ; Was buffer full? + bra write_spi1 ; Yes, try again +write_spi2: ; Wait for write command + btfss SSP2STAT, BF ; Buffer full? + bra write_spi2 ; No, wait. + movf SSP2BUF,W + return ; Returns RX data in WREG and SSP2BUF -write_spi2: ; Wait for write command - btfss SSP2STAT, BF ; Buffer full? - bra write_spi2 ; No, wait. - movf SSP2BUF,W - return ; Returns RX data in WREG and SSP2BUF - - END \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/external_flash.inc --- a/src/external_flash.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/external_flash.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File external_flash.inc +; File external_flash.inc V2.98 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -9,51 +9,54 @@ ; 2011-08-12 : [mH] creation ; Misc - extern incf_ext_flash_address_p1 ; +1 for the ext_flash_address:3 - extern ext_flash_disable_protection; Disables write protection - extern ext_flash_enable_protection ; Enables write protection - + extern incf_ext_flash_address_p1 ; +1 for the ext_flash_address:3 + extern ext_flash_disable_protection ; Disables write protection + extern ext_flash_enable_protection ; Enables write protection + ; Writes - extern write_byte_ext_flash_plus ; Write from WREG and increase address after write with banking at 0x200000 - extern write_byte_ext_flash_plus_nocnt ; No increase of ext_flash_dive_counter:3 - extern write_byte_ext_flash_plus_nodel ; Does NOT delete 4kB Page when required - extern write_byte_ext_flash_plus_header ; Write from WREG and increase address after write - extern ext_flash_byte_write ; Writes one byte from WREG @ext_flash_address:3 - extern ext_flash_byte_write_comms ; without wait, ~86us fixed delay due to 115200 Bauds (Use with caution) - extern write_spi1 ; Just (dummy)write to read a byte + extern write_byte_ext_flash_plus ; Write from WREG and increase address after write with banking at 0x200000 + extern write_byte_ext_flash_plus_nocnt ; No increase of ext_flash_dive_counter:3 + extern write_byte_ext_flash_plus_nodel ; Does NOT delete 4kB Page when required + extern write_byte_ext_flash_plus_header ; Write from WREG and increase address after write + extern ext_flash_byte_write ; Writes one byte from WREG @ext_flash_address:3 + extern ext_flash_byte_write_comms ; without wait, ~86us fixed delay due to 115200 Bauds (Use with caution) + extern write_spi1 ; Just (dummy)write to read a byte -; Delelte - extern ext_flash_erase_logbook ; erases logbook memory (000000h -> 2FFFFFh -> 3MByte) - extern ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 - +; Delete + extern ext_flash_erase_logbook ; erases logbook memory (000000h -> 2FFFFFh -> 3MByte) + extern ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3 + ; Reads - extern ext_flash_read_block_start ; Block read start and reads one byte@ext_flash_address:3 into WREG - extern ext_flash_read_block ; Read another byte into WREG - extern ext_flash_read_block_stop ; Stop block read - extern ext_flash_byte_read ; Reads one byte@ext_flash_address:3 into WREG and temp1 - extern ext_flash_byte_read_plus ; Return data read in WREG and temp1 and increase address after read with banking at 0x200000 - extern ext_flash_byte_read_plus_0x20; Return data read in WREG and temp1 + extern ext_flash_read_block_start ; Block read start and reads one byte@ext_flash_address:3 into WREG + extern ext_flash_read_block ; Read another byte into WREG + extern ext_flash_read_block_stop ; Stop block read + extern ext_flash_byte_read ; Reads one byte@ext_flash_address:3 into WREG and ext_flash_rw + extern ext_flash_byte_read_plus ; Return data read in WREG and ext_flash_rw and increase address after read with banking at 0x200000 + extern ext_flash_byte_read_plus_0x20 ; Return data read in WREG and ext_flash_rw + ; Will decrease ext_flash_address:2 with the 8Bit value "ext_flash_temp1" extern decf_ext_flash_address0 decf_ext_flash_address macro ext_flash_temp1 - movlw ext_flash_temp1 - call decf_ext_flash_address0 - endm - - extern incf_ext_flash_address0 -; Will increase ext_flash_address:2 with the 8Bit value "ext_flash_temp1" -incf_ext_flash_address macro ext_flash_temp1 - movlw ext_flash_temp1 - call incf_ext_flash_address0 - endm - -; With banking at 0x200000 - extern incf_ext_flash_address0_0x20 -; Will increase ext_flash_address:2 with the 8Bit value "ext_flash_temp1" -incf_ext_flash_address_0x20 macro ext_flash_temp1 - movlw ext_flash_temp1 - call incf_ext_flash_address0_0x20 + movlw ext_flash_temp1 + call decf_ext_flash_address0 endm +; Will increase ext_flash_address:2 with the 8Bit value "ext_flash_temp1" + extern incf_ext_flash_address0 +incf_ext_flash_address macro ext_flash_temp1 + movlw ext_flash_temp1 + call incf_ext_flash_address0 + endm + + +; With banking at 0x200000 +; Will increase ext_flash_address:2 with the 8Bit value "ext_flash_temp1" + extern incf_ext_flash_address0_0x20 +incf_ext_flash_address_0x20 macro ext_flash_temp1 + movlw ext_flash_temp1 + call incf_ext_flash_address0_0x20 + endm + + diff -r f5de1ff88814 -r b455b31ce022 src/gaslist.asm --- a/src/gaslist.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/gaslist.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File gaslist.asm ## V2.95 +; File gaslist.asm ## V2.98 ; ; Managing OSTC gas list ; @@ -9,738 +9,718 @@ ; HISTORY ; 2011-08-11 : [jDG] Creation. -#include "hwos.inc" ; Mandatory header -#include "convert.inc" -#include "math.inc" ; div16x16 for MOD calculations -#include "strings.inc" -#include "tft.inc" -#include "tft_outputs.inc" - -#include "shared_definitions.h" +#include "hwos.inc" ; Mandatory header +#include "convert.inc" +#include "math.inc" ; div16x16 for MOD calculations +#include "strings.inc" +#include "tft.inc" +#include "tft_outputs.inc" +#include "shared_definitions.h" - CBLOCK tmp+0x40 ; Keep space for menu processor - gaslist_gas ; Check ram position in menu_tree.asm, too! - gaslist_O2 - gaslist_He - gaslist_depth - gaslist_Type - ; Reserved to tmp+0x5F - ENDC + extern convert_mbar_to_feet + extern customview_show_mix + extern tGasDisabled + extern tDilDisabled + extern tbar - extern convert_mbar_to_feet +gui CODE -gui CODE ;============================================================================= ; Append gas description to current string. -; Input: PRODL : gas number (0..4) -; FSR2 : Current string position. +; Input: PRODL : gas number (0..4) +; FSR2 : Current string position. ; Output: Text appended into buffer pointed by FSR2. - extern customview_show_mix - global gaslist_strcat_gas + + global gaslist_strcat_gas gaslist_strcat_gas: - rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) - ; Retrieve gas definition: + rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) + ; Retrieve gas definition: gaslist_strcat_gas_0: - movf gaslist_gas,W - lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] - movff PLUSW1,gaslist_O2 - movf gaslist_gas,W - lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] - movff PLUSW1,gaslist_He - - movff gaslist_O2,lo - movff gaslist_He,hi - goto customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN - - + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; O2 ratio + ;movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; He ratio + goto customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN ;============================================================================= ; Append current mix to current string (For divemode) ; Input: FSR2 : Current string position. ; Output: Text appended into buffer pointed by FSR2. - global gaslist_strcat_gas6 -gaslist_strcat_gas6: ; Show current O2/He mix - STRCAT_TEXT tGas - STRCAT ": " - movff gas6_O2_ratio,lo - movff gas6_He_ratio,hi - goto customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN + global gaslist_strcat_gas6 +gaslist_strcat_gas6: ; Show current O2/He mix + STRCAT_TEXT tGas + STRCAT ": " + movff gas6_O2_ratio,lo + movff gas6_He_ratio,hi + goto customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN - global gaslist_show_type - extern tGasDisabled - extern tDilDisabled + + global gaslist_show_type gaslist_show_type: - movf gaslist_gas,W - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,gaslist_Type - STRCAT_TEXT tType - lfsr FSR1,tGasDisabled ; Base text number - btfsc ccr_diluent_setup ; In CCR setup? - lfsr FSR1,tDilDisabled ; Base text number - movff gaslist_Type,WREG ; 0-3 - rlncf WREG ; x2 - addwf FSR1L,F - movlw .0 - addwfc FSR1H,F - call strcat_text - return + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,lo ; lo holds gas type + STRCAT_TEXT tType + lfsr FSR1,tGasDisabled ; Base text number + btfsc ccr_diluent_setup ; In CCR setup? + lfsr FSR1,tDilDisabled ; Base text number + movff lo,WREG ; 0-3 + rlncf WREG ; x2 + addwf FSR1L,F + movlw .0 + addwfc FSR1H,F + call strcat_text + return - global gaslist_toggle_type + global gaslist_toggle_type gaslist_toggle_type: - movf gaslist_gas,W - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,gaslist_Type - incf gaslist_Type,F ; 0-3/0-2 - btfsc ccr_diluent_setup ; In CCR setup? - bra gaslist_toggle_type2 ; Yes - btfsc gaslist_Type,2 ; >3? - clrf gaslist_Type ; Clear to zero - movff gaslist_Type,PLUSW1 ; Copy back result - return - + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,lo ; lo holds gas type + incf lo,F ; 0-3/0-2 + btfsc ccr_diluent_setup ; In CCR setup? + bra gaslist_toggle_type2 ; Yes + btfsc lo,2 ; >3? + clrf lo ; Clear to zero + movff lo,PLUSW1 ; Copy back result + return gaslist_toggle_type2: - movlw .3 - cpfslt gaslist_Type ; >2? - clrf gaslist_Type ; Clear to zero - movf gaslist_gas,W - movff gaslist_Type,PLUSW1 ; Copy back result - return + movlw .3 + cpfslt lo ; >2? + clrf lo ; Clear to zero + movf gaslist_gas,W + movff lo,PLUSW1 ; Copy back result + return - global gaslist_setSP + global gaslist_setSP gaslist_setSP: - movff PRODL,gaslist_gas ; 0-4 - return + movff PRODL,gaslist_gas ; 0-4 + return - extern tbar - global gaslist_strcat_setpoint - global gaslist_strcat_setpoint_0 + + global gaslist_strcat_setpoint + global gaslist_strcat_setpoint_0 gaslist_strcat_setpoint: - call gaslist_setSP + call gaslist_setSP gaslist_strcat_setpoint_0: - bsf leftbind - btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - bra gaslist_strcat_setpoint2 ; Short version - STRCAT_TEXT tSP - incf gaslist_gas,W - movwf lo - output_8 - bcf leftbind - PUTC ":" -gaslist_strcat_setpoint2: ; Short version - btfsc divemode - bra gaslist_strcat_setpoint4 ; no "*" in divemode - movf gaslist_gas,W ; Number-1 into WREG - bnz gaslist_strcat_setpoint3 ; Not SP1 - PUTC "*" - bra gaslist_strcat_setpoint4 + bsf leftbind + btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bra gaslist_strcat_setpoint2 ; Short version + STRCAT_TEXT tSP + incf gaslist_gas,W + movwf lo + output_8 + bcf leftbind + PUTC ":" +gaslist_strcat_setpoint2: ; Short version + btfsc divemode + bra gaslist_strcat_setpoint4 ; no "*" in divemode + movf gaslist_gas,W ; Number-1 into WREG + bnz gaslist_strcat_setpoint3 ; Not SP1 + PUTC "*" + bra gaslist_strcat_setpoint4 gaslist_strcat_setpoint3: - PUTC " " + PUTC " " gaslist_strcat_setpoint4: - movf gaslist_gas,W - lfsr FSR1,char_I_setpoint_cbar - movf PLUSW1,W - movwf lo - clrf hi - bsf leftbind - output_16dp d'3' - btfsc divemode - bra gaslist_strcat_setpoint5 ; Skip text in divemode - STRCAT_TEXT tbar + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_cbar + movf PLUSW1,W + movwf lo + clrf hi + bsf leftbind + output_16dp d'3' + btfsc divemode + bra gaslist_strcat_setpoint5 ; Skip text in divemode + STRCAT_TEXT tbar gaslist_strcat_setpoint5: - PUTC " " - ; Read switch depth - movf gaslist_gas,W - lfsr FSR1,char_I_setpoint_change - movff PLUSW1,lo - - bsf ccr_diluent_setup ; inhibit output of "----" for depth - call gaslist_strcat_5 - bcf ccr_diluent_setup + PUTC " " + ; Read switch depth + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,lo + + bsf ccr_diluent_setup ; inhibit output of "----" for depth + call gaslist_strcat_5 + bcf ccr_diluent_setup return ;---------------------------------------------------------------------------- ; Append gas description to current string. -; Input: PRODL : gas number (0..4) -; FSR2 : Current string position. +; Input: PRODL : gas number (0..4) +; FSR2 : Current string position. ; Output: Text appended into buffer pointed by FSR2. ; ; NOTE: used in the menu-tree for the MENU_CALLBACK entry. -gaslist_strcat_gas_better: ; Yes, check if this is a "better gas" - bcf win_invert - decf better_gas_number,W ; better_gas_number-1 -> WREG - btfsc ccr_diluent_setup ; in CCR menus? - addlw .5 ; Yes, offset to gases 5-9 - cpfseq gaslist_gas ; 0-4 for OC/Bailout, 5-9 for Diluents - return - call TFT_attention_color ; show in yellow - bsf win_invert ; And invert - return - - global gaslist_strcat_gas_mod -gaslist_strcat_gas_mod: - rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) - - global gaslist_gastitle -gaslist_gastitle: - btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - bra gaslist_gastitle2 ; Short version - STRCAT_TEXT tGas - incf gaslist_gas,W - movwf lo - bsf leftbind - output_8 - bcf leftbind - PUTC ":" +gaslist_strcat_gas_better: ; Yes, check if this is a "better gas" + bcf win_invert + movff better_gas_number,WREG ; get better gas number into WREG + decf WREG,W ; better_gas_number = better_gas_number -1 + btfsc ccr_diluent_setup ; in CCR menus? + addlw .5 ; Yes, offset to gases 5-9 + cpfseq gaslist_gas ; 0-4 for OC/Bailout, 5-9 for Diluents + return + call TFT_attention_color ; show in yellow + bsf win_invert ; And invert + return -gaslist_gastitle2: ; Short version - lfsr FSR1,opt_gas_type - btfsc divemode - bra gaslist_gastitle3 ; no "*" in divemode - movf gaslist_gas,W - decf PLUSW1,W ; Type-1 into WREG - bnz gaslist_gastitle1 ; Not "First" - PUTC "*" - bra gaslist_gastitle3 -gaslist_gastitle1: - PUTC " " -gaslist_gastitle3: ; Short version - call TFT_standard_color - - btfsc divemode ; In divemode? - rcall gaslist_strcat_gas_better ; Yes, check if this is a "better gas" - - movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) - movf PLUSW1,W - bnz gaslist_strcat_3 - call TFT_disabled_color - bra gaslist_strcat_4 ; NEW ; No MOD-check and red color for disabled gases -gaslist_strcat_3: - rcall gaslist_strcat_gas_0 - PUTC " " - ; Read switch depth - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 - movlw .4 - cpfsgt gaslist_gas ; >4? (-> Diluents) - lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases + global gaslist_strcat_gas_mod +gaslist_strcat_gas_mod: + rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) + bsf space_gas_decriptions ; add a space in front for gas numbers < 10 for alignment + ;bra gaslist_gastitle - movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) - movff PLUSW1,lo - rcall gaslist_calc_mod ; Compute MOD into WREG - cpfsgt lo - bra gaslist_strcat_5 - call TFT_warnings_color ; Turn red if bigger - bra gaslist_strcat_5 ; skip gaslist_strcat_gas_0 here -gaslist_strcat_4: - rcall gaslist_strcat_gas_0 + global gaslist_gastitle +gaslist_gastitle: + btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bra gaslist_gastitle1 ; Short version + STRCAT_TEXT tGas + incf gaslist_gas,W + movwf lo + btfss space_gas_decriptions ; add a space in front for gas numbers < 10 for alignment? + bra gaslist_gastitle0 ; NO + bcf space_gas_decriptions ; YES - clear flag again + movlw .10 ; load a 10 + cpfslt lo ; gas# < 10 ? + bra gaslist_gastitle0 ; NO + PUTC " " ; YES - add a space +gaslist_gastitle0: + bsf leftbind + output_8 + bcf leftbind + PUTC ":" +gaslist_gastitle1: + lfsr FSR1,opt_gas_type + btfsc divemode + bra gaslist_gastitle3 ; no "*" in divemode + movf gaslist_gas,W + decf PLUSW1,W ; Type-1 into WREG + bnz gaslist_gastitle2 ; Not "First" + PUTC "*" + bra gaslist_gastitle3 +gaslist_gastitle2: PUTC " " - - ; Dummy code, needs some cleanup somedays... - ; Read switch depth - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 - movlw .4 - cpfsgt gaslist_gas ; >4? (-> Diluents) - lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases +gaslist_gastitle3: + call TFT_standard_color + btfsc divemode ; In divemode? + rcall gaslist_strcat_gas_better ; Yes, check if this is a "better gas" + movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) + movf PLUSW1,W + bnz gaslist_strcat_3 + call TFT_disabled_color + bra gaslist_strcat_4 ; no MOD-check and red color for disabled gases +gaslist_strcat_3: + rcall gaslist_strcat_gas_0 + PUTC " " + ; Read switch depth + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 + movlw .4 + cpfsgt gaslist_gas ; >4? (-> Diluents) + lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases - movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) - movff PLUSW1,lo - ;rcall gaslist_calc_mod ; Compute MOD into WREG - + movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) + movff PLUSW1,lo + rcall gaslist_calc_mod ; Compute MOD into WREG + cpfsgt lo ; within MOD range? + bra gaslist_strcat_5 ; YES + call TFT_warnings_color ; NO - turn red + bra gaslist_strcat_5 ; skip gaslist_strcat_gas_0 here +gaslist_strcat_4: + rcall gaslist_strcat_gas_0 + PUTC " " + ; Dummy code, needs some cleanup someday... + ; Read switch depth + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 + movlw .4 + cpfsgt gaslist_gas ; >4? (-> Diluents) + lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases + movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) + movff PLUSW1,lo + rcall gaslist_calc_mod ; Compute MOD into WREG gaslist_strcat_5: - TSTOSS opt_units ; 0=Meters, 1=Feets - bra gaslist_strcat_3_metric + PUTC " " + TSTOSS opt_units ; 0=Meter, 1=Feet + bra gaslist_strcat_3_metric ;gaslist_strcat_3_imperial: - btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") - bra gaslist_imperial_non_travel - movf gaslist_gas,W - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,gaslist_Type - movlw .2 ; 2=Travel - cpfseq gaslist_Type - bra gaslist_imperial_non_travel ; Non-Travel Gas - bra gaslist_strcat_depth_travel ; Show "---" instead of "0m"... - + btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") + bra gaslist_imperial_non_travel + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,up ; up holds gas type + movlw .2 ; 2=Travel + cpfseq up ; compare gas type with type 2=Travel + bra gaslist_imperial_non_travel ; Non-Travel Gas + bra gaslist_strcat_depth_travel ; Show "---" instead of "0m"... gaslist_imperial_non_travel: - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_TEXT tFeets ; "ft" - return - + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_TEXT tFeets ; "ft" + return gaslist_strcat_3_metric: - btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") - bra gaslist_metric_non_travel - movf gaslist_gas,W - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,gaslist_Type - movlw .2 ; 2=Travel - cpfseq gaslist_Type - bra gaslist_metric_non_travel ; Non-Travel Gas -gaslist_strcat_depth_travel: ; Show "---" instead of "0m"... - STRCAT "---" - return + btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") + bra gaslist_metric_non_travel + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,up ; up holds gas type + movlw .2 ; 2=Travel + cpfseq up ; compare gas type with type 2=Travel + bra gaslist_metric_non_travel ; Non-Travel Gas +gaslist_strcat_depth_travel: ; Show "---" instead of "0m"... + STRCAT "---" + return gaslist_metric_non_travel: - output_99 - STRCAT_TEXT tMeters ; "m" - return + output_99 + STRCAT_TEXT tMeters ; "m" + return ;---------------------------------------------------------------------------- ; Store current menu item, and display gas description later. ; Input: PRODL : gas number (0..4) ; NOTE: used in the menu-tree for the MENU_CALLBACK entry. - global gaslist_setgas + + global gaslist_setgas gaslist_setgas: - movff PRODL,gaslist_gas - movlw .5 - btfsc ccr_diluent_setup ; in CCR menus? - addwf gaslist_gas,F ; Yes, offset to gases 5-9 - return + movff PRODL,gaslist_gas + movlw .5 + btfsc ccr_diluent_setup ; in CCR menus? + addwf gaslist_gas,F ; Yes, offset to gases 5-9 + return - global gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth + global gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth gaslist_cleanup_list: - bcf ignore_last_edited_gas - movlw .0 - btfsc ccr_diluent_setup ; In CCR-Menu? - addlw .5 ; Yes, adjust offset - subwf gaslist_gas,F + bcf ignore_last_edited_gas + movlw .0 + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + subwf gaslist_gas,F gaslist_cleanup_list1: - clrf lo - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movlw .5 ; Check 5 gases - movwf hi + clrf lo + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movlw .5 ; Check 5 gases + movwf hi gaslist_cleanup_list2: - decf hi,w ; 0-4 - btfsc ccr_diluent_setup ; In CCR-Menu? - addlw .5 ; Yes, adjust offset - movff PLUSW1,hi_temp - movlw .1 - cpfseq hi_temp ; gas = first ? - bra gaslist_cleanup_list3 ; No - incf lo,F ; Yes, count "first gases" - - btfss ignore_last_edited_gas ; If we are not in the second-pass mode - bra gaslist_cleanup_list2b - - decf hi,w ; 0-4 - cpfseq gaslist_gas ; Do not disable last edited gas + decf hi,w ; 0-4 + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + movff PLUSW1,WREG ; read gas type + decfsz WREG ; is gas = first (ex 1)? + bra gaslist_cleanup_list3 ; NO + incf lo,F ; YES - count "first gases" + btfss ignore_last_edited_gas ; If we are not in the second-pass mode + bra gaslist_cleanup_list2b + decf hi,w ; 0-4 + cpfseq gaslist_gas ; Do not disable last edited gas gaslist_cleanup_list2b: - movff hi,lo_temp ; Keep the last "first gas" found + movff hi,up ; Keep the last "first gas" found gaslist_cleanup_list3: - decfsz hi,F - bra gaslist_cleanup_list2 ; Loop - - tstfsz lo ; No gas active? - bra gaslist_cleanup_list4 ; No, at least one is active - - btfsc ccr_diluent_setup ; In CCR-Menu? - bra gaslist_cleanup_list3a ; Yes. - ; make gas1 first and zero - movlw .1 ; First - movwf lo_temp - movwf INDF1 - bra gaslist_cleanup_list5 ; Set change depth to zero - + decfsz hi,F + bra gaslist_cleanup_list2 ; Loop + tstfsz lo ; No gas active? + bra gaslist_cleanup_list4 ; No, at least one is active + btfsc ccr_diluent_setup ; In CCR-Menu? + bra gaslist_cleanup_list3a ; Yes. + ; make gas1 first and zero + movlw .1 ; First + movwf up + movwf INDF1 + bra gaslist_cleanup_list5 ; Set change depth to zero gaslist_cleanup_list3a: - movlw .5 - addwf FSR1L,F - movlw .0 - addwfc FSR1H,F ; Setup to Diluents - ; make dil1 first and zero - movlw .1 ; First - movwf lo_temp - movwf INDF1 - bra gaslist_cleanup_list5 ; Set change depth to zero - + movlw .5 + addwf FSR1L,F + movlw .0 + addwfc FSR1H,F ; Setup to Diluents + ; make dil1 first and zero + movlw .1 ; First + movwf up + movwf INDF1 + bra gaslist_cleanup_list5 ; Set change depth to zero gaslist_cleanup_list4: - movlw .1 - cpfsgt lo ; More then one "first gas"? - bra gaslist_cleanup_list5 ; No, done. - ; More then one Gas is "first gas" - ; Disable last found "first gas" but keep it's change depth - decf lo_temp,W ; 0-4 - cpfseq gaslist_gas ; Do not disable last edited gas - bra gaslist_cleanup_list4b - ; Do not disable last edited gas - ; search again but ignore last edited gas - bsf ignore_last_edited_gas - bra gaslist_cleanup_list1 ; Loop until only one "first gas" is left - + movlw .1 + cpfsgt lo ; More then one "first gas"? + bra gaslist_cleanup_list5 ; No, done. + ; More then one Gas is "first gas" + ; Disable last found "first gas" but keep it's change depth + decf up,W ; 0-4 + cpfseq gaslist_gas ; Do not disable last edited gas + bra gaslist_cleanup_list4b + ; Do not disable last edited gas + ; search again but ignore last edited gas + bsf ignore_last_edited_gas + bra gaslist_cleanup_list1 ; Loop until only one "first gas" is left gaslist_cleanup_list4b: - btfsc ccr_diluent_setup ; In CCR-Menu? - addlw .5 ; Yes, adjust offset - clrf PLUSW1 ; Disable gas - bra gaslist_cleanup_list ; Loop until only one "first gas" is left - + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + clrf PLUSW1 ; Disable gas + bra gaslist_cleanup_list ; Loop until only one "first gas" is left gaslist_cleanup_list5: - ; Read switch depth - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 - btfss ccr_diluent_setup ; In CCR-Menu? - lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC Gases - decf lo_temp,W - btfsc ccr_diluent_setup ; In CCR-Menu? - addlw .5 ; Yes, adjust offset - clrf PLUSW1 ; Set First gas to zero m - return + ; Read switch depth + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 + btfss ccr_diluent_setup ; In CCR-Menu? + lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC Gases + decf up,W + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + clrf PLUSW1 ; Set First gas to zero m + return ;---------------------------------------------------------------------------- ; Increment/Decrement O2 ratio - global gaslist_pO2 + + global gaslist_pO2 gaslist_pO2: - movf gaslist_gas,W - lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] - movff PLUSW1,gaslist_He - lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] - movff PLUSW1,gaslist_O2 + movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; hi holds He ratio + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; lo holds O2 ratio - incf gaslist_O2,F ; O2++ - movf gaslist_He,W - addwf gaslist_O2,W - movwf lo - movlw .101 - cpfslt lo ; O2+He<101? - decf gaslist_O2,F ; O2-- (Unchanged) - - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] - return - - global gaslist_mO2 + incf lo,F ; O2++ + movf hi,W ; get He ratio into WREG + addwf lo,W ; add O2 ratio to WREG + movwf up ; move sum He + O2 to up + movlw .101 ; + cpfslt up ; O2 + He < 101? + decf lo,F ; O2-- (revoke ++) + movf gaslist_gas,W + movff lo,PLUSW1 ; write back O2 ratio to opt_gas_O2_ratio[WREG] + return + + global gaslist_mO2 gaslist_mO2: - movf gaslist_gas,W - lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] - movff PLUSW1,gaslist_O2 + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; lo holds O2 ratio - decf gaslist_O2,F - movlw gaslist_min_o2 - cpfslt gaslist_O2 - bra gaslist_mO2_1 - movlw gaslist_min_o2 - movwf gaslist_O2 + decf lo,F ; O2-- + movlw gaslist_min_o2 ; get minimum allowed O2 ratio + cpfslt lo ; current O2 ratio below allowed minimum? + bra gaslist_mO2_1 ; NO + movlw gaslist_min_o2 ; YES - load minimum + movwf lo ; write minimum to current O2 ratio gaslist_mO2_1: - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] - return + movf gaslist_gas,W + movff lo,PLUSW1 ; write back O2 ratio to opt_gas_O2_ratio[WREG] + return ;---------------------------------------------------------------------------- ; Increment/Decrement He ratio - global gaslist_pHe + + global gaslist_pHe gaslist_pHe: - movf gaslist_gas,W - lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] - movff PLUSW1,gaslist_O2 - lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] - movff PLUSW1,gaslist_He - - incf gaslist_He,F ; He++ - movf gaslist_He,W - addwf gaslist_O2,W - movwf lo - movlw .101 - cpfslt lo ; O2+He<101? - decf gaslist_He,F ; Yes, He-- (Unchanged) + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; lo holds O2 ratio + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; hi holds He ratio - movf gaslist_gas,W - movff gaslist_He,PLUSW1 ; And write back to opt_gas_He_ratio[WREG] - return + incf hi,F ; He++ + movf hi,W ; get He ratio into WREG + addwf lo,W ; add O2 ratio to WREG + movwf up ; move sum He + O2 to up + movlw .101 ; + cpfslt up ; O2 + He < 101? + decf hi,F ; He-- (revoke ++) + movf gaslist_gas,W + movff hi,PLUSW1 ; write back He ratio to opt_gas_He_ratio[WREG] + return - global gaslist_mHe + global gaslist_mHe gaslist_mHe: - movf gaslist_gas,W - lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] - movff PLUSW1,gaslist_He + movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; hi holds He ratio - decf gaslist_He,F - bnn gaslist_mHe_1 - clrf gaslist_He + decf hi,F ; He-- + bnn gaslist_mHe_1 ; He ratio negative? + clrf hi ; YES - set He to 0 gaslist_mHe_1: - movf gaslist_gas,W - movff gaslist_He,PLUSW1 ; And write back to opt_gas_He_ratio[WREG] - return + movf gaslist_gas,W + movff hi,PLUSW1 ; write back He ratio to opt_gas_He_ratio[WREG] + return ;---------------------------------------------------------------------------- ; Increment/Decrement switch depth - global gaslist_pDepth -gaslist_pDepth: - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 - movlw .4 - cpfsgt gaslist_gas ; >4? (-> Diluents) - lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases - - movf gaslist_gas,W - movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] - incf gaslist_O2,F - movlw gaslist_max_change_depth - cpfsgt gaslist_O2 - bra gaslist_pDepth_1 - movlw gaslist_max_change_depth - movwf gaslist_O2 + global gaslist_pDepth +gaslist_pDepth: + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 + movlw .4 + cpfsgt gaslist_gas ; >4? (-> Diluents) + lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases + movf gaslist_gas,W + movff PLUSW1,lo ; Read char_I_deco_gas_change[WREG] + incf lo,F + movlw gaslist_max_change_depth + cpfsgt lo + bra gaslist_pDepth_1 + movlw gaslist_max_change_depth + movwf lo gaslist_pDepth_1: - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] - return - - global gaslist_mDepth + movf gaslist_gas,W + movff lo,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + return + + global gaslist_mDepth gaslist_mDepth: - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 - movlw .4 - cpfsgt gaslist_gas ; >4? (-> Diluents) - lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents-5 + movlw .4 + cpfsgt gaslist_gas ; >4? (-> Diluents) + lfsr FSR1,opt_OC_bail_gas_change ; Setup OC Gases - movf gaslist_gas,W - movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] + movf gaslist_gas,W + movff PLUSW1,lo ; Read char_I_deco_gas_change[WREG] + + decf lo,F + btfsc STATUS,N + clrf lo - decf gaslist_O2,F - btfsc STATUS,N - clrf gaslist_O2 - - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; And write back to char_I_deco_gas_change[WREG] - return + movf gaslist_gas,W + movff lo,PLUSW1 ; And write back to char_I_deco_gas_change[WREG] + return - global gaslist_spplus + global gaslist_spplus gaslist_spplus: - movf gaslist_gas,W - lfsr FSR1,char_I_setpoint_cbar - movff PLUSW1,lo ; Read char_I_setpoint_cbar[WREG] - movlw gaslist_sp_stepsize - addwf lo,F - movlw gaslist_sp_max - cpfsgt lo - bra gaslist_spplus2 - movlw gaslist_sp_min - movwf lo + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_cbar + movff PLUSW1,lo ; Read char_I_setpoint_cbar[WREG] + movlw gaslist_sp_stepsize + addwf lo,F + movlw gaslist_sp_max + cpfsgt lo + bra gaslist_spplus2 + movlw gaslist_sp_min + movwf lo gaslist_spplus2: - movf gaslist_gas,W - movff lo,PLUSW1 ; Write back to char_I_setpoint_cbar - return - - global gaslist_spdepthplus + movf gaslist_gas,W + movff lo,PLUSW1 ; Write back to char_I_setpoint_cbar + return + + global gaslist_spdepthplus gaslist_spdepthplus: - movf gaslist_gas,W - bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m - lfsr FSR1,char_I_setpoint_change - movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] - incf gaslist_O2,F - movlw gaslist_max_change_depth - cpfsgt gaslist_O2 - bra gaslist_spdepthplus_1 - movlw gaslist_max_change_depth - movwf gaslist_O2 + movf gaslist_gas,W + bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,lo ; Read char_I_deco_gas_change[WREG] + incf lo,F + movlw gaslist_max_change_depth + cpfsgt lo + bra gaslist_spdepthplus_1 + movlw gaslist_max_change_depth + movwf lo gaslist_spdepthplus_1: - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] - return + movf gaslist_gas,W + movff lo,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + return gaslist_spdepthplus3: - movlw .0 - movff WREG,char_I_setpoint_change+0 ; Reset to 0m - return + movlw .0 + movff WREG,char_I_setpoint_change+0 ; Reset to 0m + return - global gaslist_spdepthminus + global gaslist_spdepthminus gaslist_spdepthminus: - movf gaslist_gas,W - bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m - lfsr FSR1,char_I_setpoint_change - movff PLUSW1,gaslist_O2 ; Read opt_gas_O2_ratio[WREG] - decf gaslist_O2,F - btfsc STATUS,N - clrf gaslist_O2 - movf gaslist_gas,W - movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] - return + movf gaslist_gas,W + bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,lo ; Read char_I_deco_gas_change[WREG] + decf lo,F + btfsc STATUS,N + clrf lo + movf gaslist_gas,W + movff lo,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + return ;---------------------------------------------------------------------------- ; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 Ratio. ; -; Input: gaslist_gas = current gas index. +; Input: gaslist_gas = current gas index. ; opt_gas_O2_ratio[gaslist_gas] = current O2 ratio -; Output: WREG = MOD [m] +; Output: WREG = MOD [m] ; gaslist_calc_mod: - movff gaslist_gas,gaslist_gas_global ; copy for color coding - movf gaslist_gas,W ; Read current gas O2 ratio - lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] - movf PLUSW1,W + movf gaslist_gas,W ; get gas number (0...5) + lfsr FSR1,opt_gas_O2_ratio ; read opt_gas_O2_ratio[WREG] + movf PLUSW1,W + + btfsc divemode ; in divemode? + bra gaslist_calc_mod_divemode ; YES - btfsc divemode ; In divemode? - bra gaslist_calc_mod_divemode ; Yes. + ; Pamb max = ppO2 Max / O2 ratio + movwf xB+0 - ; Pamb max = ppO2 Max / O2 ratio - movwf xB+0 + movf gaslist_gas,W ; get gas number (0...5) + lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents + movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type - movf gaslist_gas,W ; Read current gas O2 ratio - lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type - - movff char_I_ppO2_max_deco,xB+1 ; xB+1 used as temp here - movlw .3 - cpfseq xA+0 ; Deco? - movff char_I_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG - - clrf xB+1 ; Clear for div16x16 - mullw .10 - movff PRODL,xA+0 - movff PRODH,xA+1 - call div16x16 - - ; Prof = Pamb - 1bar. - movf xC+0,W - addlw -.10 - return + movff char_I_ppO2_max_deco,xB+1 ; xB+1 used as temp here + movlw .3 + cpfseq xA+0 ; Deco? + movff char_I_ppO2_max,xB+1 ; No, overwrite with travel/bottom max + movf xB+1,W ; Result in WREG + + clrf xB+1 ; Clear for div16x16 + mullw .10 + movff PRODL,xA+0 + movff PRODH,xA+1 + call div16x16 + + ; Prof = Pamb - 1 bar + movf xC+0,W + addlw -.10 + return gaslist_calc_mod_divemode: - extern TFT_color_code1 - movwf hi ; Copy O2% - movlw warn_gas_in_gaslist - call TFT_color_code1 ; Color-code current row in Gaslist (%O2 in hi), char_I_ppO2_max/char_I_ppO2_max_deco as threshold - return + movwf hi ; Copy O2% + call TFT_color_code_gaslist ; Color-code current row in Gaslist (%O2 in hi), char_I_ppO2_max/char_I_ppO2_max_deco as threshold + return + ;---------------------------------------------------------------------------- - global gaslist_ppo2 + global gaslist_ppo2 gaslist_ppo2: - STRCAT_TEXT tppO2 ; ppO2: - movf gaslist_gas,W - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents - btfss ccr_diluent_setup ; In CCR-Menu? - lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC/Bailout Gases - movf PLUSW1,W - mullw .10 ; PROD=Depth in mbar/10 (100 = 1.00 bar) - movlw .100 - addwf PRODL,F - movlw .0 - addwfc PRODH,F ; add 1bar - movff PRODL,xA+0 - movff PRODH,xA+1 - movf gaslist_gas,W ; Read current gas O2 ratio - lfsr FSR1,opt_dil_O2_ratio-.5 ; Read dil_gas_O2_ratio[WREG] - btfss ccr_diluent_setup ; In CCR-Menu? - lfsr FSR1,opt_gas_O2_ratio ; No, read opt_gas_O2_ratio[WREG] - movff PLUSW1,xB+0 - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * (p_amb/10) - movff xC+0,xA+0 - movff xC+1,xA+1 - movlw d'100' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=(char_I_O2_ratio * p_amb/10)/100 -; Check very high ppO2 manually - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra gaslist_ppo2_2 ; Yes, display fixed Value! - movff xC+0,lo - movff xC+1,hi - bcf ignore_digit4 - bsf leftbind - output_16dp d'3' ; x.xx - STRCAT_TEXT tbar ; bar - return + STRCAT_TEXT tppO2 ; ppO2: + movf gaslist_gas,W + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents + btfss ccr_diluent_setup ; In CCR-Menu? + lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC/Bailout Gases + movf PLUSW1,W + mullw .10 ; PROD=Depth in mbar/10 (100 = 1.00 bar) + movlw .100 + addwf PRODL,F + movlw .0 + addwfc PRODH,F ; add 1bar + movff PRODL,xA+0 + movff PRODH,xA+1 + movf gaslist_gas,W ; Read current gas O2 ratio + lfsr FSR1,opt_dil_O2_ratio-.5 ; Read dil_gas_O2_ratio[WREG] + btfss ccr_diluent_setup ; In CCR-Menu? + lfsr FSR1,opt_gas_O2_ratio ; No, read opt_gas_O2_ratio[WREG] + movff PLUSW1,xB+0 + clrf xB+1 + call mult16x16 ; char_I_O2_ratio * (p_amb/10) + movff xC+0,xA+0 + movff xC+1,xA+1 + movlw d'100' + movwf xB+0 + clrf xB+1 + call div16x16 ; xC=(char_I_O2_ratio * p_amb/10)/100 + ; Check very high ppO2 manually + tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? + bra gaslist_ppo2_2 ; Yes, display fixed Value! + movff xC+0,lo + movff xC+1,hi + bcf ignore_digit4 + bsf leftbind + output_16dp d'3' ; x.xx + STRCAT_TEXT tbar ; bar + return gaslist_ppo2_2: - STRCAT ">6.6" - return + STRCAT ">6.6" + return - global gaslist_MOD_END + global gaslist_MOD_END gaslist_MOD_END: - rcall gaslist_calc_mod ; Compute MOD into WREG - movwf lo ; Copy to lo - STRCAT_TEXT tMOD ; MOD: - TSTOSS opt_units ; 0=Meters, 1=Feets - bra gaslist_MOD_metric -;gaslist_MOD_imperial: - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_TEXT tFeets ; "ft" - bra gaslist_MOD_common + rcall gaslist_calc_mod ; Compute MOD into WREG + movwf lo ; Copy to lo + STRCAT_TEXT tMOD ; MOD: + TSTOSS opt_units ; 0=Meters, 1=Feets + bra gaslist_MOD_metric + ;gaslist_MOD_imperial: + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_TEXT tFeets ; "ft" + bra gaslist_MOD_common gaslist_MOD_metric: - output_8 - STRCAT_TEXT tMeters ; m + output_8 + STRCAT_TEXT tMeters ; m gaslist_MOD_common: - PUTC "/" - STRCAT_TEXT tEND ; END: - rcall gaslist_calc_mod ; Output: WREG = MOD [m] - addlw .10 ; MOD=MOD+10m - movwf xB+0 - clrf xB+1 - movlw d'100' - movwf xA+0 - movf gaslist_He,W ; He value in % -> WREG - subwf xA+0,F ; xA+0 = 100 - He Value in % - clrf xA+1 - call mult16x16 ; xA*xB=xC - movff xC+0,xA+0 - movff xC+1,xA+1 - movlw d'100' - movwf xB+0 - clrf xB+1 - call div16x16 ; xA/xB=xC with xA as remainder - ; xC:2 = ((MOD+10) * 100 - HE Value in %) / 100 - movlw d'10' - subwf xC+0,F ; Subtract 10m... - movff xC+0,lo -; END 8Bit only -; movlw d'0' -; subwfb xC+1,F -; movff xC+1,hi - TSTOSS opt_units ; 0=Meters, 1=Feets - bra gaslist_END_metric -;gaslist_END_imperial: - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_TEXT tFeets ; "ft" - return + PUTC "/" + STRCAT_TEXT tEND ; END: + rcall gaslist_calc_mod ; Output: WREG = MOD [m] + addlw .10 ; MOD=MOD+10m + movwf xB+0 + clrf xB+1 + movlw d'100' + movwf xA+0 + movf gaslist_gas,W ; get gas number (0...5) + lfsr FSR1,opt_gas_He_ratio ; read opt_gas_O2_ratio[WREG] + movf PLUSW1,W ; He value in % + subwf xA+0,F ; xA+0 = 100 - He Value in % + clrf xA+1 + call mult16x16 ; xA*xB=xC + movff xC+0,xA+0 + movff xC+1,xA+1 + movlw d'100' + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC with xA as remainder + ; ; xC:2 = ((MOD+10) * 100 - HE Value in %) / 100 + movlw d'10' + subwf xC+0,F ; Subtract 10m... + movff xC+0,lo + ;; END 8Bit only + ;movlw d'0' + ;subwfb xC+1,F + ;movff xC+1,hi + TSTOSS opt_units ; 0=Meter, 1=Feet + bra gaslist_END_metric + ;gaslist_END_imperial: + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_TEXT tFeets ; "ft" + return gaslist_END_metric: - output_8 - STRCAT_TEXT tMeters ; m - return + output_8 + STRCAT_TEXT tMeters ; m + return ;---------------------------------------------------------------------------- - global gaslist_reset_mod_title + global gaslist_reset_mod_title gaslist_reset_mod_title: - STRCAT_TEXT tDepthReset + STRCAT_TEXT tDepthReset gaslist_reset_mod_title2: - rcall gaslist_calc_mod ; Compute MOD into WREG - movwf lo ; Copy to lo + rcall gaslist_calc_mod ; Compute MOD into WREG + movwf lo ; Copy to lo - movf gaslist_gas,W ; Compare to switch depth - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents - btfss ccr_diluent_setup ; In CCR-Menu? - lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC Gases - movf PLUSW1,W - cpfslt lo - bra gaslist_strcat_5 ; And return... - call TFT_warnings_color ; Turn red if bigger ! - bra gaslist_strcat_5 ; And return... + movf gaslist_gas,W ; Compare to switch depth + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents + btfss ccr_diluent_setup ; In CCR-Menu? + lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC Gases + movf PLUSW1,W + cpfslt lo + bra gaslist_strcat_5 ; and return... + call TFT_warnings_color ; turn red if bigger ! + bra gaslist_strcat_5 ; and return... ;---------------------------------------------------------------------------- - global gaslist_reset_mod + global gaslist_reset_mod gaslist_reset_mod: - rcall gaslist_calc_mod ; Compute MOD - movwf gaslist_depth - - movf gaslist_gas,W ; Read current gas O2 ratio - - lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents - btfss ccr_diluent_setup ; In CCR-Menu? - lfsr FSR1,opt_OC_bail_gas_change ; No, setup OC Gases - - movff gaslist_depth,PLUSW1 ; And save new change depth - return + rcall gaslist_calc_mod ; Compute MOD, it is returned in WREG + movwf lo ; buffer MOD to lo + movf gaslist_gas,W ; Read current gas O2 ratio + lfsr FSR1,char_I_dil_change-.5 ; Setup Diluents + btfss ccr_diluent_setup ; In CCR-Menu? + lfsr FSR1,opt_OC_bail_gas_change ; NO - setup OC Gases + movff lo,PLUSW1 ; write back new change depth + return ;---------------------------------------------------------------------------- - END \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/gaslist.inc --- a/src/gaslist.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/gaslist.inc Mon Feb 26 16:40:28 2018 +0100 @@ -9,25 +9,32 @@ ; HISTORY ; 2011-08-11 : [jDG] Creation. - ; Utils - extern gaslist_strcat_gas - extern gaslist_strcat_gas_mod - extern gaslist_strcat_setpoint + ; Utils + extern gaslist_strcat_gas + extern gaslist_strcat_gas_mod + extern gaslist_strcat_setpoint - ;Setpoint Setup - extern gaslist_spplus,gaslist_spdepthplus, gaslist_spdepthminus,gaslist_setSP + ;Setpoint Setup + extern gaslist_spplus + extern gaslist_spdepthplus + extern gaslist_spdepthminus + extern gaslist_setSP + + ; Select currently edited gas + extern gaslist_setgas + extern gaslist_gastitle - ; Select currently edited gas - extern gaslist_setgas, gaslist_gastitle - - ; Main gaslist menu - extern gaslist_pO2, gaslist_mO2 - extern gaslist_pHe, gaslist_mHe - extern gaslist_show_type - extern gaslist_toggle_type - extern gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth + ; Main gaslist menu + extern gaslist_pO2, gaslist_mO2 + extern gaslist_pHe, gaslist_mHe + extern gaslist_show_type + extern gaslist_toggle_type + extern gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth - ; Depth submennu - extern gaslist_pDepth, gaslist_mDepth - extern gaslist_MOD_END, gaslist_ppo2 - extern gaslist_reset_mod_title, gaslist_reset_mod + ; Depth submennu + extern gaslist_pDepth + extern gaslist_mDepth + extern gaslist_MOD_END + extern gaslist_ppo2 + extern gaslist_reset_mod_title + extern gaslist_reset_mod diff -r f5de1ff88814 -r b455b31ce022 src/ghostwriter.asm --- a/src/ghostwriter.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/ghostwriter.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File ghostwriter.asm REFACTORED VERSION 2.94 +; File ghostwriter.asm REFACTORED VERSION 2.98 ; ; Ghostwriter (Log profile recorder) ; @@ -9,204 +9,253 @@ ; HISTORY ; 2011-11-27 : [mH] Creation -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "external_flash.inc" -#include "surfmode.inc" -#include "eeprom_rs232.inc" -#include "strings.inc" -#include "isr.inc" -#include "tft_outputs.inc" -#include "divemode.inc" -#include "rtc.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "external_flash.inc" +#include "surfmode.inc" +#include "eeprom_rs232.inc" +#include "strings.inc" +#include "isr.inc" +#include "tft_outputs.inc" +#include "divemode.inc" +#include "rtc.inc" + + + ;---- Private local variables ------------------------------------------------- + + CBLOCK local2 ; max size is 16 Byte !!! + divisor_temperature ; divisor used to time the sampling of dive data + divisor_deco ; divisor used to time the sampling of dive data + divisor_gf ; divisor used to time the sampling of dive data + divisor_ppo2_sensors ; divisor used to time the sampling of dive data + divisor_decoplan ; divisor used to time the sampling of dive data + divisor_cns ; divisor used to time the sampling of dive data + divisor_tank ; divisor used to time the sampling of dive data + ProfileFlagByte ; used to store events + ENDC ; used: 8 byte, remaining: 8 byte + + +ghostwriter CODE + +;============================================================================= + -ghostwriter CODE + global init_recording_params ; Initialize profile recording parameters +init_recording_params: + movff samplingrate,samplesecs_value; to avoid EEPROM access in the ISR + movlw div_temperature + movwf divisor_temperature ; load divisors for profile storage + movlw div_deco + movwf divisor_deco + movlw div_gf + movwf divisor_gf + movlw div_ppo2_sensors + movwf divisor_ppo2_sensors + movlw div_decoplan + movwf divisor_decoplan + movlw div_cns + movwf divisor_cns + movlw div_tank + movwf divisor_tank + btfss FLAG_apnoe_mode ; In Apnoe mode? + bra init_recording_params_1 ; NO + movlw samplingrate_apnoe ; YES - overwrite some parameters in Apnoe mode + movwf samplesecs_value ; to avoid EEPROM access in the ISR +init_recording_params_1: + btfsc FLAG_ccr_mode ; in CCR mode? + bra init_recording_params_2 ; YES + btfsc FLAG_pscr_mode ; in pSCR mode? + bra init_recording_params_2 ; YES + ; in OC Mode, disable ppO2 logging + movlw .0 + movwf divisor_ppo2_sensors +init_recording_params_2: + return + global store_dive_data store_dive_data: - bcf store_sample ; clear flag + bcf store_sample ; clear flag - ifndef __DEBUG - btfsc simulatormode_active ; Are we in simulator mode? - return ; Yes, discard everything - endif + ifndef __DEBUG + btfsc simulatormode_active ; Are we in simulator mode? + return ; Yes, discard everything + endif - btfsc FLAG_apnoe_mode ; In Apnoe mode? - return ; Yes, discard everything + btfsc FLAG_apnoe_mode ; In Apnoe mode? + return ; Yes, discard everything - SAFE_2BYTE_COPY rel_pressure, lo - movf lo,W ; store depth with every sample - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + SAFE_2BYTE_COPY rel_pressure, lo + movf lo,W ; store depth with every sample + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movf hi,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash -;First, find out how many bytes will append to this sample.... - clrf ProfileFlagByte ; clear number of bytes to append +; First, find out how many bytes will append to this sample.... + clrf ProfileFlagByte ; clear number of bytes to append -; Check Extented informations - decfsz divisor_temperature,W ; Check divisor - bra check_extended1 +; Check Extended informations + decfsz divisor_temperature,W ; Check divisor + bra check_extended1 movlw infolength_temperature - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended1: - decfsz divisor_deco,W ; Check divisor - bra check_extended2 + decfsz divisor_deco,W ; Check divisor + bra check_extended2 movlw infolength_deco - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended2: - decfsz divisor_gf,W ; Check divisor - bra check_extended3 + decfsz divisor_gf,W ; Check divisor + bra check_extended3 movlw infolength_gf - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended3: decfsz divisor_ppo2_sensors,W ; Check divisor - bra check_extended4 + bra check_extended4 movlw infolength_ppo2_sensors - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended4: - decfsz divisor_decoplan,W ; Check divisor - bra check_extended5 + decfsz divisor_decoplan,W ; Check divisor + bra check_extended5 movlw infolength_decoplan - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended5: - decfsz divisor_cns,W ; Check divisor - bra check_extended6 + decfsz divisor_cns,W ; Check divisor + bra check_extended6 movlw infolength_cns - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended6: - decfsz divisor_tank,W ; Check divisor + decfsz divisor_tank,W ; Check divisor bra check_extended7 movlw infolength_tank - addwf ProfileFlagByte,F ; add to ProfileFlagByte + addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended7: ; Second, check global event flag - btfss event_occured ; Check global event flag - bra store_dive_data3 ; No Event + btfss event_occured ; Check global event flag + bra store_dive_data3 ; No Event - incf ProfileFlagByte,F ; add one byte (The EventByte) + incf ProfileFlagByte,F ; add one byte (The EventByte1) - clrf EventByte ; reset EventByte - clrf EventByte2 ; reset EventByte2 + clrf EventByte1 ; reset EventByte1 + clrf EventByte2 ; reset EventByte2 - movf AlarmType,W ; Type of Alarm Bit 0-3 - addwf EventByte,F ; Copy to EventByte Bit 0-3 - clrf AlarmType ; Reset AlarmType - + movf AlarmType,W ; Type of Alarm Bit 0-3 + addwf EventByte1,F ; Copy to EventByte1 Bit 0-3 + clrf AlarmType ; Reset AlarmType + ; Third, check events and add additional bytes - btfss gas6_changed ; Check flag + btfss gas6_changed ; Check flag bra check_event2 - movlw d'2' ; Information length - addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte,4 ; Also set Flag in EventByte! + movlw d'2' ; Information length + addwf ProfileFlagByte,F ; add to ProfileFlagByte + bsf EventByte1,4 ; Also set Flag in EventByte1! check_event2: - btfss stored_gas_changed ; Check flag + btfss stored_gas_changed ; Check flag bra check_event3 - movlw d'1' ; Information length - addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte,5 ; Also set Flag in EventByte! + movlw d'1' ; Information length + addwf ProfileFlagByte,F ; add to ProfileFlagByte + bsf EventByte1,5 ; Also set Flag in EventByte1! check_event3: - btfss setpoint_changed ; Check flag + btfss setpoint_changed ; Check flag bra check_event4 - movlw d'1' ; Information length - addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte,6 ; Also set Flag in EventByte! + movlw d'1' ; Information length + addwf ProfileFlagByte,F ; add to ProfileFlagByte + bsf EventByte1,6 ; Also set Flag in EventByte1! check_event4: - btfss bailoutgas_event ; =1: bailout was selected or a gaschange during bailout - bra check_event5 - movlw d'2' ; Information length - addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte2,0 ; set flag in EventByte2! - bsf EventByte,7 ; =1: Another Eventbyte is available + btfss bailoutgas_event ; =1: bailout was selected or a gas change during bailout + bra check_event5 + movlw d'2' ; Information length + addwf ProfileFlagByte,F ; add to ProfileFlagByte + bsf EventByte2,0 ; set flag in EventByte2! + bsf EventByte1,7 ; =1: Another EventByte1 is available check_event5: ; more events? store_dive_data3: - btfsc EventByte,7 ; =1: Another Eventbyte is available - incf ProfileFlagByte,F ; add one byte (The EventByte2) + btfsc EventByte1,7 ; =1: Another EventByte1 is available + incf ProfileFlagByte,F ; add one byte (The EventByte2) - btfsc event_occured ; Check global event flag - bsf ProfileFlagByte,7 ; Set EventByte Flag in ProfileFlagByte + btfsc event_occured ; Check global event flag + bsf ProfileFlagByte,7 ; Set EventByte1 Flag in ProfileFlagByte - movf ProfileFlagByte,W ; finally, write ProfileFlagByte! - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf ProfileFlagByte,W ; finally, write ProfileFlagByte! + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - btfss event_occured ; Check global event flag (again) - bra store_dive_data4 ; No Event + btfss event_occured ; Check global event flag (again) + bra store_dive_data4 ; No Event ; Store the EventByte(s) + additional bytes now - movf EventByte,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf EventByte1,W + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf EventByte2,W ; Write second event byte... - btfsc EventByte,7 ; =1: Another Eventbyte is available - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf EventByte2,W ; Write second event byte... + btfsc EventByte1,7 ; =1: Another EventByte1 is available + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - btfss gas6_changed ; Check flag + btfss gas6_changed ; Check flag bra store_dive_data3b - movff char_I_O2_ratio,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movff char_I_He_ratio,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - bcf gas6_changed ; Clear this event + movff char_I_O2_ratio,WREG ; store gas 6 o2 ratio + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff char_I_He_ratio,WREG ; store gas 6 He ratio + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bcf gas6_changed ; Clear this event store_dive_data3b: - btfss stored_gas_changed ; Check flag + btfss stored_gas_changed ; Check flag bra store_dive_data3c - movf active_gas,W ; Store active gas - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - bcf stored_gas_changed ; Clear this event + movf active_gas,W ; Store active gas + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bcf stored_gas_changed ; Clear this event store_dive_data3c: - btfss setpoint_changed ; Check flag + btfss setpoint_changed ; Check flag bra store_dive_data3d - movff char_I_const_ppO2,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - bcf setpoint_changed ; Clear this event + movff char_I_const_ppO2,WREG ; store setpoint + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bcf setpoint_changed ; Clear this event store_dive_data3d: - btfss bailoutgas_event ; Check flag - bra store_dive_data3e - movff char_I_O2_ratio,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movff char_I_He_ratio,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - bcf bailoutgas_event ; Clear this event -store_dive_data3e: + btfss bailoutgas_event ; Check flag + bra store_dive_data4 + movff char_I_O2_ratio,WREG ; store O2 ratio of bailout gas + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff char_I_He_ratio,WREG ; store He ratio of bailout gas + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bcf bailoutgas_event ; Clear this event store_dive_data4: - ; Store extended informations - decfsz divisor_temperature,F ; Check divisor + decfsz divisor_temperature,F ; Check divisor bra store_extended1 rcall store_dive_temperature store_extended1: - decfsz divisor_deco,F ; Check divisor + decfsz divisor_deco,F ; Check divisor bra store_extended2 rcall store_dive_decodata store_extended2: - decfsz divisor_gf,F ; Check divisor - bra store_extended3 + decfsz divisor_gf,F ; Check divisor + bra store_extended3 rcall store_dive_gf store_extended3: - decfsz divisor_ppo2_sensors,F ; Check divisor - bra store_extended4 + decfsz divisor_ppo2_sensors,F ; Check divisor + bra store_extended4 rcall store_dive_ppO2_sensors store_extended4: - decfsz divisor_decoplan,F ; Check divisor - bra store_extended5 + decfsz divisor_decoplan,F ; Check divisor + bra store_extended5 rcall store_dive_decoplan store_extended5: - decfsz divisor_cns,F ; Check divisor - bra store_extended6 + decfsz divisor_cns,F ; Check divisor + bra store_extended6 rcall store_dive_cns store_extended6: - decfsz divisor_tank,F ; Check divisor + decfsz divisor_tank,F ; Check divisor bra store_extended7 rcall store_dive_tank store_extended7: ; The next block is required to take care of "store never" - btfsc divisor_temperature,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!) - clrf divisor_temperature ; And clear register again, so it will never reach zero... + btfsc divisor_temperature,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!) + clrf divisor_temperature ; And clear register again, so it will never reach zero... btfsc divisor_deco,7 clrf divisor_deco btfsc divisor_gf,7 @@ -221,101 +270,114 @@ clrf divisor_tank store_dive_data5: - bcf event_occured ; Clear the global event flag - clrf EventByte ; reset EventByte - clrf EventByte2 ; reset EventByte2 - return ; Done. (Sample with all informations written to external flash) - + bcf event_occured ; Clear the global event flag + clrf EventByte1 ; reset EventByte1 + clrf EventByte2 ; reset EventByte2 + return ; Done. (Sample with all informations written to external flash) + store_dive_cns: movff int_O_CNS_fraction+0,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movff int_O_CNS_fraction+1,WREG - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw div_cns - movwf divisor_cns ; Reload divisor from CF + movwf divisor_cns ; Reload divisor from CF return store_dive_tank: movlw div_tank - movwf divisor_tank ; Reload divisor from CF + movwf divisor_tank ; Reload divisor from CF return store_dive_decoplan: - ; Store the decoplan - lfsr FSR1,char_O_deco_time_for_log+.0 - movlw .15 - movwf lo + ; Store the deco plan + lfsr FSR1,char_O_deco_time_for_log+.0 + movlw .15 + movwf lo store_dive_decoplan_loop: - movf POSTINC1,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - decfsz lo,F - bra store_dive_decoplan_loop + movf POSTINC1,W + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + decfsz lo,F + bra store_dive_decoplan_loop movlw div_decoplan - movwf divisor_decoplan ; Reload divisor from CF + movwf divisor_decoplan ; Reload divisor from CF return store_dive_ppO2_sensors: - movf o2_ppo2_sensor1,W ; Sensor1 ppO2 (in 0.01bar steps) - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modified via ISR during the two writes here... - movf lo,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf hi,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf o2_ppo2_sensor1,W ; Sensor1 ppO2 (in 0.01bar steps) + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modified via ISR during the two writes here... + movf lo,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf hi,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf o2_ppo2_sensor2,W ; Sensor2 ppO2 (in 0.01bar steps) - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modified via ISR during the two writes here... - movf lo,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf hi,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf o2_ppo2_sensor2,W ; Sensor2 ppO2 (in 0.01bar steps) + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modified via ISR during the two writes here... + movf lo,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf hi,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf o2_ppo2_sensor3,W ; Sensor3 ppO2 (in 0.01bar steps) - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modified via ISR during the two writes here... - movf lo,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf hi,W ; in 0.1mV steps - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf o2_ppo2_sensor3,W ; Sensor3 ppO2 (in 0.01bar steps) + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modified via ISR during the two writes here... + movf lo,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movf hi,W ; in 0.1mV steps + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw div_ppo2_sensors - movwf divisor_ppo2_sensors ; Reload divisor + movwf divisor_ppo2_sensors ; Reload divisor return store_dive_gf: - movff int_O_gradient_factor+0,WREG ; gradient factor absolute (range is limited to 255, only lower byte used for value) - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff int_O_gradient_factor+0,WREG; gradient factor absolute (range is limited to 255, only lower byte used for value) + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw div_gf - movwf divisor_gf ; Reload divisor + movwf divisor_gf ; Reload divisor return store_dive_decodata: - movf decodata+0,W ; =0:no stop dive, if in deco mode: ceiling in m - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - movf decodata+1,W ; no stop time of length of first stop - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + ; Check if deco stops are necessary + movff char_O_first_deco_depth,WREG; get ceiling + tstfsz WREG ; ceiling < 0m (aka in deco) ? + bra store_dive_decodata_deco ; YES + ; NO - within NDL + clrf WREG ; =0: no stop dive + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff char_O_nullzeit,WREG ; remaining NDL time + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bra store_dive_decodata_common +store_dive_decodata_deco: + ; YES - in deco + movff char_O_first_deco_depth,WREG; ceiling in m + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff char_O_first_deco_time,WREG ; length of first stop in minutes + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash +store_dive_decodata_common: movlw div_deco - movwf divisor_deco ; Reload divisor + movwf divisor_deco ; Reload divisor return store_dive_temperature: - SAFE_2BYTE_COPY temperature,lo - movf lo,W ; append temperature to current sample! - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + SAFE_2BYTE_COPY temperature,lo + movf lo,W ; append temperature to current sample! + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movf hi,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw div_temperature - movwf divisor_temperature ; Reload divisor + movwf divisor_temperature ; Reload divisor return ghostwrite_byte_header: - goto write_byte_ext_flash_plus_header ; (This call will also delete the 4kB TOC entry first) - ; returns... + goto write_byte_ext_flash_plus_header ; (This call will also delete the 4kB TOC entry first) + ; returns... ghostwrite_byte_profile: - goto write_byte_ext_flash_plus ; writes byte and increases address with banking at 0x200000 - ; returns... + goto write_byte_ext_flash_plus ; writes byte and increases address with banking at 0x200000 + ; returns... global ghostwriter_end_dive ghostwriter_end_dive: @@ -323,53 +385,52 @@ movff ext_flash_address+1,ext_flash_log_pointer+1 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header - movff menupos3,customview_divemode ; store last customview + movff menupos3,customview_divemode ; store last custom view btfss realdive ; dive longer then one minute - goto ghostwriter_end_dive_common ; No, discard everything + goto ghostwriter_end_dive_common ; No, discard everything ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc... - ifndef __DEBUG - btfsc simulatormode_active ; Are we in simulator mode? - goto ghostwriter_end_dive_common_sim ; Yes, discard everything - endif + ifndef __DEBUG + btfsc simulatormode_active ; Are we in simulator mode? + goto ghostwriter_end_dive_common_sim ; Yes, discard everything + endif - btfsc FLAG_apnoe_mode ; In Apnoe mode? - goto ghostwriter_end_dive_common ; Yes, discard everything + btfsc FLAG_apnoe_mode ; In Apnoe mode? + goto ghostwriter_end_dive_common ; Yes, discard everything ; Dive finished (and longer then one minute) - btfsc FLAG_apnoe_mode ; Calc max. depth (again) for very short apnoe dives + btfsc FLAG_apnoe_mode ; Calc max. depth (again) for very short apnoe dives call apnoe_calc_maxdepth ; calculate desaturation time - movff last_surfpressure_30min+0,int_I_pres_surface+0 ; Pass surface to desat routine ! + movff last_surfpressure_30min+0,int_I_pres_surface+0 ; Pass surface to desat routine ! movff last_surfpressure_30min+1,int_I_pres_surface+1 - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - - call deco_calc_desaturation_time ; calculate desaturation time - movlb b'00000001' ; select ram bank 1 - - movlw 0xFD ; .... End-of-Profile Bytes - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + call deco_calc_dive_interval_1min ; calculate deco in surface mode + call deco_calc_desaturation_time ; calculate desaturation time + banksel common ; select ram bank 1 + + movlw 0xFD ; .... End-of-Profile Bytes + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw 0xFD - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movff ext_flash_address+0,ext_flash_log_pointer+0 movff ext_flash_address+1,ext_flash_log_pointer+1 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header - ; Set to first address again to store dive length ext_flash_dive_counter:3 - rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 + ; Set to first address again to store dive length ext_flash_dive_counter:3 + rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 - incf_ext_flash_address_0x20 d'6' ; Skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header - ; Store dive length - movf ext_flash_dive_counter+0,W - call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page - movf ext_flash_dive_counter+1,W - call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page - movf ext_flash_dive_counter+2,W - call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page + incf_ext_flash_address_0x20 d'6' ; Skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header + ; Store dive length + movf ext_flash_dive_counter+0,W + call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page + movf ext_flash_dive_counter+1,W + call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page + movf ext_flash_dive_counter+2,W + call write_byte_ext_flash_plus_nodel ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page ; profile recording done. @@ -378,16 +439,17 @@ movff EEDATA,lo read_int_eeprom .3 movff EEDATA,hi - ; +1 increase total dive counter - infsnz lo,F + ; +1 ; increase total dive counter + infsnz lo,F incf hi,F ; Store new number in EEPROM movff lo,EEDATA - write_int_eeprom .2 + write_int_eeprom .2 movff hi,EEDATA - write_int_eeprom .3 + write_int_eeprom .3 - decf lo,F ; -1 + decf lo,F ; -1 + ; Set ext_flash_address:3 to TOC entry of this dive ; 1st: 200000h-200FFFh -> lo=0 ; 2nd: 201000h-201FFFh -> lo=1 @@ -399,382 +461,382 @@ movlw 0x20 movwf ext_flash_address+2 movlw .16 - mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + 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 - + ; Now, write header - movlw 0xFA ; Header start - rcall ghostwrite_byte_header ; (This call will also delete the 4kB TOC entry first) + movlw 0xFA ; Header start + rcall ghostwrite_byte_header ; (This call will also delete the 4kB TOC entry first) movlw 0xFA - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; store pointer to begin of diveprofile - read_int_eeprom .4 + ; store pointer to begin of dive profile + read_int_eeprom .4 movf EEDATA,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - read_int_eeprom .5 + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + read_int_eeprom .5 movf EEDATA,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - read_int_eeprom .6 + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + read_int_eeprom .6 movf EEDATA,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; store pointer to end of diveprofile + ; store pointer to end of dive profile movf ext_flash_log_pointer+0,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf ext_flash_log_pointer+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf ext_flash_log_pointer+2,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash ; write rest of header - movlw logbook_profile_version ; Defined in hwos.inc - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movlw logbook_profile_version ; Defined in hwos.inc + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Store dive length - movf ext_flash_dive_counter+0,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movf ext_flash_dive_counter+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movf ext_flash_dive_counter+2,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Store dive length + movf ext_flash_dive_counter+0,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf ext_flash_dive_counter+1,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf ext_flash_dive_counter+2,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff start_year,WREG ; Date - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff start_year,WREG ; Date + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff start_month,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff start_day,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff start_hours,WREG ; Start of dive time - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff start_hours,WREG ; Start of dive time + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff start_mins,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent) - bra end_dive1 ; Store normal depth + btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent) + bra end_dive1 ; Store normal depth movff apnoe_max_pressure+0,lo movff apnoe_max_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] movff lo,apnoe_max_pressure+0 movff hi,apnoe_max_pressure+1 - movf apnoe_max_pressure+0,W ; Max. depth - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf apnoe_max_pressure+0,W ; Max. depth + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf apnoe_max_pressure+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - bra end_dive2 ; skip normal max. depth - + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + bra end_dive2 ; skip normal max. depth + end_dive1: movff max_pressure+0,lo movff max_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] movff lo,max_pressure+0 movff hi,max_pressure+1 - + movff max_pressure+0,WREG ; Max. depth rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff max_pressure+1,WREG rcall ghostwrite_byte_header ; WREG -> Header in ext. flash end_dive2: - movf divemins+0,W ; divetime minutes + movf divemins+0,W ; dive time minutes rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf divemins+1,W rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movf divesecs,W ; divetime seconds + movf divesecs,W ; dive time seconds rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff minimum_temperature+0,WREG ; minimum temperature rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff minimum_temperature+1,WREG + movff minimum_temperature+1,WREG rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff last_surfpressure_30min+0,WREG ; airpressure before dive + movff last_surfpressure_30min+0,WREG ; air pressure before dive rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff last_surfpressure_30min+1,WREG + movff last_surfpressure_30min+1,WREG rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff int_O_desaturation_time+0,WREG ; desaturation time in minutes rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff int_O_desaturation_time+1,WREG rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - btfss FLAG_ccr_mode ; In CCR mode... - bra end_dive_oc_gaslist ; No, write OC gases - ; Write Diluents... + btfss FLAG_ccr_mode ; In CCR mode... + bra end_dive_oc_gaslist ; No, write OC gases + ; Write Diluents... movff opt_dil_O2_ratio+0,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_dil_He_ratio+0,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff char_I_dil_change+0,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_dil_type+0,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_dil_type+0,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal movff opt_dil_O2_ratio+1,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_dil_He_ratio+1,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff char_I_dil_change+1,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_dil_type+1,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_dil_type+1,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal movff opt_dil_O2_ratio+2,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_dil_He_ratio+2,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff char_I_dil_change+2,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_dil_type+2,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_dil_type+2,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal movff opt_dil_O2_ratio+3,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_dil_He_ratio+3,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff char_I_dil_change+3,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_dil_type+3,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_dil_type+3,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal movff opt_dil_O2_ratio+4,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_dil_He_ratio+4,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff char_I_dil_change+4,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_dil_type+4,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal - bra end_dive_oc_cc_common + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_dil_type+4,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal + bra end_dive_oc_cc_common -end_dive_oc_gaslist: ; OC Gases... +end_dive_oc_gaslist: ; OC Gases... movff opt_gas_O2_ratio+0,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_gas_He_ratio+0,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff opt_OC_bail_gas_change+0,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_gas_type+0,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_gas_type+0,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco movff opt_gas_O2_ratio+1,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_gas_He_ratio+1,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff opt_OC_bail_gas_change+1,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_gas_type+1,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_gas_type+1,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco movff opt_gas_O2_ratio+2,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_gas_He_ratio+2,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff opt_OC_bail_gas_change+2,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_gas_type+2,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_gas_type+2,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco movff opt_gas_O2_ratio+3,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_gas_He_ratio+3,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff opt_OC_bail_gas_change+3,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_gas_type+3,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_gas_type+3,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco movff opt_gas_O2_ratio+4,WREG - rcall ghostwrite_byte_header ; %O2 + rcall ghostwrite_byte_header ; %O2 movff opt_gas_He_ratio+4,WREG - rcall ghostwrite_byte_header ; %He + rcall ghostwrite_byte_header ; %He movff opt_OC_bail_gas_change+4,WREG - rcall ghostwrite_byte_header ; Configured change depth in m - movff opt_gas_type+4,WREG - rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco -; bra end_dive_oc_cc_common + rcall ghostwrite_byte_header ; Configured change depth in m + movff opt_gas_type+4,WREG + rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco +; bra end_dive_oc_cc_common end_dive_oc_cc_common: - movlw softwareversion_x ; Firmware version + movlw softwareversion_x ; Firmware version rcall ghostwrite_byte_header movlw softwareversion_y rcall ghostwrite_byte_header - movf batt_voltage+0,W ; Battery voltage + movf batt_voltage+0,W ; Battery voltage rcall ghostwrite_byte_header movf batt_voltage+1,W rcall ghostwrite_byte_header - movf samplingrate,W ; Sampling rate - btfsc FLAG_apnoe_mode ; Apnoe mode? - movlw samplingrate_apnoe ; Apnoe sampling rate - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf samplingrate,W ; Sampling rate + btfsc FLAG_apnoe_mode ; Apnoe mode? + movlw samplingrate_apnoe ; Apnoe sampling rate + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; CNS at beginning of dive + ; CNS at beginning of dive movff CNS_start+0,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff CNS_start+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Gradient factor - movff GF_start,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff int_O_gradient_factor+0,WREG ; value limited to 255, only lower byte in use - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff CNS_start+1,WREG + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Gradient factor + movff GF_start,WREG + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff int_O_gradient_factor+0,WREG ; value limited to 255, only lower byte in use + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Logbook offset - call do_logoffset_common_read; Read into lo:hi - movf lo,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movf hi,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Logbook offset + call do_logoffset_common_read ; Read into lo:hi + movf lo,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf hi,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Battery info at Byte 59 - movf batt_percent,W ; 0-100 - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Store 5 Setpoints - movff char_I_setpoint_cbar+0,WREG - rcall ghostwrite_byte_header ; Setpoint in cbar - movff char_I_setpoint_change+0,WREG - rcall ghostwrite_byte_header ; Change depth - movff char_I_setpoint_cbar+1,WREG - rcall ghostwrite_byte_header ; Setpoint in cbar - movff char_I_setpoint_change+1,WREG - rcall ghostwrite_byte_header ; Change depth - movff char_I_setpoint_cbar+2,WREG - rcall ghostwrite_byte_header ; Setpoint in cbar - movff char_I_setpoint_change+2,WREG - rcall ghostwrite_byte_header ; Change depth - movff char_I_setpoint_cbar+3,WREG - rcall ghostwrite_byte_header ; Setpoint in cbar - movff char_I_setpoint_change+3,WREG - rcall ghostwrite_byte_header ; Change depth - movff char_I_setpoint_cbar+4,WREG - rcall ghostwrite_byte_header ; Setpoint in cbar - movff char_I_setpoint_change+4,WREG - rcall ghostwrite_byte_header ; Change depth + ; Battery info at Byte 59 + movf batt_percent,W ; 0-100 + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Store 5 Setpoints + movff char_I_setpoint_cbar+0,WREG + rcall ghostwrite_byte_header ; Setpoint in cbar + movff char_I_setpoint_change+0,WREG + rcall ghostwrite_byte_header ; Change depth + movff char_I_setpoint_cbar+1,WREG + rcall ghostwrite_byte_header ; Setpoint in cbar + movff char_I_setpoint_change+1,WREG + rcall ghostwrite_byte_header ; Change depth + movff char_I_setpoint_cbar+2,WREG + rcall ghostwrite_byte_header ; Setpoint in cbar + movff char_I_setpoint_change+2,WREG + rcall ghostwrite_byte_header ; Change depth + movff char_I_setpoint_cbar+3,WREG + rcall ghostwrite_byte_header ; Setpoint in cbar + movff char_I_setpoint_change+3,WREG + rcall ghostwrite_byte_header ; Change depth + movff char_I_setpoint_cbar+4,WREG + rcall ghostwrite_byte_header ; Setpoint in cbar + movff char_I_setpoint_change+4,WREG + rcall ghostwrite_byte_header ; Change depth - movff opt_salinity,WREG ; Salinity (0-4%) - rcall ghostwrite_byte_header ; Store Salinity to Dive + movff opt_salinity,WREG ; Salinity (0-4%) + rcall ghostwrite_byte_header ; Store Salinity to Dive movff int_O_CNS_fraction+0,WREG ; copy into bank1 - rcall ghostwrite_byte_header; Stores CNS% - movff int_O_CNS_fraction+1,WREG ; copy into bank1 - rcall ghostwrite_byte_header; Stores CNS% + rcall ghostwrite_byte_header ; Stores CNS% + movff int_O_CNS_fraction+1,WREG ; copy into bank1 + rcall ghostwrite_byte_header ; Stores CNS% movff avg_rel_pressure_total+0,WREG ; Average Depth - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff avg_rel_pressure_total+1,WREG ; Average Depth - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff total_divetime_seconds+0,WREG ; Total dive time (Regardless of start_dive_threshold) - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff total_divetime_seconds+1,WREG ; Total dive time (Regardless of start_dive_threshold) - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff char_I_GF_Low_percentage,WREG ; GF_lo movff char_I_deco_model,lo decfsz lo,F ; jump over next line if char_I_deco_model == 1 movff char_I_saturation_multiplier,WREG ; Saturation Multiplier - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff char_I_GF_High_percentage,WREG ; GF_hi movff char_I_deco_model,lo decfsz lo,F ; jump over next line if char_I_deco_model == 1 movff char_I_desaturation_multiplier,WREG ; Desaturation Multiplier - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF - rcall ghostwrite_byte_header; writes byte and increases address (no banking) + rcall ghostwrite_byte_header ; writes byte and increases address (no banking) - read_int_eeprom .2 + read_int_eeprom .2 movf EEDATA,W - rcall ghostwrite_byte_header ; Total dive counter, low - read_int_eeprom .3 + rcall ghostwrite_byte_header ; Total dive counter, low + read_int_eeprom .3 movf EEDATA,W - rcall ghostwrite_byte_header ; Total dive counter, high + rcall ghostwrite_byte_header ; Total dive counter, high - movff opt_dive_mode,WREG - rcall ghostwrite_byte_header ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + movff opt_dive_mode,WREG + rcall ghostwrite_byte_header ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR -; Store all tissue data available - movlw .16 - movwf lo - lfsr FSR1,char_O_tissue_N2_saturation+0 +; Store all tissue data available + movlw .16 + movwf lo + lfsr FSR1,char_O_tissue_N2_saturation+0 end_dive_store_tissues_N2: - movf POSTINC1,W - bcf WREG,7 ; clear flag bit for ongassing/offgassing - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - decfsz lo,F - bra end_dive_store_tissues_N2 ; No + movf POSTINC1,W + bcf WREG,7 ; clear flag bit for ongassing/offgassing + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + decfsz lo,F + bra end_dive_store_tissues_N2 ; No - movlw .64 - movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes + movlw .64 + movwf lo + lfsr FSR1,0x700 ; pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes end_dive_store_tissues_N2_2: - movf POSTINC1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - decfsz lo,F - bra end_dive_store_tissues_N2_2 ; No + movf POSTINC1,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + decfsz lo,F + bra end_dive_store_tissues_N2_2 ; No - movlw .16 - movwf lo - lfsr FSR1,char_O_tissue_He_saturation+0 + movlw .16 + movwf lo + lfsr FSR1,char_O_tissue_He_saturation+0 end_dive_store_tissues_He: - movf POSTINC1,W - bcf WREG,7 ; clear flag bit for ongassing/offgassing - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - decfsz lo,F - bra end_dive_store_tissues_He ; No + movf POSTINC1,W + bcf WREG,7 ; clear flag bit for ongassing/offgassing + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + decfsz lo,F + bra end_dive_store_tissues_He ; No - movlw .64 - movwf lo - lfsr FSR1,0x740;pres_tissue_He+0 ; 16*4Byte Float = 64Bytes + movlw .64 + movwf lo + lfsr FSR1,0x740 ; pres_tissue_He+0 ; 16*4Byte Float = 64Bytes end_dive_store_tissues_He_2: - movf POSTINC1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - decfsz lo,F - bra end_dive_store_tissues_He_2 ; No + movf POSTINC1,W + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + decfsz lo,F + bra end_dive_store_tissues_He_2 ; No - ; Some deco stuff - movff char_I_depth_last_deco,WREG ; last stop [m] - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff char_I_deco_distance,WREG ; assumed distance to shown stop - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Some deco stuff + movff char_I_depth_last_deco,WREG ; last stop [m] + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff char_I_deco_distance,WREG ; assumed distance to shown stop + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Last HUD data - movff hud_battery_mv+0,WREG ; Last HUD battery value - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff hud_battery_mv+1,WREG ; Last HUD battery value - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff hud_status_byte,WREG ; Last HUD status - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Last HUD data + movff hud_battery_mv+0,WREG ; Last HUD battery value + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff hud_battery_mv+1,WREG ; Last HUD battery value + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff hud_status_byte,WREG ; Last HUD status + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Battery gauge registers [nAs] - movff battery_gauge+0,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff battery_gauge+1,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff battery_gauge+2,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff battery_gauge+3,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff battery_gauge+4,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff battery_gauge+5,WREG ; Battery gauge register - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + ; Battery gauge registers [nAs] + movff battery_gauge+0,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff battery_gauge+1,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff battery_gauge+2,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff battery_gauge+3,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff battery_gauge+4,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff battery_gauge+5,WREG ; Battery gauge register + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; Header stop + ; Header stop movlw 0xFB - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movlw 0xFB - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - - call divemode_store_statistics ; Store/update statistics for this unit + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + + call divemode_store_statistics ; Store/update statistics for this unit clrf surface_interval+0 - clrf surface_interval+1 ; Clear surface interval timer + clrf surface_interval+1 ; Clear surface interval timer ghostwriter_end_dive_common: ; Update ext_flash_log_pointer into EEPROM @@ -786,191 +848,194 @@ movff ext_flash_log_pointer+2,EEDATA write_int_eeprom .6 - bcf simulatormode_active ; if we were in simulator mode + bcf simulatormode_active ; if we were in simulator mode ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc... - ifndef __DEBUG - extern deco_pull_tissues_from_vault - btfsc restore_deco_data ; Restore decodata? - call deco_pull_tissues_from_vault - banksel common ; Bank1 + ifndef __DEBUG + extern deco_pull_tissues_from_vault + btfsc restore_deco_data ; Restore decodata? + call deco_pull_tissues_from_vault + banksel common ; Bank1 endif call update_battery_registers ; update battery registers into EEPROM - goto surfloop ; and return to surfaceloop + goto surfloop ; and return to surface loop ghostwriter_end_dive_common_sim: - tstfsz surface_interval+0 ; Was interval zero? - bra ghostwriter_end_dive_common_sim2 ; No - tstfsz surface_interval+1 ; Was interval zero? - bra ghostwriter_end_dive_common_sim2 ; No - bra ghostwriter_end_dive_common ; Yes, done. + tstfsz surface_interval+0 ; Was interval zero? + bra ghostwriter_end_dive_common_sim2 ; No + tstfsz surface_interval+1 ; Was interval zero? + bra ghostwriter_end_dive_common_sim2 ; No + bra ghostwriter_end_dive_common ; Yes, done. ghostwriter_end_dive_common_sim2: - movf divemins+0,W - addwf surface_interval+0,F - movf divemins+1,W - addwfc surface_interval+1 ; Add simulated divetime to surface interval - bra ghostwriter_end_dive_common + movf divemins+0,W + addwf surface_interval+0,F + movf divemins+1,W + addwfc surface_interval+1 ; Add simulated dive time to surface interval + bra ghostwriter_end_dive_common -ghostwriter_load_pointer: ; Load ext_flash_address:3 from EEPROM .4-.6 - clrf EEADRH ; Make sure to select eeprom bank 0 +ghostwriter_load_pointer: ; Load ext_flash_address:3 from EEPROM .4-.6 + clrf EEADRH ; Make sure to select EEPROM bank 0 read_int_eeprom .4 movff EEDATA,ext_flash_address+0 read_int_eeprom .5 movff EEDATA,ext_flash_address+1 read_int_eeprom .6 movff EEDATA,ext_flash_address+2 - return + return -ghostwriter_short_header_init: ; Proceed one page forward - clrf EEDATA - write_int_eeprom .4 ; ext_flash_address+0 = 0 - movlw .16 - addwf ext_flash_address+1,F - movlw .0 - addwfc ext_flash_address+2,F - movlw 0x20 - cpfseq ext_flash_address+2 ; at address 0x200000? - bra ghostwriter_short_header_init2 ; No - clrf ext_flash_address+2 ; Yes, rollover to 0x000000 +ghostwriter_short_header_init: ; Proceed one page forward + clrf EEDATA + write_int_eeprom .4 ; ext_flash_address+0 = 0 + movlw .16 + addwf ext_flash_address+1,F + movlw .0 + addwfc ext_flash_address+2,F + movlw 0x20 + cpfseq ext_flash_address+2 ; at address 0x200000? + bra ghostwriter_short_header_init2 ; No + clrf ext_flash_address+2 ; Yes, rollover to 0x000000 ghostwriter_short_header_init2: - movlw 0xF0 - andwf ext_flash_address+1,F ; keep higher nibble, set lower nibble to 0 + movlw 0xF0 + andwf ext_flash_address+1,F ; keep higher nibble, set lower nibble to 0 - movff ext_flash_address+1,EEDATA - write_int_eeprom .5 ; Write new pointer - movff ext_flash_address+2,EEDATA - write_int_eeprom .6 ; Write new pointer - bra ghostwriter_short_header2 ; Done. + movff ext_flash_address+1,EEDATA + write_int_eeprom .5 ; Write new pointer + movff ext_flash_address+2,EEDATA + write_int_eeprom .6 ; Write new pointer + bra ghostwriter_short_header2 ; Done. global ghostwriter_short_header -ghostwriter_short_header: ; Write short header with divenumber into profile memory +ghostwriter_short_header: ; Write short header with dive number into profile memory ; load pointer for profile storing into RAM (Updated in EEPROM after the dive) - rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 + rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 - ; The following code is used to write a clean new dive after the previous hasn't been - ; stored correctly. e.g. after a battery fail during the dive - call ext_flash_byte_read_plus_0x20 ; Into temp1 - incfsz temp1,F - bra ghostwriter_short_header_init ; Not 0xFF -> init page - call ext_flash_byte_read_plus_0x20 ; Into temp1 - incfsz temp1,F - bra ghostwriter_short_header_init ; Not 0xFF -> init page + ; The following code is used to write a clean new dive after the previous hasn't been + ; stored correctly. e.g. after a battery fail during the dive + call ext_flash_byte_read_plus_0x20 ; Into ext_flash_rw + incfsz ext_flash_rw,F + bra ghostwriter_short_header_init ; Not 0xFF -> init page + call ext_flash_byte_read_plus_0x20 ; Into ext_flash_rw + incfsz ext_flash_rw,F + bra ghostwriter_short_header_init ; Not 0xFF -> init page ghostwriter_short_header2: - ; All ok, reload the pointer and start - rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 + ; All ok, reload the pointer and start + rcall ghostwriter_load_pointer ; Load ext_flash_address:3 from EEPROM .4-.6 - ; Clear dive length counter - clrf ext_flash_dive_counter+0 - clrf ext_flash_dive_counter+1 - clrf ext_flash_dive_counter+2 + ; Clear dive length counter + clrf ext_flash_dive_counter+0 + clrf ext_flash_dive_counter+1 + clrf ext_flash_dive_counter+2 - ; Write short header with divenumber into profile memory + ; Write short header with dive number into profile memory movlw 0xFA - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw 0xFA - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash ; Load total number of dives (low byte only) read_int_eeprom .2 - incf EEDATA,W ;+1 - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + incf EEDATA,W ;+1 + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash read_int_eeprom .3 movf EEDATA,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw 0xFA - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw 0xFA - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - ; Keep room for dive length ext_flash_dive_counter:3 (Stored at the end of the dive) - ; Writing 0xFF three times here is mandatory - ; - 0xFF can be overwritten after the dive - ; - ghostwrite_byte_profile takes care of 4kB Page switching - ; - fixes an issue when we are at exactly 0xXXX000 here... + ; Keep room for dive length ext_flash_dive_counter:3 (Stored at the end of the dive) + ; Writing 0xFF three times here is mandatory + ; - 0xFF can be overwritten after the dive + ; - ghostwrite_byte_profile takes care of 4kB Page switching + ; - fixes an issue when we are at exactly 0xXXX000 here... - movlw 0xFF - call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) - movlw 0xFF - call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) - movlw 0xFF - call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) + movlw 0xFF + call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) + movlw 0xFF + call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) + movlw 0xFF + call write_byte_ext_flash_plus_nocnt ; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) - movf samplingrate,W ; Sampling rate - btfsc FLAG_apnoe_mode ; Apnoe mode? - movlw samplingrate_apnoe ; Apnoe sampling rate - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movf samplingrate,W ; Sampling rate + btfsc FLAG_apnoe_mode ; Apnoe mode? + movlw samplingrate_apnoe ; Apnoe sampling rate + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .7 ; Number of divisors - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .7 ; Number of divisors + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .0 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .0 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_temperature - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_temperature ; Divisor temperature - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_temperature ; Divisor temperature + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .1 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .1 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_deco - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_deco ; Divisor decodata - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_deco ; Divisor deco data + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .2 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .2 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_gf - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_gf ; Divisor gf - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_gf ; Divisor gf + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .3 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .3 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_ppo2_sensors - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_ppo2_sensors ; Divisor ppO2 - btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - movlw .0 ; No ppO2 data in OC mode - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_ppo2_sensors ; Divisor ppO2 + btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + movlw .0 ; No ppO2 data in OC mode + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .4 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .4 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_decoplan - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_decoplan ; Divisor debug - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_decoplan ; Divisor debug + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .5 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .5 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_cns - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_cns ; Divisor CNS - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_cns ; Divisor CNS + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw .6 ; Type - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw .6 ; Type + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash movlw infolength_tank - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash - movlw div_tank ; Divisor Tank - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash + movlw div_tank ; Divisor Tank + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash return -divemode_store_statistics: ; Store/update statistics for this unit - rcall vault_decodata_into_eeprom ; update deco data - rcall do_logoffset_common_read ; Existing logbook offset into lo:hi - - tstfsz lo ; lo=0? - bra change_logbook_offset1 ; No, adjust offset - tstfsz hi ; hi=0? - bra change_logbook_offset1 ; No, adjust offset - bra change_logbook_offset2 ; lo=0 and hi=0 -> skip Offset routine + +divemode_store_statistics: ; Store/update statistics for this unit + call vault_decodata_into_eeprom ; update deco data + call do_logoffset_common_read ; Existing logbook offset into lo:hi + + tstfsz lo ; lo=0? + bra change_logbook_offset1 ; No, adjust offset + tstfsz hi ; hi=0? + bra change_logbook_offset1 ; No, adjust offset + bra change_logbook_offset2 ; lo=0 and hi=0 -> skip Offset routine + change_logbook_offset1: movlw d'1' addwf lo movlw d'0' addwfc hi - rcall do_logoffset_common_write ; lo:hi -> EEPROM + call do_logoffset_common_write ; lo:hi -> EEPROM + change_logbook_offset2: ; Clear lastdive:4 banksel lastdive_time+0 @@ -980,172 +1045,12 @@ clrf lastdive_time+3 movff divemins+0,lastdive_duration+0 movff divemins+1,lastdive_duration+1 - movff divesecs,lastdive_duration+2 + movff divesecs, lastdive_duration+2 movff max_pressure+0,lastdive_maxdepth+0 movff max_pressure+1,lastdive_maxdepth+1 banksel common ; Add more here... - return - - global do_logoffset_common_write -do_logoffset_common_write: - ; TODO: limit [lo:hi] to 9999 ? may arrive here as >= 10000 because of +10 increment option - ; SIMPLER WAY: return without writing to eeprom if hi == 0x27 -> 0x2700 = 9984, this is within - ; the save range for a +10 increment, shall do it... - ; mH - - movff lo,EEDATA - write_int_eeprom 0x0D - movff hi,EEDATA - write_int_eeprom 0x0E - return - - global do_logoffset_common_read -do_logoffset_common_read: - clrf EEADRH - read_int_eeprom 0x0D - movff EEDATA,lo - read_int_eeprom 0x0E - movff EEDATA,hi ; Existing logbook offset into lo:hi - return - - - global update_battery_registers -update_battery_registers: - ; save battery_gauge:6 into EEPROM 0x07-0x0C - clrf EEADRH - movff battery_gauge+0,EEDATA - write_int_eeprom 0x07 - movff battery_gauge+1,EEDATA - write_int_eeprom 0x08 - movff battery_gauge+2,EEDATA - write_int_eeprom 0x09 - movff battery_gauge+3,EEDATA - write_int_eeprom 0x0A - movff battery_gauge+4,EEDATA - write_int_eeprom 0x0B - movff battery_gauge+5,EEDATA - write_int_eeprom 0x0C - movff battery_type,EEDATA ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah - write_int_eeprom 0x0F return - - global vault_decodata_into_eeprom -vault_decodata_into_eeprom: - ; Vault in EEPROM 512...1023 - ; Write 0xAA at 512 to indicate valid data in vault - ; Store last time/date - ; Store 0x700 to 0x780 (pres_tissue_N2 and pres_tissue_He) - movlw HIGH .512 ; =2 - movwf EEADRH - movlw 0xAA - movwf EEDATA - write_int_eeprom .0 - ; Store date/time - movff year,EEDATA - write_int_eeprom .1 - movff month,EEDATA - write_int_eeprom .2 - movff day,EEDATA - write_int_eeprom .3 - movff hours,EEDATA - write_int_eeprom .4 - movff mins,EEDATA - write_int_eeprom .5 - movff secs,EEDATA - write_int_eeprom .6 - - movff int_O_CNS_fraction+0,EEDATA - write_int_eeprom .7 - movff int_O_CNS_fraction+1,EEDATA - write_int_eeprom .8 - movff int_O_desaturation_time+0,EEDATA - write_int_eeprom .9 - movff int_O_desaturation_time+1,EEDATA - write_int_eeprom .10 - movff surface_interval+0,EEDATA - write_int_eeprom .11 - movff surface_interval+1,EEDATA - write_int_eeprom .12 - movff int_O_gradient_factor+0,EEDATA ; value limited to 255, only lower byte in use for value - write_int_eeprom .13 - movff int_O_nofly_time+0,EEDATA - write_int_eeprom .14 - movff int_O_nofly_time+1,EEDATA - write_int_eeprom .15 - - ; Tissue data from 16 to 144 - movlw .16 - movwf EEADR - movlw .128 - movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes -vault_decodata_into_eeprom2: - movff POSTINC1,EEDATA - call write_eeprom ; EEDATA into EEPROM@EEADR - incf EEADR,F - decfsz lo,F ; All done? - bra vault_decodata_into_eeprom2 ; No - clrf EEADRH - return - - global restore_decodata_from_eeprom -restore_decodata_from_eeprom: - movlw LOW .512 ; =0 - movwf EEADR - movlw HIGH .512 ; =2 - movwf EEADRH - - ; Restore date/time - read_int_eeprom .1 - movff EEDATA,year - read_int_eeprom .2 - movff EEDATA,month - read_int_eeprom .3 - movff EEDATA,day - read_int_eeprom .4 - movff EEDATA,hours - read_int_eeprom .5 - movff EEDATA,mins - read_int_eeprom .6 - movff EEDATA,secs - call rtc_set_rtc - - read_int_eeprom .7 - movff EEDATA,int_O_CNS_fraction+0 - read_int_eeprom .8 - movff EEDATA,int_O_CNS_fraction+1 - read_int_eeprom .9 - movff EEDATA,int_O_desaturation_time+0 - read_int_eeprom .10 - movff EEDATA,int_O_desaturation_time+1 - read_int_eeprom .11 - movff EEDATA,surface_interval+0 - read_int_eeprom .12 - movff EEDATA,surface_interval+1 - read_int_eeprom .13 - movff EEDATA,int_O_gradient_factor+0 - read_int_eeprom .14 - movff EEDATA,int_O_nofly_time+0 - read_int_eeprom .15 - movff EEDATA,int_O_nofly_time+1 - - ; Tissue data from 16 to 144 - movlw .16 - movwf EEADR - movlw .128 - movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes -restore_decodata_from_eeprom2: - call read_eeprom ; EEPROM@EEADR into EEDATA - movff EEDATA,POSTINC1 - incf EEADR,F - decfsz lo,F ; All done? - bra restore_decodata_from_eeprom2 ; No - clrf EEADRH - return - - - END \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/ghostwriter.inc --- a/src/ghostwriter.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/ghostwriter.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File ghostwriter.inc +; File ghostwriter.inc V2.98 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,11 +8,6 @@ ; HISTORY ; 2011-11-27 : [mH] Creation - extern store_dive_data + extern store_dive_data extern ghostwriter_end_dive extern ghostwriter_short_header - extern update_battery_registers - extern do_logoffset_common_write - extern do_logoffset_common_read - - \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/hwos.inc --- a/src/hwos.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/hwos.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File hwos.inc REFACTORED VERSION V2.95a1 +; File hwos.inc REFACTORED VERSION V2.98 ; ; OSTC Platform definitions ; @@ -11,173 +11,156 @@ ;============================================================================= - LIST P=18F87K22 ; change also: Configure->SelectDevice from Mplab + LIST P=18F87K22 ; change also: Configure->SelectDevice from Mplab ;#DEFINE __DEBUG -;#DEFINE french_italian ; If defined, use french and italian instead of english and german - +;#DEFINE french_italian ; If defined, use french and italian instead of english and german + #include -#include ; Portmap +#include ; Portmap ; Firmware definition -#DEFINE softwareversion_x d'2' ; Software version XX.YY -#DEFINE softwareversion_y d'97' ; Software version XX.YY -#DEFINE softwareversion_beta 0 ; (and 0 for release) +#DEFINE softwareversion_x .2 ; Software version XX.YY +#DEFINE softwareversion_y .97 ; Software version XX.YY +#DEFINE softwareversion_beta .0 ; (and 0 for release) ; Firmware version will appear in "Change Firmware" style -#DEFINE firmware_expire_year .18 -#DEFINE firmware_expire_month .2 -#DEFINE firmware_expire_day .22 +#DEFINE firmware_expire_year .19 +#DEFINE firmware_expire_month .2 +#DEFINE firmware_expire_day .24 -#DEFINE comm_service_key 0xABCDEF +#DEFINE comm_service_key 0xABCDEF +;-----------------------------EEPROM DATA ------------------------------------ +; Automatic reset of all options when this is changed: +#define eeprom_opt_serial 0x0006 ; Version 0.6 ;----------------------------------------------------------------------------- -#DEFINE CCP1CON_VALUE b'00001100' ; PWM1 for LED dimming -#DEFINE T2CON_ECO b'00000100' ; 1:1 Postscaler, 1:1 Prescaler, Timer 2 start -> 980Hz (Good compromise of no-flicker and efficiency) -#DEFINE T2CON_NORMAL b'00001110' -#DEFINE T2CON_FASTEST b'00001110' ; 1:2 Postscaler, 1:16 Prescaler, Timer 2 start -> 1960Hz (no-flicker) - -#DEFINE TMR0H_VALUE .245 ; RX Timeout (~3ms) +#DEFINE CCP1CON_VALUE b'00001100' ; PWM1 for LED dimming +#DEFINE T2CON_ECO b'00000100' ; 1:1 Postscaler, 1:1 Prescaler, Timer 2 start -> 980Hz (Good compromise of no-flicker and efficiency) +#DEFINE T2CON_NORMAL b'00001110' +#DEFINE T2CON_FASTEST b'00001110' ; 1:2 Postscaler, 1:16 Prescaler, Timer 2 start -> 1960Hz (no-flicker) ; Timing for button hold-down flags -#DEFINE TMR1H_VALUE_FIRST .255-.128 ; in steps of 7,8125ms -> 1s -#DEFINE TMR1H_VALUE_CONT .255-.32 ; in steps of 7,8125ms -> 0.25s -#DEFINE TMR1H_VALUE_CONT_DIVE .255-.64 ; in steps of 7,8125ms -> 0.5s +#DEFINE TMR1H_VALUE_FIRST .255-.128 ; in steps of 7,8125ms -> 1s +#DEFINE TMR1H_VALUE_CONT .255-.32 ; in steps of 7,8125ms -> 0.25s +#DEFINE TMR1H_VALUE_CONT_DIVE .255-.64 ; in steps of 7,8125ms -> 0.5s ; Color Definitions: 8Bit RGB b'RRRGGGBB' -#DEFINE color_red b'11100000' ; (7,0,0) -#DEFINE color_dark_red b'10000101' ; (4,1,1) -#DEFINE color_violet b'11101011' ; (7,2,3) -#DEFINE color_blue b'11000111' ; (6,1,3) -#DEFINE color_green b'00011100' ; (0,7,0) -#DEFINE color_greenish b'00111110' ; (1,7,2) -#DEFINE color_dark_green b'00111001' ; (1,6,1) -#DEFINE color_yellow b'11111101' ; (7,7,1) -#DEFINE color_white b'11111111' ; (7,7,3) -#DEFINE color_black b'00000000' ; (0,0,0) -#DEFINE color_deepblue b'00000010' ; (0,0,2) -#DEFINE color_grey b'11011111' ; (6,7,3) -#DEFINE color_cyan b'11011111' ; (6,7,3) -#DEFINE color_lightblue b'11011011' ; (6,7,3) -#DEFINE color_orange b'11111000' ; (7,6,0) -#DEFINE color_pink b'11111010' ; (7,6,2) +#DEFINE color_red b'11100000' ; (7,0,0) +#DEFINE color_dark_red b'10000101' ; (4,1,1) +#DEFINE color_violet b'11101011' ; (7,2,3) +#DEFINE color_blue b'11000111' ; (6,1,3) +#DEFINE color_green b'00011100' ; (0,7,0) +#DEFINE color_greenish b'00111110' ; (1,7,2) +#DEFINE color_dark_green b'00111001' ; (1,6,1) +#DEFINE color_yellow b'11111101' ; (7,7,1) +#DEFINE color_white b'11111111' ; (7,7,3) +#DEFINE color_black b'00000000' ; (0,0,0) +#DEFINE color_deepblue b'00000010' ; (0,0,2) +#DEFINE color_grey b'11011111' ; (6,7,3) +#DEFINE color_cyan b'11011111' ; (6,7,3) +#DEFINE color_lightblue b'11011011' ; (6,7,3) +#DEFINE color_orange b'11111000' ; (7,6,0) +#DEFINE color_pink b'11111010' ; (7,6,2) -#DEFINE FT_TINY .0 -#DEFINE FT_SMALL .1 -#DEFINE FT_MEDIUM .2 -#DEFINE FT_LARGE .3 - -#DEFINE warn_depth .1 -#DEFINE warn_cns .2 -#DEFINE warn_gf .3 -#DEFINE warn_ppo2 .4 -#DEFINE warn_ceiling .5 -#DEFINE warn_gas_in_gaslist .6 -#DEFINE warn_ppo2_hud .7 -#DEFINE warn_battery .8 -#DEFINE warn_stop .9 +#DEFINE FT_TINY .0 +#DEFINE FT_SMALL .1 +#DEFINE FT_MEDIUM .2 ; not used +#DEFINE FT_LARGE .3 ; not used ; External O2 cell input parameters -#DEFINE min_mv .80 ; = 8mV -#DEFINE max_mv .2500 ; = 250mV -#DEFINE ignore_mv .3500 ; = 350mV (To suppress ghost readings for long, open cables) +#DEFINE min_mv .80 ; = 8mV +#DEFINE max_mv .2500 ; = 250mV +#DEFINE ignore_mv .3500 ; = 350mV (to suppress ghost readings for long, open cables) ; Profile recording parameters -#DEFINE logbook_profile_version 0x24 -#DEFINE samplingrate_apnoe .1 ; [seconds] +#DEFINE logbook_profile_version 0x24 +#DEFINE samplingrate_apnoe .1 ; [seconds] ; Warning: Divisors must be <.16 ! -#DEFINE div_temperature .6 ; x samplingrate [s] -#DEFINE div_deco .6 ; x samplingrate [s] -#DEFINE div_gf .12 ; x samplingrate [s] -#DEFINE div_ppo2_sensors .2 ; x samplingrate [s] -#DEFINE div_decoplan .12 ; x samplingrate [s] -#DEFINE div_cns .12 ; x samplingrate [s] -#DEFINE div_tank .0 ; x samplingrate [s] +#DEFINE div_temperature .6 ; x samplingrate [s] +#DEFINE div_deco .6 ; x samplingrate [s] +#DEFINE div_gf .12 ; x samplingrate [s] +#DEFINE div_ppo2_sensors .2 ; x samplingrate [s] +#DEFINE div_decoplan .12 ; x samplingrate [s] +#DEFINE div_cns .12 ; x samplingrate [s] +#DEFINE div_tank .0 ; x samplingrate [s] ; Warning: Information lengths must be <.16 ! -#DEFINE infolength_temperature .2 ; [byte] -#DEFINE infolength_deco .2 ; [byte] -#DEFINE infolength_gf .1 ; [byte] -#DEFINE infolength_ppo2_sensors .9 ; [byte] -#DEFINE infolength_decoplan .15 ; [byte] -#DEFINE infolength_cns .2 ; [byte] -#DEFINE infolength_tank .0 ; [byte] +#DEFINE infolength_temperature .2 ; [byte] +#DEFINE infolength_deco .2 ; [byte] +#DEFINE infolength_gf .1 ; [byte] +#DEFINE infolength_ppo2_sensors .9 ; [byte] +#DEFINE infolength_decoplan .15 ; [byte] +#DEFINE infolength_cns .2 ; [byte] +#DEFINE infolength_tank .0 ; [byte] ; "Better Gas" behavior ; better_gas_window <= minimum_change_depth ! ; minimum_change_depth >=5 ! -#DEFINE minimum_change_depth .3 ; [m] -#DEFINE better_gas_window_neg .3 ; [m] (Depth above change depth) -#DEFINE better_gas_window_pos .1 ; [m] (Depth below change depth, if ppO2 Result is in percent of a 0.8Ah Battery ; For internal battery gauging -#DEFINE internal_saft_capacity .364 -#DEFINE internal_panasonic_capacity .121 +#DEFINE internal_saft_capacity .364 +#DEFINE internal_panasonic_capacity .121 ; For gauge IC -#DEFINE saft_capacity .281 ; 2.4Ah/0.085mAh/100 [%] -#DEFINE saft_offset .37300 ; 65536-(2.4Ah/0.085mAh) +#DEFINE saft_capacity .281 ; 2.4Ah/0.085mAh/100 [%] +#DEFINE saft_offset .37300 ; 65536-(2.4Ah/0.085mAh) -#DEFINE panasonic_capacity .94 ; 0.8Ah/0.085mAh/100 [%] -#DEFINE panasonic_offset .56124 ; 65536-(0.8Ah/0.085mAh) +#DEFINE panasonic_capacity .94 ; 0.8Ah/0.085mAh/100 [%] +#DEFINE panasonic_offset .56124 ; 65536-(0.8Ah/0.085mAh) + +#DEFINE ncr18650_capacity .364 ; 3.1Ah/0.085mAh/100 [%] +#DEFINE ncr18650_offset .29065 ; 65536-(3.1Ah/0.085mAh) -#DEFINE ncr18650_capacity .364 ; 3.1Ah/0.085mAh/100 [%] -#DEFINE ncr18650_offset .29065 ; 65536-(3.1Ah/0.085mAh) - -#DEFINE ur16650_capacity .271 ; 2.3Ah/0.085mAh/100 [%] -#DEFINE ur16650_offset .38477 ; 65536-(2.3Ah/0.085mAh) - -#DEFINE current_sleepmode .31 -#DEFINE current_backlight_multi .115 ; *CCPR1L+current_backlight_offset -#DEFINE current_backlight_offset .216 -#DEFINE current_speed_eco .1914 -#DEFINE current_speed_normal .4027 -#DEFINE current_speed_fastest .5050 -#DEFINE current_ir_reciever .139 -#DEFINE current_compass .28 +#DEFINE ur16650_capacity .271 ; 2.3Ah/0.085mAh/100 [%] +#DEFINE ur16650_offset .38477 ; 65536-(2.3Ah/0.085mAh) + +#DEFINE current_sleepmode .31 +#DEFINE current_backlight_multi .115 ; * CCPR1L + current_backlight_offset +#DEFINE current_backlight_offset .216 +#DEFINE current_speed_eco .1914 +#DEFINE current_speed_normal .4027 +#DEFINE current_speed_fastest .5050 +#DEFINE current_ir_receiver .139 +#DEFINE current_compass .28 ; Brightness thresholds (between zero (off) and 255 (max. power)) -#DEFINE ambient_light_max_high_36V .170 -#DEFINE ambient_light_max_high_cr .240 -#DEFINE ambient_light_max_high_15V .140 -#DEFINE ambient_light_min_high .35 -#DEFINE ambient_light_max_medium .125 -#DEFINE ambient_light_min_medium .25 -#DEFINE ambient_light_max_eco .70 -#DEFINE ambient_light_min_eco .10 ; Must be the lowest value! +#DEFINE ambient_light_max_high_36V .170 +#DEFINE ambient_light_max_high_cr .240 +#DEFINE ambient_light_max_high_15V .140 +#DEFINE ambient_light_min_high .35 +#DEFINE ambient_light_max_medium .125 +#DEFINE ambient_light_min_medium .25 +#DEFINE ambient_light_max_eco .70 +#DEFINE ambient_light_min_eco .10 ; must be the lowest value! ; IR Link timeout -#DEFINE ir_timeout_value .64 ; multiples of 62,5ms +#DEFINE ir_timeout_value .64 ; multiples of 62,5ms ; Sp control constants -#DEFINE surface_sp .50 ; in cbar +#DEFINE surface_sp .50 ; in cbar ; Gaslist hard-coded limits -#DEFINE gaslist_min_o2 .7 ; Minimum O2 [%] -#DEFINE gaslist_max_change_depth .99 ; Max. change depth [m] -#DEFINE gaslist_sp_stepsize .10 ; Steps for Setpoint Setup [cbar] -#DEFINE gaslist_sp_max .160 ; Max. Setpoint [cbar] -#DEFINE gaslist_sp_min .50 ; Min. Setpoint [cbar] +#DEFINE gaslist_min_o2 .5 ; Minimum O2 [%] +#DEFINE gaslist_max_He .100-gaslist_min_o2 ; Maximum He [%] + +#DEFINE gaslist_max_change_depth .99 ; Max. change depth [m] +#DEFINE gaslist_sp_stepsize .10 ; Steps for Setpoint Setup [cbar] +#DEFINE gaslist_sp_max .160 ; Max. Setpoint [cbar] +#DEFINE gaslist_sp_min .50 ; Min. Setpoint [cbar] ; Compass display -#DEFINE compass_fast_treshold .9 ; show new heading instantly if new and old > compass_fast_treshold -#DEFINE compass_averaging .10 ; numbers of extra averaging - -; Hardware defines -#DEFINE battery_gauge_available hardware_flag,0 ; OSTC has rechargeable battery with battery management chip -#DEFINE ambient_sensor hardware_flag,1 ; OSTC has an ambient light sensor -#DEFINE analog_o2_input hardware_flag,2 ; OSTC has analog inputs and S8 digital -#DEFINE optical_input hardware_flag,3 ; OSTC has an digital optical input -#DEFINE ble_available hardware_flag,4 ; OSTC has an BLE module -#DEFINE ostc_rx_present hardware_flag,5 ; OSTC_RX circuity present -;unused -;unused - -; Hardware flag byte: -; BIT0 = OSTC has rechargeable battery with battery management chip -; BIT1 = OSTC has an ambient light sensor -; BIT2 = OSTC has analog inputs and S8 digital -; BIT3 = OSTC has an digital optical input -; BIT4 = OSTC has an BLE module -; BIT5 = OSTC_RX circuity present -; BIT6 = unused -; BIT7 = unused - - -;---------------------------- Macros ------------------------------------ - -TSTOSS macro opt_reg ; TeST Option Skip if not Zero - movff opt_reg,WREG - tstfsz WREG,A - bra $+4 - endm - -;---------------------------- Bank0 DATA ------------------------------------ -isr_backup equ 0x60 -isr_backup udata_ovr isr_backup ; Reserved space for interupt data - -;---- Backup for general registers -isr_prod res 2 - -;---- MS5541 subroutines -amb_pressure res 2 -temperature res 2 +#DEFINE compass_fast_treshold .9 ; show new heading instantly if new and old > compass_fast_treshold +#DEFINE compass_averaging .10 ; numbers of extra averaging -C1 res 2 ; Decoded calibration data -C2 res 2 -C3 res 2 -C4 res 2 ; Here: C4-250 -C5 res 2 ; Here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) -C6 res 2 -D1 res 2 ; raw pressure -D2 res 2 ; raw temperature -xdT res 2 -xdT2 res 2 -OFF res 2 -SENS res 2 -dLSB res 1 ; Pressure sensor interface -dMSB res 1 -clock_count res 1 -sensor_state_counter res 1 ; counts to eight for state maschine -amb_pressure_avg res 2 -temperature_avg res 2 -minimum_temperature res 2 ; minimum temperature -last_temperature res 2 -last_pressure res 2 -last_pressure_velocity res 2 ; For velocity -last_surfpressure res 2 -last_surfpressure_15min res 2 -last_surfpressure_30min res 2 -rel_pressure res 2 -sim_pressure res 2 ; hold simulated pressure in mbar if in Simulator mode -max_pressure res 2 -avg_rel_pressure res 2 -avg_rel_pressure_total res 2 -;---- Data for ISR math subroutines -isr_xC res 4 -isr_xA res 2 -isr_xB res 2 - -;---- Data for ISR routines -isr1_temp res 1 ; ISR temp variable, used in ms5541.asm, isr_rtcc, isr_battery_gauge -isr2_temp res 1 ; ISR temp variable, used isr_battery_gauge - -;---- Display brightness -max_CCPR1L res 1 ; Max. brightness value for CCPR1L - -; Battery gauge (nAs, nC) -battery_gauge res 6 ; 48Bit -> 78Ah max... - -; IR/S8-Link -ir_s8_buffer res .18 ; temporally used in get_calibration_data for the raw (packed) calibration data -ir_s8_counter res 1 -ir_S8_timeout res 1 ; Timeout for valid data - -; Compass raw data -compass_DX res 2 -compass_DY res 2 -compass_DZ res 2 - -accel_DX res 2 -accel_DY res 2 -accel_DZ res 2 - -; Compass FILTERED data -compass_DX_f res 2 -compass_DY_f res 2 -compass_DZ_f res 2 +; Bit Masks for communication with p2_deco.c - char_O_deco_status +#define DECO_STATUS_MASK .3 -accel_DX_f res 2 -accel_DY_f res 2 -accel_DZ_f res 2 - -; Compass calibration data -compass_CX_f res 2 -compass_CY_f res 2 -compass_CZ_f res 2 - -; Compass more data -compass_heading res 2 ; Corrected heading (in 1°) : -180 .. 180 -compass_heading_old res 2 ; Old heading (For smoother display) -compass_heading_shown res 2 ; Displayed heading -;compass_roll res 2 ; Rotation around the X axis -;compass_pitch res 2 ; Rotation around the Y axis - -compass_a res 2 ; Tmp data for Q15 arithmetics -compass_b res 2 -compass_r res 3 - -CNS_start res 2 ; CNS value at beginning of dive -GF_start res 1 ; GF value at beginning of dive - -speed_setting res 1 ; =1: Eco, =2: Normal, =3: Fastest - -;---- Data for graphical compass -xRD res 2 ; virtual compass ruler offset -xRDr res 2 ; virtual compass ruler offset - right end -xRD180 res 2 ; virtual compass ruler offset for the -180 marker -xLO res 1 ; lo backup to prevent trashing -xHI res 1 ; hi backup to prevent trashing -xCM res 1 ; compass bearing relative position -compass_bearing res 2 ; this is where the bearing menu stores the actual heading for bearing - -;---------------------------- Common DATA ------------------------------------ - -common equ 0x100 ; Alias for "banksel common" -common udata_ovr common ; Bank1 general variables - -;---- Time and Date -secs res 1 -mins res 1 -hours res 1 -day res 1 -month res 1 -year res 1 -surface_interval res 2 +; Bit Flags for communication with p2_deco.c - char_O_deco_status +#define DECO_STATUS_0_FLAG .0 +#define DECO_STATUS_1_FLAG .1 +#define DECO_MODE_LOOP_FLAG .2 +#define DECO_MODE_PSCR_FLAG .3 +#define DECO_PLAN_FLAG .4 +#define DECO_CNS_FLAG .5 +#define DECO_VOLUME_FLAG .6 +#define DECO_ASCENT_FLAG .7 -flag1 res 1 -flag2 res 1 -flag3 res 1 -flag4 res 1 -flag5 res 1 -flag6 res 1 -flag7 res 1 -flag8 res 1 -flag9 res 1 -flag10 res 1 -flag11 res 1 -flag12 res 1 -flag13 res 1 -flag14 res 1 - -hardware_flag res 1 ; hardware descriptor flag - -temp1 res 1 -temp2 res 1 - -;---- Interface to wait macros -wait_temp res 1 -waitms_temp res 1 - -;---- Interface to graphic subroutines (aa_wordprocessor, color_processor, ...) -win_leftx2 res 1 -win_top res 1 -win_width res 2 -win_height res 1 -win_bargraph res 1 -win_color1 res 1 -win_color2 res 1 -win_font res 1 - -;---- Draw subroutines -tft_temp4 res 1 -tft_temp3 res 1 -tft_temp2 res 1 -tft_temp1 res 1 - -;---- data conversion subroutines -lo res 1 -hi res 1 -up res 1 - -;---- RS232 temp variables -uart1_temp res 1 -uart2_temp res 1 -uart3_temp res 1 - -;---- Data for math subroutines -divA res 2 -divB res 1 -xC res 4 -xA res 2 -xB res 2 -sub_c res 2 -sub_a res 2 -sub_b res 2 - -;---- Data for conversion subroutines -cvt_flags res 2 -ignore_digits res 1 +; Bit Flags for communication with p2_deco.c - char_O_main_status +; .0 ; unused +; .1 ; unused +; DECO_MODE_LOOP_FLAG .2 ; defined below, also used for char_O_main_status +; DECO_MODE_PSCR_FLAG .3 ; defined below, also used for char_O_main_status +#define DECO_GASCHANGE_OVRD .4 +; .5 ; unused +#define DECO_BOTTOM_FLAG .6 +; .7 ; unused -#define leftbind cvt_flags,0 -#define ignore_digit3 cvt_flags,1 -#define ignore_digit4 cvt_flags,2 -#define ignore_digit5 cvt_flags,3 -#DEFINE enable_screen_dumps cvt_flags,4 ; =1: Ignore vin_usb, wait for "l" command (Screen dump -#DEFINE screen_type cvt_flags,5 ; =1: display1, =0; display0 -#DEFINE compass_type cvt_flags,6 ; =1: compass1, =0: compass0 -#DEFINE analog_switches cvt_flags,7 ; =1: Analog switches available - -#DEFINE compass_type2 cvt_flags+1,0 ; =1: Compass2, =0: Compass1 or compass0 - - -;---- Misc. -timeout_counter res 1 -timeout_counter2 res 1 -timeout_counter3 res 1 -batt_voltage res 2 ; Battery voltage in mV -batt_percent res 1 ; Battery in percent (1-100) -ambient_light res 2 ; ambient_light level -lo_temp res 1 -hi_temp res 1 -convert_value_temp res 3 ; used in menu_battery_state_convert_date -active_gas res 1 ; the currently breathed gas (1-5) -active_diluent res 1 ; backup when switching back from bailout to CCR/pSCR loop -warning_counter res 1 ; Counts amount of warning in divemode -warning_page res 1 ; current # of warning page - -; Remind history for menu processor (and such): -menustack res 5 ; menu stack -menupos res 1 ; Logbook and divemode menu -menupos2 res 1 ; For dive mode simulator and pre-menu -menupos3 res 1 ; For Customviews -menupos4 res 1 ; For divemode menu - -; Apnoe stuff that must be in bank common -apnoe_mins res 1 -apnoe_secs res 1 -apnoe_max_pressure res 2 - -; Divemode -divemins res 2 -divesecs res 1 -samplingrate res 1 -samplesecs_value res 1 -divisor_temperature res 1 -divisor_deco res 1 -divisor_gf res 1 -divisor_ppo2_sensors res 1 -divisor_decoplan res 1 -divisor_cns res 1 -divisor_tank res 1 -average_depth_hold res 4 -average_depth_hold_total res 4 -total_divetime_seconds res 2 -average_divesecs res 2 ; For the resettable stopwatch -decodata res 2 -apnoe_timeout_counter res 1 -apnoe_surface_mins res 1 -apnoe_surface_secs res 1 - -; Profile storing -AlarmType res 1 -samplesecs res 1 -EventByte res 1 -EventByte2 res 1 -ProfileFlagByte res 1 - -; External flash -ext_flash_address res 3 ; 24bit Address -ext_flash_log_pointer res 3 ; 24bit Address for logbook profile storing -ext_flash_dive_counter res 3 ; 24bit Counter for dive length (increased in write_byte_ext_flash_plus) - -; I2C -i2c_temp res 2 ; Temp - -; O2 Sensor data -o2_mv_sensor1 res 2 ; in 0.1mV steps -o2_mv_sensor2 res 2 ; in 0.1mV steps -o2_mv_sensor3 res 2 ; in 0.1mV steps -o2_ppo2_sensor1 res 1 ; Sensor1 ppO2 (in 0.01bar steps) -o2_ppo2_sensor2 res 1 ; Sensor2 ppO2 (in 0.01bar steps) -o2_ppo2_sensor3 res 1 ; Sensor3 ppO2 (in 0.01bar steps) -hud_status_byte res 1 -;Status Byte/ -#DEFINE hud_connection_ok hud_status_byte,0 ;Bit0 = 1 -> HUD connection ok -;Bit1 = 1 -> HUD is calibrated -;Bit2 = 1 -> HUD Battery is low (<3000mV) -#DEFINE sensor1_active hud_status_byte,3 ;=1: Sensor1 is active -#DEFINE sensor2_active hud_status_byte,4 ;=1: Sensor2 is active -#DEFINE sensor3_active hud_status_byte,5 ;=1: Sensor3 is active -;Bit6 unused in stand-alone HUD -;Bit7 unused in stand-alone HUD - -sensor_setpoint res 1 ; sensor ppo2 in 0.01bar for deco routine - -better_gas_number res 1 ; number (1-5) of the "better gas" in divemode, =0: no better gas available -customview_divemode res 1 ; keeps last custom view -customview_surfmode res 1 -safety_stop_countdown res 1 ; counts seconds of safety stop -tft_update_flags res 3 ; probably more then needed... - -; bank common 1 Byte left here... - - -;---------------------------- TMP DATA --------------------------------------- -; Space for various overlayed data from color, word, menu processors, etc. -; - -tmp udata_ovr 0x1A0 ; Bank1 shared TMP space -tmp equ 0x1A0 ; Alias for CBLOCK directive. - res 0x05F ; RESERVED area. - -;---------------------------- Common2 DATA ------------------------------------ +; Bit Values for communication with p2_deco.c +#define DECO_STATUS_INIT .3 +#define DECO_MODE_LOOP .4 +#define DECO_MODE_PSCR .8 +#define DECO_PLAN_ALTERNATE .16 +#define DECO_CNS_CALCULATE .32 +#define DECO_VOLUME_CALCULATE .64 +#define DECO_ASCENT_DELAYED .128 -common2 equ 0xA00 ; Alias for "banksel common" -common2 udata_ovr common2 ; Bank1 general variables - -s8_rawdata_sensor1 res 3 ; 24bit A/D raw data from S8 HUD sensor 1 -s8_rawdata_sensor2 res 3 ; 24bit A/D raw data from S8 HUD sensor 2 -s8_rawdata_sensor3 res 3 ; 24bit A/D raw data from S8 HUD sensor 3 - -hud_battery_mv res 2 ; hud/ppo2 monitor battery voltage in mV -start_day res 1 ; At start of dive (For logbook) -start_month res 1 ; At start of dive (For logbook) -start_year res 1 ; At start of dive (For logbook) -start_hours res 1 ; At start of dive (For logbook) -start_mins res 1 ; At start of dive (For logbook) - -old_velocity res 4 ; Stores the last 4 speeds (8 seconds) in m/min -opt_gas_type_backup res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco -opt_dil_type_backup res 5 ; 0=Disabled, 1=First, 2=Normal - -opt_OC_bail_gas_change_backup res 5 ; Gas change depths OC/Bailout -opt_dil_change_backup res 5 ; Gas change depths Diluents - -internal_battery_capacity res 2 ; For internal battery gauging -battery_capacity res 2 ; For battery gauge IC -battery_offset res 2 ; For battery gauge IC - -analog_sw1_raw res 2 ; idle values (average) -analog_sw2_raw res 2 ; idle values (average) -analog_counter res 1 ; for averaging -analog_sw1 res 1 ; analog value for switch 1 -analog_sw2 res 1 ; analog value for switch 2 -battery_type res 1 ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah -uptime res 4 ; Uptime [s] -lastdive_time res 4 ; Time since last dive [s] -lastdive_duration res 3 ; mins:2 and secs -lastdive_maxdepth res 2 ; in mbar -battery_acumulated_charge res 2 ; Raw values in battery gauge IC -gauge_status_byte res 1 ; Gauge IC status byte -button_polarity res 1 ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) -gaslist_gas_global res 1 ; for color coding the gas lists -;active_gas_type res 1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents -rx_buffer res .48 ; Buffer for RX data (Slots 0-7) -rx_firmware res 2 ; The RX firmware version xx.yy - -gas6_O2_ratio res 1 ; gas6 O2 ratio -gas6_He_ratio res 1 ; gas6 He ratio -gas6_temp res 1 ; temp used in divemenu_tree.asm - - -;----------------------------------------------------------------------------- -; Reserve BANK2 for general purpose buffer (strings, images, etc). -; NOTE: Needs to be aligned with a bank (LOW(buffer)==0). -buffer udata_ovr 0x200 -buffer res .256 - -opt_table equ 0xE00 -opt_table udata_ovr opt_table +; Bit Flags for char_O_deco_warnings +#define IBCD_warning .0 +#define IBCD_warning_lock .1 +#define mbubble_warning .2 +#define mbubble_warning_lock .3 +#define outside_warning .4 +#define outside_warning_lock .5 +#define stoptable_overflow .6 +#define deco_flag .7 -;---- Dive Options -opt_gas_O2_ratio res 5 ; Needed because deco gaslist use N2 -opt_dil_O2_ratio res 5 ; Must be in line with opt_gas_O2_ratio -opt_gas_He_ratio res 5 ; He ratio Gas1-5 -opt_dil_He_ratio res 5 ; Must be in line with opt_gas_He_ratio -opt_gas_type res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco -opt_dil_type res 5 ; 0=Disabled, 1=First, 2=Normal -> ; Must be in line with opt_gas_type -opt_dive_mode res 1 ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR -opt_ccr_mode res 1 ; =0: Fixed SP, =1: Sensor -opt_OC_bail_gas_change res 5 ; Gas change depths OC/Bailout -char_I_dil_change res 5 ; Work-Around for 2.97 stable - -;---- Managing Settings -opt_brightness res 1 ; =0: Eco, =1:Medium, =2:Full -opt_salinity res 1 ; 0-5% -#DEFINE opt_name_length .60 ; Custom text string 5 rows with 12 chars -opt_name res opt_name_length -opt_language res 1 ; Current language. 0=EN, 1=DE, 2=FR, 3=SP -opt_units res 1 ; 0:m/°C, 1:ft/°F -opt_dateformat res 1 ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD -opt_last_stop res 1 ; =3:3m, =4:4m, =5:5m, =6:6m -opt_aGF_high res 1 ; Alternative GF HIGH -opt_aGF_low res 1 ; Alternative GF LOW -opt_GF_high res 1 ; GF HIGH -opt_GF_low res 1 ; GF LOW -opt_enable_aGF res 1 ; =1: aGF can be selected underwater -opt_compass_gain res 1 ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) -opt_sampling_rate res 1 ; =1: 10s, =0: 2s -opt_dive_color_scheme res 1 ; 0-3 -opt_pressure_adjust res 1 ; SIGNED int (two's complement), -20/+20mbar max. -opt_enable_safetystop res 1 ; =1: A safety stop is shown -opt_calibration_O2_ratio res 1 ; %O2 of calibration gas -opt_x_s1 res 2 ; calibration factor (Not stored in EEPROM) -opt_x_s2 res 2 ; calibration factor (Not stored in EEPROM) -opt_x_s3 res 2 ; calibration factor (Not stored in EEPROM) -opt_sensor_fallback res 1 ; NOT USED ANY MORE, KEPT FOR COMPATIBILITY WITH EEPROM IMAGE -opt_flip_screen res 1 ; =1: Flip the screen -opt_cR_button_left res 1 ; Left button sensitivity (cR hardware) -opt_cR_button_right res 1 ; Right button sensitivity (cR hardware) -opt_modwarning res 1 ; =1:do a red blinking warning, =0:default behaviour -opt_vsitextv2 res 1 ; =1:use the depth dependent ascend rate limits -opt_vsigraph res 1 ; =1:draw the graphical VSI bar -opt_showppo2 res 1 ; =1:always show the ppO2 value in the warning position -opt_temperature_adjust res 1 ; SIGNED int (two's complement), -2.0/+2.0 °C max. -opt_safety_stop_length res 1 ; [s] -opt_safety_stop_start res 1 ; [cbar] -opt_safety_stop_end res 1 ; [cbar] -opt_safety_stop_reset res 1 ; [cbar] -opt_diveTimeout res 1 ; Timeout for Divemode [min] -opt_sim_setpoint_number res 1 ; NEW setpoint to use for deco calculation -opt_calc_asc_gasvolume res 1 ; NEW calculate OC gas volume needs for ascent -opt_sim_use_aGF res 1 ; NEW use GF (no) or aGF (yes) for deco calculation -opt_enable_IBCD res 1 ; NEW enable IBCD warning -opt_sat_multiplier_gf res 1 ; Bühlmann safety factor for GF deco -opt_desat_multiplier_gf res 1 ; Bühlmann safety factor for GF deco -opt_sat_multiplier_non_gf res 1 ; Bühlmann safety factor for NON-GF deco -opt_desat_multiplier_non_gf res 1 ; Bühlmann safety factor for NON-GF deco +; Bit Flags for status on CHARs +#define char_invalid_flag .7 -;-----------------------------EEPROM DATA ------------------------------------ -; Automatic reset of all options when this is changed: -#define eeprom_opt_serial 0x0006 ; Version 0.6 +; Bit Flags for status on INTs +#define int_invalid_flag .2 +#define int_not_yet_computed .3 +#define int_is_zero .3 +#define int_low_flag .4 +#define int_high_flag .5 +#define int_attention_flag .6 +#define int_warning_flag .7 ;----------------------------------------------------------------------------- ; Flags -#DEFINE switch_left flag1,0 -#DEFINE switch_right flag1,1 -#DEFINE neg_flag flag1,2 ; e.g. sub16 (sub_c = sub_a - sub_b) -#DEFINE pressure_refresh flag1,3 ; =1: A new pressure/temperature is available -#DEFINE sleepmode flag1,4 ; =1: In Sleepmode -#DEFINE tft_is_dimming flag1,5 ; =1: The TFT is dimming, ignore light sensor -#DEFINE display_velocity flag1,6 ; =1: show velocity -#DEFINE no_sensor_int flag1,7 ; =1: block any further access to pressure sensor + +; Hardware defines +#DEFINE battery_gauge_available hardware_flag,0 ; =1: OSTC has rechargeable battery with battery management chip +#DEFINE ambient_sensor hardware_flag,1 ; =1: OSTC has an ambient light sensor +#DEFINE analog_o2_input hardware_flag,2 ; =1: OSTC has analog inputs and S8 digital +#DEFINE optical_input hardware_flag,3 ; =1: OSTC has an digital optical input +#DEFINE ble_available hardware_flag,4 ; =1: OSTC has an BLE module +#DEFINE ostc_rx_present hardware_flag,5 ; =1: OSTC RX circuity present +; hardware_flag,6 ; unused +; hardware_flag,7 ; unused + +#DEFINE leftbind cvt_flags+0,0 +#DEFINE ignore_digit3 cvt_flags+0,1 +#DEFINE ignore_digit4 cvt_flags+0,2 +#DEFINE ignore_digit5 cvt_flags+0,3 +#DEFINE enable_screen_dumps cvt_flags+0,4 ; =1: Ignore vin_usb, wait for "l" command (Screen dump +#DEFINE screen_type cvt_flags+0,5 ; =1: display1, =0; display0 +#DEFINE compass_type cvt_flags+0,6 ; =1: compass1, =0: compass0 +#DEFINE analog_switches cvt_flags+0,7 ; =1: Analog switches available -#DEFINE rs232_recieve_overflow flag2,0 ; =1: An RS232 timeout overflow occoured -#DEFINE stored_gas_changed flag2,1 ; =1: Stored Gas changed -#DEFINE high_altitude_mode flag2,2 ; =1: Unit was manually turned on with ambient pressure <880mbar -#DEFINE FLAG_apnoe_mode flag2,3 ; =1: Apnoe mode selected -#DEFINE restore_deco_data flag2,4 ; =1: Restore deco data (After simulation) -#DEFINE premenu flag2,5 ; =1: Premenu/Divemenu selected -#DEFINE menubit flag2,6 ; menu -#DEFINE simulatormode_active flag2,7 ; =1: Simulator mode active, override pressure sensor readings +#define pre_zero_flag cvt_flags+1,0 +#define all_zeros_flag cvt_flags+1,1 +#define DP_done cvt_flags+1,2 +#define DP_done2 cvt_flags+1,3 +#define show_last3 cvt_flags+1,4 +#define leading_zeros cvt_flags+1,5 +#define show_last4 cvt_flags+1,6 +#DEFINE compass_type2 cvt_flags+1,7 ; =1: Compass2, =0: Compass1 or compass0 + -#DEFINE divemode_menu flag3,0 ; =1: Divemode menu is shown -#DEFINE onesecupdate flag3,1 ; =1: after any second -#DEFINE twosecupdate flag3,2 ; =1: New two-second update -#DEFINE toggle_customview flag3,3 ; =1: Next customview -#DEFINE oneminupdate flag3,4 ; =1: after any minute -#DEFINE divemode flag3,5 ; =1: in Divemode -#DEFINE battery_is_36v flag3,6 ; =1: 3,6V Battery is in use -#DEFINE warning_active flag3,7 ; =1: A warning is active in divemode or surfacemode +; HUD Status Byte +#DEFINE hud_connection_ok hud_status_byte,0 ; =1 -> HUD connection ok +; hud_status_byte,1 ; =1 -> HUD is calibrated +; hud_status_byte,2 ; =1 -> HUD Battery is low (<3000mV) +#DEFINE sensor1_active hud_status_byte,3 ; =1: Sensor1 is active +#DEFINE sensor2_active hud_status_byte,4 ; =1: Sensor2 is active +#DEFINE sensor3_active hud_status_byte,5 ; =1: Sensor3 is active +; hud_status_byte,6 ; unused in stand-alone HUD +; hud_status_byte,7 ; unused in stand-alone HUD -#DEFINE better_gas_available flag4,0 ; =1: A better gas is available -#DEFINE blinking_better_gas flag4,1 ; =1: Gas is blinking -#DEFINE menuview flag4,2 ; =1: A menuview is shown in divemode (e.g. "Menu?") -#DEFINE quarter_second_update flag4,3 ; =1: A new 1/4 second has begun -#DEFINE divemode_gaschange flag4,4 ; =1: The gas will change very soon -#DEFINE decostop_active flag4,5 ; =1: Decompression stop shown -#DEFINE depth_greater_100m flag4,6 ; =1: Current Depth > 100m -#DEFINE realdive flag4,7 ; =1: A real dive during divemode +#DEFINE switch_left flag1,0 ; =1: left button was pressed +#DEFINE switch_right flag1,1 ; =1: right button was pressed +#DEFINE neg_flag flag1,2 ; e.g. sub16 (sub_c = sub_a - sub_b) +#DEFINE pressure_refresh flag1,3 ; =1: A new pressure/temperature is available +#DEFINE sleepmode flag1,4 ; =1: in Sleepmode +#DEFINE tft_is_dimming flag1,5 ; =1: the TFT is dimming, ignore light sensor +#DEFINE display_velocity flag1,6 ; =1: show velocity +#DEFINE no_sensor_int flag1,7 ; =1: block any further access to pressure sensor -#DEFINE dive_warning_displayed flag5,0 ; =1: The warning sign is shown -#DEFINE reset_average_depth flag5,1 ; =1: Reset the average depth -#DEFINE store_sample flag5,2 ; =1: Store a new sample -#DEFINE divemode2 flag5,3 ; =1: Dive longer then one minute -#DEFINE FLAG_active_descent flag5,4 ; Used in Apnoe mode -#DEFINE event_occured flag5,5 ; =1: An event occured, store it! -#DEFINE divemode_menu_active flag5,6 ; =1: The divemode menu is shown -#DEFINE temp_changed flag5,7 ; =1: The temperature changed +#DEFINE rs232_receive_overflow flag2,0 ; =1: a RS232 timeout overflow occoured +#DEFINE stored_gas_changed flag2,1 ; =1: Stored Gas changed +#DEFINE high_altitude_mode flag2,2 ; =1: unit was manually turned on with ambient pressure <880mbar +#DEFINE FLAG_apnoe_mode flag2,3 ; =1: Apnoe mode selected +#DEFINE restore_deco_data flag2,4 ; =1: restore deco data (After simulation) +#DEFINE premenu flag2,5 ; =1: Premenu/Divemenu selected +#DEFINE menubit flag2,6 ; menu +#DEFINE simulatormode_active flag2,7 ; =1: simulator mode active, override pressure sensor readings -#DEFINE gas6_changed flag6,0 ; =1: Gas 6 has been selected/changed underwater -#DEFINE onehourupdate flag6,1 ; =1: A new hour has just begun -#DEFINE settime_setdate flag6,2 ; =1: In the Set Time or Set Date Menu -#DEFINE setpoint_changed flag6,3 ; =1: Setpoint has been changed -#DEFINE second_row_warning flag6,4 ; =1: The second row contains a warning -#DEFINE FLAG_ccr_mode flag6,5 ; =1: CCR mode (Fixed ppO2 or Sensor) active -#DEFINE dive_hud1_displayed flag6,6 ; =1: The Sensor1 HUD reading is displayed -#DEFINE dive_hud2_displayed flag6,7 ; =1: The Sensor2 HUD reading is displayed +#DEFINE divemode_menu flag3,0 ; =1: divemode menu is shown +#DEFINE onesecupdate flag3,1 ; =1: after any second +#DEFINE twosecupdate flag3,2 ; =1: new two-second update +#DEFINE toggle_customview flag3,3 ; =1: next customview +#DEFINE oneminupdate flag3,4 ; =1: after any minute +#DEFINE divemode flag3,5 ; =1: in Divemode +#DEFINE battery_is_36v flag3,6 ; =1: 3,6V Battery is in use +#DEFINE warning_active flag3,7 ; =1: a warning is active in divemode or surfacemode -#DEFINE dive_hud3_displayed flag7,0 ; =1: The Sensor3 HUD reading is displayed -#DEFINE no_more_divesecs flag7,1 ; =1: Do no longer show seconds in divemode -#DEFINE FLAG_gauge_mode flag7,2 ; =1: In Gauge mode -#DEFINE ignore_last_edited_gas flag7,3 ; Used in gaslist_cleanup_list -#DEFINE ccr_diluent_setup flag7,4 ; =1: Setting up Diluents ("Gas6-10") -#DEFINE menu_show_sensors flag7,5 ; =1: Update HUD data in menu ## NOT USED ANYMORE ## -#DEFINE short_gas_decriptions flag7,6 ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint -#DEFINE max_depth_greater_100m flag7,7 ; =1: Max. Depth > 100m +#DEFINE better_gas_available flag4,0 ; =1: a better gas is available +#DEFINE blinking_better_gas flag4,1 ; =1: gas is blinking +#DEFINE menuview flag4,2 ; =1: a menuview is shown in divemode (e.g. "Menu?") +#DEFINE quarter_second_update flag4,3 ; =1: a new 1/4 second has begun +#DEFINE divemode_gaschange flag4,4 ; =1: the gas will change very soon +#DEFINE decostop_active flag4,5 ; =1: decompression stop shown +#DEFINE depth_greater_100m flag4,6 ; =1: current depth > 100m +#DEFINE realdive flag4,7 ; =1: a real dive during divemode + +#DEFINE dive_warning_displayed flag5,0 ; =1: the warning sign is shown +#DEFINE reset_average_depth flag5,1 ; =1: reset the average depth +#DEFINE store_sample flag5,2 ; =1: store a new sample +#DEFINE divemode2 flag5,3 ; =1: dive longer than one minute +#DEFINE FLAG_active_descent flag5,4 ; used in Apnoe mode +#DEFINE event_occured flag5,5 ; =1: an event occured, store it! +#DEFINE divemode_menu_active flag5,6 ; =1: the divemode menu is shown +#DEFINE temp_changed flag5,7 ; =1: the temperature changed -#DEFINE is_bailout flag8,0 ; =1: Bailout -#DEFINE is_bailout_menu flag8,1 ; =1: Bailout -#DEFINE toggle_gf flag8,2 ; =1: Toggle GF/aGF -#DEFINE use_agf flag8,3 ; =1: Use aGF (instead of GF) -#DEFINE battery_removed_in_usb flag8,4 ; =1: The battery has been removed in USB -#DEFINE adc_running flag8,5 ; =1: The ADC is in use -#DEFINE comm_service_enabled flag8,6 ; =1: COMM Service mode unlocked -#DEFINE compass_enabled flag8,7 ; =1: The compass and accelerometer chip is active +#DEFINE gas6_changed flag6,0 ; =1: gas 6 has been selected/changed underwater +#DEFINE onehourupdate flag6,1 ; =1: a new hour has just begun +#DEFINE settime_setdate flag6,2 ; =1: in the Set Time or Set Date Menu +#DEFINE setpoint_changed flag6,3 ; =1: setpoint has been changed +#DEFINE second_row_warning flag6,4 ; =1: the second row contains a warning +#DEFINE FLAG_ccr_mode flag6,5 ; =1: CCR mode (fixed ppO2 or sensor) active +#DEFINE FLAG_back_to_loop flag6,6 ; =1: a switchback from bailout to loop occured +#DEFINE FLAG_set_marker flag6,7 ; =1: set a marker in the logbook + +; flag7,0 ; unused +#DEFINE no_more_divesecs flag7,1 ; =1: Do no longer show seconds in divemode +#DEFINE FLAG_gauge_mode flag7,2 ; =1: In Gauge mode +#DEFINE ignore_last_edited_gas flag7,3 ; Used in gaslist_cleanup_list +#DEFINE ccr_diluent_setup flag7,4 ; =1: Setting up Diluents ("Gas6-10") +#DEFINE space_gas_decriptions flag7,5 ; =1: add a space in front of gas numbers < 9 for alignment +#DEFINE short_gas_decriptions flag7,6 ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint +#DEFINE max_depth_greater_100m flag7,7 ; =1: Max. Depth > 100m -#DEFINE compass_fast_mode flag9,0 ; =1: The compass is in fast mode -#DEFINE in_color_menu flag9,1 ; =1: In the color scheme menu -#DEFINE bailoutgas_event flag9,2 ; =1: bailout was selected or a gaschange during bailout -#DEFINE win_invert flag9,3 ; =1: Invert font output -#DEFINE show_safety_stop flag9,4 ; =1: Show the safety stop -#DEFINE safety_stop_active flag9,5 ; =1: The safety stop is currently displayed -#DEFINE new_s8_data_available flag9,6 ; =1: New data frame recieved -#DEFINE print_compass_label flag9,7 ; =1: print the graphical comapss label +#DEFINE is_bailout flag8,0 ; =1: Bailout +#DEFINE is_bailout_menu flag8,1 ; =1: Bailout +#DEFINE toggle_gf flag8,2 ; =1: Toggle GF/aGF +#DEFINE use_agf flag8,3 ; =1: Use aGF (instead of GF) +#DEFINE battery_removed_in_usb flag8,4 ; =1: The battery has been removed in USB (probably not used for anything useful) +#DEFINE adc_running flag8,5 ; =1: The ADC is in use +#DEFINE comm_service_enabled flag8,6 ; =1: COMM Service mode unlocked +#DEFINE compass_enabled flag8,7 ; =1: The compass and accelerometer chip is active -#DEFINE s8_digital flag10,0; =1: Digital I/O -#DEFINE menu_show_sensors2 flag10,1; =1: Update mV data in calibration menu -#DEFINE use_O2_sensor1 flag10,2; =1: Use this sensor for deco -#DEFINE use_O2_sensor2 flag10,3; =1: Use this sensor for deco -#DEFINE use_O2_sensor3 flag10,4; =1: Use this sensor for deco -#DEFINE setpoint_fallback flag10,5; =1: Fallback to SP1 due to external O2 sensor failure -#DEFINE blinking_setpoint flag10,6; =1: SP is blinking -#DEFINE flip_screen flag10,7; =1: Screen is flipped by 180° +#DEFINE compass_fast_mode flag9,0 ; =1: The compass is in fast mode +#DEFINE in_color_menu flag9,1 ; =1: In the color scheme menu +#DEFINE bailoutgas_event flag9,2 ; =1: bailout was selected or a gaschange during bailout +#DEFINE win_invert flag9,3 ; =1: Invert font output +#DEFINE show_safety_stop flag9,4 ; =1: Show the safety stop +#DEFINE safety_stop_active flag9,5 ; =1: The safety stop is currently displayed +#DEFINE new_s8_data_available flag9,6 ; =1: New data frame received +#DEFINE print_compass_label flag9,7 ; =1: print the graphical comapss label + +#DEFINE s8_digital flag10,0 ; =1: Digital I/O +#DEFINE menu_show_sensors2 flag10,1 ; =1: Update mV data in calibration menu +#DEFINE use_O2_sensor1 flag10,2 ; =1: Use this sensor +#DEFINE use_O2_sensor2 flag10,3 ; =1: Use this sensor +#DEFINE use_O2_sensor3 flag10,4 ; =1: Use this sensor +#DEFINE setpoint_fallback flag10,5 ; =1: Fallback to SP1 due to external O2 sensor failure +#DEFINE blinking_setpoint flag10,6 ; =1: SP is blinking +#DEFINE flip_screen flag10,7 ; =1: Screen is flipped by 180° -#DEFINE sensor1_calibrated_ok flag11,0; =1: This sensor has been calibrated ok -#DEFINE sensor2_calibrated_ok flag11,1; =1: This sensor has been calibrated ok -#DEFINE sensor3_calibrated_ok flag11,2; =1: This sensor has been calibrated ok -#DEFINE voting_logic_sensor1 flag11,3; =1: This sensor is within the voting logic threshold -#DEFINE voting_logic_sensor2 flag11,4; =1: This sensor is within the voting logic threshold -#DEFINE voting_logic_sensor3 flag11,5; =1: This sensor is within the voting logic threshold -#DEFINE cc_active flag11,6; =1: Constant Current active (cR Hardware) -#DEFINE cv_active flag11,7; =1: Constant Voltage active (cR Hardware) +#DEFINE sensor1_calibrated_ok flag11,0 ; =1: This sensor has been calibrated ok +#DEFINE sensor2_calibrated_ok flag11,1 ; =1: This sensor has been calibrated ok +#DEFINE sensor3_calibrated_ok flag11,2 ; =1: This sensor has been calibrated ok +#DEFINE voting_logic_sensor1 flag11,3 ; =1: This sensor is within the voting logic threshold +#DEFINE voting_logic_sensor2 flag11,4 ; =1: This sensor is within the voting logic threshold +#DEFINE voting_logic_sensor3 flag11,5 ; =1: This sensor is within the voting logic threshold +#DEFINE cc_active flag11,6 ; =1: Constant Current active (cR Hardware) +#DEFINE cv_active flag11,7 ; =1: Constant Voltage active (cR Hardware) -#DEFINE compass_bearing_set flag12,0 ; bearing set -#DEFINE compass_bearing_eq flag12,1 ; bearing is in direction? do not show << or >> -#DEFINE compass_bearing_lft flag12,2 ; bearing is to the left/<< if set, otherwise to the right/>> -#DEFINE compass_bearing_vis flag12,3 ; bearing is visible? (either ahead or behind/-180°) -#DEFINE compass_bearing_ahd flag12,4 ; bearing is ahead or behind? -#DEFINE blinking_depth_warning flag12,5 ; set by the color_depth. =1: warning color -#DEFINE blinking_depth_prev flag12,6 ; set by the TFT_depth. =1: prev display had warning color -#DEFINE blinking_depth_toggle flag12,7 ; toggle to blink +#DEFINE compass_bearing_set flag12,0 ; bearing set +#DEFINE compass_bearing_eq flag12,1 ; bearing is in direction? do not show << or >> +#DEFINE compass_bearing_lft flag12,2 ; bearing is to the left/<< if set, otherwise to the right/>> +#DEFINE compass_bearing_vis flag12,3 ; bearing is visible? (either ahead or behind/-180°) +#DEFINE compass_bearing_ahd flag12,4 ; bearing is ahead or behind? +#DEFINE blinking_depth_warning flag12,5 ; set by the color_depth. =1: warning color +#DEFINE blinking_depth_prev flag12,6 ; set by the TFT_depth. =1: prev display had warning color +#DEFINE blinking_depth_toggle flag12,7 ; toggle to blink -#DEFINE neg_flag_velocity flag13,0 ; neg_flag backup for velocity logic -#DEFINE analog_sw1_pressed flag13,1 ; =1: Analog switch 1 pressed -#DEFINE analog_sw2_pressed flag13,2 ; =1: Analog switch 2 pressed -#DEFINE sp2_switched flag13,3 ; =1: This setpoint has been autoselected already -#DEFINE sp3_switched flag13,4 ; =1: This setpoint has been autoselected already -#DEFINE sp4_switched flag13,5 ; =1: This setpoint has been autoselected already -#DEFINE sp5_switched flag13,6 ; =1: This setpoint has been autoselected already -#DEFINE use_old_batt_flag flag13,7 ; =1: load old battery information after power-on reset - -#DEFINE FLAG_pscr_mode flag14,0 ; =1: OSTC is in PSCR mode -#DEFINE deep_sleep flag14,1 ; OSTC is in deep sleep (ignore buttons, etc) -#DEFINE sensors_agree flag14,2 ; =1: the ppO2 of all sensors are within the threshold range -#DEFINE gas_needs_attention flag14,3 ; =1: the gas needs attention has been raised before -#DEFINE gas_needs_warning flag14,4 ; =1: the gas needs warning has been raised before -#DEFINE sensor_warning flag14,5 ; =1: the sensors disagree warning has been raised before -#DEFINE alternative_divelayout flag14,6 ; =1: the alternative divelayout is used (aka Blind Mode) -#DEFINE i2c_error_flag flag14,7 ; =1: An I2C error occured +#DEFINE neg_flag_velocity flag13,0 ; neg_flag backup for velocity logic +#DEFINE analog_sw1_pressed flag13,1 ; =1: Analog switch 1 pressed +#DEFINE analog_sw2_pressed flag13,2 ; =1: Analog switch 2 pressed +#DEFINE sp2_switched flag13,3 ; =1: This setpoint has been autoselected already +#DEFINE sp3_switched flag13,4 ; =1: This setpoint has been autoselected already +#DEFINE sp4_switched flag13,5 ; =1: This setpoint has been autoselected already +#DEFINE sp5_switched flag13,6 ; =1: This setpoint has been autoselected already +#DEFINE use_old_batt_flag flag13,7 ; =1: load old battery information after power-on reset + +#DEFINE FLAG_pscr_mode flag14,0 ; =1: OSTC is in PSCR mode +#DEFINE deep_sleep flag14,1 ; =1: OSTC is in deep sleep (ignore buttons, etc) +#DEFINE sensors_agree flag14,2 ; =1: the ppO2 of all sensors are within the threshold range +#DEFINE gas_needs_attention flag14,3 ; =1: the gas needs attention has been raised before +#DEFINE gas_needs_warning flag14,4 ; =1: the gas needs warning has been raised before +#DEFINE sensor_warning flag14,5 ; =1: the sensors disagree warning has been raised before +#DEFINE alternative_divelayout flag14,6 ; =1: the alternative divelayout is used (aka Blind Mode) +#DEFINE i2c_error_flag flag14,7 ; =1: an I2C error occured + +#define aa_antialias aa_flags,0 ; used by aa_wordprocessor +#define aa_color_quart aa_flags,1 ; used by aa_wordprocessor +#define aa_color_half aa_flags,2 ; used by aa_wordprocessor +; aa_flags,3 ; unused +; aa_flags,4 ; unused +; aa_flags,5 ; unused +; aa_flags,6 ; unused +; aa_flags,7 ; unused ; Update flags in divemode, =1: Update the screen -#DEFINE FLAG_TFT_divemode_mask tft_update_flags+0,0 -#DEFINE FLAG_TFT_display_ndl_mask tft_update_flags+0,1 +#DEFINE FLAG_TFT_divemode_mask tft_update_flags+0,0 +#DEFINE FLAG_TFT_display_ndl_mask tft_update_flags+0,1 #DEFINE FLAG_TFT_depth tft_update_flags+0,2 #DEFINE FLAG_TFT_divemins tft_update_flags+0,3 -#DEFINE FLAG_TFT_show_safety_stop tft_update_flags+0,4 -#DEFINE FLAG_TFT_display_ndl tft_update_flags+0,5 -#DEFINE FLAG_TFT_display_deko_mask tft_update_flags+0,6 -#DEFINE FLAG_TFT_display_deko tft_update_flags+0,7 -#DEFINE FLAG_TFT_display_tts tft_update_flags+1,0 -#DEFINE FLAG_TFT_temp_divemode tft_update_flags+1,1 -#DEFINE FLAG_TFT_divemode_warning tft_update_flags+1,2 -#DEFINE FLAG_TFT_divemode_warning_clear tft_update_flags+1,3 -#DEFINE FLAG_TFT_active_gas_divemode tft_update_flags+1,4 -#DEFINE FLAG_TFT_clear_safety_stop tft_update_flags+1,5 -#DEFINE FLAG_TFT_max_depth tft_update_flags+1,6 -#DEFINE FLAG_TFT_divemode_mask_alt tft_update_flags+1,7 -#DEFINE FLAG_TFT_dive_warning_text_clear tft_update_flags+2,0 -#DEFINE FLAG_TFT_dive_warning_text_clr2 tft_update_flags+2,1 -#DEFINE FLAG_TFT_max_depth_alt tft_update_flags+2,2 -#DEFINE FLAG_TFT_big_deco_alt tft_update_flags+2,3 -#define FLAG_TFT_not_defined_yet tft_update_flags+2,7 ; last usable flag within tft_update_flags memory space +#DEFINE FLAG_TFT_show_safety_stop tft_update_flags+0,4 +#DEFINE FLAG_TFT_display_ndl tft_update_flags+0,5 +#DEFINE FLAG_TFT_display_deko_mask tft_update_flags+0,6 +#DEFINE FLAG_TFT_display_deko tft_update_flags+0,7 +#DEFINE FLAG_TFT_display_tts tft_update_flags+1,0 +#DEFINE FLAG_TFT_temp_divemode tft_update_flags+1,1 +#DEFINE FLAG_TFT_divemode_warning tft_update_flags+1,2 +#DEFINE FLAG_TFT_divemode_warning_clear tft_update_flags+1,3 +#DEFINE FLAG_TFT_active_gas_divemode tft_update_flags+1,4 +#DEFINE FLAG_TFT_clear_safety_stop tft_update_flags+1,5 +#DEFINE FLAG_TFT_max_depth tft_update_flags+1,6 +#DEFINE FLAG_TFT_divemode_mask_alt tft_update_flags+1,7 +#DEFINE FLAG_TFT_dive_warning_text_clear tft_update_flags+2,0 +#DEFINE FLAG_TFT_dive_warning_text_clr2 tft_update_flags+2,1 +#DEFINE FLAG_TFT_max_depth_alt tft_update_flags+2,2 +#DEFINE FLAG_TFT_big_deco_alt tft_update_flags+2,3 +; tft_update_flags+2,4 ; unused +; tft_update_flags+2,5 ; unused +; tft_update_flags+2,6 ; unused +; tft_update_flags+2,7 ; unused + + +;---------------------------- Macros ------------------------------------ + +TSTOSS macro opt_reg ; TeST Option Skip if not Zero + movff opt_reg,WREG + tstfsz WREG,A + bra $+4 + endm + +;---------------------------- C-code Routines ---------------------------- + + extern deco_calc_desaturation_time + extern deco_calc_hauptroutine + extern deco_calc_dive_interval_1min + extern deco_calc_dive_interval_10min + extern deco_calc_dive_interval + extern deco_clear_tissue + extern deco_pull_tissues_from_vault + extern deco_push_tissues_to_vault -; Bit Masks for communication with p2_deco.c -#define DECO_STATUS_MASK .3 +;---------------------------- Bank0 DATA ------------------------------------ +isr_backup equ 0x60 +isr_backup udata_ovr isr_backup ; Reserved space for interupt data + +;---- Backup for general registers +isr_prod res 2 + +;---- MS5541 subroutines +amb_pressure res 2 +temperature res 2 + +C1 res 2 ; Decoded calibration data +C2 res 2 +C3 res 2 +C4 res 2 ; Here: C4-250 +C5 res 2 ; Here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) +C6 res 2 +D1 res 2 ; raw pressure +D2 res 2 ; raw temperature +xdT res 2 +xdT2 res 2 +OFF res 2 +SENS res 2 +dLSB res 1 ; Pressure sensor interface +dMSB res 1 +clock_count res 1 +sensor_state_counter res 1 ; counts to eight for state maschine +amb_pressure_avg res 2 +temperature_avg res 2 +minimum_temperature res 2 ; minimum temperature +last_temperature res 2 +last_pressure res 2 +last_pressure_velocity res 2 ; For velocity +last_surfpressure res 2 +last_surfpressure_15min res 2 +last_surfpressure_30min res 2 +rel_pressure res 2 +sim_pressure res 2 ; hold simulated pressure in mbar if in Simulator mode +max_pressure res 2 +avg_rel_pressure res 2 +avg_rel_pressure_total res 2 + +;---- Data for ISR math subroutines +isr_xC res 4 +isr_xA res 2 +isr_xB res 2 -; Bit Flags for communication with p2_deco.c - char_O_deco_status -#define DECO_STATUS_0_FLAG .0 -#define DECO_STATUS_1_FLAG .1 -#define DECO_MODE_LOOP_FLAG .2 -#define DECO_MODE_PSCR_FLAG .3 -#define DECO_PLAN_FLAG .4 -#define DECO_CNS_FLAG .5 -#define DECO_VOLUME_FLAG .6 -#define DECO_ASCENT_FLAG .7 +;---- Data for ISR routines +isr1_temp res 1 ; ISR temp variable, used in ms5541.asm, isr_rtcc, isr_battery_gauge +isr2_temp res 1 ; ISR temp variable, used isr_battery_gauge + +;---- Display brightness +max_CCPR1L res 1 ; Max. brightness value for CCPR1L + +; Battery gauge (nAs, nC) +battery_gauge res 6 ; 48Bit -> 78Ah max... + +; IR/S8-Link +ir_s8_buffer res .18 ; temporally used in get_calibration_data for the raw (packed) calibration data +ir_s8_counter res 1 +ir_s8_timeout res 1 ; Timeout for valid data + +; Compass raw data +compass_DX res 2 +compass_DY res 2 +compass_DZ res 2 + +accel_DX res 2 +accel_DY res 2 +accel_DZ res 2 -; Bit Flags for communication with p2_deco.c - char_O_main_status -;#define DECO_MODE_LOOP_FLAG .2 -;#define DECO_MODE_PSCR_FLAG .3 -#define DECO_GASCHANGE_OVRD .4 -#define DECO_BOTTOM_FLAG .6 +; Compass FILTERED data +compass_DX_f res 2 +compass_DY_f res 2 +compass_DZ_f res 2 + +accel_DX_f res 2 +accel_DY_f res 2 +accel_DZ_f res 2 + +; Compass calibration data +compass_CX_f res 2 +compass_CY_f res 2 +compass_CZ_f res 2 + +; Compass more data +compass_heading res 2 ; Corrected heading (in 1°) : -180 .. 180 +compass_heading_old res 2 ; Old heading (For smoother display) +compass_heading_shown res 2 ; Displayed heading +;compass_roll res 2 ; Rotation around the X axis +;compass_pitch res 2 ; Rotation around the Y axis + +compass_a res 2 ; Tmp data for Q15 arithmetics +compass_b res 2 +compass_r res 3 + +CNS_start res 2 ; CNS value at beginning of dive +GF_start res 1 ; GF value at beginning of dive + +speed_setting res 1 ; =1: Eco, =2: Normal, =3: Fastest -; Bit Values for communication with p2_deco.c -#define DECO_STATUS_INIT .3 -#define DECO_MODE_LOOP .4 -#define DECO_MODE_PSCR .8 -#define DECO_PLAN_ALTERNATE .16 -#define DECO_CNS_CALCULATE .32 -#define DECO_VOLUME_CALCULATE .64 -#define DECO_ASCENT_DELAYED .128 +;---- Data for graphical compass +xRD res 2 ; virtual compass ruler offset +xRDr res 2 ; virtual compass ruler offset - right end +xRD180 res 2 ; virtual compass ruler offset for the -180 marker +xLO res 1 ; lo backup to prevent trashing +xHI res 1 ; hi backup to prevent trashing +xCM res 1 ; compass bearing relative position +compass_bearing res 2 ; this is where the bearing menu stores the actual heading for bearing + +;---------------------------- Common DATA ------------------------------------ +common equ 0x100 ; Alias for "banksel common" +common udata_ovr common ; Bank 1 general variables + +;---- Time and Date +secs res 1 +mins res 1 +hours res 1 +day res 1 +month res 1 +year res 1 +surface_interval res 2 + +;---- State Information +flag1 res 1 +flag2 res 1 +flag3 res 1 +flag4 res 1 +flag5 res 1 +flag6 res 1 +flag7 res 1 +flag8 res 1 +flag9 res 1 +flag10 res 1 +flag11 res 1 +flag12 res 1 +flag13 res 1 +flag14 res 1 +hardware_flag res 1 ; hardware descriptor flag +tft_update_flags res 3 + +;---- Interface to Data Conversion & +;---- Output Functions, as well as +;---- General-Purpose Temp Storage +lo res 1 +hi res 1 +up res 1 +ignore_digits res 1 + +;---- Interface to Graphic Functions +win_leftx2 res 1 +win_top res 1 +win_width res 2 +win_height res 1 +win_bargraph res 1 +win_color1 res 1 +win_color2 res 1 +win_font res 1 -; Bit Flags for char_O_deco_warnings -#define IBCD_warning .0 -#define IBCD_warning_lock .1 -#define mbubble_warning .2 -#define mbubble_warning_lock .3 -#define outside_warning .4 -#define outside_warning_lock .5 -#define stoptable_overflow .6 -#define deco_flag .7 +;---- Interface to Math Functions +divA res 2 +divB res 1 +xC res 4 +xA res 2 +xB res 2 +sub_c res 2 +sub_a res 2 +sub_b res 2 + +;---- Misc. +timeout_counter1 res 2 ; timeout for dive operations +timeout_counter2 res 1 ; timeout for menu operations +batt_voltage res 2 ; battery voltage in mV +batt_percent res 1 ; battery in percent (1-100) +warning_counter res 1 ; counts amount of warning in divemode +warning_page res 1 ; current # of warning page + +;---- Dive Mode / General +divemins res 2 +divesecs res 1 +total_divetime_seconds res 2 +average_divesecs res 2 ; for the resettable stopwatch +safety_stop_countdown res 1 ; counts seconds of safety stop +gaslist_gas res 1 ; used for transfer between gaslist.asm and menu_tree.asm +active_gas res 1 ; the currently breathed gas (1-5) +;active_gas_type res 1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents -#define char_invalid_flag .7 +;---- Dive Mode / Apnoe +apnoe_surface_mins res 1 +apnoe_surface_secs res 1 +apnoe_mins res 1 +apnoe_secs res 1 +apnoe_max_pressure res 2 + +;---- Profile Recording +samplingrate res 1 +samplesecs res 1 +samplesecs_value res 1 +AlarmType res 1 +EventByte1 res 1 +EventByte2 res 1 -#define int_invalid_flag .2 -#define int_not_yet_computed .3 -#define int_is_zero .3 -#define int_low_flag .4 -#define int_high_flag .5 -#define int_prewarning_flag .6 -#define int_warning_flag .7 +;---- External Flash +ext_flash_rw res 1 ; transfer register for data read / write +ext_flash_address res 3 ; 24 bit address +ext_flash_log_pointer res 3 ; 24 bit address for logbook profile storing +ext_flash_end_pointer res 3 ; 24 bit address for logbook profile storing +ext_flash_dive_counter res 3 ; 24 bit counter for dive length (increased in write_byte_ext_flash_plus) + +;---- O2 Sensor Data +o2_mv_sensor1 res 2 ; in 0.1mV steps +o2_mv_sensor2 res 2 ; in 0.1mV steps +o2_mv_sensor3 res 2 ; in 0.1mV steps +o2_ppo2_sensor1 res 1 ; Sensor1 ppO2 (in 0.01bar steps) +o2_ppo2_sensor2 res 1 ; Sensor2 ppO2 (in 0.01bar steps) +o2_ppo2_sensor3 res 1 ; Sensor3 ppO2 (in 0.01bar steps) +hud_status_byte res 1 +;========================= privte Variables =================================== +; do not access from outside of the respective source files! -;============================================================================= -; C-code Routines -; PART 2 - extern deco_calc_CNS_decrease_15min - extern deco_calc_desaturation_time - extern deco_calc_hauptroutine - extern deco_calc_wo_deco_step_1_min - extern deco_calc_dive_interval - extern deco_clear_tissue - extern deco_pull_tissues_from_vault - extern deco_push_tissues_to_vault - \ No newline at end of file +;---- aa_wordprocessor.asm +aa_flags res 1 ; various flags for aa_wordprocessor +aa_bitlen res 1 ; count of pixels when decoding bitmaps +aa_start res 2 ; PROM ptr to start of encoded bitmap +aa_end res 2 ; and end of it +aa_temp res 2 ; current color, divided by 2 or 4 + +;--- adc_lightsensor.asm +get_bat_volt_counter res 1 ; counter for 10x reading the charger chip + +;---- convert.asm +cvt_flags res 2 +cvt_temp1 res 1 +cvt_temp2 res 1 +cvt_temp3 res 1 +cvt_temp4 res 1 +lo_temp res 1 +hi_temp res 1 + +;---- color_processor.asm +img_pixels res 3 ; used by color_processor.asm +img_count res 2 ; used by color_processor.asm + +;---- comm.asm +comm_timeout res 1 ; timeout for communication + +;---- eeprom_rs232.asm +uart1_temp res 1 +uart2_temp res 1 +uart3_temp res 1 + +;---- i2c.asm +i2c_temp1 res 1 ; temporary data +i2c_temp2 res 1 ; temporary data + +;---- menu_processor.asm +menupos1 res 1 ; logbook and divemode menu +menupos2 res 1 ; used for dive mode simulator and pre-menu +menupos3 res 1 ; used for Customviews +menupos4 res 1 ; used for divemode menu +menu_flags res 1 ; flags for menu entries +menu_item res 1 ; index of the current item +start_item res 1 ; index of the first item (scrolling) +item_max res 1 ; number of items in menu +selected_item res 1 ; index of the current item +value_type res 1 ; type for vertical menu +dynamic_item res 3 ; callback addr +menu_block res 3 ; address of the menu block (i.e. item 0) +menu_title res 3 ; text or proc for dynamic menu +menu_center res 1 ; centering for line menu +proc_item res 3 ; address of the current proc +text_item res 2 ; address of the current text + +;---- options.asm +opt_type res 1 ; +opt_default res 1 ; +opt_inc res 1 ; also used for default+1 (string) and enum low +opt_min res 1 ; also used for enum high +opt_max res 1 ; +opt_unit res 2 ; multi-lingual unit text +opt_eeprom res 1 ; +opt_backup_tbl res 3 ; buffer for table pointer + +;---- tft.asm +save_top res 1 +save_height res 1 +save_left res 1 +save_width res 1 +ds_line res 1 ; current line (0..239) +ds_column res 1 ; current columnx2 (0..159) +ds_pixel res 2 ; current pixel color +ds_count res 1 ; repetition count +tft_temp1 res 1 +tft_temp2 res 1 +tft_temp3 res 1 +tft_temp4 res 1 + +;---- wait.asm +wait_counter res 1 + +; ==> 187 bytes used - 21 bytes free + + +;============================ LOCAL DATA ====================================== +; Space for various overlayed local data from top-level applications, +; i.e. applications that never run in parallel to each other +; +; --------------------- local Data Users -------------------------------------- +; -------------- Applications using ------------- +; Mode local1 local2 local3 +; ----------------------------------------------------------------------------- +; sleepmode sleepmode.asm (unused) (unused) +; surfmode surfmode.asm* (unused) (unused) +; simulator simulator.asm (unused) (unused) +; divemode divemode.asm ghostwriter.asm (unused) +; logbook logboock.asm logbook.asm logbook.asm +; +; * assigned to this slot, but currently no local memory used + +local1 equ 0x1D0 ; Alias for CBLOCK directive +local1 udata_ovr 0x1D0 ; Bank1 shared local space + res 0x10 ; 16 Byte (0x1D0 ... 0x1DF) + +local2 equ 0x1E0 ; Alias for CBLOCK directive +local2 udata_ovr 0x1E0 ; Bank1 shared local space + res 0x10 ; 16 Byte (0x1E0 ... 0x1EF) + +local3 equ 0x1F0 ; Alias for CBLOCK directive +local3 udata_ovr 0x1F0 ; Bank1 shared local space + res 0x10 ; 16 Byte (0x1F0 ... 0x1FF) + + +;---------------------------- Common2 DATA ------------------------------------ +common2 equ 0xA00 ; Alias for "banksel common2" +common2 udata_ovr common2 ; Bank 10 general variables + +s8_rawdata_sensor1 res 3 ; 24bit A/D raw data from S8 HUD sensor 1 +s8_rawdata_sensor2 res 3 ; 24bit A/D raw data from S8 HUD sensor 2 +s8_rawdata_sensor3 res 3 ; 24bit A/D raw data from S8 HUD sensor 3 +hud_battery_mv res 2 ; hud/ppo2 monitor battery voltage in mV + +start_day res 1 ; At start of dive (For logbook) +start_month res 1 ; At start of dive (For logbook) +start_year res 1 ; At start of dive (For logbook) +start_hours res 1 ; At start of dive (For logbook) +start_mins res 1 ; At start of dive (For logbook) + +opt_gas_type_backup res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco * need to be in same bank +opt_dil_type_backup res 5 ; 0=Disabled, 1=First, 2=Normal + need to be in same bank +opt_OC_bail_gas_change_backup res 5 ; Gas change depths OC/Bailout * +opt_dil_change_backup res 5 ; Gas change depths Diluents + + +internal_battery_capacity res 2 ; For internal battery gauging +battery_capacity res 2 ; For battery gauge IC +battery_offset res 2 ; For battery gauge IC +battery_type res 1 ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah +battery_acumulated_charge res 2 ; Raw values in battery gauge IC +gauge_status_byte res 1 ; Gauge IC status byte + +analog_sw1_raw res 2 ; idle values (average) +analog_sw2_raw res 2 ; idle values (average) +analog_counter res 1 ; for averaging +analog_sw1 res 1 ; analog value for switch 1 +analog_sw2 res 1 ; analog value for switch 2 +button_polarity res 1 ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) + +uptime res 4 ; Uptime [s] +lastdive_time res 4 ; Time since last dive [s] +lastdive_duration res 3 ; mins:2 and secs +lastdive_maxdepth res 2 ; in mbar + +rx_buffer res .48 ; Buffer for RX data (Slots 0-7) +rx_firmware res 2 ; The RX firmware version xx.yy + +customview_surfmode res 1 ; storage to remember last selected custom view in surface mode +customview_divemode res 1 ; storage to remember last selected custom view in dive mode + +ambient_light res 2 ; ambient_light level +better_gas_number res 1 ; number (1-5) of the "better gas" in divemode, =0: no better gas available +old_velocity res 4 ; Stores the last 4 speeds (8 seconds) in m/min + +menustack res 5 ; menu stack from menu_processor.asm + +gas6_O2_ratio res 1 ; gas6 O2 ratio +gas6_He_ratio res 1 ; gas6 He ratio +gas6_temp res 1 ; temp used in divemenu_tree.asm + +; ==> 134 bytes used - 122 bytes free + + +;---------------------------- Bank 2 general purpose buffer ------------------- +; Reserved for general purpose buffer (strings, images, etc). +; NOTE: Needs to be aligned with a bank (LOW(buffer)==0). + +buffer udata_ovr 0x200 + +buffer res .256 + + +;---------------------------- Bank 14 for options table ----------------------- +opt_table equ 0xE00 +opt_table udata_ovr opt_table + +;---- Dive Options +opt_gas_O2_ratio res 5 ; Needed because deco gaslist use N2 +opt_dil_O2_ratio res 5 ; Must be in line with opt_gas_O2_ratio +opt_gas_He_ratio res 5 ; He ratio Gas1-5 +opt_dil_He_ratio res 5 ; Must be in line with opt_gas_He_ratio +opt_gas_type res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco +opt_dil_type res 5 ; 0=Disabled, 1=First, 2=Normal ; Must be in line with opt_gas_type +opt_dive_mode res 1 ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR +opt_ccr_mode res 1 ; =0: Fixed SP, =1: Sensor +opt_OC_bail_gas_change res 5 ; Gas change depths OC/Bailout + +;---- Managing Settings +opt_brightness res 1 ; =0: Eco, =1:Medium, =2:Full +opt_salinity res 1 ; 0-5% +#DEFINE opt_name_length .60 ; Custom text string 5 rows with 12 chars +opt_name res opt_name_length +opt_language res 1 ; Current language. 0=EN, 1=DE, 2=FR, 3=SP +opt_units res 1 ; 0:m/°C, 1:ft/°F +opt_dateformat res 1 ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD +opt_last_stop res 1 ; =3:3m, =4:4m, =5:5m, =6:6m +opt_aGF_high res 1 ; Alternative GF HIGH +opt_aGF_low res 1 ; Alternative GF LOW +opt_GF_high res 1 ; GF HIGH +opt_GF_low res 1 ; GF LOW +opt_enable_aGF res 1 ; =1: aGF can be selected underwater +opt_compass_gain res 1 ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) +opt_sampling_rate res 1 ; =1: 10s, =0: 2s +opt_dive_color_scheme res 1 ; 0-3 +opt_pressure_adjust res 1 ; SIGNED char (two's complement), -20/+20mbar max. +opt_enable_safetystop res 1 ; =1: A safety stop is shown +opt_calibration_O2_ratio res 1 ; %O2 of calibration gas +opt_x_s1 res 2 ; calibration factor (Not stored in EEPROM) +opt_x_s2 res 2 ; calibration factor (Not stored in EEPROM) +opt_x_s3 res 2 ; calibration factor (Not stored in EEPROM) +opt_sensor_fallback res 1 ; NOT USED ANY MORE, KEPT FOR COMPATIBILITY WITH EEPROM IMAGE +opt_flip_screen res 1 ; =1: Flip the screen +opt_cR_button_left res 1 ; Left button sensitivity (cR hardware) +opt_cR_button_right res 1 ; Right button sensitivity (cR hardware) +opt_modwarning res 1 ; =1:do a red blinking warning, =0:default behaviour +opt_vsitextv2 res 1 ; =1:use the depth dependent ascend rate limits +opt_vsigraph res 1 ; =1:draw the graphical VSI bar +opt_showppo2 res 1 ; =1:always show the ppO2 value in the warning position +opt_temperature_adjust res 1 ; SIGNED char (two's complement), -2.0/+2.0 °C max. +opt_safety_stop_length res 1 ; [s] +opt_safety_stop_start res 1 ; [cbar] +opt_safety_stop_end res 1 ; [cbar] +opt_safety_stop_reset res 1 ; [cbar] +opt_diveTimeout res 1 ; Timeout for Divemode [min] +opt_sim_setpoint_number res 1 ; setpoint to use for deco calculation +opt_calc_asc_gasvolume res 1 ; calculate OC gas volume needs for ascent +opt_sim_use_aGF res 1 ; =0: use GF, =1: use aGF for deco calculation +opt_enable_IBCD res 1 ; enable IBCD warning +opt_sat_multiplier_gf res 1 ; Buhlmann safety factor for GF deco +opt_desat_multiplier_gf res 1 ; Buhlmann safety factor for GF deco +opt_sat_multiplier_non_gf res 1 ; Buhlmann safety factor for NON-GF deco +opt_desat_multiplier_non_gf res 1 ; Buhlmann safety factor for NON-GF deco + +;----------------------------------------------------------------------------- diff -r f5de1ff88814 -r b455b31ce022 src/i2c.asm --- a/src/i2c.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/i2c.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,987 +1,995 @@ ;============================================================================= ; -; File i2c.asm +; File i2c.asm V2.98 ; ; I2C Interface -; - ; Compass0 -; HMC5883L's read address (8-Bit): 0x3D -; HMC5883L's write address (8-Bit): 0x3C -; MMA8452Q's read address (8-Bit): 0x39 -; MMA8452Q's write address (8-Bit): 0x38 -; - ; Compass1 -; LSM303D's read address (8-Bit): 0x3D -; LSM303D's write address (8-Bit): 0x3C -; - ; Compass2 -; LSM303AGR's Compass read address (8-Bit): 0x3D -; LSM303AGR's Compass write address (8-Bit): 0x3C -; LSM303AGR's Acceleration read address (8-Bit): 0x33 -; LSM303AGR's Acceleration write address (8-Bit): 0x32 -; - ; RX Circuity -; RX Circuity read address (8-Bit): 0x51 -; RX Circuity write address (8-Bit): 0x50 -; ; ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= +; +; Compass0 +; -------- +; HMC5883L's read address (8-Bit): 0x3D +; HMC5883L's write address (8-Bit): 0x3C +; MMA8452Q's read address (8-Bit): 0x39 +; MMA8452Q's write address (8-Bit): 0x38 +; +; Compass1 +; -------- +; LSM303D's read address (8-Bit): 0x3D +; LSM303D's write address (8-Bit): 0x3C +; +; Compass2 +; -------- +; LSM303AGR's Compass read address (8-Bit): 0x3D +; LSM303AGR's Compass write address (8-Bit): 0x3C +; LSM303AGR's Acceleration read address (8-Bit): 0x33 +; LSM303AGR's Acceleration write address (8-Bit): 0x32 +; +; RX Circuity +; ----------- +; RX Circuity read address (8-Bit): 0x51 +; RX Circuity write address (8-Bit): 0x50 +; +; + ; HISTORY ; 2012-08-22 : [mH] Creation ; 2018-02-18 : [mH] Sync with hwOS Sport release -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; Mandatory header #include "wait.inc" #include "math.inc" #include "external_flash.inc" -i2c CODE + +i2c CODE + +;============================================================================= WaitMSSP: - decfsz i2c_temp,F ; check for timeout during I2C action + decfsz i2c_temp1,F ; check for timeout during I2C action bra WaitMSSP2 - bra I2CFail ; timeout occured + bra I2CFail ; timeout occurred WaitMSSP2: - btfss PIR1,SSP1IF + btfss PIR1,SSP1IF bra WaitMSSP - clrf i2c_temp + clrf i2c_temp1 bcf PIR1,SSP1IF return I2C_WaitforACK: - btfss SSP1CON2,ACKSTAT ; checks for ACK bit from slave + btfss SSP1CON2,ACKSTAT ; checks for ACK bit from slave return I2CFail: - rcall I2CReset ; I2C Reset + rcall I2CReset ; I2C Reset bcf PIR1,SSP1IF - clrf i2c_temp - bsf i2c_error_flag ; set error flag + clrf i2c_temp1 + bsf i2c_error_flag ; set error flag return -I2CReset: ; Something went wrong (Slave holds SDA low?) - clrf SSP1CON1 ; wake-up slave and reset entire module - clrf SSP1CON2 - clrf SSP1STAT - bcf TRISC,3 ; SCL OUTPUT - bsf TRISC,4 ; SDA Input - bcf PORTC,3 - movlw d'9' - movwf i2c_temp ; clock-out 9 clock cycles manually +I2CReset: ; Something went wrong (Slave holds SDA low?) + clrf SSP1CON1 ; wake-up slave and reset entire module + clrf SSP1CON2 + clrf SSP1STAT + bcf TRISC,3 ; SCL OUTPUT + bsf TRISC,4 ; SDA Input + bcf PORTC,3 + movlw d'9' + movwf i2c_temp1 ; clock-out 9 clock cycles manually I2CReset_1: - bsf PORTC,3 ; SCL=1 + bsf PORTC,3 ; SCL=1 nop nop nop nop - btfsc PORTC,4 ; SDA=1? - bra I2CReset_2 ; =1, SDA has been released from slave - bcf PORTC,3 ; SCL=0 + btfsc PORTC,4 ; SDA=1? + bra I2CReset_2 ; =1, SDA has been released from slave + bcf PORTC,3 ; SCL=0 nop nop - bcf PORTC,3 + bcf PORTC,3 nop nop - decfsz i2c_temp,F - bra I2CReset_1 ; check for nine clock cycles + decfsz i2c_temp1,F + bra I2CReset_1 ; check for nine clock cycles I2CReset_2: - bsf TRISC,3 ; SCL Input - clrf SSP1CON1 ; setup I²C Mode - WAITMS d'10' ; Reset-Timeout for I2C devices - movlw b'00000000' ; with slew rate control - movwf SSP1STAT - movlw b'00101000' - movwf SSP1CON1 - movlw b'00000000' - movwf SSP1CON2 - movlw 0x27 - movwf SSP1ADD + bsf TRISC,3 ; SCL Input + clrf SSP1CON1 ; setup I²C Mode + WAITMS d'10' ; Reset-Timeout for I2C devices + movlw b'00000000' ; with slew rate control + movwf SSP1STAT + movlw b'00101000' + movwf SSP1CON1 + movlw b'00000000' + movwf SSP1CON2 + movlw 0x27 + movwf SSP1ADD return I2C_TX: - movwf SSP1BUF - rcall WaitMSSP - bra I2C_WaitforACK ; Returns... + movwf SSP1BUF + rcall WaitMSSP + bra I2C_WaitforACK ; Returns... -I2C_TwoBytesRX_div16: ; Get two bytes and devide lo:hi/16 (signed) - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte -I2C_TwoBytesRX_div16_2: ; devide lo:hi/16 (signed) only - bcf STATUS,C - btfsc hi,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf hi ; /2 - rrcf lo -I2C_TwoBytesRX_div8_2: ; devide lo:hi/8 (signed) only - bcf STATUS,C - btfsc hi,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf hi ; /4 - rrcf lo - bcf STATUS,C - btfsc hi,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf hi ; /8 - rrcf lo - bcf STATUS,C - btfsc hi,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf hi ; /16 - rrcf lo - return +I2C_TwoBytesRX_div16: ; Get two bytes and divide lo:hi/16 (signed) + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte +I2C_TwoBytesRX_div16_2: ; divide lo:hi/16 (signed) only + bcf STATUS,C + btfsc hi,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf hi ; /2 + rrcf lo +I2C_TwoBytesRX_div8_2: ; divide lo:hi/8 (signed) only + bcf STATUS,C + btfsc hi,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf hi ; /4 + rrcf lo + bcf STATUS,C + btfsc hi,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf hi ; /8 + rrcf lo + bcf STATUS,C + btfsc hi,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf hi ; /16 + rrcf lo + return - global I2C_RX_accelerometer + global I2C_RX_accelerometer I2C_RX_accelerometer: - btfsc compass_type2 ; compass2 - bra I2C_RX_accelerometer_compass2 ; yes - btfsc compass_type ; compass1? - bra I2C_RX_accelerometer_compass1 ; yes + btfsc compass_type2 ; compass2 + bra I2C_RX_accelerometer_compass2 ; yes + btfsc compass_type ; compass1? + bra I2C_RX_accelerometer_compass1 ; yes I2C_RX_accelerometer_compass0: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address - rcall I2C_TX - movlw 0x00 - rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) - rcall WaitMSSP - movlw 0x39 ; address - rcall I2C_TX + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address + rcall I2C_TX + movlw 0x00 + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x39 ; address + rcall I2C_TX - rcall I2C_OneByteRX ; Get Status Byte - movf SSP1BUF,W + rcall I2C_OneByteRX ; Get Status Byte + movf SSP1BUF,W - ; Non-flipped screen: - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = -x - ; y = -y - ; z = -z + ; Non-flipped screen: + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = -x + ; y = -y + ; z = -z - ; Flipped screen: - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = x - ; y = y - ; z = -z + ; Flipped screen: + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = x + ; y = y + ; z = -z - rcall I2C_TwoBytesRX_div16 ; Get two bytes and devide /16 (signed) - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_accelerometer2 ; Yes - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. + rcall I2C_TwoBytesRX_div16 ; Get two bytes and divide /16 (signed) + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer2 ; Yes + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. I2C_RX_accelerometer2: - movff lo,accel_DX+0 - movff hi,accel_DX+1 ; Copy result + movff lo,accel_DX+0 + movff hi,accel_DX+1 ; Copy result - rcall I2C_TwoBytesRX_div16 ; Get two bytes and devide /16 (signed) - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_accelerometer3 ; Yes - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. + rcall I2C_TwoBytesRX_div16 ; Get two bytes and divide /16 (signed) + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer3 ; Yes + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. I2C_RX_accelerometer3: - movff lo,accel_DY+0 - movff hi,accel_DY+1 ; Copy result + movff lo,accel_DY+0 + movff hi,accel_DY+1 ; Copy result - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP -; According to datasheet there should be no Master Acknowlegde for the last Byte (accel_DZ+0)... - movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte + bsf SSP1CON2, RCEN ; Enable receive mode + rcall WaitMSSP +; According to data sheet there should be no Master Acknowledge for the last Byte (accel_DZ+0)... + movff SSP1BUF,lo ; Data Byte - rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. - movff lo,accel_DZ+0 - movff hi,accel_DZ+1 ; Copy result + rcall I2C_TwoBytesRX_div16_2 ; divide lo:hi/16 (signed) only + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. + movff lo,accel_DZ+0 + movff hi,accel_DZ+1 ; Copy result - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) I2C_RX_accelerometer_compass1: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw b'10101000' ; 0x28 with auto-increment (MSB=1) - rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) - rcall WaitMSSP - movlw 0x3D ; address -I2C_RX_accelerometer_compass1_xx: ; compass2 continues here... - rcall I2C_TX - ; Non-flipped screen: - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = -x (Compass 1) - ; x = x (Compass 2) - ; y = -y - ; z = -z + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw b'10101000' ; 0x28 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x3D ; address +I2C_RX_accelerometer_compass1_xx: ; compass2 continues here... + rcall I2C_TX + + ; Non-flipped screen: + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = -x (Compass 1) + ; x = x (Compass 2) + ; y = -y + ; z = -z + + ; Flipped screen: + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = x (Compass 1) + ; x = -x (Compass 2) + ; y = y + ; z = -z - ; Flipped screen: - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = x (Compass 1) - ; x = -x (Compass 2) - ; y = y - ; z = -z - - ; Dump the accelerator data - rcall I2C_OneByteRX - movff SSP1BUF,lo ;accel_DX+0 - rcall I2C_OneByteRX - movff SSP1BUF,hi ;accel_DX+1 - rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only - btfss compass_type2 ; compass 2? - bra I2C_RX_accelerometer1_c1 ; No, compass 1 - ; compass 2 - btfss flip_screen ; 180° rotation ? - bra I2C_RX_accelerometer2_c1 ; No, continue with normal compass1 routines for Y and Z - ; flipped compass 2, negate x - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. - bra I2C_RX_accelerometer2_c1 ; continue with normal compass1 routines for Y and Z - -I2C_RX_accelerometer1_c1: - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_accelerometer2_c1 ; Yes - ; non-flipped compass 1, negate x - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. + ; Dump the accelerator data + rcall I2C_OneByteRX + movff SSP1BUF,lo ; accel_DX+0 + rcall I2C_OneByteRX + movff SSP1BUF,hi ;accel_DX+1 + rcall I2C_TwoBytesRX_div16_2 ; divide lo:hi/16 (signed) only + btfss compass_type2 ; compass 2? + bra I2C_RX_accelerometer1_c1 ; No, compass 1 + ; compass 2 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer2_c1 ; No, continue with normal compass1 routines for Y and Z + ; flipped compass 2, negate x + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. + bra I2C_RX_accelerometer2_c1 ; continue with normal compass1 routines for Y and Z + +I2C_RX_accelerometer1_c1: + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer2_c1 ; Yes + ; non-flipped compass 1, negate x + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. I2C_RX_accelerometer2_c1: - ; flipped compass 1, non-flipped compass 2 - movff lo,accel_DX+0 - movff hi,accel_DX+1 ; Copy result - rcall I2C_OneByteRX - movff SSP1BUF,lo ;accel_DY+0 - rcall I2C_OneByteRX - movff SSP1BUF,hi ;accel_DY+1 - - rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_accelerometer3_c1 ; Yes - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. + ; flipped compass 1, non-flipped compass 2 + movff lo,accel_DX+0 + movff hi,accel_DX+1 ; Copy result + rcall I2C_OneByteRX + movff SSP1BUF,lo ; accel_DY+0 + rcall I2C_OneByteRX + movff SSP1BUF,hi ; accel_DY+1 + + rcall I2C_TwoBytesRX_div16_2 ; divide lo:hi/16 (signed) only + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer3_c1 ; Yes + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. I2C_RX_accelerometer3_c1: - movff lo,accel_DY+0 - movff hi,accel_DY+1 ; Copy result + movff lo,accel_DY+0 + movff hi,accel_DY+1 ; Copy result - rcall I2C_OneByteRX - movff SSP1BUF,lo ;accel_DZ+0 - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP -; According to datasheet there should be no Master Acknowlegde for the last Byte (accel_DZ+1)... - movff SSP1BUF,hi ;accel_DZ+1 - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only - comf hi ; 16bit sign change for Z - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. - movff lo,accel_DZ+0 - movff hi,accel_DZ+1 ; Copy result - return - + rcall I2C_OneByteRX + movff SSP1BUF,lo ;accel_DZ+0 + bsf SSP1CON2, RCEN ; Enable receive mode + rcall WaitMSSP +; According to data sheet there should be no Master Acknowledge for the last Byte (accel_DZ+1)... + movff SSP1BUF,hi ;accel_DZ+1 + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + rcall I2C_TwoBytesRX_div16_2 ; divide lo:hi/16 (signed) only + comf hi ; 16bit sign change for Z + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. + movff lo,accel_DZ+0 + movff hi,accel_DZ+1 ; Copy result + return + I2C_RX_accelerometer_compass2: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x32 ; address - rcall I2C_TX - movlw b'10101000' ; 0x28 with auto-increment (MSB=1) - rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) - rcall WaitMSSP - movlw 0x33 ; address - bra I2C_RX_accelerometer_compass1_xx - + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw b'10101000' ; 0x28 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x33 ; address + bra I2C_RX_accelerometer_compass1_xx + I2C_OneByteRX: - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP - bsf SSP1CON2,ACKEN ; Master acknowlegde - bra WaitMSSP ; And return! + bsf SSP1CON2,RCEN ; Enable receive mode + rcall WaitMSSP + bsf SSP1CON2,ACKEN ; Master acknowledge + bra WaitMSSP ; And return! - global I2C_RX_compass + global I2C_RX_compass I2C_RX_compass: - btfsc compass_type2 ; compass2 - bra I2C_RX_compass2 ; yes - btfsc compass_type ; compass1? - bra I2C_RX_compass1 ; yes + btfsc compass_type2 ; compass2 + bra I2C_RX_compass2 ; yes + btfsc compass_type ; compass1? + bra I2C_RX_compass1 ; yes I2C_RX_compass0: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x03 - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x03 + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - bcf PIR1,SSP1IF - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3D ; address - rcall I2C_TX + bcf PIR1,SSP1IF + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3D ; address + rcall I2C_TX - ; Compass IC sends data in following order: - ; x MSB - ; x LSB - ; z MSB - ; z LSB - ; y MSB - ; y LSB + ; Compass IC sends data in following order: + ; x MSB + ; x LSB + ; z MSB + ; z LSB + ; y MSB + ; y LSB - ; Non-flipped screen - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = -y - ; z = z - ; y = x + ; Non-flipped screen + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = -y + ; z = z + ; y = x - ; Flipped screen - ; Chip orientation on the PCB requires - ; Original = Corrected - ; x = y - ; z = z - ; y = -x + ; Flipped screen + ; Chip orientation on the PCB requires + ; Original = Corrected + ; x = y + ; z = z + ; y = -x - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DY+1; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DY+0; Data Byte - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_compass0_2 ; Yes - banksel compass_DY - comf compass_DY+1 ; 16bit sign change. - negf compass_DY+0 - btfsc STATUS,C ; Carry to propagate ? - incf compass_DY+1,F ; YES: do it. + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,compass_DY+1 ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,compass_DY+0 ; Data Byte + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_compass0_2 ; Yes + banksel compass_DY + comf compass_DY+1 ; 16bit sign change. + negf compass_DY+0 + btfsc STATUS,C ; Carry to propagate ? + incf compass_DY+1,F ; YES: do it. I2C_RX_compass0_2: - banksel common - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DZ+1; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DZ+0; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DX+1; Data Byte - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP - movff SSP1BUF,compass_DX+0; Data Byte - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - btfss flip_screen ; 180° rotation ? - return ; No, done. - ; Yes, flip X - banksel compass_DX - comf compass_DX+1 ; 16bit sign change. - negf compass_DX+0 - btfsc STATUS,C ; Carry to propagate ? - incf compass_DX+1,F ; YES: do it. - banksel common - return - -I2C_RX_compass1: ; New compass - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw b'10001000' ; 0x08 with auto-increment (MSB=1) - rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) - rcall WaitMSSP - movlw 0x3D ; address - rcall I2C_TX -;rcall WaitMSSP ; Needed? (mH) - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte - rcall I2C_TwoBytesRX_div8_2 - movff lo,compass_DX+0 - movff hi,compass_DX+1 - btfss flip_screen ; 180° rotation ? - bra I2C_RX_compass1_1 ; Yes - ; Yes, flip X - banksel compass_DX - comf compass_DX+1 ; 16bit sign change. - negf compass_DX+0 - btfsc STATUS,C ; Carry to propagate ? - incf compass_DX+1,F ; YES: do it. - banksel common + banksel common + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,compass_DZ+1 ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,compass_DZ+0 ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,compass_DX+1 ; Data Byte + bsf SSP1CON2, RCEN ; Enable receive mode + rcall WaitMSSP + movff SSP1BUF,compass_DX+0 ; Data Byte + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + btfss flip_screen ; 180° rotation ? + return ; No, done. + ; Yes, flip X + banksel compass_DX + comf compass_DX+1 ; 16bit sign change. + negf compass_DX+0 + btfsc STATUS,C ; Carry to propagate ? + incf compass_DX+1,F ; YES: do it. + banksel common + return + +I2C_RX_compass1: ; New compass + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw b'10001000' ; 0x08 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x3D ; address + rcall I2C_TX + ;rcall WaitMSSP ; Needed? (mH) + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte + rcall I2C_TwoBytesRX_div8_2 + movff lo,compass_DX+0 + movff hi,compass_DX+1 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_compass1_1 ; Yes + ; Yes, flip X + banksel compass_DX + comf compass_DX+1 ; 16bit sign change. + negf compass_DX+0 + btfsc STATUS,C ; Carry to propagate ? + incf compass_DX+1,F ; YES: do it. + banksel common I2C_RX_compass1_1: - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte - rcall I2C_TwoBytesRX_div8_2 - movff lo,compass_DY+0 - movff hi,compass_DY+1 - btfss flip_screen ; 180° rotation ? - bra I2C_RX_compass1_2 ; Yes - ; Yes, flip Y - banksel compass_DY - comf compass_DY+1 ; 16bit sign change. - negf compass_DY+0 - btfsc STATUS,C ; Carry to propagate ? - incf compass_DY+1,F ; YES: do it. + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte + rcall I2C_TwoBytesRX_div8_2 + movff lo,compass_DY+0 + movff hi,compass_DY+1 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_compass1_2 ; Yes + ; Yes, flip Y + banksel compass_DY + comf compass_DY+1 ; 16bit sign change. + negf compass_DY+0 + btfsc STATUS,C ; Carry to propagate ? + incf compass_DY+1,F ; YES: do it. I2C_RX_compass1_2: - banksel common - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP - movff SSP1BUF,hi ; Data Byte - rcall I2C_TwoBytesRX_div8_2 - movff lo,compass_DZ+0 - movff hi,compass_DZ+1 - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(And return) + banksel common + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + bsf SSP1CON2, RCEN ; Enable receive mode + rcall WaitMSSP + movff SSP1BUF,hi ; Data Byte + rcall I2C_TwoBytesRX_div8_2 + movff lo,compass_DZ+0 + movff hi,compass_DZ+1 + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) -I2C_RX_compass2: ; newest compass - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0xE8 ; 0x68 with auto-increment (MSB=1) - rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) - rcall WaitMSSP - movlw 0x3D ; address - rcall I2C_TX -; rcall WaitMSSP - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte -; rcall I2C_TwoBytesRX_div8_2 - btfsc flip_screen ; 180° rotation ? - bra I2C_RX_compass2_1 ; Yes, do nothing with X - ; No, flip X - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. -I2C_RX_compass2_1: - movff lo,compass_DX+0 - movff hi,compass_DX+1 - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte -; rcall I2C_TwoBytesRX_div8_2 - btfss flip_screen ; 180° rotation ? - bra I2C_RX_compass2_2 ; No, do nothing with Y - ; Yes, flip Y - comf hi ; 16bit sign change. - negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. +I2C_RX_compass2: ; newest compass + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0xE8 ; 0x68 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x3D ; address + rcall I2C_TX +; rcall WaitMSSP + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte +; rcall I2C_TwoBytesRX_div8_2 + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_compass2_1 ; Yes, do nothing with X + ; No, flip X + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. +I2C_RX_compass2_1: + movff lo,compass_DX+0 + movff hi,compass_DX+1 + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte +; rcall I2C_TwoBytesRX_div8_2 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_compass2_2 ; No, do nothing with Y + ; Yes, flip Y + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. I2C_RX_compass2_2: - movff lo,compass_DY+0 - movff hi,compass_DY+1 - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,lo ; Data Byte - rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,hi ; Data Byte - ;rcall I2C_TwoBytesRX_div8_2 - movff lo,compass_DZ+0 - movff hi,compass_DZ+1 - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(And return) - - - global I2C_init_compass + movff lo,compass_DY+0 + movff hi,compass_DY+1 + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte +; rcall I2C_TwoBytesRX_div8_2 + movff lo,compass_DZ+0 + movff hi,compass_DZ+1 + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) + + + global I2C_init_compass I2C_init_compass: - bsf compass_enabled - bcf compass_type2 - ; probe compass 2 - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x32 ; Address byte + Write bit - movwf SSP1BUF ; control byte - rcall WaitMSSP - btfss SSP1CON2,ACKSTAT ; ACK? - bsf compass_type2 ; ACK send. compass2 present - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - - btfsc compass_type2 - bra I2C_init_compass2 ; Compass2 - ; Check for compass0 or compass1... - bsf compass_type ; set flag - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x0F - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - bcf PIR1,SSP1IF - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3D ; address - rcall I2C_TX - rcall I2C_OneByteRX ; Get one byte - movlw 0x49 ; 0x49 = Compass1 - cpfseq SSP1BUF - bcf compass_type ; clear flag - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP + bsf compass_enabled + bcf compass_type2 + ; probe compass 2 + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + btfss SSP1CON2,ACKSTAT ; ACK? + bsf compass_type2 ; ACK send. compass2 present + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - btfsc compass_type ; compass1? - bra I2C_init_compass1 ; yes + btfsc compass_type2 + bra I2C_init_compass2 ; Compass2 + ; Check for compass0 or compass1... + bsf compass_type ; set flag + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x0F + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + bcf PIR1,SSP1IF + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3D ; address + rcall I2C_TX + rcall I2C_OneByteRX ; Get one byte + movlw 0x49 ; 0x49 = Compass1 + cpfseq SSP1BUF + bcf compass_type ; clear flag + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + + btfsc compass_type ; compass1? + bra I2C_init_compass1 ; yes ; init compass0 - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x00 - rcall I2C_TX -; movlw b'01101001' ; ConfigA: 3Hz, 8 Samples averaged, Test Mode (Positive Bias) - movlw b'01101000' ; ConfigA: 3Hz, 8 Samples averaged - rcall I2C_TX + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x00 + rcall I2C_TX +; movlw b'01101001' ; ConfigA: 3Hz, 8 Samples averaged, Test Mode (Positive Bias) + movlw b'01101000' ; ConfigA: 3Hz, 8 Samples averaged + rcall I2C_TX I2C_init_compass_common: - movff opt_compass_gain,i2c_temp ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) - swapf i2c_temp,F - comf i2c_temp,F - bcf STATUS,C - rlcf i2c_temp - movf i2c_temp,W - clrf i2c_temp - rcall I2C_TX - movlw b'00000000' ; Continous Mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + movff opt_compass_gain,i2c_temp1 ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) + swapf i2c_temp1,F + comf i2c_temp1,F + bcf STATUS,C + rlcf i2c_temp1 + movf i2c_temp1,W + clrf i2c_temp1 + rcall I2C_TX + movlw b'00000000' ; Continuous Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) I2C_init_compass1: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x9F ; 1F with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000000' ; CTRL0 - rcall I2C_TX - movlw b'00101111' ; CTRL1 (6,25Hz, BDU=0, x,y,z = ON) - rcall I2C_TX - movlw b'11000000' ; CTRL2 (50Hz, +/-2g, - rcall I2C_TX - movlw b'00000000' ; CTRL3 - rcall I2C_TX - movlw b'00000000' ; CTRL4 - rcall I2C_TX - movlw b'01100100' ; CTRL5 HIGH res, 6,25Hz - rcall I2C_TX + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x9F ; 1F with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000000' ; CTRL0 + rcall I2C_TX + movlw b'00101111' ; CTRL1 (6,25Hz, BDU=0, x,y,z = ON) + rcall I2C_TX + movlw b'11000000' ; CTRL2 (50Hz, +/-2g, + rcall I2C_TX + movlw b'00000000' ; CTRL3 + rcall I2C_TX + movlw b'00000000' ; CTRL4 + rcall I2C_TX + movlw b'01100100' ; CTRL5 HIGH res, 6,25Hz + rcall I2C_TX init_compass1_common: - movff opt_compass_gain,i2c_temp ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) - movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) - dcfsnz i2c_temp,F ; = 1? - movlw b'01100000' ; Yes, CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) - dcfsnz i2c_temp,F ; = 2? - movlw b'01000000' ; Yes, CTRL6 (+/-8 Gauss) - dcfsnz i2c_temp,F ; = 3? - movlw b'01000000' ; Yes, CTRL6 (+/-8 Gauss) - dcfsnz i2c_temp,F ; = 4? - movlw b'00100000' ; Yes, CTRL6 (+/-4 Gauss) - dcfsnz i2c_temp,F ; = 5? - movlw b'00100000' ; Yes, CTRL6 (+/-4 Gauss) - dcfsnz i2c_temp,F ; = 6? - movlw b'00000000' ; Yes, CTRL6 (+/-2 Gauss) - dcfsnz i2c_temp,F ; = 7? - movlw b'00000000' ; Yes, CTRL6 (+/-2 Gauss) - rcall I2C_TX - movlw b'00000000' ; CTRL7 Continuous Mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) - + movff opt_compass_gain,i2c_temp1 ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) +++ + movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) + dcfsnz i2c_temp1,F ; = 1? + movlw b'01100000' ; Yes, CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) + dcfsnz i2c_temp1,F ; = 2? + movlw b'01000000' ; Yes, CTRL6 (+/-8 Gauss) + dcfsnz i2c_temp1,F ; = 3? + movlw b'01000000' ; Yes, CTRL6 (+/-8 Gauss) + dcfsnz i2c_temp1,F ; = 4? + movlw b'00100000' ; Yes, CTRL6 (+/-4 Gauss) + dcfsnz i2c_temp1,F ; = 5? + movlw b'00100000' ; Yes, CTRL6 (+/-4 Gauss) + dcfsnz i2c_temp1,F ; = 6? + movlw b'00000000' ; Yes, CTRL6 (+/-2 Gauss) + dcfsnz i2c_temp1,F ; = 7? + movlw b'00000000' ; Yes, CTRL6 (+/-2 Gauss) + rcall I2C_TX + movlw b'00000000' ; CTRL7 Continuous Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) + I2C_init_compass2: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0xE0 ; 0x60 with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000000' ; CFG_REG_A_M (10Hz, Continuous) - rcall I2C_TX - movlw b'00000000' ; CFG_REG_B_M (Low-Pass Filter off) - rcall I2C_TX - movlw b'00000000' ; CFG_REG_C_M BDU=0 - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(And return) - - global I2C_sleep_compass + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0xE0 ; 0x60 with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000000' ; CFG_REG_A_M (10Hz, Continuous) + rcall I2C_TX + movlw b'00000000' ; CFG_REG_B_M (Low-Pass Filter off) + rcall I2C_TX + movlw b'00000000' ; CFG_REG_C_M BDU=0 + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) + + + global I2C_sleep_compass I2C_sleep_compass: - bcf compass_enabled - btfsc compass_type2 ; compass2? - bra I2C_sleep_compass2 ; yes - btfsc compass_type ; compass1? - bra I2C_sleep_compass1 ; yes + bcf compass_enabled + btfsc compass_type2 ; compass2? + bra I2C_sleep_compass2 ; yes + btfsc compass_type ; compass1? + bra I2C_sleep_compass1 ; yes I2C_sleep_compass0: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x00 - rcall I2C_TX - movlw b'01101000' ; ConfigA - rcall I2C_TX - movlw b'00100000' ; ConfigB - rcall I2C_TX - movlw b'00000010' ; Idle Mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x00 + rcall I2C_TX + movlw b'01101000' ; ConfigA + rcall I2C_TX + movlw b'00100000' ; ConfigB + rcall I2C_TX + movlw b'00000010' ; Idle Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) I2C_sleep_compass1: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x20 ; CTRL_REG1 - rcall I2C_TX - movlw b'00000000' ; data for CTRL_REG1: acceleration sensor Power-down mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x26 ; CTRL_REG7 - rcall I2C_TX - movlw b'00000010' ; data for CTRL_REG7: magnetic sensor Power-down mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(And return) + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x20 ; CTRL_REG1 + rcall I2C_TX + movlw b'00000000' ; data for CTRL_REG1: acceleration sensor Power-down mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0x26 ; CTRL_REG7 + rcall I2C_TX + movlw b'00000010' ; data for CTRL_REG7: magnetic sensor Power-down mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) - I2C_sleep_compass2: - ; magnetic - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0xE0 ; 0x60 with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000010' ; CFG_REG_A_M (Idle mode) - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) - + ; magnetic + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x3C ; address + rcall I2C_TX + movlw 0xE0 ; 0x60 with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000010' ; CFG_REG_A_M (Idle mode) + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) + I2C_sleep_accelerometer2: - ; accelerometer - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x32 ; address - rcall I2C_TX - movlw 0x9F ; 1F with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) - rcall I2C_TX - movlw b'00000000' ; CTRL_REG1_A (All off) - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + ; accelerometer + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw 0x9F ; 1F with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) + rcall I2C_TX + movlw b'00000000' ; CTRL_REG1_A (All off) + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) - global I2C_init_accelerometer + global I2C_init_accelerometer I2C_init_accelerometer: - btfsc compass_type2 ; compass2? - bra I2C_init_accelerometer2 ; Yes. + btfsc compass_type2 ; compass2? + bra I2C_init_accelerometer2 ; Yes. - btfsc compass_type ; compass1? - return ; yes, ignore + btfsc compass_type ; compass1? + return ; yes, ignore - rcall I2C_sleep_accelerometer ; Regs can only be changed in St.By mode + rcall I2C_sleep_accelerometer ; Regs can only be changed in St.By mode - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address - rcall I2C_TX - movlw 0x0E ; XYZ_DATA_CFG - rcall I2C_TX - movlw b'00000000' ; High pass Filter=0 , +/- 2g range - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address + rcall I2C_TX + movlw 0x0E ; XYZ_DATA_CFG + rcall I2C_TX + movlw b'00000000' ; High pass Filter=0 , +/- 2g range + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address - rcall I2C_TX - movlw 0x2A ; CTRL_REG1 - rcall I2C_TX -; movlw b'00110000' ; CTRL_REG1: 160ms data rate, St.By Mode - movlw b'00110100' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode - rcall I2C_TX - movlw b'00000010' ; CTRL_REG2: High Res in Active mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address + rcall I2C_TX + movlw 0x2A ; CTRL_REG1 + rcall I2C_TX +; movlw b'00110000' ; CTRL_REG1: 160ms data rate, St.By Mode + movlw b'00110100' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode + rcall I2C_TX + movlw b'00000010' ; CTRL_REG2: High Res in Active mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address - rcall I2C_TX - movlw 0x2A ; CTRL_REG1 - rcall I2C_TX -; movlw b'00110001' ; CTRL_REG1: 160ms data rate, Active Mode - movlw b'00110101' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode, Active Mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) - + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address + rcall I2C_TX + movlw 0x2A ; CTRL_REG1 + rcall I2C_TX +; movlw b'00110001' ; CTRL_REG1: 160ms data rate, Active Mode + movlw b'00110101' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode, Active Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) + I2C_init_accelerometer2: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x32 ; address - rcall I2C_TX - movlw 0x9F ; 1F with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) - rcall I2C_TX - movlw b'01010111' ; CTRL_REG1_A (100Hz, x,y,z = ON) - rcall I2C_TX - movlw b'00000000' ; CTRL_REG2_A - rcall I2C_TX -; movlw b'00000000' ; CTRL_REG3_A -; rcall I2C_TX -; movlw b'00000000' ; CTRL_REG4_A (BDU=0, +/-2g, -; rcall I2C_TX -; movlw b'00000000' ; CTRL_REG5_A -; rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw 0x9F ; 1F with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) + rcall I2C_TX + movlw b'01010111' ; CTRL_REG1_A (100Hz, x,y,z = ON) + rcall I2C_TX + movlw b'00000000' ; CTRL_REG2_A + rcall I2C_TX +; movlw b'00000000' ; CTRL_REG3_A +; rcall I2C_TX +; movlw b'00000000' ; CTRL_REG4_A (BDU=0, +/-2g, +; rcall I2C_TX +; movlw b'00000000' ; CTRL_REG5_A +; rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) - global I2C_sleep_accelerometer + global I2C_sleep_accelerometer I2C_sleep_accelerometer: - btfsc compass_type2 ; Compass2 - bra I2C_sleep_accelerometer2 ; Yes - btfsc compass_type ; compass1? - return ; yes, ignore + btfsc compass_type2 ; Compass2 + bra I2C_sleep_accelerometer2 ; Yes + btfsc compass_type ; compass1? + return ; yes, ignore - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address - rcall I2C_TX - movlw 0x2A ; CTRL_REG1 - rcall I2C_TX - movlw b'00000000' ; St. By Mode - rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) - + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address + rcall I2C_TX + movlw 0x2A ; CTRL_REG1 + rcall I2C_TX + movlw b'00000000' ; St. By Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) + lt2942_init_again: - clrf i2c_temp - movlw 0x02 ; Point to accumulated charge registers + clrf i2c_temp1 + movlw 0x02 ; Point to accumulated charge registers rcall I2C_TX_GAUGE - movff battery_acumulated_charge+1,SSP1BUF ; Data Byte + movff battery_acumulated_charge+1,SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - movff battery_acumulated_charge+0,SSP1BUF ; Data Byte + movff battery_acumulated_charge+0,SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP movff battery_acumulated_charge+1,sub_a+1 movff battery_acumulated_charge+0,sub_a+0 ; and init again... - global lt2942_init -lt2942_init: ; Setup Control register B - clrf i2c_temp - movlw 0x01 ; Point to control reg B + global lt2942_init +lt2942_init: ; Setup Control register B + clrf i2c_temp1 + movlw 0x01 ; Point to control reg B rcall I2C_TX_GAUGE - movlw b'11111000' ; Automatic conversion every two seconds - movff WREG, SSP1BUF ; Data Byte + movlw b'11111000' ; Automatic conversion every two seconds + movff WREG, SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) global lt2942_get_status -lt2942_get_status: ; Read status register - bcf battery_gauge_available ; Clear flag - clrf i2c_temp - movlw 0x00 ; Point to Status reg +lt2942_get_status: ; Read status register + bcf battery_gauge_available ; Clear flag + clrf i2c_temp1 + movlw 0x00 ; Point to Status reg rcall I2C_TX_GAUGE rcall I2C_RX_GAUGE movff SSP1BUF,WREG - btfss WREG,7 ; 2942 found? - bsf battery_gauge_available ; Yes, set flag - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ; (And return) + btfss WREG,7 ; 2942 found? + bsf battery_gauge_available ; Yes, set flag + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) global lt2942_get_voltage -lt2942_get_voltage: ; Read battery voltage registers - clrf i2c_temp - movlw 0x08 ; Point to voltage registers +lt2942_get_voltage: ; Read battery voltage registers + clrf i2c_temp1 + movlw 0x08 ; Point to voltage registers rcall I2C_TX_GAUGE rcall I2C_RX_GAUGE - bsf SSP1CON2,ACKEN ; Master acknowlegde + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP movff SSP1BUF,xA+1 - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,xA+0 - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP ; banksel common - ; xA:2 loaded with raw values - movlw LOW .6000 - movwf xB+0 - movlw HIGH .6000 - movwf xB+1 - call mult16x16 ;xA*xB=xC + ; xA:2 loaded with raw values + movlw LOW .6000 + movwf xB+0 + movlw HIGH .6000 + movwf xB+1 + call mult16x16 ; xA*xB=xC - ; devide xC (32bit)/65535 for result in mV (16bit) - movlw .16 - movwf i2c_temp + ; divide xC (32bit)/65535 for result in mV (16bit) + movlw .16 + movwf i2c_temp1 lt2942_get_voltage2: - bcf STATUS,C - rrcf xC+3,F - rrcf xC+2,F - rrcf xC+1,F - rrcf xC+0,F - decfsz i2c_temp,F - bra lt2942_get_voltage2 + bcf STATUS,C + rrcf xC+3,F + rrcf xC+2,F + rrcf xC+1,F + rrcf xC+0,F + decfsz i2c_temp1,F + bra lt2942_get_voltage2 - ; Update battery voltage in mV - movff xC+1,batt_voltage+1 - movff xC+0,batt_voltage+0 - - tstfsz batt_voltage+1 ; <256mV? - return ; No, done. + ; Update battery voltage in mV + movff xC+1,batt_voltage+1 + movff xC+0,batt_voltage+0 - bra lt2942_init ;(and return) + tstfsz batt_voltage+1 ; <256mV? + return ; No, done. + bra lt2942_init ;(and return) ; global lt2942_get_temperature -;lt2942_get_temperature: ; Read temperature registers -; clrf i2c_temp -; movlw 0x0C ; Point to temperature registers +;lt2942_get_temperature: ; Read temperature registers +; clrf i2c_temp1 +; movlw 0x0C ; Point to temperature registers ; call I2C_TX_GAUGE ; call I2C_RX -; bsf SSP1CON2,ACKEN ; Master acknowlegde +; bsf SSP1CON2,ACKEN ; Master acknowledge ; rcall WaitMSSP ; movff SSP1BUF,xA+1 -; bsf SSP1CON2, RCEN ; Enable recieve mode +; bsf SSP1CON2, RCEN ; Enable receive mode ; rcall WaitMSSP ; movff SSP1BUF,xA+0 -; bsf SSP1CON2,PEN ; Stop condition +; bsf SSP1CON2,PEN ; Stop condition ; rcall WaitMSSP ; ;; banksel common -; ; xA:2 loaded with raw values -; movlw LOW .6000 -; movwf xB+0 -; movlw HIGH .6000 -; movwf xB+1 -; call mult16x16 ;xA*xB=xC +; ; xA:2 loaded with raw values +; movlw LOW .6000 +; movwf xB+0 +; movlw HIGH .6000 +; movwf xB+1 +; call mult16x16 ; xA*xB=xC ; -; ; devide xC (32bit)/65535 for result in 0.1K (16bit) -; movlw .16 -; movwf i2c_temp +; ; devide xC (32bit)/65535 for result in 0.1K (16bit) +; movlw .16 +; movwf i2c_temp1 ;lt2942_get_temperature2: -; bcf STATUS,C -; rrcf xC+3,F -; rrcf xC+2,F -; rrcf xC+1,F -; rrcf xC+0,F -; decfsz i2c_temp,F -; bra lt2942_get_temperature2 +; bcf STATUS,C +; rrcf xC+3,F +; rrcf xC+2,F +; rrcf xC+1,F +; rrcf xC+0,F +; decfsz i2c_temp1,F +; bra lt2942_get_temperature2 ; -; movff xC+1,sub_a+1 -; movff xC+0,sub_a+0 -; movlw LOW .2731 ; Kelvin to Celcius offset -; movwf sub_b+0 -; movlw HIGH .2731 ; Kelvin to Celcius offset -; movwf sub_b+1 -; call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) +; movff xC+1,sub_a+1 +; movff xC+0,sub_a+0 +; movlw LOW .2731 ; Kelvin to Celsius offset +; movwf sub_b+0 +; movlw HIGH .2731 ; Kelvin to Celsius offset +; movwf sub_b+1 +; call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) ; -; ; Update batttery_temperature in 0.1°C -; movff sub_c+1,battery_temperature+1 -; movff sub_c+0,battery_temperature+0 +; ; Update batttery_temperature in 0.1°C +; movff sub_c+1,battery_temperature+1 +; movff sub_c+0,battery_temperature+0 ; return global lt2942_get_accumulated_charge -lt2942_get_accumulated_charge: ; Read accumulated charge and compute percent - clrf i2c_temp - movlw 0x00 ; Point to status register +lt2942_get_accumulated_charge: ; Read accumulated charge and compute percent + clrf i2c_temp1 + movlw 0x00 ; Point to status register rcall I2C_TX_GAUGE rcall I2C_RX_GAUGE - bsf SSP1CON2,ACKEN ; Master acknowlegde + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP movff SSP1BUF,gauge_status_byte - bsf SSP1CON2, RCEN ; Enable recieve mode - rcall WaitMSSP ; Dummy read (Control byte) + bsf SSP1CON2, RCEN ; Enable receive mode + rcall WaitMSSP ; Dummy read (Control byte) movf SSP1BUF,W - bsf SSP1CON2,ACKEN ; Master acknowlegde + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP - - bsf SSP1CON2, RCEN ; Enable recieve mode + + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,sub_a+1 - bsf SSP1CON2,ACKEN ; Master acknowlegde + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP - - bsf SSP1CON2, RCEN ; Enable recieve mode + + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,sub_a+0 - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP - - movff gauge_status_byte,sub_b+0 ; copy into bank common - btfsc sub_b+0,0 ; =1: UVLO Event + + movff gauge_status_byte,sub_b+0 ; copy into bank common + btfsc sub_b+0,0 ; =1: UVLO Event rcall lt2942_init_again - movff sub_a+1,battery_acumulated_charge+1 ; Save raw value - movff sub_a+0,battery_acumulated_charge+0 ; Save raw value - - ; Compute batt_percent - ; (charge-battery_offset)/365 - movff battery_offset+0,sub_b+0 - movff battery_offset+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b (with signed values) + movff sub_a+1,battery_acumulated_charge+1 ; Save raw value + movff sub_a+0,battery_acumulated_charge+0 ; Save raw value + + ; Compute batt_percent + ; (charge-battery_offset)/365 + movff battery_offset+0,sub_b+0 + movff battery_offset+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b (with signed values) - clrf batt_percent ; Set to zero - btfsc neg_flag ; result negative? - bra lt2942_set_to_zero_percent ; Yes, keep LT2942 at zero percent and return + clrf batt_percent ; Set to zero + btfsc neg_flag ; result negative? + bra lt2942_set_to_zero_percent ; Yes, keep LT2942 at zero percent and return - ; > Zero, set batt_percent properly - movff sub_c+0,xA+0 - movff sub_c+1,xA+1 - movff battery_capacity+0,xB+0 - movff battery_capacity+1,xB+1 - call div16x16 ;xA/xB=xC with xA+0 as remainder, uses divB as temp variable - movff xC+0,batt_percent - return + ; > Zero, set batt_percent properly + movff sub_c+0,xA+0 + movff sub_c+1,xA+1 + movff battery_capacity+0,xB+0 + movff battery_capacity+1,xB+1 + call div16x16 ; xA/xB=xC with xA+0 as remainder, uses divB as temp variable + movff xC+0,batt_percent + return lt2942_set_to_zero_percent: - clrf i2c_temp - movlw 0x02 ; Point to accumulated charge registers + clrf i2c_temp1 + movlw 0x02 ; Point to accumulated charge registers rcall I2C_TX_GAUGE movff battery_offset+1,SSP1BUF rcall WaitMSSP @@ -989,222 +997,223 @@ movff battery_offset+0,SSP1BUF rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP; (and return) + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (and return) global lt2942_charge_done -lt2942_charge_done: ; Reset accumulating registers to 0xFFFF - clrf i2c_temp - movlw 0x02 ; Point to accumulated charge registers +lt2942_charge_done: ; Reset accumulating registers to 0xFFFF + clrf i2c_temp1 + movlw 0x02 ; Point to accumulated charge registers rcall I2C_TX_GAUGE - setf SSP1BUF ; Data Byte + setf SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - setf SSP1BUF ; Data Byte + setf SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP; (and return) + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (and return) -I2C_TX_GAUGE: ; Sends a byte to the LT2942 Gauge IC - movwf i2c_temp+1 ; Data byte - bsf SSP1CON2,SEN ; Start condition +I2C_TX_GAUGE: ; Sends a byte to the LT2942 Gauge IC + movwf i2c_temp2 ; Data byte + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw b'11001000' ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw b'11001000' ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - movf i2c_temp+1,W - bra I2C_TX ; (and return) - + movf i2c_temp2,W + bra I2C_TX ; (and return) + I2C_RX_GAUGE: - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw b'11001001' ; Address byte + Read bit - movwf SSP1BUF ; control byte + movlw b'11001001' ; Address byte + Read bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2, RCEN ; Enable recieve mode - bra WaitMSSP; (and return) - - + bsf SSP1CON2, RCEN ; Enable receive mode + bra WaitMSSP ; (and return) + + global I2C_probe_OSTC_rx I2C_probe_OSTC_rx: - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x50 ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP - btfss SSP1CON2,ACKSTAT ; ACK? - bsf ostc_rx_present ; ACK send. OSTC_RX present! - bsf SSP1CON2,PEN ; Stop condition + btfss SSP1CON2,ACKSTAT ; ACK? + bsf ostc_rx_present ; ACK send. OSTC_RX present! + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP - btfss ostc_rx_present ; Do we have the RX? - return ; No, Done. + btfss ostc_rx_present ; Do we have the RX? + return ; No, Done. WAITMS .1 - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x50 ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK movlw 0x1B - movwf SSP1BUF ; Data Byte (Get firmware) + movwf SSP1BUF ; Data Byte (Get firmware) rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP WAITMS .1 - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x51 ; Address byte + Read bit - movwf SSP1BUF ; control byte + movlw 0x51 ; Address byte + Read bit + movwf SSP1BUF ; control byte rcall WaitMSSP - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,rx_firmware+0 - bsf SSP1CON2,ACKEN ; Master acknowlegde + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP - + ; last byte in read from RX circuity always with a NACK! - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,rx_firmware+1 - bsf SSP1CON2,ACKDT - bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowledge rcall WaitMSSP - bcf SSP1CON2,ACKDT ; Reset ACKDT flag - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(and return) - + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(and return) + global I2C_get_tankdata I2C_get_tankdata: - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x50 ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - movlw 0x1E ; Read buffer2 (48 Bytes) + movlw 0x1E ; Read buffer2 (48 Bytes) movwf SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP WAITMS .1 ; read 48 bytes - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x51 ; Address byte + read bit - movwf SSP1BUF ; control byte + movlw 0x51 ; Address byte + read bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - movlw .47 ; 47 with ACK + 1 w/o ACK - movwf temp1 + movlw .47 ; 47 with ACK + 1 w/o ACK + movwf i2c_temp2 lfsr FSR2,rx_buffer+0 I2C_get_tankdata_loop_read: - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,POSTINC2 - bcf SSP1CON2,ACKDT - bsf SSP1CON2,ACKEN ; Master acknowlegde + bcf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP - decfsz temp1,F - bra I2C_get_tankdata_loop_read + decfsz i2c_temp2,F + bra I2C_get_tankdata_loop_read ; 1 w/o ACK - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,POSTINC2 - bsf SSP1CON2,ACKDT - bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowledge rcall WaitMSSP - bcf SSP1CON2,ACKDT ; Reset ACKDT flag - - bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(and return) - - + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(and return) + + global I2C_update_OSTC_rx -I2C_update_OSTC_rx: ; 992*64byte master loop - bcf i2c_error_flag ; clear error flag +I2C_update_OSTC_rx: ; 992*64byte master loop + bcf i2c_error_flag ; clear error flag ; write 64 bytes - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x50 ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - lfsr FSR2,buffer ; send buffer for verify + lfsr FSR2,buffer ; send buffer for verify movlw .64 - movwf temp1 -I2C_update_OSTC_loop: ; 64byte flash page loop - movff up,POSTINC2 ; store for verify + movwf i2c_temp2 +I2C_update_OSTC_loop: ; 64byte flash page loop + movff up,POSTINC2 ; store for verify movff up,SSP1BUF rcall WaitMSSP rcall I2C_WaitforACK call ext_flash_read_block ; Read one byte - movwf up ; prepare for transmit - decfsz temp1,F - bra I2C_update_OSTC_loop - bsf SSP1CON2,PEN ; Stop condition + movwf up ; prepare for transmit + decfsz i2c_temp2,F + bra I2C_update_OSTC_loop + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP WAITMS .1 ; read 64 bytes - bsf SSP1CON2,SEN ; Start condition + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x51 ; Address byte + read bit - movwf SSP1BUF ; control byte + movlw 0x51 ; Address byte + read bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - lfsr FSR2,buffer ; send buffer for verify - movlw .63 ; 63 with ACK + 1 w/o ACK - movwf temp1 + lfsr FSR2,buffer ; send buffer for verify + movlw .63 ; 63 with ACK + 1 w/o ACK + movwf i2c_temp2 I2C_update_OSTC_loop_read: - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movf SSP1BUF,W - cpfseq POSTINC2 ; compare readback with original - bsf i2c_error_flag ; Not equal, set flag - bcf SSP1CON2,ACKDT - bsf SSP1CON2,ACKEN ; Master acknowlegde + cpfseq POSTINC2 ; compare read-back with original + bsf i2c_error_flag ; Not equal, set flag + bcf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master acknowledge rcall WaitMSSP - decfsz temp1,F - bra I2C_update_OSTC_loop_read + decfsz i2c_temp2,F + bra I2C_update_OSTC_loop_read ; 1 w/o ACK - bsf SSP1CON2, RCEN ; Enable recieve mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movf SSP1BUF,W - cpfseq POSTINC2 ; compare readback with original - bsf i2c_error_flag ; Not equal, set flag - bsf SSP1CON2,ACKDT - bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + cpfseq POSTINC2 ; compare read-back with original + bsf i2c_error_flag ; Not equal, set flag + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowledge rcall WaitMSSP - bcf SSP1CON2,ACKDT ; Reset ACKDT flag - - bsf SSP1CON2,PEN ; Stop condition + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP WAITMS .1 - - bsf SSP1CON2,SEN ; Start condition + + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - movlw 0x50 ; Address byte + Write bit - movwf SSP1BUF ; control byte + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte rcall WaitMSSP rcall I2C_WaitforACK - movlw 0x1F ; Write command! - movwf SSP1BUF ; Data Byte + movlw 0x1F ; Write command! + movwf SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP - WAITMS .5 ; Required waiting time - + WAITMS .5 ; Required waiting time + btfss i2c_error_flag - retlw .0 ; All ok - retlw .255 ; an error occured - END \ No newline at end of file + retlw .0 ; All ok + retlw .255 ; an error occurred + + END diff -r f5de1ff88814 -r b455b31ce022 src/isr.asm --- a/src/isr.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/isr.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File isr.asm REFACTORED VERSION V2.92 +; File isr.asm REFACTORED VERSION V2.98 ; ; INTERUPT subroutines ; @@ -10,391 +10,392 @@ ; 2011-05-24 : [jDG] Cleanups from initial Matthias code. #include "hwos.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "ms5541.inc" #include "adc_lightsensor.inc" #include "eeprom_rs232.inc" ;============================================================================= - extern start + extern start -isr_high CODE 0x0008 ; High Priority Interrups - bra HighInt - nop - nop - nop - nop - nop - nop - bra HighInt +isr_high CODE 0x0008 ; High Priority Interrupts + bra HighInt + nop + nop + nop + nop + nop + nop + bra HighInt -isr_low CODE 0x00018 ; Low Priority Interrups +isr_low CODE 0x00018 ; Low Priority Interrupts ; *** low priority interrupts not used - retfie FAST ; Restores BSR, STATUS and WREG + retfie FAST ; Restores BSR, STATUS and WREG HighInt: - movff PRODL,isr_prod+0 - movff PRODH,isr_prod+1 + movff PRODL,isr_prod+0 + movff PRODH,isr_prod+1 -; Buttons - btfsc PIR1,TMR1IF ; Timer1 INT (Button hold-down Timer) - rcall timer1int - btfsc INTCON,INT0IF ; Buttons - rcall isr_switch_right - btfsc INTCON3,INT1IF ; Buttons - rcall isr_switch_left + ; Buttons + btfsc PIR1,TMR1IF ; Timer1 INT (Button hold-down Timer) + rcall timer1int + btfsc INTCON,INT0IF ; Buttons + rcall isr_switch_right + btfsc INTCON3,INT1IF ; Buttons + rcall isr_switch_left -; IR/S8-Linktimer1int - btfsc PIR3,RC2IF ; UART2 - rcall isr_uart2 ; IR/S8-Link - btfsc PIR2,TMR3IF ; Timer 3 - rcall isr_timer3 ; IR-Link Timeout + ; IR/S8 link timer int + btfsc PIR3,RC2IF ; UART2 + rcall isr_uart2 ; IR/S8-Link + btfsc PIR2,TMR3IF ; Timer 3 + rcall isr_timer3 ; IR-Link Timeout -; Pressure sensor and others - btfsc PIR5,TMR7IF ; Timer 7 - rcall isr_tmr7 ; Every 62,5ms + ; Pressure sensor and others + btfsc PIR5,TMR7IF ; Timer 7 + rcall isr_tmr7 ; Every 62,5ms -; RTCC - btfsc PIR3,RTCCIF ; Real-time-clock interrupt - rcall isr_rtcc ; May return in bank common! + ; RTCC + btfsc PIR3,RTCCIF ; Real-time-clock interrupt + rcall isr_rtcc ; May return in bank common! - movff isr_prod+1,PRODH - movff isr_prod+0,PRODL - retfie FAST ; Restores BSR, STATUS and WREG + movff isr_prod+1,PRODH + movff isr_prod+0,PRODL + retfie FAST ; Restores BSR, STATUS and WREG isr_set_speed_to_normal: - ; Set Speed to normal - movlw b'01110010' - movwf OSCCON ; 16MHz INTOSC - movlw b'00000000' - movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) - movlw b'00001101' ; 1:2 Postscaler, 1:4 Prescaler, Timer 2 start -> 1960Hz (no-flicker) - movwf T2CON - btfss OSCCON,HFIOFS - bra $-2 ; Wait until clock is stable - return + ; Set speed to normal + movlw b'01110010' + movwf OSCCON ; 16MHz INTOSC + movlw b'00000000' + movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movlw b'00001101' ; 1:2 Postscaler, 1:4 Prescaler, Timer 2 start -> 1960Hz (no-flicker) + movwf T2CON + btfss OSCCON,HFIOFS + bra $-2 ; Wait until clock is stable + return -isr_dimm_tft: ; Adjust until max_CCPR1L=CCPR1L ! - banksel common - btfsc tft_is_dimming ; Ignore while dimming - return - banksel isr_backup - movf max_CCPR1L,W - cpfsgt CCPR1L ; CCPR1L>max_CCPR1L? - bra isr_dimm_tft2 ; No, dimm up +isr_dimm_tft: ; Adjust until max_CCPR1L=CCPR1L ! + banksel common + btfsc tft_is_dimming ; Ignore while dimming + return + banksel isr_backup + movf max_CCPR1L,W + cpfsgt CCPR1L ; CCPR1L>max_CCPR1L? + bra isr_dimm_tft2 ; No, dimm up ; dimm down - decf CCPR1L,F ; -1 - return + decf CCPR1L,F ; -1 + return isr_dimm_tft2: - movf max_CCPR1L,W - sublw ambient_light_min_eco - cpfsgt CCPR1L ; CCPR1L>max_CCPR1L-ambient_light_min_eco? - bra isr_dimm_tft3 ; No, dimm up slow - ; dimm up faster - movlw .10 - addwf CCPR1L,F + movf max_CCPR1L,W + sublw ambient_light_min_eco + cpfsgt CCPR1L ; CCPR1L>max_CCPR1L-ambient_light_min_eco? + bra isr_dimm_tft3 ; No, dimm up slow + ; dimm up faster + movlw .10 + addwf CCPR1L,F isr_dimm_tft3: - incf CCPR1L,F ; +1 - return - nop - nop ; block flash here + incf CCPR1L,F ; +1 + return + nop + nop ; block flash here -isr_restore CODE 0x00080 ; Restore first flash page from EEPROM +isr_restore CODE 0x00080 ; Restore first flash page from EEPROM restore_flash_0x00080: - goto restore_flash + goto restore_flash -isr_routines; CODE +isr_routines ; CODE ;============================================================================= -isr_uart2: ; IR/S8-Link - banksel RCREG2 - movf RCREG2,W - bcf RCSTA2,CREN ; Clear receiver status - bsf RCSTA2,CREN - banksel isr_backup - incf ir_s8_counter,F ; Increase counter - movff ir_s8_counter,isr1_temp ; Copy - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.0 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.1 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.2 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.3 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.4 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.5 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.6 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.7 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.8 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.9 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.10 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.11 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.12 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.13 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.14 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.15 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.16 - dcfsnz isr1_temp,F - movwf ir_s8_buffer+.17 +isr_uart2: ; IR/S8-Link + banksel RCREG2 + movf RCREG2,W + bcf RCSTA2,CREN ; Clear receiver status + bsf RCSTA2,CREN + banksel isr_backup + incf ir_s8_counter,F ; Increase counter + movff ir_s8_counter,isr1_temp ; Copy + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.0 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.1 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.2 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.3 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.4 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.5 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.6 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.7 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.8 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.9 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.10 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.11 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.12 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.13 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.14 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.15 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.16 + dcfsnz isr1_temp,F + movwf ir_s8_buffer+.17 - clrf TMR3L ; Preload timer - movlw .253 - movwf TMR3H - bsf T3CON,TMR3ON ; (Re)Start Timeout counter - return + clrf TMR3L ; Preload timer + movlw .253 + movwf TMR3H + bsf T3CON,TMR3ON ; (Re)Start Timeout counter + return -isr_timer3: ; IR/S8-Link Timeout - bcf T3CON,TMR3ON ; Stop Timer3 - banksel isr_backup ; Select Bank0 for ISR data. - movlw .15 - cpfseq ir_s8_counter ; Got exact 15bytes? - bra isr_timer3_1 ; No, test for 16bytes - bra isr_timer3_ir ; Got 15 bytes, compute local checksum +isr_timer3: ; IR/S8-Link Timeout + bcf T3CON,TMR3ON ; Stop Timer3 + banksel isr_backup ; Select Bank0 for ISR data. + movlw .15 + cpfseq ir_s8_counter ; Got exact 15bytes? + bra isr_timer3_1 ; No, test for 16bytes + bra isr_timer3_ir ; Got 15 bytes, compute local checksum isr_timer3_1: - movlw .16 - cpfseq ir_s8_counter ; Got exact 16bytes? - bra isr_timer3_2 ; No, test for 17bytes - tstfsz ir_s8_buffer+.15 ; Last byte=0x00 - bra isr_timer3_exit ; No, exit - bra isr_timer3_ir ; Got 16 bytes, compute local checksum + movlw .16 + cpfseq ir_s8_counter ; Got exact 16bytes? + bra isr_timer3_2 ; No, test for 17bytes + tstfsz ir_s8_buffer+.15 ; Last byte=0x00 + bra isr_timer3_exit ; No, exit + bra isr_timer3_ir ; Got 16 bytes, compute local checksum isr_timer3_2: - movlw .17 - cpfseq ir_s8_counter ; Got exact 17bytes? - bra isr_timer3_exit ; No, exit - bra isr_timer3_s8 ; S8 data + movlw .17 + cpfseq ir_s8_counter ; Got exact 17bytes? + bra isr_timer3_exit ; No, exit + bra isr_timer3_s8 ; S8 data -isr_timer3_ir: ; IR input - movff ir_s8_buffer+.0,PRODL - clrf PRODH - movf ir_s8_buffer+.1,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.2,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.3,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.4,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.5,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.6,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.7,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.8,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.9,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.10,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.11,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.12,W - rcall isr_timer3_checksum +isr_timer3_ir: ; IR input + movff ir_s8_buffer+.0,PRODL + clrf PRODH + movf ir_s8_buffer+.1,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.2,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.3,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.4,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.5,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.6,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.7,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.8,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.9,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.10,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.11,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.12,W + rcall isr_timer3_checksum - ; Compare checksum - movf ir_s8_buffer+.13,W - cpfseq PRODL ; Checksum ok? - bra isr_timer3_exit ; No, exit - movf ir_s8_buffer+.14,W - cpfseq PRODH ; Checksum ok? - bra isr_timer3_exit ; No, exit + ; Compare checksum + movf ir_s8_buffer+.13,W + cpfseq PRODL ; Checksum ok? + bra isr_timer3_exit ; No, exit + movf ir_s8_buffer+.14,W + cpfseq PRODH ; Checksum ok? + bra isr_timer3_exit ; No, exit - ; Checksum OK, copy results - movff ir_s8_buffer+.1,hud_status_byte - movff ir_s8_buffer+.2,o2_mv_sensor1+0 - movff ir_s8_buffer+.3,o2_mv_sensor1+1 - movff ir_s8_buffer+.4,o2_mv_sensor2+0 - movff ir_s8_buffer+.5,o2_mv_sensor2+1 - movff ir_s8_buffer+.6,o2_mv_sensor3+0 - movff ir_s8_buffer+.7,o2_mv_sensor3+1 - movff ir_s8_buffer+.8,o2_ppo2_sensor1 - movff ir_s8_buffer+.9,o2_ppo2_sensor2 - movff ir_s8_buffer+.10,o2_ppo2_sensor3 - movff ir_s8_buffer+.11,hud_battery_mv+0 - movff ir_s8_buffer+.12,hud_battery_mv+1 + ; Checksum OK, copy results + movff ir_s8_buffer+.1,hud_status_byte + movff ir_s8_buffer+.2,o2_mv_sensor1+0 + movff ir_s8_buffer+.3,o2_mv_sensor1+1 + movff ir_s8_buffer+.4,o2_mv_sensor2+0 + movff ir_s8_buffer+.5,o2_mv_sensor2+1 + movff ir_s8_buffer+.6,o2_mv_sensor3+0 + movff ir_s8_buffer+.7,o2_mv_sensor3+1 + movff ir_s8_buffer+.8,o2_ppo2_sensor1 + movff ir_s8_buffer+.9,o2_ppo2_sensor2 + movff ir_s8_buffer+.10,o2_ppo2_sensor3 + movff ir_s8_buffer+.11,hud_battery_mv+0 + movff ir_s8_buffer+.12,hud_battery_mv+1 - movlw ir_timeout_value ; multiples of 62,5ms - movwf ir_S8_timeout ; Reload timeout + movlw ir_timeout_value ; multiples of 62,5ms + movwf ir_s8_timeout ; Reload timeout - banksel hud_status_byte - bsf hud_connection_ok ; Set manually for hwHUD w/o the HUD module... - banksel isr_backup ; Select Bank0 for ISR data. - + banksel hud_status_byte + bsf hud_connection_ok ; Set manually for hwHUD w/o the HUD module... + banksel isr_backup ; Select Bank0 for ISR data. + isr_timer3_exit: - clrf ir_s8_counter ; Clear pointer - bcf PIR2,TMR3IF ; Clear flag - return + clrf ir_s8_counter ; Clear pointer + bcf PIR2,TMR3IF ; Clear flag + return isr_timer3_checksum: - addwf PRODL,F - movlw .0 - addwfc PRODH,F - return + addwf PRODL,F + movlw .0 + addwfc PRODH,F + return -isr_timer3_s8: ; S8 input - movff ir_s8_buffer+.0,PRODL - clrf PRODH - movf ir_s8_buffer+.1,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.2,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.3,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.4,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.5,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.6,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.7,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.8,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.9,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.10,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.11,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.12,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.13,W - rcall isr_timer3_checksum - movf ir_s8_buffer+.14,W - rcall isr_timer3_checksum +isr_timer3_s8: ; S8 input + movff ir_s8_buffer+.0,PRODL + clrf PRODH + movf ir_s8_buffer+.1,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.2,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.3,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.4,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.5,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.6,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.7,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.8,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.9,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.10,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.11,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.12,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.13,W + rcall isr_timer3_checksum + movf ir_s8_buffer+.14,W + rcall isr_timer3_checksum - ; Compare checksum - movf ir_s8_buffer+.15,W - cpfseq PRODL ; Checksum ok? - bra isr_timer3_exit ; No, exit - movf ir_s8_buffer+.16,W - cpfseq PRODH ; Checksum ok? - bra isr_timer3_exit ; No, exit + ; Compare checksum + movf ir_s8_buffer+.15,W + cpfseq PRODL ; Checksum ok? + bra isr_timer3_exit ; No, exit + movf ir_s8_buffer+.16,W + cpfseq PRODH ; Checksum ok? + bra isr_timer3_exit ; No, exit - ; Checksum OK, copy results - movff ir_s8_buffer+.3,hud_status_byte - movff ir_s8_buffer+.13,hud_battery_mv+0 - movff ir_s8_buffer+.14,hud_battery_mv+1 + ; Checksum OK, copy results + movff ir_s8_buffer+.3,hud_status_byte + movff ir_s8_buffer+.13,hud_battery_mv+0 + movff ir_s8_buffer+.14,hud_battery_mv+1 - banksel common - btfsc new_s8_data_available ; =1: Old data already processed? - bra isr_timer3_skip ; No, skip copying new results + banksel common + btfsc new_s8_data_available ; =1: Old data already processed? + bra isr_timer3_skip ; No, skip copying new results - movff ir_s8_buffer+.6,s8_rawdata_sensor1+2 - movff ir_s8_buffer+.5,s8_rawdata_sensor1+1 - movff ir_s8_buffer+.4,s8_rawdata_sensor1+0 - movff ir_s8_buffer+.9,s8_rawdata_sensor2+2 - movff ir_s8_buffer+.8,s8_rawdata_sensor2+1 - movff ir_s8_buffer+.7,s8_rawdata_sensor2+0 - movff ir_s8_buffer+.12,s8_rawdata_sensor3+2 - movff ir_s8_buffer+.11,s8_rawdata_sensor3+1 - movff ir_s8_buffer+.10,s8_rawdata_sensor3+0 - banksel common - bsf new_s8_data_available ; set flag + movff ir_s8_buffer+.6,s8_rawdata_sensor1+2 + movff ir_s8_buffer+.5,s8_rawdata_sensor1+1 + movff ir_s8_buffer+.4,s8_rawdata_sensor1+0 + movff ir_s8_buffer+.9,s8_rawdata_sensor2+2 + movff ir_s8_buffer+.8,s8_rawdata_sensor2+1 + movff ir_s8_buffer+.7,s8_rawdata_sensor2+0 + movff ir_s8_buffer+.12,s8_rawdata_sensor3+2 + movff ir_s8_buffer+.11,s8_rawdata_sensor3+1 + movff ir_s8_buffer+.10,s8_rawdata_sensor3+0 + banksel common + bsf new_s8_data_available ; set flag isr_timer3_skip: - banksel ir_S8_timeout - movlw ir_timeout_value ; multiples of 62,5ms - movwf ir_S8_timeout ; Reload timeout - bra isr_timer3_exit ; Exit + banksel ir_s8_timeout + movlw ir_timeout_value ; multiples of 62,5ms + movwf ir_s8_timeout ; Reload timeout + bra isr_timer3_exit ; Exit ;============================================================================= -isr_tmr7: ; each 62,5ms - bcf PIR5,TMR7IF ; clear flag - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. +isr_tmr7: ; each 62,5ms + bcf PIR5,TMR7IF ; clear flag + banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. movlw .248 - movwf TMR7H ; -> Rollover after 2048 cycles -> 62,5ms + movwf TMR7H ; -> Rollover after 2048 cycles -> 62,5ms - banksel common + banksel common call get_analog_switches ; Get analog readings btfss INTCON3,INT1IE - bra isr_tmr7_a + bra isr_tmr7_a btfsc analog_sw2_pressed rcall isr_switch_left isr_tmr7_a: - banksel common + banksel common btfss INTCON,INT0IE - bra isr_tmr7_b + bra isr_tmr7_b btfsc analog_sw1_pressed rcall isr_switch_right isr_tmr7_b: - banksel common - btfss no_sensor_int ; No sensor interrupt (because it's addressed during sleep) - bra isr_tmr7_c ; No, continue - banksel isr_backup ; Back to Bank0 ISR data - return + banksel common + btfss no_sensor_int ; No sensor interrupt (because it's addressed during sleep) + bra isr_tmr7_c ; No, continue + banksel isr_backup ; Back to Bank0 ISR data + return isr_tmr7_c: banksel isr_backup movf max_CCPR1L,W ; Dimm value - cpfseq CCPR1L ; = current PWM value? + cpfseq CCPR1L ; = current PWM value? rcall isr_dimm_tft ; No, adjust until max_CCPR1L=CCPR1L ! - - banksel isr_backup - decfsz ir_S8_timeout,F ; IR Data still valid? - bra isr_tmr7_2 ; Yes, continue - ; timeout, clear IR-Data + + banksel isr_backup + decfsz ir_s8_timeout,F ; IR Data still valid? + bra isr_tmr7_2 ; Yes, continue + ; timeout, clear IR-Data - movlw ir_timeout_value ; multiples of 62,5ms - movwf ir_S8_timeout ; Reload timeout + movlw ir_timeout_value ; multiples of 62,5ms + movwf ir_s8_timeout ; Reload timeout - banksel common - btfss analog_o2_input - bra isr_tmr7_1a ; Always with normal ostc3 hardware - btfss s8_digital - bra isr_tmr7_2 ; only when digital + banksel common + btfss analog_o2_input + bra isr_tmr7_1a ; Always with normal ostc3 hardware + btfss s8_digital + bra isr_tmr7_2 ; only when digital isr_tmr7_1a: - clrf o2_mv_sensor1+0 ; S8/IR timeout clears all analog input readings to zero -> Fallback will be triggered when sensor mode was used - clrf o2_mv_sensor1+1 - clrf o2_mv_sensor2+0 - clrf o2_mv_sensor2+1 - clrf o2_mv_sensor3+0 - clrf o2_mv_sensor3+1 - banksel hud_battery_mv - clrf hud_battery_mv+0 - clrf hud_battery_mv+1 - banksel hud_status_byte - clrf hud_status_byte - clrf o2_ppo2_sensor1 ; For IR/S8 HUD - clrf o2_ppo2_sensor2 - clrf o2_ppo2_sensor3 + clrf o2_mv_sensor1+0 ; S8/IR timeout clears all analog input readings to zero -> Fallback will be triggered when sensor mode was used + clrf o2_mv_sensor1+1 + clrf o2_mv_sensor2+0 + clrf o2_mv_sensor2+1 + clrf o2_mv_sensor3+0 + clrf o2_mv_sensor3+1 + banksel hud_battery_mv + clrf hud_battery_mv+0 + clrf hud_battery_mv+1 + banksel hud_status_byte + clrf hud_status_byte + clrf o2_ppo2_sensor1 ; for IR/S8 UD + clrf o2_ppo2_sensor2 + clrf o2_ppo2_sensor3 + banksel common - bsf new_s8_data_available ; set flag to update in surface mode - + bsf new_s8_data_available ; set flag to update in surface mode + isr_tmr7_2: - banksel common - btfss no_sensor_int ; No sensor interrupt (because it's addressed during sleep) - bra isr_sensor_state2 ; No, continue - banksel isr_backup ; Back to Bank0 ISR data - return + banksel common + btfss no_sensor_int ; No sensor interrupt (because it's addressed during sleep) + bra isr_sensor_state2 ; No, continue + banksel isr_backup ; Back to Bank0 ISR data + return isr_sensor_state2: - banksel common - movff sensor_state_counter,WREG - btfss WREG,0 ; every 1/4 second - bsf quarter_second_update ; Set flag - banksel isr_backup ; Back to Bank0 ISR data - movlw d'2' - cpfseq speed_setting ; Set to normal in case it's not already in normal speed mode - rcall isr_set_speed_to_normal - - incf sensor_state_counter,F ; counts to eight for state maschine + banksel common + movff sensor_state_counter,WREG + btfss WREG,0 ; every 1/4 second + bsf quarter_second_update ; Set flag + banksel isr_backup ; Back to Bank0 ISR data + movlw d'2' + cpfseq speed_setting ; Set to normal in case it's not already in normal speed mode + rcall isr_set_speed_to_normal + + incf sensor_state_counter,F ; counts to eight for state machine ; State 1: Clear flags and average registers, get temperature (51us) and start pressure integration (73,5us) ; State 2: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us) @@ -404,590 +405,548 @@ ; State 6: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us) ; State 7: Get temperature (51us) and start pressure integration (73,5us) ; State 8: Get pressure (51us), start temperature integration (73,5us), calculate temperature compensated pressure (233us) and build average for half-second update of tempperature and pressure - - movff sensor_state_counter,WREG ; WREG used as temp here... - dcfsnz WREG,F - bra sensor_int_state1_plus_restart ; Do State 1 - dcfsnz WREG,F - bra sensor_int_state2 ; Do State 2 - dcfsnz WREG,F - bra sensor_int_state1 ; Do State 3 - dcfsnz WREG,F - bra sensor_int_state2 ; Do State 4 - dcfsnz WREG,F - bra sensor_int_state1 ; Do State 5 - dcfsnz WREG,F - bra sensor_int_state2 ; Do State 6 - dcfsnz WREG,F - bra sensor_int_state1 ; Do State 7 -; bra sensor_int2_plus_average ; Do State 8 + + movff sensor_state_counter,WREG ; WREG used as temp here... + dcfsnz WREG,F + bra sensor_int_state1_plus_restart ; Do State 1 + dcfsnz WREG,F + bra sensor_int_state2 ; Do State 2 + dcfsnz WREG,F + bra sensor_int_state1 ; Do State 3 + dcfsnz WREG,F + bra sensor_int_state2 ; Do State 4 + dcfsnz WREG,F + bra sensor_int_state1 ; Do State 5 + dcfsnz WREG,F + bra sensor_int_state2 ; Do State 6 + dcfsnz WREG,F + bra sensor_int_state1 ; Do State 7 +; bra sensor_int2_plus_average ; Do State 8 ;sensor_int2_plus_average: - ; First, do state2: - call get_pressure_value ; State2: Get pressure (51us) - call get_temperature_start ; and start temperature integration (73,5us) - call calculate_compensation ; calculate temperature compensated pressure (27us) + ; First, do state2: + call get_pressure_value ; State2: Get pressure (51us) + call get_temperature_start ; and start temperature integration (73,5us) + call calculate_compensation ; calculate temperature compensated pressure (27us) ; Build average - bcf STATUS,C ; clear carry bit. - rrcf amb_pressure_avg+1 ; amb_pressure sum / 2 - rrcf amb_pressure_avg+0 - bcf STATUS,C ; clear carry bit, twice. - rrcf amb_pressure_avg+1 ; amb_pressure sum / 4 - rrcf amb_pressure_avg+0 + bcf STATUS,C ; clear carry bit. + rrcf amb_pressure_avg+1 ; amb_pressure sum / 2 + rrcf amb_pressure_avg+0 + bcf STATUS,C ; clear carry bit, twice. + rrcf amb_pressure_avg+1 ; amb_pressure sum / 4 + rrcf amb_pressure_avg+0 - movff amb_pressure_avg+1,amb_pressure+1 ; copy into actual register - movff amb_pressure_avg+0,amb_pressure+0 + movff amb_pressure_avg+1,amb_pressure+1 ; copy into actual register + movff amb_pressure_avg+0,amb_pressure+0 - bcf STATUS,C - btfsc temperature_avg+1,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf temperature_avg+1 ; Signed temperature /2 - rrcf temperature_avg+0 - bcf STATUS,C - btfsc temperature_avg+1,7 ; Copy sign bit to carry - bsf STATUS,C - rrcf temperature_avg+1 ; Signed temperature /4 - rrcf temperature_avg+0 + bcf STATUS,C + btfsc temperature_avg+1,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf temperature_avg+1 ; Signed temperature /2 + rrcf temperature_avg+0 + bcf STATUS,C + btfsc temperature_avg+1,7 ; Copy sign bit to carry + bsf STATUS,C + rrcf temperature_avg+1 ; Signed temperature /4 + rrcf temperature_avg+0 - movff temperature_avg+1,temperature+1 ; copy into actual register - movff temperature_avg+0,temperature+0 + movff temperature_avg+1,temperature+1 ; copy into actual register + movff temperature_avg+0,temperature+0 - banksel common ; flag1 is in Bank1 - bcf temp_changed ; Clear flag for temperature update - bcf pressure_refresh ; Clear flag for pressure update - banksel isr_backup ; Back to Bank0 ISR data + banksel common ; flag1 is in Bank1 + bcf temp_changed ; Clear flag for temperature update + bcf pressure_refresh ; Clear flag for pressure update + banksel isr_backup ; Back to Bank0 ISR data - ; Temp changed? - movf temperature+0,W - cpfseq last_temperature+0 - bra isr_sensor_state2_2 ; Yes - movf temperature+1,W - cpfseq last_temperature+1 - bra isr_sensor_state2_2 ; Yes + ; Temp changed? + movf temperature+0,W + cpfseq last_temperature+0 + bra isr_sensor_state2_2 ; Yes + movf temperature+1,W + cpfseq last_temperature+1 + bra isr_sensor_state2_2 ; Yes - bra isr_sensor_state2_3 ; no change + bra isr_sensor_state2_3 ; no change isr_sensor_state2_2: - banksel common ; flag1 is in Bank1 - bsf temp_changed ; Yes - banksel isr_backup ; Back to Bank0 ISR data + banksel common ; flag1 is in Bank1 + bsf temp_changed ; Yes + banksel isr_backup ; Back to Bank0 ISR data isr_sensor_state2_3: - movff temperature+0,last_temperature+0 ; Copy for compare - movff temperature+1,last_temperature+1 + movff temperature+0,last_temperature+0 ; Copy for compare + movff temperature+1,last_temperature+1 - movf amb_pressure+0,W - cpfseq last_pressure+0 - bra isr_sensor_state2_4 ; Yes - movf amb_pressure+1,W - cpfseq last_pressure+1 - bra isr_sensor_state2_4 ; Yes + movf amb_pressure+0,W + cpfseq last_pressure+0 + bra isr_sensor_state2_4 ; Yes + movf amb_pressure+1,W + cpfseq last_pressure+1 + bra isr_sensor_state2_4 ; Yes - bra isr_sensor_state2_5 ; No change + bra isr_sensor_state2_5 ; No change isr_sensor_state2_4: - banksel common ; flag1 is in Bank1 - bsf pressure_refresh ; Yes - banksel isr_backup ; Back to Bank0 ISR data + banksel common ; flag1 is in Bank1 + bsf pressure_refresh ; Yes + banksel isr_backup ; Back to Bank0 ISR data isr_sensor_state2_5: - movff amb_pressure+0,last_pressure+0 ; Copy for compare - movff amb_pressure+1,last_pressure+1 + movff amb_pressure+0,last_pressure+0 ; Copy for compare + movff amb_pressure+1,last_pressure+1 - clrf sensor_state_counter ; Then reset State counter - banksel common ; flag2 is in Bank1 - btfss simulatormode_active ; are we in simulator mode? - bra comp_air_pressure ; no - ; Always set pressure_refresh flag in simulator mode - bsf pressure_refresh ; Yes - banksel isr_backup ; Back to Bank0 ISR data - movlw LOW d'1000' ; yes, so simulate 1000mbar surface pressure - movwf last_surfpressure+0 - movlw HIGH d'1000' - movwf last_surfpressure+1 + clrf sensor_state_counter ; Then reset State counter + banksel common ; flag2 is in Bank1 + btfss simulatormode_active ; are we in simulator mode? + bra comp_air_pressure ; no + ; Always set pressure_refresh flag in simulator mode + bsf pressure_refresh ; Yes + banksel isr_backup ; Back to Bank0 ISR data + movlw LOW d'1000' ; yes, so simulate 1000mbar surface pressure + movwf last_surfpressure+0 + movlw HIGH d'1000' + movwf last_surfpressure+1 comp_air_pressure: - banksel isr_backup ; Back to Bank0 ISR data - movf last_surfpressure+0,W ; compensate airpressure - subwf amb_pressure+0,W - movwf rel_pressure+0 ; rel_pressure stores depth! + banksel isr_backup ; Back to Bank0 ISR data + movf last_surfpressure+0,W ; compensate air pressure + subwf amb_pressure+0,W + movwf rel_pressure+0 ; rel_pressure stores depth! - movf last_surfpressure+1,W - subwfb amb_pressure+1,W - movwf rel_pressure+1 - btfss STATUS,N ; result is below zero? - bra sensor_int_state_exit - clrf rel_pressure+0 ; Yes, do not display negative depths - clrf rel_pressure+1 ; e.g. when surface air pressure dropped during the dive - bra sensor_int_state_exit + movf last_surfpressure+1,W + subwfb amb_pressure+1,W + movwf rel_pressure+1 + btfss STATUS,N ; result is below zero? + bra sensor_int_state_exit + clrf rel_pressure+0 ; Yes, do not display negative depths + clrf rel_pressure+1 ; e.g. when surface air pressure dropped during the dive + bra sensor_int_state_exit sensor_int_state1_plus_restart: - clrf amb_pressure_avg+0 ; pressure average registers - clrf amb_pressure_avg+1 - clrf temperature_avg+0 - clrf temperature_avg+1 + clrf amb_pressure_avg+0 ; pressure average registers + clrf amb_pressure_avg+1 + clrf temperature_avg+0 + clrf temperature_avg+1 sensor_int_state1: - call get_temperature_value ; State 1: Get temperature - call get_pressure_start ; and start pressure integration. - bra sensor_int_state_exit + call get_temperature_value ; State 1: Get temperature + call get_pressure_start ; and start pressure integration. + bra sensor_int_state_exit sensor_int_state2: - call get_pressure_value ; State2: Get pressure (51us) - call get_temperature_start ; and start temperature integration (73,5us) - call calculate_compensation ; calculate temperature compensated pressure (233us) -; bra sensor_int_state_exit + call get_pressure_value ; State2: Get pressure (51us) + call get_temperature_start ; and start temperature integration (73,5us) + call calculate_compensation ; calculate temperature compensated pressure (233us) + ;bra sensor_int_state_exit + sensor_int_state_exit: - rcall isr_restore_clock ; Restore clock - return + rcall isr_restore_clock ; Restore clock + return + ;============================================================================= - - isr_rtcc: ; each second - bcf PIR3,RTCCIF ; clear flag - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. - bsf RTCCFG,RTCPTR1 - bsf RTCCFG,RTCPTR0 ; year - movff RTCVALL,year ; format is BCD! - movff RTCVALH,day ; dummy read - movff RTCVALL,day ; format is BCD! - movff RTCVALH,month ; format is BCD! - movff RTCVALL,hours ; format is BCD! - movff RTCVALH,secs ; format is BCD! - movff RTCVALL,secs ; format is BCD! - movff RTCVALH,mins ; format is BCD! - banksel isr_backup ; Back to Bank0 ISR data - - ; Convert BCD to DEC and set registers - movff mins, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,mins - movff secs, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,secs - movff hours, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,hours - movff month, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,month - movff day, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,day - movff year, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG - movff WREG,year + bcf PIR3,RTCCIF ; clear flag + banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. + bsf RTCCFG,RTCPTR1 + bsf RTCCFG,RTCPTR0 ; year + movff RTCVALL,year ; format is BCD! + movff RTCVALH,day ; dummy read + movff RTCVALL,day ; format is BCD! + movff RTCVALH,month ; format is BCD! + movff RTCVALL,hours ; format is BCD! + movff RTCVALH,secs ; format is BCD! + movff RTCVALL,secs ; format is BCD! + movff RTCVALH,mins ; format is BCD! + banksel isr_backup ; Back to Bank0 ISR data + + ; Convert BCD to DEC and set registers + movff mins, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,mins + movff secs, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,secs + movff hours, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,hours + movff month, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,month + movff day, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,day + movff year, isr1_temp + rcall isr_rtcc_convert ; Converts to dec with result in WREG + movff WREG,year ; Place once/second tasks for ISR here (Be sure of the right bank!) - banksel common ; flag1 is in Bank1 - btfss sleepmode ; in Sleepmode? - call get_ambient_level ; No, get ambient light level and set max_CCPR1L + banksel common ; flag1 is in Bank1 + btfss sleepmode ; in Sleepmode? + call get_ambient_level ; No, get ambient light level and set max_CCPR1L - rcall isr_battery_gauge ; Add amount of battery consumption to battery_gauge:6 + rcall isr_battery_gauge ; Add amount of battery consumption to battery_gauge:6 - ; update uptime - banksel uptime+0 - incf uptime+0,F - movlw .0 - addwfc uptime+1,F - addwfc uptime+2,F - addwfc uptime+3,F - - banksel common ; flag1 is in Bank1 - bsf onesecupdate ; A new second has begun - btfsc divemode ; in divemode? - rcall isr_divemode_1sec ; Yes, do some divemode stuff in bank common + ; update uptime + banksel uptime+0 + incf uptime+0,F + movlw .0 + addwfc uptime+1,F + addwfc uptime+2,F + addwfc uptime+3,F + + banksel common ; flag1 is in Bank1 + bsf onesecupdate ; A new second has begun + btfsc divemode ; in divemode? + rcall isr_divemode_1sec ; Yes, do some divemode stuff in bank common - btfss divemode ; in divemode? - rcall isr_update_lastdive_time ; No, update the lastdive timer + btfss divemode ; in divemode? + rcall isr_update_lastdive_time ; No, update the lastdive timer - tstfsz secs ; Secs == 0 ? - return ; No, Done. + tstfsz secs ; secs == 0 ? + return ; No, Done. - bsf oneminupdate ; A new minute has begun + bsf oneminupdate ; A new minute has begun - btfss divemode ; In Divemode? - rcall check_nofly_desat_time ; No, so reduce NoFly and Desat and increase interval + btfss divemode ; In Divemode? + rcall check_nofly_desat_time ; No, so increase interval - ; Check if a new hour has just begun - tstfsz mins ; mins=0? - bra isr_rtcc2 ; No - bsf onehourupdate ; Yes, set flag - + ; Check if a new hour has just begun + tstfsz mins ; mins == 0? + bra isr_rtcc2 ; No + bsf onehourupdate ; Yes, set flag + isr_rtcc2: - banksel isr_backup ; Back to Bank0 ISR data - return ; Done. + banksel isr_backup ; Back to Bank0 ISR data + return ; Done. -isr_update_lastdive_time: - ; update uptime - banksel lastdive_time+0 - incf lastdive_time+0,F - movlw .0 - addwfc lastdive_time+1,F - addwfc lastdive_time+2,F - addwfc lastdive_time+3,F - banksel common - return - -isr_battery_gauge: - banksel isr_backup ; Bank0 ISR data - movlw current_sleepmode ; 100µA/3600 -> nAs (Sleepmode current) - movwf isr1_temp ; Store value (low byte) - clrf isr2_temp ; High byte - - banksel common ; flag1 is in Bank1 - btfss sleepmode ; in Sleepmode? - rcall isr_battery_gauge2 ; No, compute current consumtion value into isr1_temp and isr2_temp +isr_update_lastdive_time: ; called every second when not in divemode + ; update uptime + banksel lastdive_time+0 + incf lastdive_time+0,F + movlw .0 + addwfc lastdive_time+1,F + addwfc lastdive_time+2,F + addwfc lastdive_time+3,F + banksel common + return + +isr_battery_gauge: + banksel isr_backup ; Bank0 ISR data + movlw current_sleepmode ; 100µA/3600 -> nAs (Sleepmode current) + movwf isr1_temp ; Store value (low byte) + clrf isr2_temp ; High byte - banksel isr_backup ; Bank0 ISR data - movf isr1_temp,W ; 48Bit add of isr1_temp and isr2_temp into battery_gauge:6 - addwf battery_gauge+0,F - movf isr2_temp,W - addwfc battery_gauge+1,F - movlw .0 - addwfc battery_gauge+2,F - addwfc battery_gauge+3,F - addwfc battery_gauge+4,F - addwfc battery_gauge+5,F - return - + banksel common ; flag1 is in Bank1 + btfss sleepmode ; in Sleepmode? + rcall isr_battery_gauge2 ; No, compute current consumption value into isr1_temp and isr2_temp + + banksel isr_backup ; Bank0 ISR data + movf isr1_temp,W ; 48Bit add of isr1_temp and isr2_temp into battery_gauge:6 + addwf battery_gauge+0,F + movf isr2_temp,W + addwfc battery_gauge+1,F + movlw .0 + addwfc battery_gauge+2,F + addwfc battery_gauge+3,F + addwfc battery_gauge+4,F + addwfc battery_gauge+5,F + return + isr_battery_gauge2: - ; set consumtion rate in nAs for an one second interval + ; set consumption rate in nAs for an one second interval ; Example: - ; movlw LOW .55556 ; 0,2A/3600*1e9s = nAs - ; movwf isr1_temp ; Low byte - ; movlw HIGH .55556 ; 0,2A/3600*1e9s = nAs - ; movwf isr2_temp ; High byte + ; movlw LOW .55556 ; 0,2A/3600*1e9s = nAs + ; movwf isr1_temp ; Low byte + ; movlw HIGH .55556 ; 0,2A/3600*1e9s = nAs + ; movwf isr2_temp ; High byte ; Current consumption for LED backlight is 47*CCPR1L+272 - movf CCPR1L,W - mullw current_backlight_multi - movlw LOW current_backlight_offset - addwf PRODL,F - movlw HIGH current_backlight_offset - addwfc PRODH,F - movff PRODL,isr1_temp - movff PRODH,isr2_temp ; isr1_temp and isr2_temp hold value for backlight + movf CCPR1L,W + mullw current_backlight_multi + movlw LOW current_backlight_offset + addwf PRODL,F + movlw HIGH current_backlight_offset + addwfc PRODH,F + movff PRODL,isr1_temp + movff PRODH,isr2_temp ; isr1_temp and isr2_temp hold value for backlight ; Add current for CPU and GPU ; speed_setting=1: ECO (3,1mA -> 861nAs), =2: NORMAL (5,50mA -> 1528nAs) or =3: FASTEST (8,04mA -> 2233nAs) - banksel isr_backup ; Bank0 ISR data - movlw .1 - cpfseq speed_setting - bra isr_battery_gauge3 - movlw LOW current_speed_eco - addwf isr1_temp,F - movlw HIGH current_speed_eco - addwfc isr2_temp,F - bra isr_battery_gauge5 + banksel isr_backup ; Bank0 ISR data + movlw .1 + cpfseq speed_setting + bra isr_battery_gauge3 + movlw LOW current_speed_eco + addwf isr1_temp,F + movlw HIGH current_speed_eco + addwfc isr2_temp,F + bra isr_battery_gauge5 isr_battery_gauge3: - movlw .2 - cpfseq speed_setting - bra isr_battery_gauge4 - movlw LOW current_speed_normal - addwf isr1_temp,F - movlw HIGH current_speed_normal - addwfc isr2_temp,F - bra isr_battery_gauge5 + movlw .2 + cpfseq speed_setting + bra isr_battery_gauge4 + movlw LOW current_speed_normal + addwf isr1_temp,F + movlw HIGH current_speed_normal + addwfc isr2_temp,F + bra isr_battery_gauge5 isr_battery_gauge4: - movlw LOW current_speed_fastest - addwf isr1_temp,F - movlw HIGH current_speed_fastest - addwfc isr2_temp,F + movlw LOW current_speed_fastest + addwf isr1_temp,F + movlw HIGH current_speed_fastest + addwfc isr2_temp,F isr_battery_gauge5: - ; Add current if IR reciever is on - btfss ir_power ; IR enabled? - bra isr_battery_gauge6 ; no - movlw LOW current_ir_reciever - addwf isr1_temp,F - movlw HIGH current_ir_reciever - addwfc isr2_temp,F + ; Add current if IR receiver is on + btfss ir_power ; IR enabled? + bra isr_battery_gauge6 ; no + movlw LOW current_ir_receiver + addwf isr1_temp,F + movlw HIGH current_ir_receiver + addwfc isr2_temp,F isr_battery_gauge6: - ; Add current for compass/accelerometer - btfss compass_enabled ; compass active? - bra isr_battery_gauge7 ; no - movlw LOW current_compass - addwf isr1_temp,F - movlw HIGH current_compass - addwfc isr2_temp,F + ; Add current for compass/accelerometer + btfss compass_enabled ; compass active? + bra isr_battery_gauge7 ; no + movlw LOW current_compass + addwf isr1_temp,F + movlw HIGH current_compass + addwfc isr2_temp,F isr_battery_gauge7: - return + return isr_divemode_1sec: - incf samplesecs,F ; "samplingrate" diving seconds done - decf samplesecs_value,W ; holds "samplingrate" value (minus 1 into WREG) - cpfsgt samplesecs ; Done? - bra isr_divemode_1sec2 ; no + incf samplesecs,F ; "samplingrate" diving seconds done + decf samplesecs_value,W ; holds "samplingrate" value (minus 1 into WREG) + cpfsgt samplesecs ; Done? + bra isr_divemode_1sec2 ; no - clrf samplesecs ; clear counter... - bsf store_sample ; ...and set bit for profile storage + clrf samplesecs ; clear counter... + bsf store_sample ; ...and set bit for profile storage isr_divemode_1sec2: -; Increase re-setable average depth divetime counter - infsnz average_divesecs+0,F ; increase stopwatch registers - incf average_divesecs+1,F ; increase stopwatch registers -; Increase total divetime (Regardless of start_dive_threshold) - infsnz total_divetime_seconds+0,F - incf total_divetime_seconds+1,F ; Total dive time (Regardless of start_dive_threshold) - - btfss divemode2 ; displayed divetime is running? - return ; No (e.g. too shallow) + ; Increase re-setable average depth divetime counter + infsnz average_divesecs+0,F ; increase stopwatch registers + incf average_divesecs+1,F ; increase stopwatch registers + ; Increase total divetime (Regardless of start_dive_threshold) + infsnz total_divetime_seconds+0,F + incf total_divetime_seconds+1,F ; Total dive time (Regardless of start_dive_threshold) + + btfss divemode2 ; displayed divetime is running? + return ; No (e.g. too shallow) -; increase divetime registers (Displayed dive time) - incf divesecs,F - movlw d'59' - cpfsgt divesecs - bra isr_divemode_1sec2a + ; increase divetime registers (Displayed dive time) + incf divesecs,F + movlw d'59' + cpfsgt divesecs + bra isr_divemode_1sec2a + + clrf divesecs + bsf realdive ; this bit is always set (again) if the dive is longer then one minute + infsnz divemins+0,F + incf divemins+1,F ; increase divemins - clrf divesecs - bsf realdive ; this bit is always set (again) if the dive is longer then one minute - infsnz divemins+0,F - incf divemins+1,F ; increase divemins - -isr_divemode_1sec2a: - btfss FLAG_apnoe_mode ; Are we in Apnoe mode? - return ; No - - incf apnoe_secs,F ; increase descent registers - movlw d'59' - cpfsgt apnoe_secs ; full minute? - return ; No - clrf apnoe_secs - incf apnoe_mins,F ; increase descent mins - return +isr_divemode_1sec2a: + btfss FLAG_apnoe_mode ; Are we in Apnoe mode? + return ; No + + incf apnoe_secs,F ; increase descent registers + movlw d'59' + cpfsgt apnoe_secs ; full minute? + return ; No + clrf apnoe_secs + incf apnoe_mins,F ; increase descent mins + return ;============================================================================= -; BCD to Binary convertion. +; BCD to Binary conversion. ; Input: isr1_temp = Value in BCD ; Output WREG = value in binary. isr_rtcc_convert: - swapf isr1_temp, W - andlw 0x0F ; W= tens - rlncf WREG, W ; W= 2*tens - subwf isr1_temp, F ; 16*tens + ones - 2*tens - subwf isr1_temp, F ; 14*tens + ones - 2*tens - subwf isr1_temp, W ; 12*tens + ones - 2*tens - return + swapf isr1_temp, W + andlw 0x0F ; W = tens + rlncf WREG, W ; W = 2*tens + subwf isr1_temp, F ; 16*tens + ones - 2*tens + subwf isr1_temp, F ; 14*tens + ones - 2*tens + subwf isr1_temp, W ; 12*tens + ones - 2*tens + return ;============================================================================= -isr_switch_right: ; - bcf INTCON,INT0IE ; Disable INT0 - banksel common ; flag1 is in Bank1 - btfss flip_screen ; 180° flipped? - bsf switch_right ; Set flag - btfsc flip_screen ; 180° flipped? - bsf switch_left ; Set flag - bra isr_switch_common ; Continue... +isr_switch_right: + bcf INTCON,INT0IE ; Disable INT0 + banksel common ; flag1 is in Bank1 + btfss flip_screen ; 180° flipped? + bsf switch_right ; Set flag + btfsc flip_screen ; 180° flipped? + bsf switch_left ; Set flag + bra isr_switch_common ; Continue... -isr_switch_left: ; - bcf INTCON3,INT1IE ; Disable INT1 - banksel common ; flag1 is in Bank1 - btfss flip_screen ; 180° flipped? - bsf switch_left ; Set flag - btfsc flip_screen ; 180° flipped? - bsf switch_right ; Set flag +isr_switch_left: + bcf INTCON3,INT1IE ; Disable INT1 + banksel common ; flag1 is in Bank1 + btfss flip_screen ; 180° flipped? + bsf switch_left ; Set flag + btfsc flip_screen ; 180° flipped? + bsf switch_right ; Set flag isr_switch_common: - ; load timer1 for first press - clrf TMR1L - movlw TMR1H_VALUE_FIRST ; in steps of 7,8125ms - movwf TMR1H - bsf T1CON,TMR1ON ; Start Timer 1 - banksel isr_backup ; Select Bank0 for ISR data. - bcf INTCON3,INT1IF ; Clear flag - bcf INTCON,INT0IF ; Clear flag - return + ; load timer1 for first press + clrf TMR1L + movlw TMR1H_VALUE_FIRST ; in steps of 7,8125ms + movwf TMR1H + bsf T1CON,TMR1ON ; Start Timer 1 + banksel isr_backup ; Select Bank0 for ISR data. + bcf INTCON3,INT1IF ; Clear flag + bcf INTCON,INT0IF ; Clear flag + return timer1int: - bcf PIR1,TMR1IF ; Clear flag - banksel common ; flag1 is in Bank1 - bcf INTCON,INT0IF ; Clear flag - bcf INTCON3,INT1IF ; Clear flag + bcf PIR1,TMR1IF ; Clear flag + banksel common ; flag1 is in Bank1 + bcf INTCON,INT0IF ; Clear flag + bcf INTCON3,INT1IF ; Clear flag ; digital - btfss switch_left1 ; Left button hold-down? - bra timer1int_left ; Yes - btfss switch_right2 ; Right button hold-down? - bra timer1int_right ; Yes - + btfss switch_left1 ; Left button hold-down? + bra timer1int_left ; Yes + btfss switch_right2 ; Right button hold-down? + bra timer1int_right ; Yes + ; Analog - btfsc analog_sw2_pressed ; Left button hold-down? - bra timer1int_left ; Yes - btfsc analog_sw1_pressed ; Right button hold-down? - bra timer1int_right ; Yes - - ; No button hold-down, stop Timer 1 - bcf T1CON,TMR1ON ; Stop Timer 1 - bsf INTCON,INT0IE ; Enable INT0 - bsf INTCON3,INT1IE ; Enable INT1 + btfsc analog_sw2_pressed ; Left button hold-down? + bra timer1int_left ; Yes + btfsc analog_sw1_pressed ; Right button hold-down? + bra timer1int_right ; Yes + + ; No button hold-down, stop Timer 1 + bcf T1CON,TMR1ON ; Stop Timer 1 + bsf INTCON,INT0IE ; Enable INT0 + bsf INTCON3,INT1IE ; Enable INT1 return timer1int_left: - btfss flip_screen ; 180° flipped? - bsf switch_left ; (Re-)Set flag - btfsc flip_screen ; 180° flipped? - bsf switch_right ; (Re-)Set flag - bra timer1int_common ; Continue + btfss flip_screen ; 180° flipped? + bsf switch_left ; (Re-)Set flag + btfsc flip_screen ; 180° flipped? + bsf switch_right ; (Re-)Set flag + bra timer1int_common ; Continue timer1int_right: - btfss flip_screen ; 180° flipped? - bsf switch_right ; Set flag - btfsc flip_screen ; 180° flipped? - bsf switch_left ; Set flag + btfss flip_screen ; 180° flipped? + bsf switch_right ; Set flag + btfsc flip_screen ; 180° flipped? + bsf switch_left ; Set flag timer1int_common: - ; load timer1 for next press - clrf TMR1L - movlw TMR1H_VALUE_CONT ; Surface mode - btfsc divemode - movlw TMR1H_VALUE_CONT_DIVE ; Dive mode - movwf TMR1H - return ; Return from timer1int with timer1 kept running + ; load timer1 for next press + clrf TMR1L + movlw TMR1H_VALUE_CONT ; Surface mode + btfsc divemode + movlw TMR1H_VALUE_CONT_DIVE ; Dive mode + movwf TMR1H + return ; Return from timer1int with timer1 kept running ;============================================================================= -check_nofly_desat_time: - - ; DELETE - no-fly time is now re-computed every second ## no fly - ; ; REPLACE ## no fly - ; ; movf nofly_time+0,W ; Is nofly null ? - ; ; iorwf nofly_time+1,W - ; ; BY - ; banksel int_O_nofly_time - ; movf int_O_nofly_time+0,W ; Is nofly null ? - ; iorwf int_O_nofly_time+1,W - - ; bz check_nofly_desat_time2 ; yes... - - ; movlw d'1' - ; ; REPLACE ## no fly - ; ; subwf nofly_time+0,F - ; ; BY - ; subwf int_O_nofly_time+0,F - - ; movlw d'0' - - ; ; REPLACE ## no fly - ; ; subwfb nofly_time+1,F ; reduce by one - ; ; BY - ; subwfb int_O_nofly_time+1,F ; reduce by one +check_nofly_desat_time: ; called every minute when not in divemode + banksel int_O_desaturation_time + movf int_O_desaturation_time+0,W ; Is Desat null ? + iorwf int_O_desaturation_time+1,W + bz check_nofly_desat_time_1 ; yes... -check_nofly_desat_time2: - ; REPLACE - ; movf desaturation_time+0,W ; Is Desat null ? - ; iorwf desaturation_time+1,W - ; BY - banksel int_O_desaturation_time - movf int_O_desaturation_time+0,W ; Is Desat null ? - iorwf int_O_desaturation_time+1,W - - bz check_nofly_desat_time3 ; yes... - - ; DELETE - desat-time is now re-computed every second ## no fly - ; movlw d'1' - ; ; REPLACE ## no fly - ; ; subwf desaturation_time+0,F - ; ; BY - ; subwf int_O_desaturation_time+0,F - - ; movlw d'0' - - ; ; REPLACE ## no fly - ; ; subwfb desaturation_time+1,F ; reduce by one... - ; ; by - ; subwfb int_O_desaturation_time+1,F ; reduce by one... - banksel common + ; int_O_desaturation_time is only computed while in start, surface mode, menue_tree or ghostwriter. + ; So the ISR may clock surface_interval past the actual surface interval time. But TFT_surface_lastdive + ; will check int_O_desaturation_time and in case int_O_desaturation_time is zero it will not show + ; surface_interval but lastdive_time instead. So this glitch remains invisible. ; Increase surface interval timer - infsnz surface_interval+0,F - incf surface_interval+1,F - return ; Done + banksel common + infsnz surface_interval+0,F + incf surface_interval+1,F + return ; Done -check_nofly_desat_time3: - ; NEW ## no fly - banksel common - - clrf surface_interval+0 - clrf surface_interval+1 ; Clear surface interval timer - return ; Done. +check_nofly_desat_time_1: + banksel common + clrf surface_interval+0 + clrf surface_interval+1 ; Clear surface interval timer + return ; Done. ;============================================================================= isr_restore_clock: - banksel isr_backup - movlw d'1' - cpfseq speed_setting - bra isr_restore_speed2 - ; Reset to eco - movlw b'00000000' - movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) - movlw b'00110010' - movwf OSCCON ; 1MHz INTOSC - movlw T2CON_ECO - movwf T2CON - bra isr_restore_exit + banksel isr_backup + movlw d'1' + cpfseq speed_setting + bra isr_restore_speed2 + ; Reset to eco + movlw b'00000000' + movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movlw b'00110010' + movwf OSCCON ; 1MHz INTOSC + movlw T2CON_ECO + movwf T2CON + bra isr_restore_exit isr_restore_speed2: - movlw d'2' - cpfseq speed_setting - bra isr_restore_speed3 + movlw d'2' + cpfseq speed_setting + bra isr_restore_speed3 ; Reset to normal - movlw b'01110010' - movwf OSCCON ; 16MHz INTOSC - movlw b'00000000' - movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) - movlw T2CON_NORMAL - movwf T2CON - bra isr_restore_exit + movlw b'01110010' + movwf OSCCON ; 16MHz INTOSC + movlw b'00000000' + movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movlw T2CON_NORMAL + movwf T2CON + bra isr_restore_exit isr_restore_speed3: ; Reset to fastest - movlw b'01110010' ; 16MHz INTOSC - movwf OSCCON - movlw b'01000000' - movwf OSCTUNE ; 4x PLL Enable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) - movlw T2CON_FASTEST - movwf T2CON -; bra isr_restore_exit + movlw b'01110010' ; 16MHz INTOSC + movwf OSCCON + movlw b'01000000' + movwf OSCTUNE ; 4x PLL Enable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movlw T2CON_FASTEST + movwf T2CON + ;bra isr_restore_exit + isr_restore_exit: - btfss OSCCON,HFIOFS - bra isr_restore_exit ; loop until PLL is stable - return + btfss OSCCON,HFIOFS + bra isr_restore_exit ; loop until PLL is stable + return -restore_flash: ; Restore first flash page from eeprom - banksel common - ; Start address in internal flash - movlw 0x00 - movwf TBLPTRL - movwf TBLPTRH - movwf TBLPTRU +restore_flash: ; Restore first flash page from eeprom + banksel common + ; Start address in internal flash + movlw 0x00 + movwf TBLPTRL + movwf TBLPTRH + movwf TBLPTRU - movlw b'10010100' ; Setup erase - rcall Write ; Write! + movlw b'10010100' ; Setup erase + rcall Write ; Write! - movlw .128 - movwf lo ; Byte counter - clrf EEADR - movlw .3 - movwf EEADRH ; Setup backup address + movlw .128 + movwf lo ; Byte counter + clrf EEADR + movlw .3 + movwf EEADRH ; Setup backup address - TBLRD*- ; Dummy read to be in 128 byte block + TBLRD*- ; Dummy read to be in 128 byte block restore_flash_loop: - call read_eeprom - incf EEADR,F - movff EEDATA,TABLAT ; put 1 byte - tblwt+* ; Table Write with Pre-Increment - decfsz lo,F ; 128byte done? - bra restore_flash_loop ; No + call read_eeprom + incf EEADR,F + movff EEDATA,TABLAT ; put 1 byte + tblwt+* ; Table Write with Pre-Increment + decfsz lo,F ; 128byte done? + bra restore_flash_loop ; No - movlw b'10000100' ; Setup writes - rcall Write ; Write! + movlw b'10000100' ; Setup writes + rcall Write ; Write! - reset ; Done, reset CPU + reset ; Done, reset CPU Write: - movwf EECON1 ; Type of memory to write in - movlw 0x55 - movwf EECON2 - movlw 0xAA - movwf EECON2 - bsf EECON1,WR ; Write - nop - nop - return + movwf EECON1 ; Type of memory to write in + movlw 0x55 + movwf EECON2 + movlw 0xAA + movwf EECON2 + bsf EECON1,WR ; Write + nop + nop + return - - END + END diff -r f5de1ff88814 -r b455b31ce022 src/logbook.asm --- a/src/logbook.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/logbook.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File logbook.asm REFACTORED VERSION V2.91 +; File logbook.asm REFACTORED VERSION V2.98 ; ; Logbook ; @@ -8,244 +8,277 @@ ;============================================================================= ; HISTORY ; 2011-11-12 : [mH] moving from OSTC code - +; ;============================================================================= -; Temp data, local to this module, moved to ACCES0 area. -; + + +#include "hwos.inc" ; Mandatory header +#include "tft.inc" +#include "external_flash.inc" +#include "math.inc" +#include "strings.inc" +#include "convert.inc" +#include "tft_outputs.inc" +#include "eeprom_rs232.inc" +#include "menu_processor.inc" +#include "wait.inc" +#include "start.inc" +#include "surfmode.inc" +#include "divemode.inc" +#include "ghostwriter.inc" -#include "hwos.inc" ; Mandatory header -#include "tft.inc" -#include "external_flash.inc" -#include "math.inc" -#include "strings.inc" -#include "convert.inc" -#include "tft_outputs.inc" -#include "eeprom_rs232.inc" -#include "menu_processor.inc" -#include "wait.inc" -#include "start.inc" -#include "surfmode.inc" -#include "divemode.inc" -#include "ghostwriter.inc" + extern do_main_menu2 + extern comm_mode + extern customview_show_mix + + + ;---- Private local variables ------------------------------------------------- - extern do_main_menu2,comm_mode + CBLOCK local1 ; max size is 16 byte !!! + count_temperature ; current sample count for temperature divisor + count_deco ; current sample count for deco (ceiling) divisor + logbook_cur_depth:2 ; current depth, for drawing profile. + logbook_cur_tp:2 ; current temperature, for drawing profile. + logbook_last_tp ; Y of the last item in Tp° curve. + logbook_min_tp:2 ; min temperature, for drawing profile. + logbook_max_tp:2 ; maximum temperature, for drawing profile. + logbook_ceiling ; current ceiling, for drawing profile. + logbook_flags ; flags only used in logbook.asm + logbook_page_number ; page# in logbook + logbook_divenumber ; # of dive in list during search + logbook_max_dive_counter ; counts dive# to zero + ENDC ; used: 16 byte, remaining: 0 byte => FULL - CBLOCK tmp+0x36 ; Keep space for menu processor. - count_temperature ; Current sample count for temperature divisor - count_deco ; Current sample count for deco (ceiling) divisor - logbook_cur_depth:2 ; Current depth, for drawing profile. - logbook_cur_tp:2 ; Current temperature, for drawing profile. - logbook_last_tp ; Y of the last item in Tp° curve. - logbook_min_tp:2 ; Min temperature, for drawing profile. - logbook_max_tp:2 ; Maximum temperature, for drawing profile. - logbook_ceiling ; Current ceiling, for drawing profile. - logbook_flags ; Flags only used in logbook.asm - logbook_page_number ; Page# in logbook - logbook_divenumber ; # of dive in list during search - logbook_divenumber_temp ; # of dive in list during search - logbook_menupos_temp ; Last position of cursor - profile_temp:2 ; Temp for profile display - profile_temp2:2 ; Temp for profile display - logbook_max_dive_counter ; Counts dive# to zero - logbook_max_dive_counter_temp; Counts dive# to zero - logbook_sample_counter:2; Amount of read samples - divemins_backup ; Backup of divemins+0 - y_scale:2 ; y-scale (The horizontal lines) - x_scale:2 ; x-scale (The vertical lines) - logbook_pixel_x_pos ; x2 position of current pixel in X-direction - logbook_min_temp_pos ; lowest row in the temp graph - logbook_max_temp_pos ; lowest row in the temp graph - ;+.33, reserved to tmp+0x57 - ENDC + CBLOCK local2 ; max size is 16 byte !!! + profile_temp1:2 ; temp for profile display + profile_temp2:2 ; temp for profile display + logbook_sample_counter:2 ; amount of read samples + y_scale:2 ; y-scale (The horizontal lines) + x_scale:2 ; x-scale (The vertical lines) + logbook_pixel_x_pos ; x2 position of current pixel in X-direction + logbook_min_temp_pos ; lowest row in the temp graph + logbook_max_temp_pos ; lowest row in the temp graph + logbook_menupos_temp ; last position of cursor + logbook_divenumber_temp ; used to back-up dive number + logbook_max_dive_counter_temp ; used to back-up max_dive_counter + ENDC ; used: 16 byte, remaining: 0 byte => FULL - #DEFINE return_from_profileview logbook_flags,0 - #DEFINE all_dives_shown logbook_flags,1 - #DEFINE logbook_page_not_empty logbook_flags,2 - #DEFINE end_of_profile logbook_flags,3 - #DEFINE keep_cursor_new_page logbook_flags,4 - #DEFINE log_marker_found logbook_flags,5 + CBLOCK local3 ; max size is 16 byte !!! + divenumber ; used for accessing dives + vertical_interval:2 ; holds interval of samples for vertical 10min line + backup_color1 ; used for restoring drawing color + backup_color2 ; used for restoring drawing color + backup_divedata ; used to backup depth and salinity + fill_between_rows ; used for fill between rows + logbook_temp ; used as temp + logbook_temp_backup ; used as backup for temp + divisor_temperature ; divisor used while sampling of the dive data + divisor_deco ; divisor used while sampling of the dive data + divisor_gf ; divisor used while sampling of the dive data + divisor_ppo2_sensors ; divisor used while sampling of the dive data + divisor_decoplan ; divisor used while sampling of the dive data + divisor_cns ; divisor used while sampling of the dive data + divisor_tank ; divisor used while sampling of the dive data + ENDC ; used: 16 byte, remaining: 0 byte => FULL + - + ; Remark: The variable gaslist_gas is "misused" here as a local variable, + ; because the storage space for local variables is fully used up. + + +;---- Defines ---------------------------------------------------------------- + +; Flags +#DEFINE return_from_profileview logbook_flags,0 +#DEFINE all_dives_shown logbook_flags,1 +#DEFINE logbook_page_not_empty logbook_flags,2 +#DEFINE end_of_profile logbook_flags,3 +#DEFINE keep_cursor_new_page logbook_flags,4 +#DEFINE log_marker_found logbook_flags,5 +#DEFINE log_show_gas_short logbook_flags,6 +; logbook_flags,7 ; unused + ; Logbook Coordinates - #DEFINE logbook_list_left .10 ; Column of dive# in list - #DEFINE logbook_row_offset .28 ; Distance between rows of list - #DEFINE logbook_row_number .6 ; Amount of rows in the list +#DEFINE logbook_list_left .10 ; Column of dive# in list +#DEFINE logbook_row_offset .28 ; Distance between rows of list +#DEFINE logbook_row_number .6 ; Amount of rows in the list ; Profile display - #DEFINE profile_height_pixels .157 ; Amount of pixels height for profile display - #DEFINE profile_width_pixels .156 ; Amount of pixels width for profile display - #DEFINE profile_left .1 ; Left border - #DEFINE profile_top .65 ; Top border +#DEFINE profile_height_pixels .157 ; Amount of pixels height for profile display +#DEFINE profile_width_pixels .156 ; Amount of pixels width for profile display +#DEFINE profile_left .1 ; Left border +#DEFINE profile_top .65 ; Top border ; "Bailout" - #DEFINE logbook_bailout_column .124 - #DEFINE logbook_bailout_row .207 +#DEFINE logbook_bailout_column .124 +#DEFINE logbook_bailout_row .207 ; Dive number - #DEFINE logbook_divenumer_column .1 - #DEFINE logbook_divenumer_row .1 +#DEFINE logbook_divenumer_column .1 +#DEFINE logbook_divenumer_row .1 ; Date and Time - #DEFINE logbook_date_column .100 - #DEFINE logbook_date_row .7 - #DEFINE logbook_time_column .120 - #DEFINE logbook_time_row .38 +#DEFINE logbook_date_column .100 +#DEFINE logbook_date_row .7 +#DEFINE logbook_time_column .120 +#DEFINE logbook_time_row .38 ; Max. Depth - #DEFINE log_max_value_row .38 - #DEFINE log_max_value_column .1 -; Divetime - #DEFINE log_divetime_value_row .38 - #DEFINE log_divetime_value_column .60 ; UPDATED, old value was .65 +#DEFINE log_max_value_row .38 +#DEFINE log_max_value_column .1 +; Divetime +#DEFINE log_divetime_value_row .38 +#DEFINE log_divetime_value_column .60 ; Gaslist below profile - #DEFINE log_gas_row .225 - #DEFINE log_gas_column1 .0 - #DEFINE log_gas_column2 log_gas_column1+(.1*.32) - #DEFINE log_gas_column3 log_gas_column1+(.2*.32) - #DEFINE log_gas_column4 log_gas_column1+(.3*.32) - #DEFINE log_gas_column5 log_gas_column1+(.4*.32) +#DEFINE log_gas_row .225 +#DEFINE log_gas_column1 .0 +#DEFINE log_gas_column2 log_gas_column1+(.1*.32) +#DEFINE log_gas_column3 log_gas_column1+(.2*.32) +#DEFINE log_gas_column4 log_gas_column1+(.3*.32) +#DEFINE log_gas_column5 log_gas_column1+(.4*.32) ; Logbook Page2 - ; Gaslist - #DEFINE log2_title_row1 .20 - #DEFINE log2_title_column .90 - #DEFINE log2_gas_column log2_title_column - #DEFINE log2_gas_row1 .36 - #DEFINE log2_gas_row2 1*.16+log2_gas_row1 - #DEFINE log2_gas_row3 2*.16+log2_gas_row1 - #DEFINE log2_gas_row4 3*.16+log2_gas_row1 - #DEFINE log2_gas_row5 4*.16+log2_gas_row1 +; Gaslist +#DEFINE log2_title_row1 .20 +#DEFINE log2_title_column .90 +#DEFINE log2_gas_column log2_title_column +#DEFINE log2_gas_row1 .36 +#DEFINE log2_gas_row2 1*.16+log2_gas_row1 +#DEFINE log2_gas_row3 2*.16+log2_gas_row1 +#DEFINE log2_gas_row4 3*.16+log2_gas_row1 +#DEFINE log2_gas_row5 4*.16+log2_gas_row1 - ; Setpoint List - #DEFINE log2_title_sp_row .130 - #DEFINE log2_sp_row1 .146 - #DEFINE log2_sp_row2 1*.16+log2_sp_row1 - #DEFINE log2_sp_row3 2*.16+log2_sp_row1 - #DEFINE log2_sp_row4 3*.16+log2_sp_row1 - #DEFINE log2_sp_row5 4*.16+log2_sp_row1 +; Setpoint List +#DEFINE log2_title_sp_row .130 +#DEFINE log2_sp_row1 .146 +#DEFINE log2_sp_row2 1*.16+log2_sp_row1 +#DEFINE log2_sp_row3 2*.16+log2_sp_row1 +#DEFINE log2_sp_row4 3*.16+log2_sp_row1 +#DEFINE log2_sp_row5 4*.16+log2_sp_row1 - ; Details list - #DEFINE log2_salinity_row .55 - #DEFINE log2_salinity_column .2 - #DEFINE log2_cns_row .1*.16+log2_salinity_row - #DEFINE log2_cns_column log2_salinity_column - #DEFINE log2_avr_row .2*.16+log2_salinity_row - #DEFINE log2_avr_column log2_salinity_column - #DEFINE log2_decomodel2_row .3*.16+log2_salinity_row - #DEFINE log2_decomodel2_column log2_salinity_column - #DEFINE log2_decomodel3_row .4*.16+log2_salinity_row - #DEFINE log2_decomodel3_column log2_salinity_column - #DEFINE log2_decomodel_row .5*.16+log2_salinity_row - #DEFINE log2_decomodel_column log2_salinity_column - #DEFINE log2_firmware_row .6*.16+log2_salinity_row - #DEFINE log2_firmware_column log2_salinity_column - #DEFINE log2_battery_row .7*.16+log2_salinity_row - #DEFINE log2_battery_column log2_salinity_column - #DEFINE log2_divemode_row .8*.16+log2_salinity_row - #DEFINE log2_divemode_column log2_salinity_column - #DEFINE log2_lastdeco_row .9*.16+log2_salinity_row - #DEFINE log2_lastdeco_column log2_salinity_column +; Details list +#DEFINE log2_salinity_row .55 +#DEFINE log2_salinity_column .2 +#DEFINE log2_cns_row .1*.16+log2_salinity_row +#DEFINE log2_cns_column log2_salinity_column +#DEFINE log2_avr_row .2*.16+log2_salinity_row +#DEFINE log2_avr_column log2_salinity_column +#DEFINE log2_decomodel2_row .3*.16+log2_salinity_row +#DEFINE log2_decomodel2_column log2_salinity_column +#DEFINE log2_decomodel3_row .4*.16+log2_salinity_row +#DEFINE log2_decomodel3_column log2_salinity_column +#DEFINE log2_decomodel_row .5*.16+log2_salinity_row +#DEFINE log2_decomodel_column log2_salinity_column +#DEFINE log2_firmware_row .6*.16+log2_salinity_row +#DEFINE log2_firmware_column log2_salinity_column +#DEFINE log2_battery_row .7*.16+log2_salinity_row +#DEFINE log2_battery_column log2_salinity_column +#DEFINE log2_divemode_row .8*.16+log2_salinity_row +#DEFINE log2_divemode_column log2_salinity_column +#DEFINE log2_lastdeco_row .9*.16+log2_salinity_row +#DEFINE log2_lastdeco_column log2_salinity_column ; Air pressure - #DEFINE MBAR_row .10*.16+log2_salinity_row - #DEFINE MBAR_column log2_salinity_column +#DEFINE MBAR_row .10*.16+log2_salinity_row +#DEFINE MBAR_column log2_salinity_column ; Header coordinates - #DEFINE log_profile_version .8 - #DEFINE log_date .12 - #DEFINE log_time .15 - #DEFINE log_max_depth .17 - #DEFINE log_divetime .19 - #DEFINE log_min_temp .22 - #DEFINE log_surface_press .24 - #DEFINE log_desattime .26 - #DEFINE log_gas1 .28 - #DEFINE log_gas2 .32 - #DEFINE log_gas3 .36 - #DEFINE log_gas4 .40 - #DEFINE log_gas5 .44 - #DEFINE log_firmware .48 - #DEFINE log_battery .50 - #DEFINE log_samplingrate .52 - #DEFINE log_cns_start .53 - #DEFINE log_gf_start .55 - #DEFINE log_gf_end .56 - #DEFINE log_batt_info .59 - #DEFINE log_sp1 .60 - #DEFINE log_sp2 .62 - #DEFINE log_sp3 .64 - #DEFINE log_sp4 .66 - #DEFINE log_sp5 .68 - #DEFINE log_salinity .70 - #DEFINE log_cns_end .71 - #DEFINE log_avr_depth .73 - #DEFINE log_total_seconds .75 - #DEFINE log_gf_lo .77 - #DEFINE log_sat_mult .77 - #DEFINE log_gf_hi .78 - #DEFINE log_desat_mult .78 - #DEFINE log_decomodel .79 - #DEFINE log_total_dives .80 - #DEFINE log_divemode .82 - #DEFINE log_last_stop .243 +#DEFINE log_profile_version .8 +#DEFINE log_date .12 +#DEFINE log_time .15 +#DEFINE log_max_depth .17 +#DEFINE log_divetime .19 +#DEFINE log_min_temp .22 +#DEFINE log_surface_press .24 +#DEFINE log_desattime .26 +#DEFINE log_gas1 .28 +#DEFINE log_gas2 .32 +#DEFINE log_gas3 .36 +#DEFINE log_gas4 .40 +#DEFINE log_gas5 .44 +#DEFINE log_firmware .48 +#DEFINE log_battery .50 +#DEFINE log_samplingrate .52 +#DEFINE log_cns_start .53 +#DEFINE log_gf_start .55 +#DEFINE log_gf_end .56 +#DEFINE log_batt_info .59 +#DEFINE log_sp1 .60 +#DEFINE log_sp2 .62 +#DEFINE log_sp3 .64 +#DEFINE log_sp4 .66 +#DEFINE log_sp5 .68 +#DEFINE log_salinity .70 +#DEFINE log_cns_end .71 +#DEFINE log_avr_depth .73 +#DEFINE log_total_seconds .75 +#DEFINE log_gf_lo .77 +#DEFINE log_sat_mult .77 +#DEFINE log_gf_hi .78 +#DEFINE log_desat_mult .78 +#DEFINE log_decomodel .79 +#DEFINE log_total_dives .80 +#DEFINE log_divemode .82 +#DEFINE log_last_stop .243 -LOG_POINT_TO macro address - movlw address - movwf ext_flash_address+0 - endm + +LOG_POINT_TO macro address + movlw address + movwf ext_flash_address+0 + endm + +logbook code ;============================================================================= -logbook code +TFT_logbook_cursor: +; call speed_fastest + WIN_BOX_BLACK .0, .240-.16, logbook_list_left-.8, logbook_list_left-.1 ; top, bottom, left, right -TFT_logbook_cursor: -; call speed_fastest - WIN_BOX_BLACK .0, .240-.16, logbook_list_left-.8, logbook_list_left-.1 ;top, bottom, left, right - - WIN_LEFT logbook_list_left-.8 - WIN_FONT FT_SMALL -; bcf win_invert ; Reset invert flag + WIN_LEFT logbook_list_left-.8 + WIN_FONT FT_SMALL +; bcf win_invert ; Reset invert flag call TFT_standard_color - movff menupos,temp1 - dcfsnz temp1,F + movff menupos1,lo + dcfsnz lo,F movlw d'0' - dcfsnz temp1,F + dcfsnz lo,F movlw logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .2*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .3*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .4*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .5*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .6*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .7*logbook_row_offset - dcfsnz temp1,F + dcfsnz lo,F movlw .8*logbook_row_offset movwf win_top STRCPY_PRINT "\xB7" return - global logbook + global logbook ; entry point coming from menu_tree.asm logbook: - clrf logbook_flags - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot -; call TFT_standard_color - clrf menupos3 ; Here: used rows on current logbook-page - clrf logbook_page_number ; Here: # of current displayed page - clrf logbook_divenumber ; # of dive in list during search - clrf divemins+0 ; Here: used as temp variables - clrf divemins+1 - clrf timeout_counter2 ; For timeout - movlw logbook_row_number - movwf menupos ; Here: stores current position on display (logbook_row_number-x) - read_int_eeprom .2 ; Get low-byte of total dives - movff EEDATA,logbook_max_dive_counter + clrf logbook_flags + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_boot +; call TFT_standard_color + clrf menupos3 ; Here: used rows on current logbook-page + clrf logbook_page_number ; Here: # of current displayed page + clrf logbook_divenumber ; # of dive in list during search + clrf logbook_temp + clrf logbook_temp_backup + clrf timeout_counter2 ; For timeout + movlw logbook_row_number + movwf menupos1 ; Here: stores current position on display (logbook_row_number-x) + read_int_eeprom .2 ; Get low-byte of total dives + movff EEDATA,logbook_max_dive_counter ;----------------------------------------------------------------------------- ; display dive headers backwards from read_int_eeprom .2 = lo-1 @@ -256,13 +289,13 @@ ; Stop when ; a) no dive is stored (no valid header found) ; b) current dive has no valid header (Number of stored dives < 256) -; c) when 255 dives are reached divemins+0 = 255 +; c) when 255 dives are reached logbook_temp = 255 logbook2: -; call speed_fastest - incf divemins+0,F ; increase dive counter - incf divemins+0,W ; = 0x..FF ? - bz logbook_reset ; Yes: FF --> loop. +; call speed_fastest + incf logbook_temp,F ; increase dive counter + incf logbook_temp,W ; = 0x..FF ? + bz logbook_reset ; Yes: FF --> loop. ; Set ext_flash_address:3 to TOC entry of this dive ; 1st: 200000h-200FFFh -> logbook_max_dive_counter=0 @@ -270,940 +303,903 @@ ; 3rd: 202000h-202FFFh -> logbook_max_dive_counter=2 ; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (And hi>0...) - decf logbook_max_dive_counter,F ; -1 + decf logbook_max_dive_counter,F ; -1 - clrf ext_flash_address+0 - clrf ext_flash_address+1 - movlw 0x20 - movwf ext_flash_address+2 - movlw .16 - mulwf logbook_max_dive_counter; logbook_max_dive_counter*16 = offset to 0x2000 (up:hi) - movf PRODL,W - addwf ext_flash_address+1,F - movf PRODH,W - addwfc ext_flash_address+2,F + clrf ext_flash_address+0 + clrf ext_flash_address+1 + movlw 0x20 + movwf ext_flash_address+2 + movlw .16 + mulwf logbook_max_dive_counter ; logbook_max_dive_counter*16 = offset to 0x2000 (up:hi) + movf PRODL,W + addwf ext_flash_address+1,F + movf PRODH,W + addwfc ext_flash_address+2,F ; pointer at the first 0xFA of header - call ext_flash_byte_read ; Reads one byte@ext_flash_address:3 into WREG and temp1 - movwf temp1 - movlw 0xFA - cpfseq temp1 ; 0xFA found? - bra logbook3b ; No, abort + call ext_flash_byte_read ; Reads one byte@ext_flash_address:3 into WREG and ext_flash_rw + movwf ext_flash_rw + movlw 0xFA + cpfseq ext_flash_rw ; 0xFA found? + bra logbook3b ; No, abort - incf logbook_divenumber,F ; new header found, increase logbook_divenumber - bra logbook4 ; Done with searching, display the header! + incf logbook_divenumber,F ; new header found, increase logbook_divenumber + bra logbook4 ; Done with searching, display the header! logbook3b: - btfss logbook_page_not_empty ; Was there at least one dive? - bra exit_logbook ; Not a single header was found, leave logbook. - bra logbook_display_loop2 + btfss logbook_page_not_empty ; Was there at least one dive? + bra exit_logbook ; Not a single header was found, leave logbook. + bra logbook_display_loop2 logbook_reset: - tstfsz logbook_divenumber ; Was there at least one dive? - bra logbook_reset2 - bra logbook3b ; No, Nothing to do + tstfsz logbook_divenumber ; Was there at least one dive? + bra logbook_reset2 + bra logbook3b ; No, Nothing to do logbook_reset2: - bsf all_dives_shown ; Yes - bra logbook_display_loop2 ; Continue + bsf all_dives_shown ; Yes + bra logbook_display_loop2 ; Continue logbook4: - btfsc all_dives_shown ; All dives displayed? - bra logbook_display_loop2 ; Yes, but display first page again. + btfsc all_dives_shown ; All dives displayed? + bra logbook_display_loop2 ; Yes, but display first page again. - call display_listdive ; display short header for list on current list position + call display_listdive ; display short header for list on current list position - movlw logbook_row_number - cpfseq menupos ; first dive on list (top place)? - bra logbook_display_loop1 ; no, so skip saving of address + movlw logbook_row_number + cpfseq menupos1 ; first dive on list (top place)? + bra logbook_display_loop1 ; no, so skip saving of address -; store all registered required to rebuilt the current logbookpage after the detail/profile view - movff logbook_divenumber,logbook_divenumber_temp ; # of dive in list of the current page - movff divemins+0,divemins_backup ; amount of dives drawn until now - movff logbook_max_dive_counter,logbook_max_dive_counter_temp ; backup Counter + ; store all registers required to rebuilt the current logbook page after the detail/profile view + movff logbook_divenumber,logbook_divenumber_temp ; # of dive in list of the current page + movff logbook_max_dive_counter,logbook_max_dive_counter_temp ; backup Counter + movff logbook_temp,logbook_temp_backup ; amount of dives drawn until now + logbook_display_loop1: - decfsz menupos,F ; List full? - bra logbook2 ; no, search another dive for our current logbook page + decfsz menupos1,F ; List full? + bra logbook2 ; no, search another dive for our current logbook page logbook_display_loop2: - btfss logbook_page_not_empty ; Was there one dive at all? - bra logbook ; Yes, so reload the first page + btfss logbook_page_not_empty ; Was there one dive at all? + bra logbook ; Yes, so reload the first page ; TFT_mask... WIN_LEFT logbook_list_left WIN_TOP logbook_row_offset*logbook_row_number - STRCPY_TEXT_PRINT tNextLog ; "Next Page" + STRCPY_TEXT_PRINT tNextLog ; "Next Page" WIN_LEFT logbook_list_left WIN_TOP logbook_row_offset*(logbook_row_number+.1) - STRCPY_TEXT_PRINT tExit ; "Exit" + STRCPY_TEXT_PRINT tExit ; "Exit" - movlw d'1' ; Set cursor to position 1... - btfsc return_from_profileview ; .. unless we are returning from a detail/profile view - movf logbook_menupos_temp,W ; load last cursor position again - movwf menupos ; and set menupos byte - bcf return_from_profileview ; Do this only once while the page is loaded again! + movlw d'1' ; Set cursor to position 1... + btfsc return_from_profileview ; .. unless we are returning from a detail/profile view + movf logbook_menupos_temp,W ; load last cursor position again + movwf menupos1 ; and set menupos1 byte + bcf return_from_profileview ; Do this only once while the page is loaded again! - bcf logbook_page_not_empty ; Obviously the current page is NOT empty + bcf logbook_page_not_empty ; Obviously the current page is NOT empty - movlw d'7' ; Set cursor to position 7... - btfsc keep_cursor_new_page ; ... if we came from the "new Page" line - movwf menupos ; and set menupos byte - bcf keep_cursor_new_page + movlw d'7' ; Set cursor to position 7... + btfsc keep_cursor_new_page ; ... if we came from the "new Page" line + movwf menupos1 ; and set menupos1 byte + bcf keep_cursor_new_page - call TFT_logbook_cursor ; Show the cursor + call TFT_logbook_cursor ; Show the cursor - call logbook_preloop_tasks ; Clear some flags and set to Speed_eco - call menu_processor_bottom_line ; Show bottom line + call logbook_preloop_tasks ; Clear some flags and set to Speed_eco + call menu_processor_bottom_line ; Show bottom line + logbook_loop: - btfsc switch_left ; SET/MENU? - goto next_logbook3 ; adjust cursor or create new page - btfsc switch_right ; ENTER? - bra display_profile_or_exit ; view details/profile or exit logbook + btfsc switch_left ; SET/MENU? + goto next_logbook3 ; adjust cursor or create new page + btfsc switch_right ; ENTER? + bra display_profile_or_exit ; view details/profile or exit logbook - rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_logbook ; Yes - - bra logbook_loop ; Wait for something to do + rcall log_screendump_and_onesecond ; Check if we need to make a screen-shot and check for new second + btfsc sleepmode ; Timeout? + bra exit_logbook ; Yes + bra logbook_loop ; Wait for something to do display_profile_or_exit: - movlw logbook_row_number+.2 ; exit? - cpfseq menupos - bra display_profile_or_exit2 ; No, check for "Next Page" + movlw logbook_row_number+.2 ; exit? + cpfseq menupos1 + bra display_profile_or_exit2 ; No, check for "Next Page" exit_logbook: -; call TFT_DisplayOff -; call TFT_boot - goto do_main_menu2 +; call TFT_DisplayOff +; call TFT_boot + goto do_main_menu2 ; jump-back to menu_tree.asm display_profile_or_exit2: - movlw logbook_row_number+.1 ; Next page? - cpfseq menupos - bra display_profile ; No, show details/profile - goto next_logbook2 ; Next page! + movlw logbook_row_number+.1 ; Next page? + cpfseq menupos1 + bra display_profile ; No, show details/profile + goto next_logbook2 ; Next page! display_profile: - bcf is_bailout - bcf gas6_changed ; Clear event flags -; call speed_fastest - movff menupos,logbook_menupos_temp; store current cursor position - bsf return_from_profileview ; tweak search routine to exit after found + bcf is_bailout + bcf gas6_changed ; Clear event flags +; call speed_fastest + movff menupos1,logbook_menupos_temp ; store current cursor position + bsf return_from_profileview ; tweak search routine to exit after found - movf logbook_page_number,W ; Number of page - mullw logbook_row_number - movf PRODL,W - addwf menupos,W ; page*logbook_row_number+menupos= - movwf divesecs ; # of dive to show + movf logbook_page_number,W ; Number of page + mullw logbook_row_number + movf PRODL,W + addwf menupos1,W ; page * logbook_row_number + menupos1 = + movwf divenumber ; # of dive to show display_profile2: -; call speed_fastest - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot - ;call TFT_ClearScreen ; Clear screen -; Set ext_flash pointer to "#divesecs-oldest" dive -; compute read_int_eeprom .2 - divesecs +; call speed_fastest + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_boot +; call TFT_ClearScreen ; Clear screen +; Set ext_flash pointer to "#divenumber-oldest" dive +; compute read_int_eeprom .2 - divenumber ; Read required header data for profile display -; look in header for pointer to begin of diveprofile (Byte 2-4) +; look in header for pointer to begin of dive profile (Byte 2-4) ; Set pointer (ext_flash_log_pointer:3) to this address, start drawing - - decf divesecs,F ;-1 + + decf divenumber,F ;-1 read_int_eeprom .2 movf EEDATA,W bcf STATUS,C - subfwb divesecs,W ; max. dives (low value) - divesecs - movwf lo ; result - incf divesecs,F ;+1 + subfwb divenumber,W ; max. dives (low value) - divenumber + movwf lo ; result + incf divenumber,F ;+1 ; 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 (And hi>0...) - 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 + 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 ; pointer at the first 0xFA of header ; Now, show profile - LOG_POINT_TO log_samplingrate - call ext_flash_byte_read ; Read sampling rate - movff temp1,samplesecs_value ; needed later... + LOG_POINT_TO log_samplingrate + call ext_flash_byte_read ; Read sampling rate + movff ext_flash_rw,samplesecs_value ; needed later... - LOG_POINT_TO .2 - 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 - + LOG_POINT_TO .2 + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+0 + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+1 + call ext_flash_byte_read_plus ; Read start address of profile + movff ext_flash_rw,ext_flash_log_pointer+2 - clrf logbook_sample_counter+0 - clrf logbook_sample_counter+1 ; holds amount of read samples + clrf logbook_sample_counter+0 + clrf logbook_sample_counter+1 ; holds amount of read samples - call TFT_standard_color - call logbook_show_divenumber ; Show the dive number in medium font + call TFT_standard_color + call logbook_show_divenumber ; Show the dive number in medium font - WIN_SMALL logbook_date_column, logbook_date_row - LOG_POINT_TO log_date - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+2 ; Year - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+0 ; Month - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+1 ; Day - call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 - STRCAT_PRINT "" + WIN_SMALL logbook_date_column, logbook_date_row + LOG_POINT_TO log_date + call ext_flash_byte_read_plus + movff ext_flash_rw,up ; year + call ext_flash_byte_read_plus + movff ext_flash_rw,hi ; month + call ext_flash_byte_read_plus + movff ext_flash_rw,lo ; day + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + STRCAT_PRINT "" + + WIN_SMALL log_divetime_value_column,logbook_date_row ; align with surrounding data + LOG_POINT_TO log_divemode + call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into ext_flash_rw + movff ext_flash_rw,lo + call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) -; NEW code block ## logbook look and feel - WIN_SMALL log_divetime_value_column,logbook_date_row ; align with surrounding data - LOG_POINT_TO log_divemode - call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 - movff temp1,lo - call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) - - WIN_SMALL logbook_time_column, logbook_time_row - LOG_POINT_TO log_time - call ext_flash_byte_read_plus ; hour - movff temp1,lo - call ext_flash_byte_read_plus ; Minutes - movff temp1,hi - output_99x ; hour - PUTC ':' - movff hi,lo - output_99x ; minute - STRCAT_PRINT "" ; Display 1st row of details + WIN_SMALL logbook_time_column, logbook_time_row + LOG_POINT_TO log_time + call ext_flash_byte_read_plus ; hour + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; minutes + movff ext_flash_rw,hi + output_99x ; hour + PUTC ':' + movff hi,lo + output_99x ; minute + STRCAT_PRINT "" ; Display 1st row of details - LOG_POINT_TO log_profile_version - call ext_flash_byte_read_plus ; Profile version - movlw 0x24 - cpfslt temp1 ; <0x24? - bra log_skip_extra_icon ; Yes, skip - - WIN_SMALL logbook_time_column-.8, logbook_time_row - STRCPY_PRINT 0x94 ; "End of dive" icon + LOG_POINT_TO log_profile_version + call ext_flash_byte_read_plus ; Profile version + movlw 0x24 + cpfslt ext_flash_rw ; <0x24? + bra log_skip_extra_icon ; Yes, skip + + WIN_SMALL logbook_time_column-.8, logbook_time_row + STRCPY_PRINT 0x94 ; "End of dive" icon log_skip_extra_icon: - LOG_POINT_TO log_max_depth - call ext_flash_byte_read_plus ; read max depth - movff temp1,lo - call ext_flash_byte_read_plus ; read max depth - movff temp1,hi - movff lo,xA+0 ; calculate y-scale for profile display - movff hi,xA+1 - movlw profile_height_pixels ; pixel height available for profile - movwf xB+0 - clrf xB+1 - call div16x16 ; does xA/xB=xC - movff xC+0,y_scale+0 ; holds LOW byte of y-scale (mbar/pixel!) - movff xC+1,y_scale+1 ; holds HIGH byte of y-scale (mbar/pixel!) - infsnz y_scale+0,F ; increase one, because there may be a remainder - incf y_scale+1,F - - movlw LOW ((profile_height_pixels+1)*.1000) - movwf xC+0 - movlw HIGH (((profile_height_pixels+1)*.1000) & h'FFFF') - movwf xC+1 - movlw UPPER ((profile_height_pixels+1)*.1000) - movwf xC+2 - clrf xC+3 + LOG_POINT_TO log_max_depth + call ext_flash_byte_read_plus ; read max depth + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read max depth + movff ext_flash_rw,hi + movff lo,xA+0 ; calculate y-scale for profile display + movff hi,xA+1 + movlw profile_height_pixels ; pixel height available for profile + movwf xB+0 + clrf xB+1 + call div16x16 ; does xA/xB=xC + movff xC+0,y_scale+0 ; holds LOW byte of y-scale (mbar/pixel!) + movff xC+1,y_scale+1 ; holds HIGH byte of y-scale (mbar/pixel!) + infsnz y_scale+0,F ; increase one, because there may be a remainder + incf y_scale+1,F - movff lo,xB+0 ; Max. Depth in mbar - movff hi,xB+1 ; Max. Depth in mbar - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movlw LOW ((profile_height_pixels+1)*.1000) + movwf xC+0 + movlw HIGH (((profile_height_pixels+1)*.1000) & h'FFFF') + movwf xC+1 + movlw UPPER ((profile_height_pixels+1)*.1000) + movwf xC+2 + clrf xC+3 - movff xC+0,x_scale+0 ; - movff xC+1,x_scale+1 ; = Pixels/10m (For scale, draw any xx rows a scale-line) + movff lo,xB+0 ; Max. Depth in mbar + movff hi,xB+1 ; Max. Depth in mbar + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movf x_scale+0,W - iorwf x_scale+1,W ; x_scale:2 = Null? - bnz display_profile_offset4 ; No, continue - incf x_scale+1,F ; Yes, make x_scale+1>1 to make "display_profile2e" working + movff xC+0,x_scale+0 + movff xC+1,x_scale+1 ; = Pixels/10m (For scale, draw any xx rows a scale-line) + + movf x_scale+0,W + iorwf x_scale+1,W ; x_scale:2 = Null? + bnz display_profile_offset4 ; No, continue + incf x_scale+1,F ; Yes, make x_scale+1>1 to make "display_profile2e" working display_profile_offset4: - WIN_SMALL log_max_value_column,log_max_value_row + WIN_SMALL log_max_value_column,log_max_value_row - TSTOSS opt_units ; 0=Meters, 1=Feets - bra display_profile_offset4_metric -;display_profile_offset4_imperial: - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + TSTOSS opt_units ; 0=Meters, 1=Feets + bra display_profile_offset4_metric + ; display_profile_offset4_imperial: + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet PUTC ' ' - bcf leftbind - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_TEXT_PRINT tFeets - bra display_profile_offset4_common + bcf leftbind + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_TEXT_PRINT tFeets + bra display_profile_offset4_common display_profile_offset4_metric: - bsf leftbind - output_16dp d'3' ; max. depth - STRCAT_TEXT_PRINT tMeters + bsf leftbind + output_16dp d'3' ; max. depth + STRCAT_TEXT_PRINT tMeters -display_profile_offset4_common: - call ext_flash_byte_read_plus ; divetime in minutes - movff temp1,lo - call ext_flash_byte_read_plus - movff temp1,hi ; divetime in minutes +display_profile_offset4_common: + call ext_flash_byte_read_plus ; divetime in minutes + movff ext_flash_rw,lo + call ext_flash_byte_read_plus + movff ext_flash_rw,hi ; divetime in minutes - movff lo,xA+0 ; calculate x-scale for profile display - movff hi,xA+1 ; calculate total diveseconds first - movlw d'60' ; 60seconds are one minute... - movwf xB+0 - clrf xB+1 - call mult16x16 ; result is in xC:2 ! + movff lo,xA+0 ; calculate x-scale for profile display + movff hi,xA+1 ; calculate total diveseconds first + movlw d'60' ; 60seconds are one minute... + movwf xB+0 + clrf xB+1 + call mult16x16 ; result is in xC:2 ! - WIN_SMALL log_divetime_value_column,log_divetime_value_row - bsf leftbind - output_16 ; divetime minutes - movlw LOW d'600' - movwf xA+0 - movlw HIGH d'600' - movwf xA+1 ; A vertical line every 600 seconds - movff samplesecs_value,xB+0 ; Copy sampling rate - clrf xB+1 - call div16x16 ; xA/xB=xC with xA as remainder - movff xC+0,average_depth_hold_total+0 - movff xC+1,average_depth_hold_total+1 - ;average_depth_hold_total:2 holds interval of samples for vertical 10min line + WIN_SMALL log_divetime_value_column,log_divetime_value_row + bsf leftbind + output_16 ; divetime minutes + movlw LOW d'600' + movwf xA+0 + movlw HIGH d'600' + movwf xA+1 ; a vertical line every 600 seconds + movff samplesecs_value,xB+0 ; Copy sampling rate + clrf xB+1 + call div16x16 ; xA/xB=xC with xA as remainder + movff xC+0,vertical_interval+0 + movff xC+1,vertical_interval+1 + ; vertical_interval:2 holds interval of samples for vertical 10min line -; Restore divetime in minutes: -; get real sample time - LOG_POINT_TO log_total_seconds - call ext_flash_byte_read_plus ; Total sample time in seconds - movff temp1,xC+0 - call ext_flash_byte_read_plus ; Total sample time in seconds - movff temp1,xC+1 + ; Restore divetime in minutes: + ; get real sample time + LOG_POINT_TO log_total_seconds + call ext_flash_byte_read_plus ; Total sample time in seconds + movff ext_flash_rw,xC+0 + call ext_flash_byte_read_plus ; Total sample time in seconds + movff ext_flash_rw,xC+1 - PUTC ':' - LOG_POINT_TO log_divetime+.2 - call ext_flash_byte_read_plus ; read divetime seconds - movff temp1,lo - movff xC+0,xA+0 ; now calculate x-scale value - movff xC+1,xA+1 - movlw profile_width_pixels ; pix width available - movwf xB+0 - clrf xB+1 - call div16x16 ; xA/xB=xC - movff xC+0,xA+0 - movff xC+1,xA+1 - movf samplesecs_value,W ; devide through sample interval! - movwf xB+0 - clrf xB+1 - call div16x16 ; xA/xB=xC - movff xC+0,profile_temp+0 ; store value (use any #xC sample, skip xC-1) into temp registers - movff xC+1,profile_temp+1 ; store value (use any #xC sample, skip xC-1) into temp registers - infsnz profile_temp+0,F ; Increase by one, there might be a remainder - incf profile_temp+1,F + PUTC ':' + LOG_POINT_TO log_divetime+.2 + call ext_flash_byte_read_plus ; read divetime seconds + movff ext_flash_rw,lo + movff xC+0,xA+0 ; now calculate x-scale value + movff xC+1,xA+1 + movlw profile_width_pixels ; pix width available + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC + movff xC+0,xA+0 + movff xC+1,xA+1 + movf samplesecs_value,W ; divide through sample interval! + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC + movff xC+0,profile_temp1+0 ; store value (use any #xC sample, skip xC-1) into temp registers + movff xC+1,profile_temp1+1 ; store value (use any #xC sample, skip xC-1) into temp registers + infsnz profile_temp1+0,F ; Increase by one, there might be a remainder + incf profile_temp1+1,F - bsf leftbind - output_99x ; divetime seconds + bsf leftbind + output_99x ; divetime seconds call TFT_standard_color - STRCAT_PRINT "" + STRCAT_PRINT "" - call ext_flash_byte_read_plus ; Read min. Temperature - movff temp1,logbook_min_tp+0 - call ext_flash_byte_read_plus ; Read min. Temperature - movff temp1,logbook_min_tp+1 + call ext_flash_byte_read_plus ; Read min. Temperature + movff ext_flash_rw,logbook_min_tp+0 + call ext_flash_byte_read_plus ; Read min. Temperature + movff ext_flash_rw,logbook_min_tp+1 - ; Set pointer to Gas 1 Type. - LOG_POINT_TO log_gas1+.3 - call ext_flash_byte_read_plus ; read Gas Type - decfsz temp1,W ; =1 (="First")? - bra logbook_find_first_gas2 ; No. - movlw .1 - movwf temp1 - bra logbook_find_first_gas_done + ; Set pointer to Gas 1 Type. + LOG_POINT_TO log_gas1+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz ext_flash_rw,W ; =1 (="First")? + bra logbook_find_first_gas2 ; No. + movlw .1 + movwf ext_flash_rw + bra logbook_find_first_gas_done logbook_find_first_gas2: - ; Set pointer to Gas 2 Type. - LOG_POINT_TO log_gas2+.3 - call ext_flash_byte_read_plus ; read Gas Type - decfsz temp1,W ; =1 (="First")? - bra logbook_find_first_gas3 ; No. - movlw .2 - movwf temp1 - bra logbook_find_first_gas_done + ; Set pointer to Gas 2 Type. + LOG_POINT_TO log_gas2+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz ext_flash_rw,W ; =1 (="First")? + bra logbook_find_first_gas3 ; No. + movlw .2 + movwf ext_flash_rw + bra logbook_find_first_gas_done logbook_find_first_gas3: - ; Set pointer to Gas 3 Type. - LOG_POINT_TO log_gas3+.3 - call ext_flash_byte_read_plus ; read Gas Type - decfsz temp1,W ; =1 (="First")? - bra logbook_find_first_gas4 ; No. - movlw .3 - movwf temp1 - bra logbook_find_first_gas_done + ; Set pointer to Gas 3 Type. + LOG_POINT_TO log_gas3+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz ext_flash_rw,W ; =1 (="First")? + bra logbook_find_first_gas4 ; No. + movlw .3 + movwf ext_flash_rw + bra logbook_find_first_gas_done logbook_find_first_gas4: - ; Set pointer to Gas 4 Type. - LOG_POINT_TO log_gas4+.3 - call ext_flash_byte_read_plus ; read Gas Type - decfsz temp1,W ; =1 (="First")? - bra logbook_find_first_gas5 ; No. - movlw .4 - movwf temp1 - bra logbook_find_first_gas_done + ; Set pointer to Gas 4 Type. + LOG_POINT_TO log_gas4+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz ext_flash_rw,W ; =1 (="First")? + bra logbook_find_first_gas5 ; No. + movlw .4 + movwf ext_flash_rw + bra logbook_find_first_gas_done logbook_find_first_gas5: - movlw .5 ; Must be Gas5 - movwf temp1 + movlw .5 ; Must be Gas5 + movwf ext_flash_rw logbook_find_first_gas_done: - movff temp1,average_depth_hold_total+3; keep copy to restore color - rcall profile_display_color ; Back to normal profile color. - ; Pointer is now trashed! + movff ext_flash_rw,backup_color1 ; keep copy to restore color + movff ext_flash_rw,WREG ; copy gas number to WREG for color coding + call TFT_color_code_gas ; Back to normal profile color. + ; Pointer is now trashed! -; Point to profile portion of this dive - 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 + ; Point to profile portion of this dive + 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 - incf_ext_flash_address_0x20 d'2' ; Skip 0xFA 0xFA - call ext_flash_byte_read_plus_0x20 ; Read low byte of total dives into temp1 (at the time the dive was made) + incf_ext_flash_address_0x20 d'2' ; Skip 0xFA 0xFA + call ext_flash_byte_read_plus_0x20 ; Read low byte of total dives into ext_flash_rw (at the time the dive was made) ; Load total number of dives (low byte only) read_int_eeprom .2 - incf EEDATA,W ; +1 - bsf STATUS,C ; Set borrow - subfwb divesecs,W ; total dives - dive# to show - 1 = low byte of total dives (at the time the dive was made) - cpfseq temp1 ; # of dive in logbook (Must be equal with low byte in short header) - bra display_profile_no_profile ; Not equal, no profile for this dive available! + incf EEDATA,W ; +1 + bsf STATUS,C ; Set borrow + subfwb divenumber,W ; total dives - dive# to show - 1 = low byte of total dives (at the time the dive was made) + cpfseq ext_flash_rw ; # of dive in logbook (Must be equal with low byte in short header) + bra display_profile_no_profile ; Not equal, no profile for this dive available! ; Skip rest of short header: 3 Bytes ; Skip length of profile data: 3 Bytes - ; Skip sampling rate in profile section: 1Byte - ; Skip number of divisors: 1Byte - incf_ext_flash_address_0x20 d'8' + ; Skip sampling rate in profile section: 1Byte + ; Skip number of divisors: 1Byte + incf_ext_flash_address_0x20 d'8' ; Divisor temp - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movf temp1,W - movwf divisor_temperature ; Store divisor - movwf count_temperature ; Store to tp° counter too. + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movf ext_flash_rw,W + movwf divisor_temperature ; Store divisor + movwf count_temperature ; Store to tp° counter too. ; Divisor Deco - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movf temp1,W - movwf divisor_deco ; Store divisor - movwf count_deco ; Store as temp, too + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movf ext_flash_rw,W + movwf divisor_deco ; Store divisor + movwf count_deco ; Store as temp, too ; Divisor GF - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movff temp1,divisor_gf ; Store divisor + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff ext_flash_rw,divisor_gf ; Store divisor ; Divisor ppO2 Sensors - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movff temp1,divisor_ppo2_sensors ; Store divisor + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff ext_flash_rw,divisor_ppo2_sensors ; Store divisor ; Divisor decoplan - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movff temp1,divisor_decoplan ; Store divisor + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff ext_flash_rw,divisor_decoplan ; Store divisor ; Divisor CNS - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movff temp1,divisor_cns ; Store divisor + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff ext_flash_rw,divisor_cns ; Store divisor ; Divisor Tank data - incf_ext_flash_address_0x20 d'2' -; call ext_flash_byte_read_plus_0x20 ; Read information type -; call ext_flash_byte_read_plus_0x20 ; Read information Length - call ext_flash_byte_read_plus_0x20 ; Read information Divisor - movff temp1,divisor_tank ; Store divisor + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff ext_flash_rw,divisor_tank ; Store divisor ; Start Profile display - movlw color_deepblue - call TFT_set_color ; Make this configurable? - ; Draw a frame around profile area - WIN_FRAME_COLOR16 profile_top-1,profile_top+profile_height_pixels+1,profile_left-1,profile_left+profile_width_pixels+1 + movlw color_deepblue + call TFT_set_color ; Make this configurable? + ; Draw a frame around profile area + WIN_FRAME_COLOR16 profile_top-1,profile_top+profile_height_pixels+1,profile_left-1,profile_left+profile_width_pixels+1 - movlw profile_top - movwf win_top - movlw profile_left - movwf win_leftx2 ; Left border (0-159) - movlw d'1' - movwf win_height - movlw profile_width_pixels+.1 - movwf win_width+0 ; Right border (0-159) - clrf win_width+1 - bra display_profile2f ; No 0m line + movlw profile_top + movwf win_top + movlw profile_left + movwf win_leftx2 ; Left border (0-159) + movlw d'1' + movwf win_height + movlw profile_width_pixels+.1 + movwf win_width+0 ; Right border (0-159) + clrf win_width+1 + bra display_profile2f ; No 0m line display_profile2e: - call TFT_box ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 + call TFT_box ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 display_profile2f: - movf win_top,W ; Get row - addwf x_scale+0,W ; Add line interval distance to win_top - tstfsz x_scale+1 ; >255? - movlw d'255' ; Yes, make win_top>239 -> Abort here - btfsc STATUS,C ; A Cary from the addwf above? - movlw d'255' ; Yes, make win_top>239 -> Abort here - movwf win_top ; Result in win_top again - movlw profile_top+profile_height_pixels+.1 ; Limit - cpfsgt win_top ; >239? - bra display_profile2e ; No, draw another line + movf win_top,W ; Get row + addwf x_scale+0,W ; Add line interval distance to win_top + tstfsz x_scale+1 ; >255? + movlw d'255' ; Yes, make win_top>239 -> Abort here + btfsc STATUS,C ; A Cary from the addwf above? + movlw d'255' ; Yes, make win_top>239 -> Abort here + movwf win_top ; Result in win_top again + movlw profile_top+profile_height_pixels+.1 ; Limit + cpfsgt win_top ; >239? + bra display_profile2e ; No, draw another line - clrf timeout_counter2 ; here: used as counter for depth readings - movlw profile_width_pixels+profile_left-.1 - movwf ignore_digits ; here: used as counter for x-pixels - bcf end_of_profile ; clear flag + clrf gaslist_gas ; here: used as counter for depth readings + movlw profile_width_pixels+profile_left-.1 + movwf ignore_digits ; here: used as counter for x-pixels + bcf end_of_profile ; clear flag - movlw profile_left+.1 - movwf logbook_pixel_x_pos ; here: used as colum x2 (Start at Colum 5) + movlw profile_left+.1 + movwf logbook_pixel_x_pos ; here: used as colum x2 (Start at Colum 5) - movlw profile_top+.1 ; Zero-m row - movwf apnoe_mins ; here: used for fill between rows - movwf logbook_last_tp ; Initialise for Tp° curve too. + movlw profile_top+.1 ; Zero-m row + movwf fill_between_rows + movwf logbook_last_tp ; Initialize for Tp° curve too. + + movlw LOW(-.100) ; Initialize max tp° to -10.0 °C. + movwf logbook_max_tp+0 + movlw HIGH 0xFFFF & (-.100) + movwf logbook_max_tp+1 - movlw LOW(-.100) ; Initialize max tp° to -10.0 °C. - movwf logbook_max_tp+0 - movlw HIGH 0xFFFF & (-.100) - movwf logbook_max_tp+1 - - setf logbook_cur_tp+0 ; Initialize Tp°, before the first recorded point. - setf logbook_cur_tp+1 - clrf logbook_last_tp ; Also reset previous Y for Tp° - clrf logbook_ceiling ; Ceiling = 0, correct value for no ceiling. - movlw profile_top+.1 - movwf logbook_min_temp_pos ; Initialize for displaying the lowest temperature - movlw profile_top+profile_height_pixels - movwf logbook_max_temp_pos ; Initialize for displaying the highest temperature + setf logbook_cur_tp+0 ; Initialize Tp°, before the first recorded point. + setf logbook_cur_tp+1 + clrf logbook_last_tp ; Also reset previous Y for Tp° + clrf logbook_ceiling ; Ceiling = 0, correct value for no ceiling. + movlw profile_top+.1 + movwf logbook_min_temp_pos ; Initialize for displaying the lowest temperature + movlw profile_top+profile_height_pixels + movwf logbook_max_temp_pos ; Initialize for displaying the highest temperature - movlw profile_left - movwf win_leftx2 - movlw profile_top - movwf win_top - movlw profile_height_pixels - movwf win_height - movlw LOW (profile_width_pixels*.2) - movwf win_width+0 - movlw HIGH (profile_width_pixels*.2) - movwf win_width+1 - call TFT_box_write ; open box for d1 + movlw profile_left + movwf win_leftx2 + movlw profile_top + movwf win_top + movlw profile_height_pixels + movwf win_height + movlw LOW (profile_width_pixels*.2) + movwf win_width+0 + movlw HIGH (profile_width_pixels*.2) + movwf win_width+1 + call TFT_box_write ; open box for d1 -; INIT_PIXEL_WRITE logbook_pixel_x_pos ; pixel x2 (Also sets standard Color!) +; INIT_PIXEL_WRITE logbook_pixel_x_pos ; pixel x2 (also sets standard color!) profile_display_loop: ; Init pixel write - movf logbook_pixel_x_pos,W - mullw 2 - call pixel_write_col320 - - movff profile_temp+0,profile_temp2+0 - movff profile_temp+1,profile_temp2+1 ; 16Bit x-scaler - incf profile_temp2+1,F - tstfsz profile_temp2+0 ; Must not be Zero - bra profile_display_loop2 ; Not Zero! - incf profile_temp2+0,F ; Zero, Increase! + movf logbook_pixel_x_pos,W + mullw 2 + call pixel_write_col320 + + movff profile_temp1+0,profile_temp2+0 + movff profile_temp1+1,profile_temp2+1 ; 16Bit x-scaler + incf profile_temp2+1,F + tstfsz profile_temp2+0 ; Must not be Zero + bra profile_display_loop2 ; Not Zero! + incf profile_temp2+0,F ; Zero, Increase! profile_display_loop2: - rcall profile_view_get_depth ; reads depth, temp and profile data + rcall profile_view_get_depth ; reads depth, temp and profile data - btfsc end_of_profile ; end-of profile reached? - bra profile_display_loop_done ; Yes, skip all remaining pixels + btfsc end_of_profile ; end-of profile reached? + bra profile_display_loop_done ; Yes, skip all remaining pixels - ;---- Draw Ceiling curve, if any --------------------------------------------- - movf divisor_deco,W - bz profile_display_skip_deco + ;---- Draw Ceiling curve, if any --------------------------------------------- + movf divisor_deco,W + bz profile_display_skip_deco - movf logbook_ceiling,W ; Any deco ceiling ? - bz profile_display_skip_deco + movf logbook_ceiling,W ; Any deco ceiling ? + bz profile_display_skip_deco - mullw .100 ; Yes: convert to mbar - movff PRODL,sub_a+0 - movff PRODH,sub_a+1 - movff logbook_cur_depth+0,sub_b+0 ; Compare with UNSIGNED current depth (16bits) - movff logbook_cur_depth+1,sub_b+1 - call subU16 ; set (or not) neg_flag + mullw .100 ; Yes: convert to mbar + movff PRODL,sub_a+0 + movff PRODH,sub_a+1 + movff logbook_cur_depth+0,sub_b+0 ; Compare with UNSIGNED current depth (16bits) + movff logbook_cur_depth+1,sub_b+1 + call subU16 ; set (or not) neg_flag - movlw color_dark_green ; Dark green if Ok, - btfss neg_flag - movlw color_dark_red ; Or dark red if ceiling overflown. - call TFT_set_color - - movff PRODL,xA+0 - movff PRODH,xA+1 - movff y_scale+0,xB+0 ; devide pressure in mbar/quant for row offsett - movff y_scale+1,xB+1 - call div16x16 ; xA/xB=xC + movlw color_dark_green ; Dark green if Ok, + btfss neg_flag + movlw color_dark_red ; Or dark red if ceiling overflown. + call TFT_set_color - movlw profile_top+.1 ; Starts right after the top line. - movwf win_top - movff logbook_pixel_x_pos,win_leftx2 ; Left border (0-159) - movff xC+0,win_height - call half_vertical_line ; Inputs: win_top, win_leftx2, win_height, win_color1, win_color2 + movff PRODL,xA+0 + movff PRODH,xA+1 + movff y_scale+0,xB+0 ; divide pressure in mbar/quant for row offset + movff y_scale+1,xB+1 + call div16x16 ; xA/xB=xC + + movlw profile_top+.1 ; Starts right after the top line. + movwf win_top + movff logbook_pixel_x_pos,win_leftx2 ; Left border (0-159) + movff xC+0,win_height + call half_vertical_line ; Inputs: win_top, win_leftx2, win_height, win_color1, win_color2 profile_display_skip_deco: - ;---- Draw Tp° curve, if any --------------------------------------------- - movf divisor_temperature,W - bz profile_display_skip_temp + ;---- Draw Tp° curve, if any --------------------------------------------- + movf divisor_temperature,W + bz profile_display_skip_temp - movf logbook_cur_tp+0,W ; Did we had already a valid Tp°C record ? - andwf logbook_cur_tp+1,W - incf WREG - bz profile_display_skip_temp ; No: just skip drawing. + movf logbook_cur_tp+0,W ; Did we had already a valid Tp°C record ? + andwf logbook_cur_tp+1,W + incf WREG + bz profile_display_skip_temp ; No: just skip drawing. - movlw LOW(((profile_height_pixels-.10)*.256)/.370) ; fixed tp° scale: (-2 .. +35°C * scale256 )/153pix - movwf xB+0 - movlw HIGH(((profile_height_pixels-.10)*.256)/.370) - movwf xB+1 + movlw LOW (((profile_height_pixels-.10)*.256)/.370) ; fixed tp° scale: (-2 .. +35°C * scale256 )/153pix + movwf xB+0 + movlw HIGH (((profile_height_pixels-.10)*.256)/.370) + movwf xB+1 - movf logbook_cur_tp+0,W ; Current Tp° - (-2.0°C) == Tp° + 20. - addlw LOW(.20) ; Low byte. - movwf xA+0 - movf logbook_cur_tp+1,W - btfsc STATUS,C ; Propagate carry, if any - incf WREG - movwf xA+1 - call mult16x16 ; xA*xB=xC + movf logbook_cur_tp+0,W ; Current Tp° - (-2.0°C) == Tp° + 20. + addlw LOW(.20) ; Low byte. + movwf xA+0 + movf logbook_cur_tp+1,W + btfsc STATUS,C ; Propagate carry, if any + incf WREG + movwf xA+1 + call mult16x16 ; xA*xB=xC - ; scale: divide by 256, ie. take just high byte. - movf xC+1,W - sublw profile_top+profile_height_pixels-.10 ; Upside-down: Y = .75 + (.153 - result) - movwf xC+0 + ; scale: divide by 256, ie. take just high byte. + movf xC+1,W + sublw profile_top+profile_height_pixels-.10 ; Upside-down: Y = .75 + (.153 - result) + movwf xC+0 ; Check limits - movlw profile_top+.1 - movwf xC+1 - cpfsgt xC+0 - movff xC+1,xC+0 + movlw profile_top+.1 + movwf xC+1 + cpfsgt xC+0 + movff xC+1,xC+0 - movlw color_orange - call TFT_set_color + movlw color_orange + call TFT_set_color - movf logbook_last_tp,W ; do we have a valid previous value ? - bz profile_display_temp_1 ; No: skip the vertical line. - movwf xC+1 - call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) + movf logbook_last_tp,W ; do we have a valid previous value ? + bz profile_display_temp_1 ; No: skip the vertical line. + movwf xC+1 + call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) profile_display_temp_1: - movf xC+0,W ; current row - cpfsgt logbook_min_temp_pos ; check limit - movwf logbook_min_temp_pos ; lowest row in the temp graph - cpfslt logbook_max_temp_pos ; check limit - movwf logbook_max_temp_pos ; lowest row in the temp graph + movf xC+0,W ; current row + cpfsgt logbook_min_temp_pos ; check limit + movwf logbook_min_temp_pos ; lowest row in the temp graph + cpfslt logbook_max_temp_pos ; check limit + movwf logbook_max_temp_pos ; highest row in the temp graph - movff xC+0,logbook_last_tp - PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a current color pixel. + movff xC+0,logbook_last_tp + PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a current color pixel. profile_display_skip_temp: - ;---- Draw depth curve --------------------------------------------------- - movff y_scale+0,xB+0 ; devide pressure in mbar/quant for row offsett - movff y_scale+1,xB+1 - movff logbook_cur_depth+0,xA+0 - movff logbook_cur_depth+1,xA+1 - call div16x16 ; xA/xB=xC - movlw profile_top+.1 - addwf xC+0,F ; add 75 pixel offset to result - - btfsc STATUS,C ; Ignore potential profile errors - movff apnoe_mins,xC+0 + ;---- Draw depth curve --------------------------------------------------- + movff y_scale+0,xB+0 ; divide pressure in mbar/quant for row offset + movff y_scale+1,xB+1 + movff logbook_cur_depth+0,xA+0 + movff logbook_cur_depth+1,xA+1 + call div16x16 ; xA/xB=xC + movlw profile_top+.1 + addwf xC+0,F ; add 75 pixel offset to result + + btfsc STATUS,C ; Ignore potential profile errors + movff fill_between_rows,xC+0 - rcall profile_display_color ; Back to normal profile color. + movff backup_color1,WREG ; copy gas number to WREG for color-coding + call TFT_color_code_gas ; Back to normal profile color. - movff apnoe_mins,xC+1 - call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) - movff xC+0,apnoe_mins ; Store last row for fill routine + movff fill_between_rows,xC+1 + call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) + movff xC+0,fill_between_rows ; Store last row for fill routine - PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a std color pixel. - incf logbook_pixel_x_pos,F ; Next column + PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a std color pixel. + incf logbook_pixel_x_pos,F ; Next column - ;---- Draw Marker square , if any ---------------------------------------- - btfss log_marker_found ; Any marker to draw? - bra profile_display_skip_marker ; No + ;---- Draw Marker square , if any ---------------------------------------- + btfss log_marker_found ; Any marker to draw? + bra profile_display_skip_marker ; No - ; tiny "m" - incf apnoe_mins,W ; increase row (Y) - movwf win_top - ; limit win_top to 220 - movlw .220 - cpfslt win_top - movwf win_top - decf logbook_pixel_x_pos,W ; decrease column (X) - movwf win_leftx2 - ; limit win_leftx2 to 151 - movlw .151 - cpfslt win_leftx2 - movwf win_leftx2 + ; tiny "m" + incf fill_between_rows,W ; increase row (Y) + movwf win_top + ; limit win_top to 220 + movlw .220 + cpfslt win_top + movwf win_top + decf logbook_pixel_x_pos,W ; decrease column (X) + movwf win_leftx2 + ; limit win_leftx2 to 151 + movlw .151 + cpfslt win_leftx2 + movwf win_leftx2 - movlw color_orange - call TFT_set_color - WIN_FONT FT_TINY - lfsr FSR2,buffer - STRCPY_PRINT "m" - bcf log_marker_found ; Clear flag - - movlw profile_left - movwf win_leftx2 - movlw profile_top - movwf win_top - movlw profile_height_pixels - movwf win_height - movlw LOW (profile_width_pixels*.2) - movwf win_width+0 - movlw HIGH (profile_width_pixels*.2) - movwf win_width+1 - call TFT_box_write ; re-open box for d1 + movlw color_orange + call TFT_set_color + WIN_FONT FT_TINY + lfsr FSR2,buffer + STRCPY_PRINT "m" + bcf log_marker_found ; Clear flag + + movlw profile_left + movwf win_leftx2 + movlw profile_top + movwf win_top + movlw profile_height_pixels + movwf win_height + movlw LOW (profile_width_pixels*.2) + movwf win_width+0 + movlw HIGH (profile_width_pixels*.2) + movwf win_width+1 + call TFT_box_write ; re-open box for d1 profile_display_skip_marker: - ;---- Draw CNS curve, if any --------------------------------------------- - movf divisor_cns,W - bz profile_display_skip_cns - ; - ; TODO HERE - ; + ;---- Draw CNS curve, if any --------------------------------------------- + movf divisor_cns,W + bz profile_display_skip_cns + ; + ; TODO HERE + ; profile_display_skip_cns: - ;---- Draw GF curve, if any ---------------------------------------------- - movf divisor_gf,W - bz profile_display_skip_gf - ; - ; TODO HERE - ; + ;---- Draw GF curve, if any ---------------------------------------------- + movf divisor_gf,W + bz profile_display_skip_gf + ; + ; TODO HERE + ; profile_display_skip_gf: - ;---- All curves done. - -profile_display_skip_loop1: ; skips readings! - dcfsnz profile_temp2+0,F - bra profile_display_loop3 ; check 16bit.... + ;---- All curves done. + +profile_display_skip_loop1: ; skips readings! + dcfsnz profile_temp2+0,F + bra profile_display_loop3 ; check 16bit.... - rcall profile_view_get_depth ; reads depth, temp and profile data + rcall profile_view_get_depth ; reads depth, temp and profile data - btfsc end_of_profile ; end-of profile reached? - bra profile_display_loop_done ; Yes, skip all remaining pixels + btfsc end_of_profile ; end-of profile reached? + bra profile_display_loop_done ; Yes, skip all remaining pixels - bra profile_display_skip_loop1 + bra profile_display_skip_loop1 profile_display_loop3: - decfsz profile_temp2+1,F ; 16 bit x-scaler test - bra profile_display_skip_loop1 ; skips readings! + decfsz profile_temp2+1,F ; 16 bit x-scaler test + bra profile_display_skip_loop1 ; skips readings! - decfsz ignore_digits,F ; counts drawn x-pixels to zero - bra profile_display_loop ; Not ready yet -; Done. + decfsz ignore_digits,F ; counts drawn x-pixels to zero + bra profile_display_loop ; Not ready yet + ; Done. -display_profile_no_profile: ; No profile available for this dive! +display_profile_no_profile: ; No profile available for this dive! profile_display_loop_done: - btfss is_bailout ; Bailout during the dive? - bra profile_display_loop_done_nobail ; No - ; Yes, show "Bailout" - movlw color_pink - call TFT_set_color - WIN_TINY logbook_bailout_column,logbook_bailout_row - STRCPY_TEXT_PRINT tDiveBailout ; Bailout + btfss is_bailout ; Bailout during the dive? + bra profile_display_loop_done_nobail ; No + ; Yes, show "Bailout" + movlw color_pink + call TFT_set_color + WIN_TINY logbook_bailout_column,logbook_bailout_row + STRCPY_TEXT_PRINT tDiveBailout ; Bailout profile_display_loop_done_nobail: - btfss gas6_changed ; Gas6 - bra profile_display_loop_done_nogas6 ; No - ; Yes, show "Gas 6!" - movlw color_pink - call TFT_set_color - WIN_TINY logbook_bailout_column,logbook_bailout_row-.15 - STRCPY_TEXT tGas ; Gas - STRCAT_PRINT " 6!" + btfss gas6_changed ; Gas6 + bra profile_display_loop_done_nogas6 ; No + ; Yes, show "Gas 6!" + movlw color_pink + call TFT_set_color + WIN_TINY logbook_bailout_column,logbook_bailout_row-.15 + STRCPY_TEXT tGas ; Gas + STRCAT_PRINT " 6!" profile_display_loop_done_nogas6: - decf divesecs,F ;-1 + decf divenumber,F ;-1 read_int_eeprom .2 - movf EEDATA,W - bcf STATUS,C - subfwb divesecs,W ; max. dives (low value) - divesecs - movwf lo ; result - incf divesecs,F ;+1 + movf EEDATA,W + bcf STATUS,C + subfwb divenumber,W ; max. dives (low value) - divenumber + movwf lo ; result + incf divenumber,F ;+1 ; 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 (And hi>0...) - 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 + 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 ; pointer at the first 0xFA of header - movff logbook_min_temp_pos,win_top ; Y position at lowest temperature - movff logbook_pixel_x_pos,win_leftx2 - movlw .130 - cpfslt win_leftx2 ; limit left border to 130 - movwf win_leftx2 - WIN_FONT FT_TINY - movlw color_orange ; Use same color as tp° curve - call TFT_set_color + movff logbook_min_temp_pos,win_top ; Y position at lowest temperature + movff logbook_pixel_x_pos,win_leftx2 + movlw .130 + cpfslt win_leftx2 ; limit left border to 130 + movwf win_leftx2 + WIN_FONT FT_TINY + movlw color_orange ; Use same color as tp° curve + call TFT_set_color - movff logbook_min_tp+0,lo - movff logbook_min_tp+1,hi - lfsr FSR2,buffer + movff logbook_min_tp+0,lo + movff logbook_min_tp+1,hi + lfsr FSR2,buffer - TSTOSS opt_units ; 0=°C, 1=°F + TSTOSS opt_units ; 0=°C, 1=°F bra logbook_show_temp_metric ;logbook_show_temp_imperial: - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit - lfsr FSR2,buffer ; Overwrite "-" - bsf ignore_digit5 ; Full degrees only + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + call convert_celsius_to_fahrenheit ; convert value in lo:hi from Celsius to Fahrenheit + lfsr FSR2,buffer ; Overwrite "-" + bsf ignore_digit5 ; Full degrees only output_16 - STRCAT_TEXT_PRINT tLogTunitF - ; Now, the max. temperature - movlw .15 - subwf logbook_max_temp_pos,W - movff WREG,win_top ; Y position at max temperature - movff logbook_max_tp+0,lo - movff logbook_max_tp+1,hi - lfsr FSR2,buffer - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit + STRCAT_TEXT_PRINT tLogTunitF + ; Now, the max. temperature + movlw .15 + subwf logbook_max_temp_pos,W + movff WREG,win_top ; Y position at max temperature + movff logbook_max_tp+0,lo + movff logbook_max_tp+1,hi + lfsr FSR2,buffer + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + call convert_celsius_to_fahrenheit ; convert value in lo:hi from Celsius to Fahrenheit output_16 bcf ignore_digit5 - STRCAT_TEXT_PRINT tLogTunitF + STRCAT_TEXT_PRINT tLogTunitF bra logbook_show_temp_common logbook_show_temp_metric: - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required movlw d'3' movwf ignore_digits bsf leftbind - output_16dp d'2' ; temperature - STRCAT_TEXT_PRINT tLogTunitC - ; Now, the max. temperature - movlw .15 - subwf logbook_max_temp_pos,W - movwf win_top ; Y position at max temperature - movff logbook_max_tp+0,lo - movff logbook_max_tp+1,hi - lfsr FSR2,buffer - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16dp d'2' ; temperature + STRCAT_TEXT_PRINT tLogTunitC + ; Now, the max. temperature + movlw .15 + subwf logbook_max_temp_pos,W + movwf win_top ; Y position at max temperature + movff logbook_max_tp+0,lo + movff logbook_max_tp+1,hi + lfsr FSR2,buffer + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required movlw d'3' movwf ignore_digits bsf leftbind - output_16dp d'2' ; temperature - STRCAT_TEXT_PRINT tLogTunitC + output_16dp d'2' ; temperature + STRCAT_TEXT_PRINT tLogTunitC logbook_show_temp_common: bcf leftbind - call TFT_standard_color + call TFT_standard_color ; Get pointer to Gaslist - LOG_POINT_TO log_gas1 - - movlw color_white ; Color for Gas 1 - call TFT_set_color ; Set Color... - bsf leftbind - WIN_TINY log_gas_column1, log_gas_row - rcall log_show_gas_common + LOG_POINT_TO log_gas1 + bsf log_show_gas_short ; do the short version of log_show_gas + bsf leftbind - movlw color_green ; Color for Gas 2 - call TFT_set_color ; Set Color... - WIN_TINY log_gas_column2, log_gas_row - rcall log_show_gas_common + WIN_TINY log_gas_column1, log_gas_row + movlw .1 ; Color for Gas 1 + call log_show_gas - movlw color_red ; Color for Gas 3 - call TFT_set_color ; Set Color... - WIN_TINY log_gas_column3, log_gas_row - rcall log_show_gas_common - - movlw color_yellow ; Color for Gas 4 - call TFT_set_color ; Set Color... - WIN_TINY log_gas_column4, log_gas_row - rcall log_show_gas_common + WIN_TINY log_gas_column2, log_gas_row + movlw .2 ; Color for Gas 2 + call log_show_gas - movlw color_cyan ; Color for Gas 5 - call TFT_set_color ; Set Color... - WIN_TINY log_gas_column5, log_gas_row - rcall log_show_gas_common + WIN_TINY log_gas_column3, log_gas_row + movlw .3 ; Color for Gas 3 + call log_show_gas - rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco -display_profile_loop: - ; REPLACE ## logbook look and feel - ; btfsc switch_left ; SET/MENU? - ; BY - btfsc switch_right - bra logbook_page2 ; Show more information - ; REPLACE ## logbook look and feel - ; btfsc switch_right ; ENTER? - ; BY - btfsc switch_left - bra exit_profileview ; back to list + WIN_TINY log_gas_column4, log_gas_row + movlw .4 ; Color for Gas 4 + call log_show_gas - rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_profile_loop ; wait for something to do + WIN_TINY log_gas_column5, log_gas_row + movlw .5 ; Color for Gas 5 + call log_show_gas + + bcf leftbind - global log_screendump_and_onesecond -log_screendump_and_onesecond: ; Check if we need to make a screenshot and check for new second - btfsc onesecupdate - call timeout_surfmode ; Timeout - btfsc onesecupdate - call set_dive_modes ; Check, if divemode must be entered - bcf onesecupdate ; one second update - btfsc divemode - goto restart ; Enter Divemode if required + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco +display_profile_loop: + btfsc switch_right + bra logbook_page2 ; Show more information + btfsc switch_left + bra exit_profileview ; back to list - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - bra log_screendump_and_onesecond2 - btfsc vusb_in ; USB plugged in? - call comm_mode ; Start COMM mode - return -log_screendump_and_onesecond2: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag - call rs232_get_byte - btfsc rs232_recieve_overflow - return - movlw "l" - cpfseq RCREG1 - return - goto TFT_dump_screen ; Dump the screen contents and return + rcall log_screendump_and_onesecond ; Check if we need to make a screen-shot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_profile_loop ; wait for something to do -log_show_gas_common: - extern customview_show_mix - lfsr FSR2,buffer - call ext_flash_byte_read_plus ; Gas2 current O2 - movff temp1,lo - call ext_flash_byte_read_plus ; Gas2 current He - movff temp1,hi - call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - STRCAT_PRINT "" - call ext_flash_byte_read_plus ; Gas2 change depth - goto ext_flash_byte_read_plus ; Gas2 Type and return + global log_screendump_and_onesecond +log_screendump_and_onesecond: ; Check if we need to make a screen-shot and check for new second + btfsc onesecupdate + call timeout_surfmode ; Timeout + btfsc onesecupdate + call set_dive_modes ; Check, if divemode must be entered + bcf onesecupdate ; one second update + btfsc divemode + goto restart ; Enter divemode if required -;============================================================================= -profile_display_color: - movff average_depth_hold_total+3,active_gas ; Restore gas color. - movlw color_white ; Default color - dcfsnz active_gas,F - movlw color_white ; Color for Gas 1 - dcfsnz active_gas,F - movlw color_green ; Color for Gas 2 - dcfsnz active_gas,F - movlw color_red ; Color for Gas 3 - dcfsnz active_gas,F - movlw color_yellow ; Color for Gas 4 - dcfsnz active_gas,F - movlw color_cyan ; Color for Gas 5 - dcfsnz active_gas,F - movlw color_pink ; Color for Gas 6 - goto TFT_set_color ; Set Color... + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + bra log_screendump_and_onesecond2 + btfsc vusb_in ; USB plugged in? + call comm_mode ; Start COMM mode + return +log_screendump_and_onesecond2: + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag + call rs232_get_byte + btfsc rs232_receive_overflow + return + movlw "l" + cpfseq RCREG1 + return + goto TFT_dump_screen ; Dump the screen contents and return ;============================================================================= ; Draw a vertical line between xC+1 and xC+0, at current X position. @@ -1212,874 +1208,852 @@ ; Note: ascending or descending ! ; profile_display_fill: - ; First, check if xC+0>apnoe_mins or xC+0 fill_between_rows or xC+0 < aponoe_mins movf xC+0,W - cpfseq xC+1 ; xC+0 = apone_mins? - bra profile_display_fill2 ; No! + cpfseq xC+1 ; xC+0 = apone_mins? + bra profile_display_fill2 ; No! return profile_display_fill2: - ; Make sure to init X position. - movf logbook_pixel_x_pos,W - mullw 2 - decf PRODL,F - movlw 0 - subwfb PRODH,F - call pixel_write_col320 + ; Make sure to init X position. + movf logbook_pixel_x_pos,W + mullw 2 + decf PRODL,F + movlw 0 + subwfb PRODH,F + call pixel_write_col320 movf xC+0,W - cpfsgt xC+1 ; apnoe_mins>xC+0? - bra profile_display_fill_up ; Yes! + cpfsgt xC+1 ; fill_between_rows > xC+0? + bra profile_display_fill_up ; Yes! -profile_display_fill_down2: ; Loop +profile_display_fill_down2: ; Loop decf xC+1,F - HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) movf xC+0,W - cpfseq xC+1 ; Loop until xC+1=xC+0 + cpfseq xC+1 ; Loop until xC+1 = xC+0 bra profile_display_fill_down2 - return ; apnoe_mins and xC+0 are untouched + return ; fill_between_rows and xC+0 are untouched -profile_display_fill_up: ; Fill upwards from xC+0 to apone_mins! +profile_display_fill_up: ; Fill upwards from xC+0 to apone_mins! incf xC+1,F - HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) movf xC+0,W - cpfseq xC+1 ; Loop until xC+1=apnoe_mins + cpfseq xC+1 ; Loop until xC+1 = fill_between_rows bra profile_display_fill_up - return ; apnoe_mins and xC+0 are untouched + return ; fill_between_rows and xC+0 are untouched ;============================================================================= profile_view_get_depth: - infsnz logbook_sample_counter+0,F - incf logbook_sample_counter+1,F ; Count read pixels + infsnz logbook_sample_counter+0,F + incf logbook_sample_counter+1,F ; Count read pixels - movf logbook_sample_counter+0,W - cpfseq average_depth_hold_total+0 - bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue - movf logbook_sample_counter+1,W - cpfseq average_depth_hold_total+1 - bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue + movf logbook_sample_counter+0,W + cpfseq vertical_interval+0 + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue + movf logbook_sample_counter+1,W + cpfseq vertical_interval+1 + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue ; draw a new 10min line here... - clrf logbook_sample_counter+0 - clrf logbook_sample_counter+1 ; clear counting registers for next line + clrf logbook_sample_counter+0 + clrf logbook_sample_counter+1 ; clear counting registers for next line ; Vertical lines... - movlw color_deepblue - call TFT_set_color ; Make this configurable? - movlw profile_top+.1 - movwf win_top - incf logbook_pixel_x_pos,W ; draw one line to right to make sure it's the background of the profile - movwf win_leftx2 ; Left border (0-159) - movlw profile_height_pixels - movwf win_height - movlw profile_height_pixels - movwf win_width ; "Window" height - call half_horizontal_line ; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2 + movlw color_deepblue + call TFT_set_color ; Make this configurable? + movlw profile_top+.1 + movwf win_top + incf logbook_pixel_x_pos,W ; draw one line to right to make sure it's the background of the profile + movwf win_leftx2 ; Left border (0-159) + movlw profile_height_pixels + movwf win_height + movlw profile_height_pixels + movwf win_width ; "Window" height + call half_horizontal_line ; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2 profile_view_get_depth_no_line: - call ext_flash_byte_read_plus_0x20 ; read depth first - movff temp1,logbook_cur_depth+0 ; low value - call ext_flash_byte_read_plus_0x20 ; read depth first - movff temp1,logbook_cur_depth+1 ; high value - call ext_flash_byte_read_plus_0x20 ; read Profile Flag Byte - movff temp1,timeout_counter2 ; store Profile Flag Byte + call ext_flash_byte_read_plus_0x20 ; read depth first + movff ext_flash_rw,logbook_cur_depth+0 ; low value + call ext_flash_byte_read_plus_0x20 ; read depth first + movff ext_flash_rw,logbook_cur_depth+1 ; high value + call ext_flash_byte_read_plus_0x20 ; read Profile Flag Byte + movff ext_flash_rw,gaslist_gas ; store Profile Flag Byte - bcf event_occured ; clear flag - btfsc timeout_counter2,7 - bsf event_occured ; We also have an Event byte! - bcf timeout_counter2,7 ; Clear Event Byte Flag (If any) - ; timeout_counter2 now holds the number of additional bytes to ignore (0-127) - movlw 0xFD ; end of profile bytes? - cpfseq logbook_cur_depth+0 - bra profile_view_get_depth_new1 ; no 1st. 0xFD - cpfseq logbook_cur_depth+1 - bra profile_view_get_depth_new1 ; no 2nd. 0xFD - bsf end_of_profile ; End found! Set Flag! Skip remaining pixels! + bcf event_occured ; clear flag + btfsc gaslist_gas,7 + bsf event_occured ; We also have an Event byte! + bcf gaslist_gas,7 ; Clear Event Byte Flag (If any) + ; gaslist_gas now holds the number of additional bytes to ignore (0-127) + movlw 0xFD ; end of profile bytes? + cpfseq logbook_cur_depth+0 + bra profile_view_get_depth_new1 ; no 1st. 0xFD + cpfseq logbook_cur_depth+1 + bra profile_view_get_depth_new1 ; no 2nd. 0xFD + bsf end_of_profile ; End found! Set Flag! Skip remaining pixels! return profile_view_get_depth_new1: - btfsc event_occured ; Was there an event attached to this sample? - rcall profile_view_get_depth_events ; Yes, get information about this event(s) - - ;---- Read Tp°, if any AND divisor reached AND bytes available ----------- - movf divisor_temperature,W ; Is Tp° divisor null ? - bz profile_view_get_depth_no_tp ; Yes: no Tp° curve. - decf count_temperature,F ; Decrement tp° counter - bnz profile_view_get_depth_no_tp ; No temperature this time - - call ext_flash_byte_read_plus_0x20 ; Tp° low - decf timeout_counter2,F - movff temp1,logbook_cur_tp+0 - call ext_flash_byte_read_plus_0x20 ; Tp° high - decf timeout_counter2,F - movff temp1,logbook_cur_tp+1 - movff divisor_temperature,count_temperature ; Restart counter. - - ; Compute Tp° max on the fly... - movff logbook_cur_tp+0,sub_a+0 ; Compare cur_tp > max_tp ? - movff logbook_cur_tp+1,sub_a+1 - movff logbook_max_tp+0,sub_b+0 - movff logbook_max_tp+1,sub_b+1 - call sub16 ; SIGNED sub_a - sub_b - btfsc neg_flag - bra profile_view_get_depth_no_tp + btfsc event_occured ; Was there an event attached to this sample? + rcall profile_view_get_depth_events ; Yes, get information about this event(s) + + ;---- Read Tp°, if any AND divisor reached AND bytes available ----------- + movf divisor_temperature,W ; Is Tp° divisor null ? + bz profile_view_get_depth_no_tp ; Yes: no Tp° curve. + decf count_temperature,F ; Decrement tp° counter + bnz profile_view_get_depth_no_tp ; No temperature this time - ; store max. temp only below start_dive_threshold (1,0m) - tstfsz logbook_cur_depth+1 ; > 2,56m? - bra profile_view_compute_max_temp ; Yes, include in max. temp measurement - movlw start_dive_threshold ; 1,0m - cpfsgt logbook_cur_depth+0 ; low value - bra profile_view_get_depth_no_tp ; above 1,0m, ignore temp + call ext_flash_byte_read_plus_0x20 ; Tp° low + decf gaslist_gas,F + movff ext_flash_rw,logbook_cur_tp+0 + call ext_flash_byte_read_plus_0x20 ; Tp° high + decf gaslist_gas,F + movff ext_flash_rw,logbook_cur_tp+1 + movff divisor_temperature,count_temperature ; Restart counter. + + ; Compute Tp° max on the fly... + movff logbook_cur_tp+0,sub_a+0 ; Compare cur_tp > max_tp ? + movff logbook_cur_tp+1,sub_a+1 + movff logbook_max_tp+0,sub_b+0 + movff logbook_max_tp+1,sub_b+1 + call sub16 ; SIGNED sub_a - sub_b + btfsc neg_flag + bra profile_view_get_depth_no_tp + + ; store max. temp only below start_dive_threshold (1,0m) + tstfsz logbook_cur_depth+1 ; > 2,56m? + bra profile_view_compute_max_temp ; Yes, include in max. temp measurement + movlw start_dive_threshold ; 1,0m + cpfsgt logbook_cur_depth+0 ; low value + bra profile_view_get_depth_no_tp ; above 1,0m, ignore temp profile_view_compute_max_temp: - movff logbook_cur_tp+0,logbook_max_tp+0 - movff logbook_cur_tp+1,logbook_max_tp+1 - - ;---- Read deco, if any AND divisor=0 AND bytes available ---------------- + movff logbook_cur_tp+0,logbook_max_tp+0 + movff logbook_cur_tp+1,logbook_max_tp+1 + + ;---- Read deco, if any AND divisor=0 AND bytes available ---------------- profile_view_get_depth_no_tp: - movf divisor_deco,W - bz profile_view_get_depth_no_deco - decf count_deco,F - bnz profile_view_get_depth_no_deco - - call ext_flash_byte_read_plus_0x20 - decf timeout_counter2,F - movff temp1,logbook_ceiling - movff divisor_deco,count_deco ; Restart counter. - call ext_flash_byte_read_plus_0x20 ; Skip stop length - decf timeout_counter2,F + movf divisor_deco,W + bz profile_view_get_depth_no_deco + decf count_deco,F + bnz profile_view_get_depth_no_deco - ;---- Read GF, if any AND divisor=0 AND bytes available ------------------ + call ext_flash_byte_read_plus_0x20 + decf gaslist_gas,F + movff ext_flash_rw,logbook_ceiling + movff divisor_deco,count_deco ; Restart counter. + call ext_flash_byte_read_plus_0x20 ; Skip stop length + decf gaslist_gas,F + + ;---- Read GF, if any AND divisor=0 AND bytes available ------------------ profile_view_get_depth_no_deco: - ; Then skip remaining bytes... - movf timeout_counter2,W ; number of additional bytes to ignore (0-127) - tstfsz timeout_counter2 ; Anything to skip? - call incf_ext_flash_address0_0x20 ; Yes, increases bytes in ext_flash_address:3 with 0x200000 bank switching + ; Then skip remaining bytes... + movf gaslist_gas,W ; number of additional bytes to ignore (0-127) + tstfsz gaslist_gas ; Anything to skip? + call incf_ext_flash_address0_0x20 ; Yes, increases bytes in ext_flash_address:3 with 0x200000 bank switching return profile_view_get_depth_events: - clrf EventByte2 ; Clear EventByte2 - call ext_flash_byte_read_plus_0x20 ; Read Event byte - movff temp1,EventByte ; store EventByte - decf timeout_counter2,F ; reduce counter + clrf EventByte2 ; Clear EventByte2 + call ext_flash_byte_read_plus_0x20 ; Read Event byte + movff ext_flash_rw,EventByte1 ; store EventByte1 + decf gaslist_gas,F ; reduce counter - btfss EventByte,7 ; Another Event byte? - bra profile_no_second_eventbyte ; No - call ext_flash_byte_read_plus_0x20 ; Read Event byte2 - movff temp1,EventByte2 ; store EventByte2 - decf timeout_counter2,F ; reduce counter - bcf EventByte,7 ; Clear flag + btfss EventByte1,7 ; Another Event byte? + bra profile_no_second_eventbyte ; No + call ext_flash_byte_read_plus_0x20 ; Read Event byte2 + movff ext_flash_rw,EventByte2 ; store EventByte2 + decf gaslist_gas,F ; reduce counter + bcf EventByte1,7 ; Clear flag profile_no_second_eventbyte: -; Check event flags in the EventBytes - btfsc EventByte,4 ; Manual Gas Changed? - rcall logbook_event1 ; Yes! - btfsc EventByte,5 ; Stored Gas Changed? - rcall logbook_event4 ; Yes! - btfsc EventByte,6 ; Setpoint Change? - rcall logbook_event3 ; Yes! - btfsc EventByte2,0 ; Bailout? - rcall logbook_event2 ; Yes! - ; Any Alarm? - bcf EventByte,4 ; Clear bits already tested - bcf EventByte,5 - bcf EventByte,6 - movlw .6 ; manual marker? - cpfseq EventByte - return ; No, return - bsf log_marker_found ; Manual marker! Draw small yellow rectancle here - return + ; Check event flags in the EventBytes + btfsc EventByte1,4 ; Manual Gas Changed? + rcall logbook_event1 ; Yes! + btfsc EventByte1,5 ; Stored Gas Changed? + rcall logbook_event4 ; Yes! + btfsc EventByte1,6 ; Setpoint Change? + rcall logbook_event3 ; Yes! + btfsc EventByte2,0 ; Bailout? + rcall logbook_event2 ; Yes! + ; Any Alarm? + bcf EventByte1,4 ; Clear bits already tested + bcf EventByte1,5 + bcf EventByte1,6 + movlw .6 ; manual marker? + cpfseq EventByte1 + return ; No, return + bsf log_marker_found ; Manual marker! Draw small yellow rectangle here + return -logbook_event4: ; Stored Gas changed! - call ext_flash_byte_read_plus_0x20 ; Read Gas# - decf timeout_counter2,F ; reduce counter - movff temp1,average_depth_hold_total+3 - rcall profile_display_color ; Change profile color according to gas number +logbook_event4: ; Stored Gas changed! + call ext_flash_byte_read_plus_0x20 ; Read Gas# + decf gaslist_gas,F ; reduce counter + movff ext_flash_rw,backup_color1 + movff ext_flash_rw,WREG ; copy gas number to WREG for color-coding + call TFT_color_code_gas ; Change profile color according to gas number return -logbook_event1: ; Gas6 changed - bsf gas6_changed - movlw 6 ; Just color backup to 6 - movwf average_depth_hold_total+3 - rcall profile_display_color ; Back to normal profile color. - incf_ext_flash_address_0x20 .2 ; Skip two bytes - decf timeout_counter2,F ; reduce counter - decf timeout_counter2,F ; reduce counter +logbook_event1: ; Gas 6 used + bsf gas6_changed + movlw .6 ; Use Gas6 color + movwf backup_color1 + call TFT_color_code_gas ; set profile color + incf_ext_flash_address_0x20 .2 ; Skip two bytes + decf gaslist_gas,F ; reduce counter + decf gaslist_gas,F ; reduce counter return -logbook_event2: ; Bailout - bsf is_bailout ; Set flag - movff average_depth_hold_total+3,total_divetime_seconds+0 ; Backup last gas color in case we return to CCR - movlw 6 ; Use Gas6 color - movwf average_depth_hold_total+3 - rcall profile_display_color ; Back to normal profile color. - incf_ext_flash_address_0x20 .2 ; Skip two bytes - decf timeout_counter2,F ; reduce counter - decf timeout_counter2,F ; reduce counter +logbook_event2: ; Bailout + bsf is_bailout ; Set flag + movff backup_color1,backup_color2 ; Backup last gas color in case we return to CCR + movlw .6 ; Use Gas6 color + movwf backup_color1 + call TFT_color_code_gas ; Use Gas6 color + incf_ext_flash_address_0x20 .2 ; Skip two bytes + decf gaslist_gas,F ; reduce counter + decf gaslist_gas,F ; reduce counter return -logbook_event3: ; Setpoint change - incf_ext_flash_address_0x20 .1 ; Skip one byte - decf timeout_counter2,F ; reduce counter - btfss is_bailout ; Are we in bailout? - return ; No, return - ; We were in bailout before, restore profile color - movff total_divetime_seconds+0,average_depth_hold_total+3 ; Restore color - rcall profile_display_color ; Back to normal profile color. - return +logbook_event3: ; Setpoint change + incf_ext_flash_address_0x20 .1 ; Skip one byte + decf gaslist_gas,F ; reduce counter + btfss is_bailout ; Are we in bailout? + return ; No, return + ; We were in bailout before, restore profile color + movff backup_color2,backup_color1 ; Restore color + movff backup_color2,WREG ; copy gas number to WREG for color-coding + call TFT_color_code_gas ; Back to normal profile color + return exit_profileview: -; call speed_fastest - bcf sleepmode - clrf timeout_counter2 ; restore all registers to build same page again - movff divemins_backup,divemins+0 - movff logbook_divenumber_temp, logbook_divenumber - movff logbook_max_dive_counter_temp,logbook_max_dive_counter - incf logbook_max_dive_counter,F - decf logbook_divenumber,F - bcf all_dives_shown - clrf menupos3 ; here: used row on current page - movlw logbook_row_number - movwf menupos ; here: active row on current page -; call TFT_DisplayOff - call TFT_boot - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot -; call TFT_ClearScreen ; clear details/profile - goto logbook2 ; start search +; call speed_fastest + bcf sleepmode + clrf gaslist_gas ; restore all registers to build same page again + movff logbook_divenumber_temp,logbook_divenumber + movff logbook_max_dive_counter_temp,logbook_max_dive_counter + movff logbook_temp_backup,logbook_temp + incf logbook_max_dive_counter,F + decf logbook_divenumber,F + bcf all_dives_shown + clrf menupos3 ; here: used row on current page + movlw logbook_row_number + movwf menupos1 ; here: active row on current page +; call TFT_DisplayOff + call TFT_boot + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_boot +; call TFT_ClearScreen ; clear details/profile + goto logbook2 ; start search next_logbook2: - btfsc all_dives_shown ; all shown - goto logbook ; all reset - clrf menupos3 - movlw logbook_row_number - movwf menupos - incf logbook_page_number,F ; start new screen - bsf keep_cursor_new_page ; Keep cursor on "next page" - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot - ;call TFT_ClearScreen - goto logbook2 ; start search + btfsc all_dives_shown ; all shown + goto logbook ; all reset + clrf menupos3 + movlw logbook_row_number + movwf menupos1 + incf logbook_page_number,F ; start new screen + bsf keep_cursor_new_page ; Keep cursor on "next page" + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_boot +; call TFT_ClearScreen + goto logbook2 ; start search next_logbook3: - incf menupos,F ; +1 - movlw logbook_row_number+.2 - cpfsgt menupos ; =logbook_row_number+.3? - bra next_logbook3a ; No - movlw .1 - movwf menupos - bra next_logbook3b + incf menupos1,F ; +1 + movlw logbook_row_number+.2 + cpfsgt menupos1 ; =logbook_row_number+.3? + bra next_logbook3a ; No + movlw .1 + movwf menupos1 + bra next_logbook3b next_logbook3a: - incf menupos3,W ; last entry in current page +1 - cpfseq menupos ; same as cursor pos.? - bra next_logbook3b ; No - movlw logbook_row_number+.1 ; Yes, ... - movwf menupos ; ... jump directly to "next page" if page is not full + incf menupos3,W ; last entry in current page +1 + cpfseq menupos1 ; same as cursor pos.? + bra next_logbook3b ; No + movlw logbook_row_number+.1 ; Yes, ... + movwf menupos1 ; ... jump directly to "next page" if page is not full - movlw logbook_row_number - cpfseq menupos3 ; Last dive was row logbook_row_number? - bsf all_dives_shown ; No, set flag to load first page again (full reset) + movlw logbook_row_number + cpfseq menupos3 ; Last dive was row logbook_row_number? + bsf all_dives_shown ; No, set flag to load first page again (full reset) next_logbook3b: - clrf timeout_counter2 - call TFT_logbook_cursor - - bcf switch_left - goto logbook_loop + clrf timeout_counter2 + call TFT_logbook_cursor + bcf switch_left + goto logbook_loop display_listdive: - bsf logbook_page_not_empty ; Page not empty - incf menupos3,F + bsf logbook_page_not_empty ; Page not empty + incf menupos3,F + + bsf leftbind + WIN_FONT FT_SMALL + WIN_LEFT logbook_list_left - bsf leftbind - WIN_FONT FT_SMALL - WIN_LEFT logbook_list_left - - decf menupos3,W ; -1 into wreg - mullw logbook_row_offset - movff PRODL,win_top + decf menupos3,W ; -1 into wreg + mullw logbook_row_offset + movff PRODL,win_top - lfsr FSR2,buffer - call do_logoffset_common_read ; Read into lo:hi - tstfsz lo ; lo=0? - bra display_listdive1 ; No, adjust offset - tstfsz hi ; hi=0? - bra display_listdive1 ; No, adjust offset - bra display_listdive1b ; Display now + lfsr FSR2,buffer + call do_logoffset_common_read ; Read into lo:hi + tstfsz lo ; lo=0? + bra display_listdive1 ; No, adjust offset + tstfsz hi ; hi=0? + bra display_listdive1 ; No, adjust offset + bra display_listdive1b ; Display now display_listdive1: ; Check limit (lo:hi must be <1000) - movlw LOW d'1000' ; Compare to 1000 - subwf lo,W - movlw HIGH d'1000' - subwfb hi,W - bc display_listdive1b ; carry = no-borrow = > 1000, skip! + movlw LOW d'1000' ; Compare to 1000 + subwf lo,W + movlw HIGH d'1000' + subwfb hi,W + bc display_listdive1b ; carry = no-borrow = > 1000, skip! - infsnz lo,F - incf hi,F ; hi:lo = hi:lo + 1 - movff lo,sub_a+0 - movff hi,sub_a+1 - movff logbook_divenumber,sub_b+0 - clrf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+0,lo - movff sub_c+1,hi - bra display_listdive1a + infsnz lo,F + incf hi,F ; hi:lo = hi:lo + 1 + movff lo,sub_a+0 + movff hi,sub_a+1 + movff logbook_divenumber,sub_b+0 + clrf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+0,lo + movff sub_c+1,hi + bra display_listdive1a display_listdive1b: - clrf hi - movff logbook_divenumber,lo ; lo=0 and hi=0 -> show without applied offset + clrf hi + movff logbook_divenumber,lo ; lo=0 and hi=0 -> show without applied offset display_listdive1a: - output_16_3 ; displays only last three figures from a 16Bit value (0-999), # of dive - PUTC ' ' - LOG_POINT_TO log_date+1 ; Point to month - call ext_flash_byte_read_plus - movff temp1,lo ; read month - -display_listdive2: - movff lo,convert_value_temp+0 ; Month (in lo, see above) - call ext_flash_byte_read_plus ; Day - movff temp1,convert_value_temp+1 - call TFT_convert_date_short ; converts into "DD/MM" or "MM/DD" or "MM/DD" into buffer + output_16_3 ; displays only last three figures from a 16Bit value (0-999), # of dive + PUTC ' ' + ;display_listdive2: + LOG_POINT_TO log_date+1 ; Point to month + call ext_flash_byte_read_plus ; read month + movff ext_flash_rw,hi ; month + call ext_flash_byte_read_plus ; read day + movff ext_flash_rw,lo ; day + call TFT_convert_date_short ; converts into "DD/MM" or "MM/DD" or "MM/DD" into buffer PUTC ' ' - LOG_POINT_TO log_max_depth ; Point to max. depth - call ext_flash_byte_read_plus ; max. Depth - movff temp1,lo - call ext_flash_byte_read_plus - movff temp1,hi + LOG_POINT_TO log_max_depth ; Point to max. depth + call ext_flash_byte_read_plus ; max. Depth + movff ext_flash_rw,lo + call ext_flash_byte_read_plus + movff ext_flash_rw,hi - TSTOSS opt_units ; 0=Meters, 1=Feets - bra display_listdive2_metric -;display_listdive2_imperial: - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + TSTOSS opt_units ; 0=Meters, 1=Feets + bra display_listdive2_metric + ;display_listdive2_imperial: + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet PUTC ' ' - bcf leftbind - output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + output_16_3 ; limit to 999 and display only (0-999) STRCAT_TEXT tFeets1 - bra display_listdive3 + bra display_listdive3 display_listdive2_metric: - bsf ignore_digit5 ; no cm... - movlw d'1' ; +1 - movff WREG,ignore_digits ; no 1000m - bcf leftbind - output_16dp .3 ; xxx.y + bsf ignore_digit5 ; no cm... + movlw d'1' ; +1 + movff WREG,ignore_digits ; no 1000m + bcf leftbind + output_16dp .3 ; xxx.y STRCAT_TEXT tMeters PUTC ' ' display_listdive3: - call ext_flash_byte_read_plus - movff temp1,lo ; read divetime minutes - call ext_flash_byte_read_plus - movff temp1,hi - output_16_3 ; Divetime minutes (0-999min) - STRCAT_TEXT tMinutes - clrf WREG - movff WREG,buffer+.21 ; limit to 21 chars - STRCAT_PRINT "" ; Display header-row in list + call ext_flash_byte_read_plus + movff ext_flash_rw,lo ; read divetime minutes + call ext_flash_byte_read_plus + movff ext_flash_rw,hi + output_16_3 ; Divetime minutes (0-999min) + STRCAT_TEXT tMinutes + clrf WREG + movff WREG,buffer+.21 ; limit to 21 chars + STRCAT_PRINT "" ; Display header-row in list return logbook_show_divenumber: - call do_logoffset_common_read ; Read into lo:hi - tstfsz lo ; lo=0? - bra logbook_show_divenumber2 ; No, adjust offset - tstfsz hi ; hi=0? - bra logbook_show_divenumber2 ; No, adjust offset - movff divesecs,lo ; lo=0 and hi=0 -> skip Offset routine - bra logbook_show_divenumber3 ; Display now + call do_logoffset_common_read ; Read into lo:hi + tstfsz lo ; lo=0? + bra logbook_show_divenumber2 ; No, adjust offset + tstfsz hi ; hi=0? + bra logbook_show_divenumber2 ; No, adjust offset + movff divenumber,lo ; lo=0 and hi=0 -> skip Offset routine + bra logbook_show_divenumber3 ; Display now logbook_show_divenumber2: - infsnz lo,F - incf hi,F ; hi:lo = hi:lo + 1 - movff lo,sub_a+0 - movff hi,sub_a+1 - movff divesecs,sub_b+0 - clrf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+0,lo - movff sub_c+1,hi + infsnz lo,F + incf hi,F ; hi:lo = hi:lo + 1 + movff lo,sub_a+0 + movff hi,sub_a+1 + movff divenumber,sub_b+0 + clrf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+0,lo + movff sub_c+1,hi logbook_show_divenumber3: WIN_MEDIUM logbook_divenumer_column, logbook_divenumer_row - bsf leftbind - output_16 ; # of dive in logbook - bcf leftbind + bsf leftbind + output_16 ; # of dive in logbook + bcf leftbind STRCAT_PRINT "" - return + return -logbook_page2: ; Show more info - rcall log_details_header ; Shows number, time/date and basic dive info - +logbook_page2: ; Show more info + rcall log_details_header ; Shows number, time/date and basic dive info + ; Deco model - WIN_SMALL .5,.65 - LOG_POINT_TO log_decomodel - call ext_flash_byte_read_plus ; read deco model - movff temp1,lo - decfsz temp1,F - bra logbook_decomodel1 - ; Deco model GF Version - STRCAT_PRINT "ZH-L16+GF" - LOG_POINT_TO log_gf_lo - WIN_SMALL .5,.90 - STRCPY_TEXT tGF - call ext_flash_byte_read_plus ; Read GF lo - movff temp1,lo - output_8 - STRCAT "%/" - bra logbook_decomodel_common + WIN_SMALL .5,.65 + LOG_POINT_TO log_decomodel + call ext_flash_byte_read_plus ; read deco model + movff ext_flash_rw,lo + decfsz ext_flash_rw,F + bra logbook_decomodel1 + ; Deco model GF Version + STRCAT_PRINT "ZHL-16+GF" + LOG_POINT_TO log_gf_lo + WIN_SMALL .5,.90 + STRCPY_TEXT tGF + call ext_flash_byte_read_plus ; Read GF lo + movff ext_flash_rw,lo + output_8 + STRCAT "%/" + bra logbook_decomodel_common logbook_decomodel1: - ; Deco model NON-GF Version - STRCAT_PRINT "ZH-L16" - LOG_POINT_TO log_sat_mult - WIN_SMALL .5,.90 - call ext_flash_byte_read_plus ; Read sat_mult - movff temp1,lo - output_8 - STRCAT "%/" + ; Deco model NON-GF Version + STRCAT_PRINT "ZH-L16" + LOG_POINT_TO log_sat_mult + WIN_SMALL .5,.90 + call ext_flash_byte_read_plus ; Read sat_mult + movff ext_flash_rw,lo + output_8 + STRCAT "%/" logbook_decomodel_common: - call ext_flash_byte_read_plus ; Read desat_mult or GF_hi - movff temp1,lo - output_8 - STRCAT_PRINT "%" - - ; CNS - LOG_POINT_TO log_cns_start - WIN_SMALL .5,.115 - STRCPY_TEXT tCNS2 - call ext_flash_byte_read_plus ; read cns low - movff temp1,lo - call ext_flash_byte_read_plus ; read cns high - movff temp1,hi - output_16 - LOG_POINT_TO log_cns_end - STRCAT "->" - call ext_flash_byte_read_plus ; read CNS low - movff temp1,lo - call ext_flash_byte_read_plus ; read CNS high - movff temp1,hi - output_16 - STRCAT_PRINT "%" + call ext_flash_byte_read_plus ; Read desat_mult or GF_hi + movff ext_flash_rw,lo + output_8 + STRCAT_PRINT "%" - ; Salinity - WIN_SMALL .5,.140 - LOG_POINT_TO log_salinity - STRCPY_TEXT tDvSalinity - bsf leftbind - call ext_flash_byte_read_plus ; read salinity - movff temp1,lo - movff temp1,total_divetime_seconds+1 ; backup for average depth display - output_8 - STRCAT_PRINT "%" + ; CNS + LOG_POINT_TO log_cns_start + WIN_SMALL .5,.115 + STRCPY_TEXT tCNS2 + call ext_flash_byte_read_plus ; read cns low + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read cns high + movff ext_flash_rw,hi + output_16 + LOG_POINT_TO log_cns_end + STRCAT "->" + call ext_flash_byte_read_plus ; read CNS low + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read CNS high + movff ext_flash_rw,hi + output_16 + STRCAT_PRINT "%" + + ; Salinity + WIN_SMALL .5,.140 + LOG_POINT_TO log_salinity + STRCPY_TEXT tDvSalinity + bsf leftbind + call ext_flash_byte_read_plus ; read salinity + movff ext_flash_rw,lo + movff ext_flash_rw,backup_divedata ; backup for average depth display + output_8 + STRCAT_PRINT "%" - ; Average depth - WIN_SMALL .5,.165 - STRCPY_TEXT tAVG - LOG_POINT_TO log_avr_depth - call ext_flash_byte_read_plus ; read avr low - movff temp1,lo - call ext_flash_byte_read_plus ; read avr high - movff temp1,hi - movf total_divetime_seconds+1,W ; salinity for this dive - call adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] - output_16dp .3 - STRCAT_PRINT "m" - - ; Last deco - LOG_POINT_TO log_last_stop - WIN_SMALL .5,.190 - STRCPY_TEXT tLastDecostop - call ext_flash_byte_read_plus ; Read last stop - movff temp1,lo - output_8 - STRCAT_PRINT "m" + ; Average depth + WIN_SMALL .5,.165 + STRCPY_TEXT tAVG + LOG_POINT_TO log_avr_depth + call ext_flash_byte_read_plus ; read avr low + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read avr high + movff ext_flash_rw,hi + movf backup_divedata,W ; salinity for this dive + call adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] + output_16dp .3 + STRCAT_PRINT "m" - movlw color_lightblue - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.105 ; Top, Bottom, Left, Right + ; Last deco + LOG_POINT_TO log_last_stop + WIN_SMALL .5,.190 + STRCPY_TEXT tLastDecostop + call ext_flash_byte_read_plus ; Read last stop + movff ext_flash_rw,lo + output_8 + STRCAT_PRINT "m" + + movlw color_lightblue + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.2,.105 ; Top, Bottom, Left, Right - ; Firmware - call TFT_standard_color - WIN_SMALL .110,.65 - STRCAT "V:" - LOG_POINT_TO log_firmware - call ext_flash_byte_read_plus ; read firmware xx - movff temp1,lo - bsf neg_flag ; set flag for 2.15 or newer - movlw .1 - cpfsgt lo ; >1? - bcf neg_flag ; No, clear flag - movlw .9 - cpfslt lo ; <9? - bcf neg_flag ; No, clear flag (When unit was updgraded from hwOS Sport (10.xx)) - bsf leftbind - output_8 - PUTC "." - call ext_flash_byte_read_plus ; read firmware yy - movff temp1,lo - movlw .14 - cpfsgt lo ; >14? - bcf neg_flag ; No, clear flag - output_99x - STRCAT_PRINT "" + ; Firmware + call TFT_standard_color + WIN_SMALL .110,.65 + STRCAT "V:" + LOG_POINT_TO log_firmware + call ext_flash_byte_read_plus ; read firmware xx + movff ext_flash_rw,lo + bsf neg_flag ; set flag for 2.15 or newer + movlw .1 + cpfsgt lo ; >1? + bcf neg_flag ; No, clear flag + movlw .9 + cpfslt lo ; <9 ? + bcf neg_flag ; No, clear flag (When unit was upgraded from hwOS Sport (10.xx)) + bsf leftbind + output_8 + PUTC "." + call ext_flash_byte_read_plus ; read firmware yy + movff ext_flash_rw,lo + movlw .14 + cpfsgt lo ; >14 ? + bcf neg_flag ; No, clear flag + output_99x + STRCAT_PRINT "" - btfss neg_flag ; set flag for 2.15 or newer - bra logbook_no_batt_info - - ; Battery percent (for dives with 2.15 or newer) - WIN_SMALL .110,.140 - LOG_POINT_TO log_batt_info ; Battery percent - call ext_flash_byte_read_plus ; read battery low - movff temp1,lo - output_8 - STRCAT_PRINT "%" + btfss neg_flag ; set flag for 2.15 or newer + bra logbook_no_batt_info + + ; Battery percent (for dives with 2.15 or newer) + WIN_SMALL .110,.140 + LOG_POINT_TO log_batt_info ; Battery percent + call ext_flash_byte_read_plus ; read battery low + movff ext_flash_rw,lo + output_8 + STRCAT_PRINT "%" -logbook_no_batt_info: ; dives with firmware <2.15 +logbook_no_batt_info: ; dives with firmware <2.15 + + ; Battery voltage + WIN_SMALL .110,.90 + STRCAT_PRINT "Batt:" + WIN_SMALL .110,.115 + LOG_POINT_TO log_battery ; Battery voltage... + call ext_flash_byte_read_plus ; read battery low + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read battery high + movff ext_flash_rw,hi + output_16dp .2 + STRCAT_PRINT "V" - ; Battery voltage - WIN_SMALL .110,.90 - STRCAT_PRINT "Batt:" - WIN_SMALL .110,.115 - LOG_POINT_TO log_battery ; Battery voltage... - call ext_flash_byte_read_plus ; read battery low - movff temp1,lo - call ext_flash_byte_read_plus ; read battery high - movff temp1,hi - output_16dp .2 - STRCAT_PRINT "V" - - ; surface pressure in mbar - LOG_POINT_TO log_surface_press - call ext_flash_byte_read_plus ; read surface pressure - movff temp1,lo - call ext_flash_byte_read_plus ; read surface pressure - movff temp1,hi - WIN_SMALL .110,.165 - lfsr FSR2,buffer - bsf leftbind - output_16 ; Air pressure before dive - STRCAT_TEXT tMBAR - clrf WREG - movff WREG,buffer+7 ; limit to 7 chars - STRCAT_PRINT "" + ; surface pressure in mbar + LOG_POINT_TO log_surface_press + call ext_flash_byte_read_plus ; read surface pressure + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read surface pressure + movff ext_flash_rw,hi + WIN_SMALL .110,.165 + lfsr FSR2,buffer + bsf leftbind + output_16 ; Air pressure before dive + STRCAT_TEXT tMBAR + clrf WREG + movff WREG,buffer+7 ; limit to 7 chars + STRCAT_PRINT "" - movlw color_greenish - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.107,.159 ; Top, Bottom, Left, Right + movlw color_greenish + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.107,.159 ; Top, Bottom, Left, Right + + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco +display_details_loop: + btfsc switch_right + bra logbook_page3 ; Details, 2nd page + btfsc switch_left + bra exit_profileview ; back to list + rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details_loop ; wait for something to do - rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco -display_details_loop: - ; REPLACE ## logbook look and feel - ; btfsc switch_left ; SET/MENU? - ; BY - btfsc switch_right - bra logbook_page3 ; Details, 2nd page - ; REPLACE ## logbook look and feel - ; btfsc switch_right ; ENTER? - btfsc switch_left - bra exit_profileview ; back to list - rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details_loop ; wait for something to do + global logbook_preloop_tasks +logbook_preloop_tasks: + movlw CCP1CON_VALUE ; See hwos.inc + movwf CCP1CON ; Power-on backlight + call TFT_standard_color + bcf sleepmode ; clear some flags + bcf switch_right + bcf switch_left + clrf timeout_counter2 + goto speed_normal ; and return + + +logbook_page3: ; Show even more info +++ + rcall log_details_header ; Shows number, time/date and basic dive info + LOG_POINT_TO log_gas1 + bcf log_show_gas_short ; do the long version of log_show_gas + bcf leftbind - global logbook_preloop_tasks -logbook_preloop_tasks: - movlw CCP1CON_VALUE ; See hwos.inc - movwf CCP1CON ; Power-on backlight - call TFT_standard_color - bcf sleepmode ; clear some flags - bcf switch_right - bcf switch_left - clrf timeout_counter2 - goto speed_normal ; and return + WIN_SMALL .5,.90 + movlw .1 ; Color for Gas 1 + rcall log_show_gas + + WIN_SMALL .5,.115 + movlw .2 ; Color for Gas 2 + rcall log_show_gas - -logbook_page3: ; Show even more info - rcall log_details_header ; Shows number, time/date and basic dive info + WIN_SMALL .5,.140 + movlw .3 ; Color for Gas 3 + rcall log_show_gas + + WIN_SMALL .5,.165 + movlw .4 ; Color for Gas 4 + rcall log_show_gas + + WIN_SMALL .5,.190 + movlw .5 ; Color for Gas 5 + rcall log_show_gas -; REPLACE ## logbook look and feel -; ; OC/CC Gas List -; LOG_POINT_TO log_divemode -; call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 -; WIN_SMALL .5,.65 -; WIN_COLOR color_greenish -; STRCPY_TEXT_PRINT tGaslist ; "OC Gas List" / tGaslistCC -; BY - bcf leftbind - LOG_POINT_TO log_gas1 - movlw color_white ; Color for Gas 1 - call TFT_set_color ; Set Color... - WIN_SMALL .5,.90 - rcall log_show_gas_common2 - movlw color_green ; Color for Gas 2 - call TFT_set_color ; Set Color... - WIN_SMALL .5,.115 - rcall log_show_gas_common2 - movlw color_red ; Color for Gas 3 - call TFT_set_color ; Set Color... - WIN_SMALL .5,.140 - rcall log_show_gas_common2 - movlw color_yellow ; Color for Gas 4 - call TFT_set_color ; Set Color... - WIN_SMALL .5,.165 - rcall log_show_gas_common2 - movlw color_cyan ; Color for Gas 5 - call TFT_set_color ; Set Color... - WIN_SMALL .5,.190 - rcall log_show_gas_common2 - ; OC/CC Gas List - WIN_SMALL .5,.65 - WIN_COLOR color_greenish - LOG_POINT_TO log_divemode - call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 - decfsz temp1,w ; =1 (CC)? - bra logbook_page3a - STRCPY_TEXT_PRINT tGaslistCC - bra logbook_page3b + ; OC/CC Gas List + WIN_SMALL .5,.65 + WIN_COLOR color_greenish + LOG_POINT_TO log_divemode + call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into ext_flash_rw + decfsz ext_flash_rw,w ; =1 (CC)? + bra logbook_page3a + STRCPY_TEXT_PRINT tGaslistCC + bra logbook_page3b logbook_page3a: - STRCPY_TEXT_PRINT tGaslist + STRCPY_TEXT_PRINT tGaslist logbook_page3b: + movlw color_lightblue + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.2,.90 ; Top, Bottom, Left, Right - movlw color_lightblue - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.90 ; Top, Bottom, Left, Right - - rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_details2_loop: - ; REPLACE ## logbook look and feel - ; btfsc switch_left ; SET/MENU? - ; BY - btfsc switch_right - goto logbook_page4 ; Show more info - ; REPLACE ## logbook look and feel - ; btfsc switch_right ; ENTER? - ; BY - btfsc switch_left - bra exit_profileview ; back to list - rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details2_loop ; wait for something to do + btfsc switch_right + goto logbook_page4 ; Show more info + btfsc switch_left + bra exit_profileview ; back to list + rcall log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details2_loop ; wait for something to do -logbook_page4: ; Show even more info in CC mode - LOG_POINT_TO log_divemode - call ext_flash_byte_read ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into WREG and temp1 - decfsz temp1,w ; =1 (CC)? - goto display_profile2 ; no +logbook_page4: ; Show even more info in CC mode + LOG_POINT_TO log_divemode + call ext_flash_byte_read ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into WREG and ext_flash_rw + decfsz ext_flash_rw,w ; =1 (CC)? + goto display_profile2 ; no - rcall log_details_header ; Shows number, time/date and basic dive info - ; Setpoint list - LOG_POINT_TO log_sp1 - WIN_SMALL .5,.65 - WIN_COLOR color_greenish - STRCPY_TEXT_PRINT tFixedSetpoints - call TFT_standard_color - WIN_SMALL .5,.90 - rcall log_show_sp_common - WIN_SMALL .5,.115 - rcall log_show_sp_common - WIN_SMALL .5,.140 - rcall log_show_sp_common - WIN_SMALL .5,.165 - rcall log_show_sp_common - WIN_SMALL .5,.190 - rcall log_show_sp_common + rcall log_details_header ; Shows number, time/date and basic dive info + ; Setpoint list + LOG_POINT_TO log_sp1 + WIN_SMALL .5,.65 + WIN_COLOR color_greenish + STRCPY_TEXT_PRINT tFixedSetpoints + call TFT_standard_color + WIN_SMALL .5,.90 + rcall log_show_sp + WIN_SMALL .5,.115 + rcall log_show_sp + WIN_SMALL .5,.140 + rcall log_show_sp + WIN_SMALL .5,.165 + rcall log_show_sp + WIN_SMALL .5,.190 + rcall log_show_sp - movlw color_greenish - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.112 ; Top, Bottom, Left, Right + movlw color_greenish + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.2,.112 ; Top, Bottom, Left, Right - rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_details3_loop: - ; REPLACE ## logbook look and feel - ; btfsc switch_left ; SET/MENU? - ; BY - btfsc switch_right - goto display_profile2 ; Show the profile view again - ; REPLACE ## logbook look and feel - ; btfsc switch_right ; ENTER? - ; BY - btfsc switch_left - bra exit_profileview ; back to list - rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details3_loop ; wait for something to do - - -log_details_header: - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot - ;call TFT_ClearScreen ; Clear screen + btfsc switch_right + goto display_profile2 ; Show the profile view again + btfsc switch_left + bra exit_profileview ; back to list + rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details3_loop ; wait for something to do -; Set ext_flash pointer to "#divesecs-oldest" dive -; compute read_int_eeprom .2 - divesecs + +log_details_header: + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_boot +; call TFT_ClearScreen ; Clear screen + +; Set ext_flash pointer to "#divenumber-oldest" dive +; compute read_int_eeprom .2 - divenumber ; Read required header data for profile display ; look in header for pointer to begin of diveprofile (Byte 2-4) ; Set pointer (ext_flash_log_pointer:3) to this address, start drawing - decf divesecs,F ;-1 + decf divenumber,F ;-1 read_int_eeprom .2 movf EEDATA,W bcf STATUS,C - subfwb divesecs,W ; max. dives (low value) - divesecs - movwf lo ; result - incf divesecs,F ;+1 + subfwb divenumber,W ; max. dives (low value) - divenumber + movwf lo ; result + incf divenumber,F ;+1 ; 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 (And hi>0...) - 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 + 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 ; pointer at the first 0xFA of header - rcall logbook_show_divenumber ; Show the dive number in medium font + rcall logbook_show_divenumber ; show the dive number in medium font ; Show date and time in first row - WIN_SMALL .59,.10 - LOG_POINT_TO log_date - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+2 ; Year - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+0 ; Month - call ext_flash_byte_read_plus - movff temp1,convert_value_temp+1 ; Day - call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 - PUTC "-" - call ext_flash_byte_read_plus ; hour - movff temp1,lo - call ext_flash_byte_read_plus ; Minutes - movff temp1,hi - output_99x ; hour - PUTC ':' - movff hi,lo - output_99x ; minute - STRCAT_PRINT "" ; Display 1st row of details + WIN_SMALL .59,.10 + LOG_POINT_TO log_date + call ext_flash_byte_read_plus + movff ext_flash_rw,up ; year + call ext_flash_byte_read_plus + movff ext_flash_rw,hi ; month + call ext_flash_byte_read_plus + movff ext_flash_rw,lo ; day + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + PUTC "-" + call ext_flash_byte_read_plus ; hour + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; minutes + movff ext_flash_rw,hi + output_99x ; hour + PUTC ':' + movff hi,lo + output_99x ; minute + STRCAT_PRINT "" ; display 1st row of details ; Show max depth and dive time - WIN_SMALL .5,.35 - STRCAT "Max:" - LOG_POINT_TO log_max_depth - call ext_flash_byte_read_plus ; read max depth - movff temp1,lo - call ext_flash_byte_read_plus ; read max depth - movff temp1,hi + WIN_SMALL .5,.35 + STRCAT "Max:" + LOG_POINT_TO log_max_depth + call ext_flash_byte_read_plus ; read max depth + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read max depth + movff ext_flash_rw,hi - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra logbook_page2_depth_metric ; imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet PUTC ' ' bcf leftbind output_16_3 - STRCAT_TEXT tFeets + STRCAT_TEXT tFeets bra logbook_page2_depth_common logbook_page2_depth_metric: bsf leftbind - output_16dp d'3' ; max. depth - STRCAT_TEXT tMeters + output_16dp d'3' ; max. depth + STRCAT_TEXT tMeters -logbook_page2_depth_common: - STRCAT " - " - call ext_flash_byte_read_plus ; divetime in minutes - movff temp1,lo - call ext_flash_byte_read_plus - movff temp1,hi ; divetime in minutes +logbook_page2_depth_common: + STRCAT " - " + call ext_flash_byte_read_plus ; divetime in minutes + movff ext_flash_rw,lo + call ext_flash_byte_read_plus + movff ext_flash_rw,hi ; divetime in minutes bsf leftbind - output_16 ; divetime minutes - PUTC "m" - LOG_POINT_TO log_divetime+.2 - call ext_flash_byte_read_plus ; read divetime seconds - movff temp1,lo + output_16 ; divetime minutes + PUTC "m" + LOG_POINT_TO log_divetime+.2 + call ext_flash_byte_read_plus ; read divetime seconds + movff ext_flash_rw,lo bsf leftbind - output_99x ; divetime seconds + output_99x ; divetime seconds call TFT_standard_color - STRCAT_PRINT "s" -; ; Dive mode -; LOG_POINT_TO log_divemode -; call ext_flash_byte_read_plus ; Read divemode -; movff temp1,lo -; call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) + STRCAT_PRINT "s" +; ; Dive mode +; LOG_POINT_TO log_divemode +; call ext_flash_byte_read_plus ; Read divemode +; movff ext_flash_rw,lo +; call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) return - - -log_show_sp_common: - lfsr FSR2,buffer - call ext_flash_byte_read_plus ; Read setpoint - movff temp1,lo - clrf hi - bsf leftbind - output_16dp d'3' - bcf leftbind - STRCAT_TEXT tbar - PUTC " " - call ext_flash_byte_read_plus ; change depth - movff temp1,lo + + +log_show_sp: + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; Read setpoint + movff ext_flash_rw,lo + clrf hi + bsf leftbind + output_16dp d'3' + bcf leftbind + STRCAT_TEXT tbar + PUTC " " + call ext_flash_byte_read_plus ; change depth + movff ext_flash_rw,lo - TSTOSS opt_units ; 0=Meters, 1=Feets - bra log_show_sp_common_metric - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16 - STRCAT_TEXT tFeets ; "ft" - bra log_show_sp_common_common -log_show_sp_common_metric: - output_8 - STRCAT_TEXT tMeters ; "m" -log_show_sp_common_common: - STRCAT_PRINT "" - return + TSTOSS opt_units ; 0=Meter, 1=Feet + bra log_show_sp_metric + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16 + STRCAT_TEXT tFeets ; "ft" + bra log_show_sp_common +log_show_sp_metric: + output_8 + STRCAT_TEXT tMeters ; "m" +log_show_sp_common: + STRCAT_PRINT "" + return + -log_show_gas_common2: ; as log_show_gas_common but with change depth - lfsr FSR2,buffer - call ext_flash_byte_read_plus ; current O2 - movff temp1,lo - call ext_flash_byte_read_plus ; current He - movff temp1,hi - call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - call ext_flash_byte_read_plus ; change depth - movff temp1,lo +log_show_gas: ; show gas data + call TFT_color_code_gas ; color the output (gas number is in WREG) + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; read gas O2 fraction + movff ext_flash_rw,lo + call ext_flash_byte_read_plus ; read gas He fraction + movff ext_flash_rw,hi + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + call ext_flash_byte_read_plus ; read change depth - TSTOSS opt_units ; 0=Meters, 1=Feets - bra log_show_gas_common2_metric - movf lo,W - mullw .100 ; convert meters to mbar - movff PRODL,lo - movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16 - STRCAT_TEXT tFeets ; "ft" - bra log_show_gas_common2_common -log_show_gas_common2_metric: - output_8 - STRCAT_TEXT tMeters ; "m" -log_show_gas_common2_common: - bcf leftbind - call ext_flash_byte_read_plus ; Gas Type - STRCAT_PRINT "" - return + btfsc log_show_gas_short ; shall we do the short version? + bra log_show_gas_common ; YES + ; long version + movff ext_flash_rw,lo ; process change depth + TSTOSS opt_units ; 0=Meter, 1=Feet + bra log_show_gas_metric + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16 + STRCAT_TEXT tFeets ; "ft" + bra log_show_gas_common +log_show_gas_metric: + output_8 + STRCAT_TEXT tMeters ; "m" +log_show_gas_common: + call ext_flash_byte_read_plus ; read gas type - just to increment the pointer + STRCAT_PRINT "" + return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/menu_processor.asm --- a/src/menu_processor.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/menu_processor.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_processor.asm REFACTORED VERSION V2.91 +; File menu_processor.asm REFACTORED VERSION V2.98 ; ; Routines to handle all hwOS graphic/text menus. ; @@ -8,7 +8,7 @@ ;============================================================================= ; HISTORY ; 2012-11-02 : [jDG] Cleanup for hwOS: removed icons. Added scrolling. -; But need a font with lower/upper alpha chars... +; But need a font with lower/upper alpha chars... #include "convert.inc" #include "hwos.inc" @@ -24,205 +24,187 @@ #include "adc_lightsensor.inc" -;NOTE: should be identic in .inc and .asm ! -#define MENU_LINES_MAX .7 ; Number of lines per screen? -#define MENU_TITLE_FONT WIN_STD ; Font should contains lower/UPPER alpha -#define MENU_LINE_FONT WIN_SMALL ; Font should contains lower/UPPER alpha -#define MENU_LEFT .20 ; Position of first menu item -#define MENU_HEIGHT .27 ; Spacing between menu lines. -#define MENU_VCENTER .125 ; Position on screen. -#define MENU_LINE_MAX_LENGTH .20 ; Length in characters +;NOTE: should be identical in .inc and .asm ! +#define MENU_LINES_MAX .7 ; Number of lines per screen? +#define MENU_TITLE_FONT WIN_STD ; Font should contains lower/UPPER alpha +#define MENU_LINE_FONT WIN_SMALL ; Font should contains lower/UPPER alpha +#define MENU_LEFT .20 ; Position of first menu item +#define MENU_HEIGHT .27 ; Spacing between menu lines. +#define MENU_VCENTER .125 ; Position on screen. +#define MENU_LINE_MAX_LENGTH .20 ; Length in characters +#define option_item proc_item ; Other needed references - extern aa_wordprocessor,option_inc,option_draw,comm_mode + extern aa_wordprocessor + extern option_inc + extern option_draw + extern comm_mode + extern TFT_clear_divemode_menu + extern TFT_divemask_color + extern rtc_set_rtc + extern divemode_option0_return + extern TFT_fillup_with_spaces -;============================================================================= -; Temporary data. +basic CODE - CBLOCK tmp+0x20 ; Reserved space for options.asm - menu_flags ; Various flags for menu: - ; bit 0 :dynamic menu - menu_item ; Index of the current item. - start_item ; Index of the first item (scrolling) - item_max ; Number of items in menu. - selected_item ; Index of the current item. - value_type ; Type for vertical menu. - dynamic_item:3 ; Callback addr - menu_block:3 ; Address of the menu block (ie. item 0) - menu_title:3 ; text or proc for dynamic menu. - menu_center ; centering for line menu. - proc_item:3 ; Address of the current proc. - text_item:2 ; Address of the current text. - ; Reserved to tmp+0x35 - ENDC - -#define option_item proc_item - -basic CODE ;============================================================================= ; menu handler. ; ; Input: TBLPTR = addr of menu block. - global menu_processor + global menu_processor menu_processor: - banksel common ; Bank1 - btfss divemode ; Not in divemode - call speed_fastest ; Make it quick ! - - ;---- Read menu block ------------------------------------------------ - VARARGS_BEGIN ; Read inline PROM data - clrf STKPTR ; Never return, anyway... - VARARGS_GET8 item_max ; Get number of items - VARARGS_GET8 menu_flags ; Get flags - VARARGS_GET24 menu_title ; Get pointer to menu title - VARARGS_GET8 menu_center ; Vertical position - movff TBLPTRL, menu_block+0 ; Save base address for menu_read_item - movff TBLPTRH, menu_block+1 - movff TBLPTRU, menu_block+2 + banksel common ; Bank1 + btfss divemode ; Not in divemode + call speed_fastest ; Make it quick ! + ;---- Read menu block ------------------------------------------------ + VARARGS_BEGIN ; Read inline PROM data + clrf STKPTR ; Never return, anyway... + VARARGS_GET8 item_max ; Get number of items + VARARGS_GET8 menu_flags ; Get flags + VARARGS_GET24 menu_title ; Get pointer to menu title + VARARGS_GET8 menu_center ; Vertical position + movff TBLPTRL, menu_block+0 ; Save base address for menu_read_item + movff TBLPTRH, menu_block+1 + movff TBLPTRU, menu_block+2 + btfss divemode ; In divemode? + bra menu_processor0 ; No + ; Required for menus with less entries then the calling menu but not so nice when setting up gas 6.... mH + movlw .1 + cpfsgt menupos1 ; only if menupos1 = 1... + call TFT_clear_divemode_menu ; ... Clear the menu! + ; Draw one frame around the divemode menu + call TFT_divemask_color + WIN_FRAME_COLOR16 dm_menu_row, dm_menu_lower, dm_menu_left ,dm_menu_right ; top, bottom, left, right + call TFT_standard_color - btfss divemode ; In divemode? - bra menu_processor0 ; No - - ; Required for menus with less entries then the calling menu but not so nice when setting up gas 6.... mH - extern TFT_clear_divemode_menu - movlw .1 - cpfsgt menupos ; only if menupos=1... - call TFT_clear_divemode_menu ; ... Clear the menu! - - ; Draw one frame around the divemode menu - extern TFT_divemask_color - call TFT_divemask_color - WIN_FRAME_COLOR16 dm_menu_row, dm_menu_lower, dm_menu_left ,dm_menu_right ; top, bottom, left, right - call TFT_standard_color - - bra menu_processor1 ; Yes, skip some lines here + bra menu_processor1 ; Yes, skip some lines here menu_processor0: - ;---- draw menu title ------------------------------------------------ - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND - call TFT_ClearScreen - rcall menu_processor_title - rcall menu_processor_bottom_line + ;---- draw menu title ------------------------------------------------ + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen + rcall menu_processor_title + rcall menu_processor_bottom_line menu_processor1: - movlw FT_SMALL - movff WREG, win_font - - ;---- Select menu type ----------------------------------------------- - bra menu_vertical + movlw FT_SMALL + movff WREG, win_font - global menu_processor_bottom_line -menu_processor_bottom_line: - ;---- Draw bottomline ------------------------------------------------ - TEXT_TINY .5, .240-.16, tNext - TEXT_TINY .160-.6*.6, .240-.16, tEnter + ;---- Select menu type ----------------------------------------------- + bra menu_vertical - WIN_COLOR color_greenish - ; Serial and Firmware Version - WIN_TINY .57,.240-.16 - STRCPY "#" - call TFT_cat_serial - STRCAT " v" - call TFT_cat_firmware - STRCAT_PRINT "" - call TFT_standard_color - bcf win_invert - return + global menu_processor_bottom_line +menu_processor_bottom_line: + ;---- Draw bottom line ----------------------------------------------- + TEXT_TINY .5, .240-.16, tNext + TEXT_TINY .160-.6*.6, .240-.16, tEnter + WIN_COLOR color_greenish + ; Serial and Firmware Version + WIN_TINY .57,.240-.16 + STRCPY "#" + call TFT_cat_serial + STRCAT " v" + call TFT_cat_firmware + STRCAT_PRINT "" + call TFT_standard_color + bcf win_invert + return ;============================================================================= ; (re-)draw menu title. ; -menu_processor_title: - WIN_BOX_BLACK .2,.23,.0,.159 ; Clear Menu title - MENU_TITLE_FONT .0, .2 ; Menu title positionning - - btfss menu_flags,0 ; Static or dynmic title ? - bra menu_processor_static_title +menu_processor_title: + WIN_BOX_BLACK .2,.23,.0,.159 ; Clear Menu title + MENU_TITLE_FONT .0, .2 ; Menu title positioning + btfss menu_flags,0 ; Static or dynamic title ? + bra menu_processor_static_title + rcall menu_processor_call_title ; add gas, detail and color. + bra menu_processor_title_1 - rcall menu_processor_call_title ; add gas, detail and color. - bra menu_processor_title_1 - -menu_processor_static_title: - movff menu_title+0,FSR1L ; Just copy string. - movff menu_title+1,FSR1H - call strcpy_text +menu_processor_static_title: + movff menu_title+0,FSR1L ; Just copy string. + movff menu_title+1,FSR1H + call strcpy_text menu_processor_title_1: - WIN_COLOR color_greenish - movf FSR2L,W ; Get title length - mullw .9 ; Convert to half pixels - bcf STATUS,C ; Clear carry - rrcf PRODL ; /2 - movf PRODL,W ; Back to WREG - sublw .80 ; 80 - width - movwf win_leftx2 ; Aligned to center. - - movlw .0 - movff WREG,buffer+.17 ; limit to 17chars (Std font max.) - - call aa_wordprocessor - call TFT_standard_color - return + WIN_COLOR color_greenish + movf FSR2L,W ; Get title length + mullw .9 ; Convert to half pixels + bcf STATUS,C ; Clear carry + rrcf PRODL ; /2 + movf PRODL,W ; Back to WREG + sublw .80 ; 80 - width + movwf win_leftx2 ; Aligned to center. + movlw .0 + movff WREG,buffer+.17 ; limit to 17chars (Std font max.) + call aa_wordprocessor + call TFT_standard_color + return ;============================================================================= ; Call dynamic proc for menu title: menu_processor_call_title: - movff menu_title+2,PCLATU ; Just execute computed goto. - movff menu_title+1,PCLATH - movf menu_title+0,W - movwf PCL - + movff menu_title+2,PCLATU ; Just execute computed goto. + movff menu_title+1,PCLATH + movf menu_title+0,W + movwf PCL + ;============================================================================= ; Restart with first icon/line selected. - global menu_processor_reset + global menu_processor_reset menu_processor_reset: - banksel common - lfsr FSR2,menustack - clrf POSTINC2 - clrf POSTINC2 - clrf POSTINC2 - clrf POSTINC2 - clrf POSTINC2 - clrf selected_item - return + banksel menustack + lfsr FSR2,menustack + clrf POSTINC2 + clrf POSTINC2 + clrf POSTINC2 + clrf POSTINC2 + clrf POSTINC2 + banksel common + clrf selected_item + return - global menu_processor_pop + global menu_processor_pop menu_processor_pop: - movff menustack+0,selected_item - movff menustack+1,menustack+0 - movff menustack+2,menustack+1 - movff menustack+3,menustack+2 - movff menustack+4,menustack+3 - return + movff menustack+0,selected_item + movff menustack+1,menustack+0 + movff menustack+2,menustack+1 + movff menustack+3,menustack+2 + movff menustack+4,menustack+3 + return + + global menu_processor_double_pop +menu_processor_double_pop: + movff menustack+1,selected_item + movff menustack+2,menustack+0 + movff menustack+3,menustack+1 + movff menustack+4,menustack+2 + return menu_processor_push: - movff menustack+3,menustack+4 - movff menustack+2,menustack+3 - movff menustack+1,menustack+2 - movff menustack+0,menustack+1 - movff selected_item,menustack+0 - clrf selected_item - return + movff menustack+3,menustack+4 + movff menustack+2,menustack+3 + movff menustack+1,menustack+2 + movff menustack+0,menustack+1 + movff selected_item,menustack+0 + clrf selected_item + return ;---- Execute menu selection ------------------------------------------------- do_menu_item: - bcf switch_right ; Avoid loops. - call speed_normal ; Back to normal speed. - - movf selected_item,W ; Reread proc address from table. - rcall menu_read_item ; (destroy PROD) - - movff selected_item,PRODL ; Pass along selected line - - rcall menu_processor_push ; Remember where we get from. (clears selected_item) - - movff proc_item+2,PCLATU ; Then execute computed goto. - movff proc_item+1,PCLATH - movf proc_item+0,W - movwf PCL + bcf switch_right ; Avoid loops. + call speed_normal ; Back to normal speed. + movf selected_item,W ; Reread proc address from table. + rcall menu_read_item ; (destroy PROD) + movff selected_item,PRODL ; Pass along selected line + rcall menu_processor_push ; Remember where we get from. (clears selected_item) + movff proc_item+2,PCLATU ; Then execute computed goto. + movff proc_item+1,PCLATH + movf proc_item+0,W + movwf PCL ;============================================================================= ; Get current item from table. @@ -233,379 +215,335 @@ ; ; Trashed: PROD, WREG menu_read_item: - mullw .10 ; 10 bytes per item. - movf PRODL,W ; Then do a 24bits add - addwf menu_block+0,W ; with menu_block, and - movwf TBLPTRL ; setup TBLPTR - movf PRODH,W - addwfc menu_block+1,W - movwf TBLPTRH - movlw 0 - addwfc menu_block+2,W - movwf TBLPTRU + mullw .10 ; 10 bytes per item. + movf PRODL,W ; Then do a 24bits add + addwf menu_block+0,W ; with menu_block, and + movwf TBLPTRL ; setup TBLPTR + movf PRODH,W + addwfc menu_block+1,W + movwf TBLPTRH + movlw 0 + addwfc menu_block+2,W + movwf TBLPTRU + VARARGS_GET8 value_type ; Read 10 bytes of item data + VARARGS_GET24 dynamic_item + VARARGS_GET24 proc_item + VARARGS_GET8 WREG ; Skip dummy byte + VARARGS_GET16 text_item - VARARGS_GET8 value_type ; Read 10 bytes of item data - VARARGS_GET24 dynamic_item - VARARGS_GET24 proc_item - VARARGS_GET8 WREG ; Skip dummy byte - VARARGS_GET16 text_item - - return + return ;============================================================================= ; Vertical menu : set of line/value to choose from. ; Entry point to update lines already shown. ; - global menu_vertical + global menu_vertical menu_vertical: - btfss divemode ; Not in divemode - clrf timeout_counter2 ; Reset timeout + btfss divemode ; Not in divemode + clrf timeout_counter2 ; Reset timeout menu_vertical_2: - rcall menu_draw_lines ; Always re-draw whole menu - - movlw CCP1CON_VALUE ; See hwos.inc - btfss divemode ; Not in divemode - movwf CCP1CON ; Power-on backlight + rcall menu_draw_lines ; Always re-draw whole menu + movlw CCP1CON_VALUE ; See hwos.inc + btfss divemode ; Not in divemode + movwf CCP1CON ; Power-on backlight menu_vertical_1: - movf selected_item,W ; Get current item data - rcall menu_read_item - movf proc_item+0,W ; Check if pro address is NULL ? - iorwf proc_item+1,W - bz next_line_menu ; YES: not selectable ! - - btfss divemode ; Not in divemode - rcall menu_draw_selected_line - - btfsc in_color_menu ; =1: In the color scheme menu - call TFT_show_color_schemes ; Yes, update the color schemes - - extern rtc_set_rtc - btfss settime_setdate ; In the Set Time or Set Date menu? - bra menu_line_loop_pre2 ; no, skip all following - - 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? - bra menu_line_loop_pre1 ; OK! - movlw .1 ; not OK, set to 1st - movwf day + movf selected_item,W ; Get current item data + rcall menu_read_item + movf proc_item+0,W ; Check if pro address is NULL ? + iorwf proc_item+1,W + bz next_line_menu ; YES: not selectable ! + btfss divemode ; Not in divemode + rcall menu_draw_selected_line + btfsc in_color_menu ; =1: In the color scheme menu + call TFT_show_color_schemes ; Yes, update the color schemes + btfss settime_setdate ; In the Set Time or Set Date menu? + bra menu_line_loop_pre2 ; no, skip all following + 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? + bra menu_line_loop_pre1 ; OK! + movlw .1 ; not OK, set to 1st + movwf day menu_line_loop_pre1: - btfsc switch_right ; Enter pressed? - call rtc_set_rtc ; Yes, update mins,sec,hours,day,month and year to rtc module - call TFT_show_time_date_menu ; Update clock + btfsc switch_right ; Enter pressed? + call rtc_set_rtc ; Yes, update mins,sec,hours,day,month and year to RTC module + call TFT_show_time_date_menu ; Update clock menu_line_loop_pre2: - bcf switch_right - bcf switch_left - btfss divemode ; Not in Divemode - call speed_normal + bcf switch_right + bcf switch_left + btfss divemode ; Not in divemode + call speed_normal menu_line_loop_pre3: - extern divemode_option0_return - btfsc divemode ; In divemode? - goto divemode_option0_return ; Yes, return to it + btfsc divemode ; In divemode? + goto divemode_option0_return ; Yes, return to it menu_line_loop: - btfsc switch_right - bra do_line_menu ; Type dependent - btfsc switch_left - bra next_line_menu - - btfss quarter_second_update ; 1/4 second? - bra menu_line_loop1 ; Not yet... - - btfsc menu_show_sensors2 ; In the "Calibrate" menu? - call TFT_menu_calibrate ; Yes, update mV data - bcf quarter_second_update ; Clear flag + btfsc switch_right + bra do_line_menu ; Type dependent + btfsc switch_left + bra next_line_menu + btfss quarter_second_update ; 1/4 second? + bra menu_line_loop1 ; Not yet... + btfsc menu_show_sensors2 ; In the "Calibrate" menu? + call TFT_menu_calibrate ; Yes, update mV data + bcf quarter_second_update ; Clear flag menu_line_loop1: - btfss onesecupdate ; New second - bra menu_line_loop2 ; not yet... - - call timeout_surfmode ; timeout - call set_dive_modes ; check, if divemode must be entered - call get_battery_voltage ; gets battery voltage - - btfsc settime_setdate ; In the Set Time or Set Date menu? - call TFT_show_time_date_menu ; Yes, update clock - - ; DELETE - menu has been deleted ## memory - ; btfsc menu_show_sensors ; In the "Sensors" menu? - ; call TFT_menu_hud ; Yes, update HUD data - - bcf onesecupdate ; one second updates done + btfss onesecupdate ; New second + bra menu_line_loop2 ; not yet... + call timeout_surfmode ; timeout on timeout_counter2 + call set_dive_modes ; check, if divemode must be entered + call get_battery_voltage ; gets battery voltage + btfsc settime_setdate ; In the Set Time or Set Date menu? + call TFT_show_time_date_menu ; Yes, update clock + bcf onesecupdate ; one second updates done menu_line_loop2: - btfsc sleepmode ; Timeout? - goto restart ; Yes, back to surfacemode - btfsc divemode - goto restart ; Enter Divemode if required - - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - bra menu_line_loop3 - btfsc vusb_in ; USB plugged in? - call comm_mode ; Start COMM mode - bra menu_line_loop4 + btfsc sleepmode ; Timeout? + goto restart ; Yes, back to surfacemode + btfsc divemode + goto restart ; Enter divemode if required + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + bra menu_line_loop3 + btfsc vusb_in ; USB plugged in? + call comm_mode ; Start COMM mode + bra menu_line_loop4 menu_line_loop3: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag - call rs232_get_byte - btfsc rs232_recieve_overflow - bra menu_line_loop4 - movlw "l" - cpfseq RCREG1 - bra menu_line_loop4 - call TFT_dump_screen ; Dump the screen contents + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag + call rs232_get_byte + btfsc rs232_receive_overflow + bra menu_line_loop4 + movlw "l" + cpfseq RCREG1 + bra menu_line_loop4 + call TFT_dump_screen ; Dump the screen contents menu_line_loop4: - - bra menu_line_loop + bra menu_line_loop ;---- Move to menu's next line next_line_menu: - btfss divemode ; not in divemode - call speed_fastest - bcf switch_left ; Avoid looping. + btfss divemode ; not in divemode + call speed_fastest + bcf switch_left ; Avoid looping. + incf selected_item,F ; Select next item. + movf selected_item,W ; Index == max ? + cpfseq item_max + bra menu_vertical_1 ; NO: redraw cursor. + clrf selected_item ; YES: restart for item 0. + bra menu_vertical_1 ; Then redraw cursor. - incf selected_item,F ; Select next item. - movf selected_item,W ; Index == max ? - cpfseq item_max - bra menu_vertical_1 ; NO: redraw cursor. - - clrf selected_item ; YES: restart for item 0. - bra menu_vertical_1 ; Then redraw cursor. - - global do_line_menu + global do_line_menu do_line_menu: - btfss divemode ; not in divemode - call speed_fastest -; bcf switch_right ; Avoid looping. - - decf menupos,W ; menu_processor needs 0-5... - btfsc divemode ; only in divemode - movwf selected_item - - movf selected_item,W ; Read selected descriptor - rcall menu_read_item - - movf value_type,W ; Switch on data type - bz menu_do_line_call ; CALL - dcfsnz WREG - bra menu_do_line_call ; STRING: do as call - dcfsnz WREG - bra menu_do_line_option ; OPTION - dcfsnz WREG - bra menu_do_line_call ; DYNAMIC: do as call - bra menu_line_loop_pre3 ; else do nothing... + btfss divemode ; not in divemode + call speed_fastest +; bcf switch_right ; Avoid looping. + decf menupos1,W ; menu_processor needs 0-5... + btfsc divemode ; only in divemode + movwf selected_item + movf selected_item,W ; Read selected descriptor + rcall menu_read_item + movf value_type,W ; Switch on data type + bz menu_do_line_call ; CALL + dcfsnz WREG + bra menu_do_line_call ; STRING: do as call + dcfsnz WREG + bra menu_do_line_option ; OPTION + dcfsnz WREG + bra menu_do_line_call ; DYNAMIC: do as call + bra menu_line_loop_pre3 ; else do nothing... ;---- CALL menu_do_line_call: - rcall do_menu_item ; Same as icon menu: calculated goto. - rcall menu_processor_pop ; Back to same line, - bra menu_vertical ; Then continue into menu... + rcall do_menu_item ; Same as icon menu: calculated goto. + rcall menu_processor_pop ; Back to same line, + bra menu_vertical ; Then continue into menu... ;---- Call option specific increment subroutine menu_do_line_option: - movff option_item+0,FSR0L ; Get option handle - movff option_item+1,FSR0H - call option_inc ; increment - - movff selected_item,PRODL ; Pass selection to callback. - rcall menu_text_call - bra menu_vertical_2 ; redraw all lines... + movff option_item+0,FSR0L ; Get option handle + movff option_item+1,FSR0H + call option_inc ; increment + movff selected_item,PRODL ; Pass selection to callback. + rcall menu_text_call + bra menu_vertical_2 ; redraw all lines... ;----------------------------------------------------------------------------- menu_draw_lines_divemode: - movlw dm_menu_item1_row - movff WREG,win_top - movlw dm_menu_item1_column - movff WREG,win_leftx2 - clrf start_item - movff item_max,menupos4 ; Copy item_max for divemode cursor routine - bra menu_draw_lines_2 + movlw dm_menu_item1_row + movff WREG,win_top + movlw dm_menu_item1_column + movff WREG,win_leftx2 + clrf start_item + movff item_max,menupos4 ; Copy item_max for divemode cursor routine + bra menu_draw_lines_2 menu_draw_lines: - btfsc divemode ; in divemode? - bra menu_draw_lines_divemode; Yes - - btfsc menu_flags,0 ; Dynamic title ? - rcall menu_processor_title ; YES: redraw it then. + btfsc divemode ; in divemode? + bra menu_draw_lines_divemode ; Yes + btfsc menu_flags,0 ; Dynamic title ? + rcall menu_processor_title ; YES: redraw it then. + MENU_LINE_FONT MENU_LEFT, 0 ; Init start position/font + movff menu_center,win_top ; computed in menu block. - MENU_LINE_FONT MENU_LEFT, 0 ; Init start position/font - movff menu_center,win_top ; computed in menu block. - - ; Does the menu have more than 6 lines ? - movf item_max,W - addlw -(MENU_LINES_MAX+1) ; (max - 7) - bnn menu_draw_long_menu ; bra if (max >= 7) - - clrf start_item - bra menu_draw_lines_2 + ; Does the menu have more than 6 lines ? + movf item_max,W + addlw -(MENU_LINES_MAX+1) ; (max - 7) + bnn menu_draw_long_menu ; bra if (max >= 7) + clrf start_item + bra menu_draw_lines_2 menu_draw_long_menu: - movf selected_item,W ; Start at selected-6 - addlw -(MENU_LINES_MAX-1) - btfsc STATUS,N ; This is <0 ? - clrf WREG ; YES: start from top instead. - movwf start_item + movf selected_item,W ; Start at selected-6 + addlw -(MENU_LINES_MAX-1) + btfsc STATUS,N ; This is <0 ? + clrf WREG ; YES: start from top instead. + movwf start_item menu_draw_lines_2: - movff start_item, menu_item + movff start_item, menu_item menu_draw_lines_1: - call TFT_standard_color ; Restore color after disabled lines. - - movf menu_item,W - rcall menu_read_item - - movf value_type,W ; Switch on data type - bz menu_draw_line_call - dcfsnz WREG - bra menu_draw_line_string - dcfsnz WREG - bra menu_draw_line_option - dcfsnz WREG - bra menu_draw_line_dynamic - bra menu_draw_line_none + call TFT_standard_color ; Restore color after disabled lines. + movf menu_item,W + rcall menu_read_item + movf value_type,W ; Switch on data type + bz menu_draw_line_call + dcfsnz WREG + bra menu_draw_line_string + dcfsnz WREG + bra menu_draw_line_option + dcfsnz WREG + bra menu_draw_line_dynamic + bra menu_draw_line_none menu_draw_line_string: - movff text_item+0,TBLPTRL ; Read not-translated string from PROM. - movff text_item+1,TBLPTRH - call strcpy_prom ; Copy in buffer - bra menu_draw_line_none - -menu_draw_line_call: - movff text_item+0,FSR1L ; Read string from PROM. - movff text_item+1,FSR1H - call strcpy_text ; Copy in buffer + movff text_item+0,TBLPTRL ; Read not-translated string from PROM. + movff text_item+1,TBLPTRH + call strcpy_prom ; Copy in buffer + bra menu_draw_line_none - bra menu_draw_line_none - +menu_draw_line_call: + movff text_item+0,FSR1L ; Read string from PROM. + movff text_item+1,FSR1H + call strcpy_text ; Copy in buffer + bra menu_draw_line_none + menu_draw_line_option: - movff text_item+0,FSR1L ; Read string from PROM. - movff text_item+1,FSR1H - call strcpy_text ; Copy in buffer - - movff option_item+0,FSR0L ; Retrieve option handle. - movff option_item+1,FSR0H - btfss settime_setdate ; Not in Time/Date menu... - call option_draw - bra menu_draw_line_none + movff text_item+0,FSR1L ; Read string from PROM. + movff text_item+1,FSR1H + call strcpy_text ; Copy in buffer + movff option_item+0,FSR0L ; Retrieve option handle. + movff option_item+1,FSR0H + btfss settime_setdate ; Not in Time/Date menu... + call option_draw + bra menu_draw_line_none menu_draw_line_dynamic: - lfsr FSR2,buffer - movff menu_item,PRODL ; Pass item to callback. - rcall menu_text_call ; Push return address. - bra menu_draw_line_none + lfsr FSR2,buffer + movff menu_item,PRODL ; Pass item to callback. + rcall menu_text_call ; Push return address. + bra menu_draw_line_none ; Computed goto to pointer inside dynamic_item: menu_text_call: - movf dynamic_item+0,W ; Check if callback is NULL - iorwf dynamic_item+1,W - iorwf dynamic_item+2,W - btfsc STATUS,Z - return ; YES: don't call it. - - movff dynamic_item+2,PCLATU ; Prepare... - movff dynamic_item+1,PCLATH - movf dynamic_item+0,W - movwf PCL ; And jump ! + movf dynamic_item+0,W ; Check if callback is NULL + iorwf dynamic_item+1,W + iorwf dynamic_item+2,W + btfsc STATUS,Z + return ; YES: don't call it. + movff dynamic_item+2,PCLATU ; Prepare... + movff dynamic_item+1,PCLATH + movf dynamic_item+0,W + movwf PCL ; And jump ! menu_draw_line_none: - extern TFT_fillup_with_spaces - - btfsc divemode ; In divemode? - bra menu_draw_line_none_divemode ; Yes - - movlw MENU_LINE_MAX_LENGTH - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - clrf WREG - movff WREG,buffer+MENU_LINE_MAX_LENGTH;No ; Make sure won't be longer than MENU_LINE_MAX_LENGTH ch - call aa_wordprocessor - movlw MENU_HEIGHT ; No, Move to next line - addwf win_top,F - incf menu_item,F ; inc loop counter - - movf start_item,W ; First line (scrolled) - subwf menu_item,W ; current - first - xorlw MENU_LINES_MAX ; Already done 6 lines ? - btfsc STATUS,Z - return ; YES + btfsc divemode ; In divemode? + bra menu_draw_line_none_divemode ; Yes + movlw MENU_LINE_MAX_LENGTH + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + clrf WREG + movff WREG,buffer+MENU_LINE_MAX_LENGTH ; No - make sure won't be longer than MENU_LINE_MAX_LENGTH ch + call aa_wordprocessor + movlw MENU_HEIGHT ; No, Move to next line + addwf win_top,F + incf menu_item,F ; inc loop counter + movf start_item,W ; First line (scrolled) + subwf menu_item,W ; current - first + xorlw MENU_LINES_MAX ; Already done 6 lines ? + btfsc STATUS,Z + return ; YES menu_draw_line_none2: - movf menu_item,W ; Done item_max lines ? - xorwf item_max,W - btfss STATUS,Z - bra menu_draw_lines_1 ; No: loop... - return + movf menu_item,W ; Done item_max lines ? + xorwf item_max,W + btfss STATUS,Z + bra menu_draw_lines_1 ; No: loop... + return menu_draw_line_none_divemode: - movlw .10 - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - clrf WREG - movff WREG,buffer+.10 - - call aa_wordprocessor ; Draw the line! - - banksel common - bcf win_invert ; Reset invert flag - banksel win_top - - movlw .24 ; Divemode menu spacing - addwf win_top,F - incf menu_item,F ; inc loop counter - - movlw .3 - cpfseq menu_item ; At pos 4? - bra menu_draw_line_none2 ; No - - movlw dm_menu_item4_row - movff WREG,win_top ; Reset row - movlw dm_menu_item4_column - movff WREG,win_leftx2 ; New column - bra menu_draw_line_none2 ; Done. + movlw .10 + call TFT_fillup_with_spaces ; Fill up FSR2 with spaces (Total string length in #WREG) + clrf WREG + movff WREG,buffer+.10 + call aa_wordprocessor ; Draw the line! + banksel common + bcf win_invert ; Reset invert flag + banksel win_top + movlw .24 ; divemode menu spacing + addwf win_top,F + incf menu_item,F ; inc loop counter + movlw .3 + cpfseq menu_item ; At pos 4? + bra menu_draw_line_none2 ; No + movlw dm_menu_item4_row + movff WREG,win_top ; Reset row + movlw dm_menu_item4_column + movff WREG,win_leftx2 ; New column + bra menu_draw_line_none2 ; Done. ;----------------------------------------------------------------------------- ; Put a mark in front of the current line menu_draw_selected_line: - clrf timeout_counter2 ; Reset timeout - WIN_BOX_BLACK .34,.221,MENU_LEFT-8,MENU_LEFT-2 ; Clear left column - - call TFT_standard_color - WIN_SMALL MENU_LEFT-8, 0 ; Arrow symbol only in small font - movf start_item,W ; First line (scrolled) - subwf selected_item,W ; selected - first - mullw MENU_HEIGHT ; 30 pixel by line - movf PRODL,W ; result - addwf menu_center,W ; added to first line - movwf win_top ; and stored to pos. - STRCPY_PRINT "\xb7" ; print cursor + clrf timeout_counter2 ; Reset timeout + WIN_BOX_BLACK .34,.221,MENU_LEFT-8,MENU_LEFT-2 ; Clear left column + call TFT_standard_color + WIN_SMALL MENU_LEFT-8, 0 ; Arrow symbol only in small font + movf start_item,W ; First line (scrolled) + subwf selected_item,W ; selected - first + mullw MENU_HEIGHT ; 30 pixel by line + movf PRODL,W ; result + addwf menu_center,W ; added to first line + movwf win_top ; and stored to pos. + STRCPY_PRINT "\xb7" ; print cursor + return - return - - END + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/menu_processor.inc --- a/src/menu_processor.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/menu_processor.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_processor.asm +; File menu_processor.asm REFACTORED VERSION V2.97 ; ; Routines to handle all OSTC graphic/text menus. ; @@ -9,82 +9,88 @@ ; HISTORY ; 2011-05-30 : [jDG] Creation. - ; Restart menu-system from first icon/line: - extern menu_processor_reset - - ; Recal last (automatically) saved icon/line when returning from submenu. - extern menu_processor_pop + ; Restart menu-system from first icon/line + extern menu_processor_reset - ; Rexecute the menu block - extern menu_processor + ; Recall last (automatically) saved icon/line when returning from submenu + extern menu_processor_pop + extern menu_processor_double_pop - extern menu_processor_bottom_line + ; execute the menu block + extern menu_processor + extern menu_processor_bottom_line ;============================================================================= ; Menus parameters ;NOTE: should be idenric in .inc and .asm ! -#define MENU_LINES_MAX .7 ; Number of lines per screen? -#define MENU_HEIGHT .27 ; Spacing on screen. -#define MENU_VCENTER .125 ; Position on screen. +#define MENU_LINES_MAX .7 ; Number of lines per screen? +#define MENU_HEIGHT .27 ; Spacing on screen. +#define MENU_VCENTER .125 ; Position on screen. ;============================================================================= -COMMON_BEGIN_MENU MACRO dynamic, txt, nb_items - local center - If nb_items > MENU_LINES_MAX -center set MENU_VCENTER - (MENU_HEIGHT/2) * MENU_LINES_MAX - Else -center set MENU_VCENTER - (MENU_HEIGHT/2) * nb_items - Endif - If nb_items <= 0 - Error "Zero items in menu ", x - Endif +COMMON_BEGIN_MENU MACRO dynamic, txt, nb_items + local center + + If nb_items > MENU_LINES_MAX +center set MENU_VCENTER - (MENU_HEIGHT/2) * MENU_LINES_MAX + Else +center set MENU_VCENTER - (MENU_HEIGHT/2) * nb_items + Endif - extern txt - call menu_processor - ; Push 6 bytes of menu header data. - db nb_items, dynamic - db LOW(txt), HIGH(txt) - db UPPER(txt), center - ENDM + If nb_items <= 0 + Error "Zero items in menu ", x + Endif + + extern txt + call menu_processor + + ; Push 6 bytes of menu header data. + db nb_items, dynamic + db LOW(txt), HIGH(txt) + db UPPER(txt), center + ENDM ;============================================================================= + ; Macro to generat (and check) menu vertical menu blocks with data. -; -MENU_BEGIN MACRO menu_title, nb_items - COMMON_BEGIN_MENU 0, menu_title, nb_items - ENDM -MENU_BEGIN_DYNAMIC macro title_proc, nb_items - COMMON_BEGIN_MENU 1, title_proc, nb_items - ENDM +MENU_BEGIN MACRO menu_title, nb_items + COMMON_BEGIN_MENU 0, menu_title, nb_items + ENDM + +MENU_BEGIN_DYNAMIC MACRO title_proc, nb_items + COMMON_BEGIN_MENU 1, title_proc, nb_items + ENDM ;============================================================================= ; Submenu -MENU_CALL MACRO txt, proc - extern txt - db 0, 0, 0, 0 - db LOW(proc), HIGH(proc), UPPER(proc), 0 - db LOW(txt), HIGH(txt) + +MENU_CALL MACRO txt, proc + extern txt + db 0, 0, 0, 0 + db LOW(proc), HIGH(proc), UPPER(proc), 0 + db LOW(txt), HIGH(txt) ENDM ; Generic option menu -MENU_OPTION MACRO txt, option, callback - extern txt - extern option - db 2, LOW(callback), HIGH(callback), UPPER(callback) - db LOW(option),HIGH(option),UPPER(option), 0 - db LOW(txt), HIGH(txt) - ENDM + +MENU_OPTION MACRO txt, option, callback + extern txt + extern option + db 2, LOW(callback), HIGH(callback), UPPER(callback) + db LOW(option), HIGH(option), UPPER(option), 0 + db LOW(txt), HIGH(txt) + ENDM -MENU_DYNAMIC MACRO callback, proc - extern callback - db 3, LOW(callback), HIGH(callback), UPPER(callback) - db LOW(proc), HIGH(proc), UPPER(proc), 0 - db 0, 0 - ENDM +MENU_DYNAMIC MACRO callback, proc + extern callback + db 3, LOW(callback), HIGH(callback), UPPER(callback) + db LOW(proc), HIGH(proc), UPPER(proc), 0 + db 0, 0 + ENDM -MENU_END MACRO - ENDM \ No newline at end of file +MENU_END MACRO + ENDM \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/menu_tree.asm --- a/src/menu_tree.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/menu_tree.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_tree.asm REFACTORED VERSION V2.95 +; File menu_tree.asm REFACTORED VERSION V2.98 ; ; OSTC menus ; @@ -9,750 +9,797 @@ ; HISTORY ; 2011-07-11 : [jDG] Creation. -#include "hwos.inc" ; Mandatory header -#include "gaslist.inc" -#include "menu_processor.inc" -#include "start.inc" -#include "comm.inc" -#include "logbook.inc" -#include "tft.inc" -#include "eeprom_rs232.inc" -#include "external_flash.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "isr.inc" -#include "ghostwriter.inc" -#include "adc_lightsensor.inc" -#include "wait.inc" -#include "i2c.inc" +#include "hwos.inc" ; Mandatory header +#include "gaslist.inc" +#include "menu_processor.inc" +#include "start.inc" +#include "comm.inc" +#include "logbook.inc" +#include "tft.inc" +#include "eeprom_rs232.inc" +#include "external_flash.inc" +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "isr.inc" +#include "ghostwriter.inc" +#include "adc_lightsensor.inc" +#include "wait.inc" +#include "i2c.inc" + - CBLOCK tmp+0x40 ; Keep space for menu processor - gaslist_gas ; Check ram position in gaslist.asm, too! - ENDC + extern do_demo_divemode + extern restart + extern option_save_all + extern option_reset + extern do_demo_planner + extern calibrate_mix + extern comm_mode0 + extern piezo_config + extern compass_calibration_loop + extern option_reset_all + extern rtc_set_rtc + extern surfloop + extern oColorSetDive -gui CODE + +gui CODE + ;============================================================================= ; Main Menu - global do_main_menu,do_main_menu2 + +do_return_main_menu: + call menu_processor_double_pop ; drop exit line and back to last line + bra do_main_menu_common + + global do_main_menu do_main_menu: - movff menupos3,customview_surfmode; save last customview -do_main_menu2: - call TFT_boot - bcf sleepmode ; for timeout - call menu_processor_reset ; restart from first icon. - -do_continue_main_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line + movff menupos3,customview_surfmode ; save last customview - extern do_demo_divemode, restart - MENU_BEGIN tMainMenu, .7 - MENU_CALL tLogbook, logbook - MENU_CALL tGasSetup, do_gas_menu - MENU_CALL tCCRSetup, do_ccr_menu - MENU_CALL tPlan, do_planner_menu_reset - MENU_CALL tDiveModeMenu, do_divemode_menu - MENU_CALL tSystSets, do_settings_menu - MENU_CALL tExit, restart - MENU_END + global do_main_menu2 +do_main_menu2: ; entry point used by logbook.asm + call TFT_boot + bcf sleepmode ; for timeout + call menu_processor_reset ; restart from first icon -do_info_menu: - MENU_BEGIN tInfoMenu, .6 - MENU_DYNAMIC info_menu_serial, 0 - MENU_DYNAMIC info_menu_firmware, 0 - MENU_DYNAMIC info_menu_battery_volts,0 - MENU_DYNAMIC info_menu_uptime, 0 - MENU_DYNAMIC info_menu_total_dives, 0 - MENU_CALL tExit, do_return_settings - MENU_END +do_main_menu_common: + MENU_BEGIN tMainMenu, .7 + MENU_CALL tLogbook, logbook + MENU_CALL tGasSetup, do_gas_menu + MENU_CALL tCCRSetup, do_ccr_menu + MENU_CALL tPlan, do_planner_menu + MENU_CALL tDiveModeMenu, do_divemode_menu + MENU_CALL tSystSets, do_settings_menu + MENU_CALL tExit, restart + MENU_END + ;============================================================================= ; CCR Setup -return_ccr_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line +do_return_ccr_menu: + call menu_processor_double_pop ; drop exit line and back to last line do_ccr_menu: - bcf menu_show_sensors2 ; Clear flag - btfsc analog_o2_input - bra do_ccr_menu_cR + bcf menu_show_sensors2 ; stop imprinting of live sensor values - ; COMMENT OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu - ; btfss optical_input - ; bra do_ccr_menu_ostc2 + btfsc analog_o2_input + bra do_ccr_menu_cR + + ; COMMENTED OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu + ; btfss optical_input + ; bra do_ccr_menu_ostc2 - MENU_BEGIN tCCRSetup, .6 ; OSTC3 menu (and currently also the OSTC2 menu) - MENU_OPTION tCCRMode, oCCRMode, 0 - MENU_CALL tDiluentSetup, do_diluent_setup - MENU_CALL tFixedSetpoints, do_fixed_setpoints - MENU_CALL tPSCRMenu, do_PSCR_menu - MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 - MENU_CALL tExit, do_continue_main_menu - MENU_END + MENU_BEGIN tCCRSetup, .6 ; OSTC3 menu (and currently also the OSTC2 menu) + MENU_OPTION tCCRMode, oCCRMode, 0 + MENU_CALL tDiluentSetup, do_diluent_setup + MENU_CALL tFixedSetpoints, do_fixed_setpoints + MENU_CALL tPSCRMenu, do_PSCR_menu + MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 + MENU_CALL tExit, do_return_main_menu + MENU_END + -do_ccr_menu_cR: ; cR menu - MENU_BEGIN tCCRSetup, .7 - MENU_OPTION tCCRMode, oCCRMode, 0 - MENU_CALL tCalibrateMenu, do_calibrate_menu - MENU_CALL tDiluentSetup, do_diluent_setup - MENU_CALL tFixedSetpoints, do_fixed_setpoints - MENU_CALL tPSCRMenu, do_PSCR_menu - MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 - MENU_CALL tExit, do_continue_main_menu - MENU_END +do_ccr_menu_cR: ; cR menu + MENU_BEGIN tCCRSetup, .7 + MENU_OPTION tCCRMode, oCCRMode, 0 + MENU_CALL tCalibrateMenu, do_calibrate_menu + MENU_CALL tDiluentSetup, do_diluent_setup + MENU_CALL tFixedSetpoints, do_fixed_setpoints + MENU_CALL tPSCRMenu, do_PSCR_menu + MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 + MENU_CALL tExit, do_return_main_menu + MENU_END -; COMMENT OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu +; COMMENTED OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu ;do_ccr_menu_ostc2: -; MENU_BEGIN tCCRSetup, .6 ; ostc2 menu -; MENU_OPTION tCCRMode, oCCRMode, 0 -; MENU_CALL tDiluentSetup, do_diluent_setup -; MENU_CALL tFixedSetpoints, do_fixed_setpoints -; MENU_CALL tPSCRMenu, do_PSCR_menu -; MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 -; MENU_CALL tExit, do_continue_main_menu -; MENU_END +; MENU_BEGIN tCCRSetup, .6 ; ostc2 menu +; MENU_OPTION tCCRMode, oCCRMode, 0 +; MENU_CALL tDiluentSetup, do_diluent_setup +; MENU_CALL tFixedSetpoints, do_fixed_setpoints +; MENU_CALL tPSCRMenu, do_PSCR_menu +; MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 +; MENU_CALL tExit, do_return_main_menu +; MENU_END -do_PSCR_menu: - MENU_BEGIN tPSCRMenu, .3 ; PSCR Menu - MENU_OPTION tPSCR_O2_drop, oPSCR_drop, 0 - MENU_OPTION tPSCR_lungratio, oPSCR_lungratio, 0 - MENU_CALL tExit, return_ccr_menu - MENU_END do_calibrate_menu: - call enable_ir_s8 ; Enable IR/S8-Port - bsf menu_show_sensors2 ; Set flag + call enable_ir_s8 ; Enable IR/S8-Port + bsf menu_show_sensors2 ; start imprinting of live sensor values + do_calibrate_menu2: - MENU_BEGIN tCalibrateMenu, .6 - MENU_CALL tDiveHudMask1, 0 - MENU_CALL tDiveHudMask2, 0 - MENU_CALL tDiveHudMask3, 0 - MENU_OPTION tCalibrationGas,oCalGasO2, 0 - MENU_CALL tCalibrate, do_calibrate_mix - MENU_CALL tExit, return_ccr_menu - MENU_END + MENU_BEGIN tCalibrateMenu, .6 + MENU_CALL tDiveHudMask1, 0 + MENU_CALL tDiveHudMask2, 0 + MENU_CALL tDiveHudMask3, 0 + MENU_OPTION tCalibrationGas,oCalGasO2, 0 + MENU_CALL tCalibrate, do_calibrate_mix + MENU_CALL tExit, do_return_ccr_menu + MENU_END + do_calibrate_mix: - extern calibrate_mix - call calibrate_mix ; Calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected - WAITMS d'250' ; Wait for HUD v3 - movlw .9 - movwf customview_surfmode ; show sensor mV custom view after restart - goto restart ; Restart into surface mode + call calibrate_mix ; Calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected + WAITMS d'250' ; Wait for HUD v3 + movlw .9 + movff WREG,customview_surfmode ; show sensor mV custom view after restart + goto restart ; Restart into surface mode do_diluent_setup: - bsf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") - bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth - MENU_BEGIN tDiluentSetup, .6 - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_CALL tExit, return_ccr_menu - MENU_END + bsf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") + bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth + + MENU_BEGIN tDiluentSetup, .6 + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_CALL tExit, do_return_ccr_menu + MENU_END + do_return_fixed_setpoints: - rcall menu_tree_double_pop ; drop exit line and back to last line + call menu_processor_double_pop ; drop exit line and back to last line do_fixed_setpoints: - bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - MENU_BEGIN tFixedSetpoints, .6 - MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu - MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu - MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu - MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu - MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu - MENU_CALL tExit, return_ccr_menu - MENU_END + bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + + MENU_BEGIN tFixedSetpoints, .6 + MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu + MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu + MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu + MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu + MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu + MENU_CALL tExit, do_return_ccr_menu + MENU_END + do_edit_sp_menu: - call gaslist_setSP ; Save current item. - MENU_BEGIN tFixedSetpoints, .5 - MENU_DYNAMIC gaslist_strcat_setpoint_0,0 - MENU_CALL tSPPlus, gaslist_spplus - MENU_CALL tDepthPlus, gaslist_spdepthplus - MENU_CALL tDepthMinus, gaslist_spdepthminus - MENU_CALL tExit, do_return_fixed_setpoints - MENU_END + call gaslist_setSP ; Save current item. + + MENU_BEGIN tFixedSetpoints, .5 + MENU_DYNAMIC gaslist_strcat_setpoint_0, 0 + MENU_CALL tSPPlus, gaslist_spplus + MENU_CALL tDepthPlus, gaslist_spdepthplus + MENU_CALL tDepthMinus, gaslist_spdepthminus + MENU_CALL tExit, do_return_fixed_setpoints + MENU_END + + +do_PSCR_menu: + MENU_BEGIN tPSCRMenu, .3 ; PSCR Menu + MENU_OPTION tPSCR_O2_drop, oPSCR_drop, 0 + MENU_OPTION tPSCR_lungratio, oPSCR_lungratio, 0 + MENU_CALL tExit, do_return_ccr_menu + MENU_END ;============================================================================= ; OC Gas Setup -return_gas_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line +do_return_gas_menu: + call menu_processor_double_pop ; drop exit line and back to last line - btfsc ccr_diluent_setup ; Return to CCR-Menu? - bra do_diluent_setup ; Yes. + btfsc ccr_diluent_setup ; Return to CCR-Menu? + bra do_diluent_setup ; Yes. + do_gas_menu: - bcf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") - bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth - MENU_BEGIN tGaslist, .6 - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu - MENU_CALL tExit, do_continue_main_menu - MENU_END + bcf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") + bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth -return_gas_depth: - rcall menu_tree_double_pop ; drop exit line and back to last line - bra do_edit_gas_menu_1 + MENU_BEGIN tGaslist, .6 + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_mod, do_edit_gas_menu + MENU_CALL tExit, do_return_main_menu + MENU_END + + +do_return_edit_gas_menu: + call menu_processor_pop ; drop exit line and ... +do_abort_gas_depth_menu: + call menu_processor_pop ; back to last line + bra do_edit_gas_menu_common do_edit_gas_menu: - call gaslist_setgas ; Save current item. -do_edit_gas_menu_1: ; Keep current gas. - MENU_BEGIN tGasEdit, .6 - MENU_DYNAMIC gaslist_gastitle, 0 - MENU_DYNAMIC gaslist_MOD_END, 0 - MENU_DYNAMIC gaslist_show_type, gaslist_toggle_type - MENU_CALL tSetup_mix, do_setup_mix - MENU_CALL tGasDepth, do_gas_depth_menu - MENU_CALL tExit, return_gas_menu - MENU_END + call gaslist_setgas ; set gaslist_gas + +do_edit_gas_menu_common: ; keep current gas + MENU_BEGIN tGasEdit, .6 + MENU_DYNAMIC gaslist_gastitle, 0 + MENU_DYNAMIC gaslist_MOD_END, 0 + MENU_DYNAMIC gaslist_show_type, gaslist_toggle_type + MENU_CALL tSetup_mix, do_setup_mix + MENU_CALL tGasDepth, do_gas_depth_menu + MENU_CALL tExit, do_return_gas_menu + MENU_END + do_setup_mix: - MENU_BEGIN tGasEdit, .7 - MENU_DYNAMIC gaslist_gastitle, 0 - MENU_DYNAMIC gaslist_MOD_END, 0 - MENU_CALL tO2Plus, gaslist_pO2 - MENU_CALL tO2Minus, gaslist_mO2 - MENU_CALL tHePlus, gaslist_pHe - MENU_CALL tHeMinus, gaslist_mHe - MENU_CALL tExit, return_gas_depth - MENU_END - -menu_tree_double_pop: - call menu_processor_pop ; drop exit line. - goto menu_processor_pop ; back to last gas and return + MENU_BEGIN tGasEdit, .7 + MENU_DYNAMIC gaslist_gastitle, 0 + MENU_DYNAMIC gaslist_MOD_END, 0 + MENU_CALL tO2Plus, gaslist_pO2 + MENU_CALL tO2Minus, gaslist_mO2 + MENU_CALL tHePlus, gaslist_pHe + MENU_CALL tHeMinus, gaslist_mHe + MENU_CALL tExit, do_return_edit_gas_menu + MENU_END - global do_gas_depth_menu do_gas_depth_menu: - movff gaslist_gas,WREG - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,lo ; Used as temp - movlw .3 ; 3=Deco - btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") - movlw .2 ; 2=Normal - cpfseq lo - bra return_gas_depth ; Non-Deco gas or "Normal" Diluent, Return! + movff gaslist_gas,WREG + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,lo ; Used as temp + movlw .3 ; 3=Deco + btfsc ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") + movlw .2 ; 2=Normal + cpfseq lo + bra do_abort_gas_depth_menu ; Non-Deco gas or "Normal" Diluent, abort! - MENU_BEGIN tGasEdit, .7 - MENU_DYNAMIC gaslist_gastitle, 0 - MENU_DYNAMIC gaslist_MOD_END, 0 - MENU_DYNAMIC gaslist_ppo2, 0 ; ppO2 at change depth - MENU_CALL tDepthPlus, gaslist_pDepth - MENU_CALL tDepthMinus, gaslist_mDepth - MENU_DYNAMIC gaslist_reset_mod_title,gaslist_reset_mod - MENU_CALL tExit, return_gas_depth - MENU_END + MENU_BEGIN tGasEdit, .7 + MENU_DYNAMIC gaslist_gastitle, 0 + MENU_DYNAMIC gaslist_MOD_END, 0 + MENU_DYNAMIC gaslist_ppo2, 0 ; ppO2 at change depth + MENU_CALL tDepthPlus, gaslist_pDepth + MENU_CALL tDepthMinus, gaslist_mDepth + MENU_DYNAMIC gaslist_reset_mod_title, gaslist_reset_mod + MENU_CALL tExit, do_return_edit_gas_menu + MENU_END - + ;============================================================================= ; Simulator menus - global do_planner_menu +do_return_planner_menu: + call menu_processor_pop ; drop exit line and ... -do_planner_menu_reset: - extern option_save_all - call option_save_all - call restart_set_modes_and_flags ; To have correct simulator results for mode changes without prior surfacemode call - ;---- Reset dive time/depth to default values - extern option_reset - lfsr FSR0,odiveInterval - call option_reset - lfsr FSR0,obottomTime - call option_reset - lfsr FSR0,obottomDepth - call option_reset + global do_return_demo_planner +do_return_demo_planner: + call menu_processor_pop ; back to last line + bra do_planner_common do_planner_menu: - extern do_demo_planner - MENU_BEGIN tPlan, .7 - MENU_OPTION tIntvl, odiveInterval, 0 - MENU_OPTION tBtDep, obottomDepth, 0 - MENU_CALL tInter, do_demo_divemode - MENU_OPTION tBtTm, obottomTime, 0 - MENU_CALL tDecoSetup, do_planner_config - MENU_CALL tDeco, do_demo_planner - MENU_CALL tExit, do_continue_main_menu - MENU_END + ; to have correct simulator results after mode changes without prior excursion to surfacemode + call option_save_all + call restart_set_modes_and_flags + ; Reset dive time/depth to default values + lfsr FSR0,odiveInterval + call option_reset + lfsr FSR0,obottomTime + call option_reset + lfsr FSR0,obottomDepth + call option_reset + +do_planner_common: + MENU_BEGIN tPlan, .7 + MENU_OPTION tIntvl, odiveInterval, 0 + MENU_OPTION tBtDep, obottomDepth, 0 + MENU_CALL tInter, do_demo_divemode + MENU_OPTION tBtTm, obottomTime, 0 + MENU_CALL tDecoSetup, do_planner_config + MENU_CALL tDeco, do_demo_planner + MENU_CALL tExit, do_return_main_menu + MENU_END do_planner_config: - MENU_BEGIN tPlan, .3 - MENU_OPTION tSelectSetpoint,oSimSetpoint, 0 - MENU_OPTION tuseAGF, oSimAGF, 0 - MENU_CALL tExit, do_planner_menu - MENU_END + MENU_BEGIN tPlan, .3 + MENU_OPTION tSelectSetpoint, oSimSetpoint, 0 + MENU_OPTION tuseAGF, oSimAGF, 0 + MENU_CALL tExit, do_return_planner_menu + MENU_END ;============================================================================= ; Divemode menu do_return_divemode_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line + call menu_processor_double_pop ; drop exit line and back to last line do_divemode_menu: - MENU_BEGIN tDiveModeMenu, .7 - MENU_OPTION tDvMode, oDiveMode, 0 - MENU_OPTION tDkMode, oDecoMode, 0 - MENU_CALL tppO2settings, do_ppo2_menu - MENU_OPTION tsafetystopmenu,oSafetyStop, 0 - MENU_CALL t2ndDecoPlanMenu, do_2nd_deco_plan_menu - MENU_CALL tDecoparameters, do_decoparameters_menu - MENU_CALL tExit, do_continue_main_menu - MENU_END + MENU_BEGIN tDiveModeMenu, .7 + MENU_OPTION tDvMode, oDiveMode, 0 + MENU_OPTION tDkMode, oDecoMode, 0 + MENU_CALL tppO2settings, do_ppo2_menu + MENU_OPTION tsafetystopmenu, oSafetyStop, 0 + MENU_CALL t2ndDecoPlanMenu, do_2nd_deco_plan_menu + MENU_CALL tDecoparameters, do_decoparameters_menu + MENU_CALL tExit, do_return_main_menu + MENU_END + do_ppo2_menu: - MENU_BEGIN tppO2settings, .6 - - MENU_DYNAMIC divesets_ppo2_max, do_toggle_ppo2_max - MENU_DYNAMIC divesets_ppo2_max_deco, do_toggle_ppo2_max_deco - MENU_DYNAMIC divesets_ppo2_min, do_toggle_ppo2_min - MENU_DYNAMIC divesets_ppo2_min_cc, do_toggle_ppo2_min_cc - MENU_OPTION tShowppO2, oShowppO2, 0 - MENU_CALL tExit, do_return_divemode_menu - MENU_END + MENU_BEGIN tppO2settings, .6 + MENU_DYNAMIC divesets_ppo2_max, do_toggle_ppo2_max + MENU_DYNAMIC divesets_ppo2_max_deco, do_toggle_ppo2_max_deco + MENU_DYNAMIC divesets_ppo2_min, do_toggle_ppo2_min + MENU_DYNAMIC divesets_ppo2_min_cc, do_toggle_ppo2_min_cc + MENU_OPTION tShowppO2, oShowppO2, 0 + MENU_CALL tExit, do_return_divemode_menu + MENU_END + do_return_decoparameters_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line -do_decoparameters_menu: - movff char_I_deco_model,lo ; 0 = ZH-L16, 1 = ZH-L16-GF - tstfsz lo - bra do_decoparameters_menugf ; <> 0 -> GF menu! - ; NON-GF menu - MENU_BEGIN tDecoparameters, .4 - MENU_OPTION tSaturationMult,osatmult, 0 - MENU_OPTION tDesaturationMult,odesatmult,0 - MENU_OPTION tLastDecostop,oLastDeco, 0 - MENU_CALL tExit, do_return_divemode_menu - MENU_END - + call menu_processor_double_pop ; drop exit line and back to last line + +do_decoparameters_menu: + movff char_I_deco_model,lo ; 0 = ZH-L16, 1 = ZH-L16-GF + tstfsz lo + bra do_decoparameters_menugf ; <> 0 -> GF menu! + ; NON-GF menu + MENU_BEGIN tDecoparameters, .4 + MENU_OPTION tSaturationMult, osatmult, 0 + MENU_OPTION tDesaturationMult, odesatmult, 0 + MENU_OPTION tLastDecostop, oLastDeco, 0 + MENU_CALL tExit, do_return_divemode_menu + MENU_END + do_decoparameters_menugf: - ; GF menu - MENU_BEGIN tDecoparameters, .7 - MENU_OPTION tGF_low, oGF_low, 0 - MENU_OPTION tGF_high, oGF_high, 0 - MENU_CALL taGFMenu, do_aGF_menu - MENU_OPTION tSaturationMult,osatmultgf, 0 - MENU_OPTION tDesaturationMult,odesatmultgf,0 - MENU_OPTION tLastDecostop,oLastDeco, 0 - MENU_CALL tExit, do_return_divemode_menu - MENU_END + ; GF menu + MENU_BEGIN tDecoparameters, .7 + MENU_OPTION tGF_low, oGF_low, 0 + MENU_OPTION tGF_high, oGF_high, 0 + MENU_CALL taGFMenu, do_aGF_menu + MENU_OPTION tSaturationMult, osatmultgf, 0 + MENU_OPTION tDesaturationMult, odesatmultgf, 0 + MENU_OPTION tLastDecostop, oLastDeco, 0 + MENU_CALL tExit, do_return_divemode_menu + MENU_END - - do_return_2nd_deco_plan_menu: - rcall menu_tree_double_pop ; drop exit line and back to last line - + call menu_processor_double_pop ; drop exit line and back to last line do_2nd_deco_plan_menu - MENU_BEGIN t2ndDecoPlanMenu, .7 - MENU_OPTION tFTTSMenu, oExtraTime, 0 - MENU_OPTION tCalcAscGas, oCalcAscGas, 0 - MENU_OPTION tSetBotUse, obottom_usage, 0 - MENU_OPTION tSetDecoUse, odeco_usage, 0 - MENU_CALL tTankSizes, do_tank_sizes_menu - MENU_CALL tTankFillPress, do_tank_fill_press_menu - MENU_CALL tExit, do_return_divemode_menu - MENU_END + MENU_BEGIN t2ndDecoPlanMenu, .7 + MENU_OPTION tFTTSMenu, oExtraTime, 0 + MENU_OPTION tCalcAscGas, oCalcAscGas, 0 + MENU_OPTION tSetBotUse, obottom_usage, 0 + MENU_OPTION tSetDecoUse, odeco_usage, 0 + MENU_CALL tTankSizes, do_tank_sizes_menu + MENU_CALL tTankFillPress, do_tank_fill_press_menu + MENU_CALL tExit, do_return_divemode_menu + MENU_END - do_tank_sizes_menu: - MENU_BEGIN tTankSizes, .6 - MENU_OPTION tGas1, oTankSize1, 0 - MENU_OPTION tGas2, oTankSize2, 0 - MENU_OPTION tGas3, oTankSize3, 0 - MENU_OPTION tGas4, oTankSize4, 0 - MENU_OPTION tGas5, oTankSize5, 0 - MENU_CALL tExit, do_return_2nd_deco_plan_menu - MENU_END + MENU_BEGIN tTankSizes, .6 + MENU_OPTION tGas1, oTankSize1, 0 + MENU_OPTION tGas2, oTankSize2, 0 + MENU_OPTION tGas3, oTankSize3, 0 + MENU_OPTION tGas4, oTankSize4, 0 + MENU_OPTION tGas5, oTankSize5, 0 + MENU_CALL tExit, do_return_2nd_deco_plan_menu + MENU_END - do_tank_fill_press_menu: - MENU_BEGIN tTankFillPress, .6 - MENU_OPTION tGas1, oTankFillPres1, 0 - MENU_OPTION tGas2, oTankFillPres2, 0 - MENU_OPTION tGas3, oTankFillPres3, 0 - MENU_OPTION tGas4, oTankFillPres4, 0 - MENU_OPTION tGas5, oTankFillPres5, 0 - MENU_CALL tExit, do_return_2nd_deco_plan_menu - MENU_END + MENU_BEGIN tTankFillPress, .6 + MENU_OPTION tGas1, oTankFillPres1, 0 + MENU_OPTION tGas2, oTankFillPres2, 0 + MENU_OPTION tGas3, oTankFillPres3, 0 + MENU_OPTION tGas4, oTankFillPres4, 0 + MENU_OPTION tGas5, oTankFillPres5, 0 + MENU_CALL tExit, do_return_2nd_deco_plan_menu + MENU_END - + do_aGF_menu: - MENU_BEGIN taGFMenu, .4 - MENU_OPTION taGF_enable,oEnable_aGF, 0 - MENU_OPTION taGF_low, oaGF_low, 0 - MENU_OPTION taGF_high, oaGF_high, 0 - MENU_CALL tExit, do_return_decoparameters_menu - MENU_END + MENU_BEGIN taGFMenu, .4 + MENU_OPTION taGF_enable, oEnable_aGF, 0 + MENU_OPTION taGF_low, oaGF_low, 0 + MENU_OPTION taGF_high, oaGF_high, 0 + MENU_CALL tExit, do_return_decoparameters_menu + MENU_END ;============================================================================= ; Setup Menu +do_return_settings_deeper: ; entry point for return from set time/date sub-menu + bcf settime_setdate ; clear flag + call menu_processor_pop ; drop one more stack entry + do_return_settings: - bcf settime_setdate ; Clear flag - rcall menu_tree_double_pop ; drop exit line and back to last line - - extern compass_calibration_loop + call menu_processor_double_pop ; drop exit line and back to last line + do_settings_menu: - btfsc ble_available ; ble available - bra do_settings_menu_ble ; Yes. - MENU_BEGIN tSystSets, .6 - MENU_CALL tInfoMenu, do_info_menu - MENU_CALL tSetTimeDate, do_date_time_menu - MENU_CALL tDispSets, do_dispsets_menu - MENU_OPTION tLanguage, oLanguage, 0 - MENU_CALL tMore, do_settings_menu_more - MENU_CALL tExit, do_continue_main_menu - MENU_END + btfsc ble_available ; ble available? + bra do_settings_menu_ble ; YES + + MENU_BEGIN tSystSets, .6 + MENU_CALL tInfoMenu, do_info_menu + MENU_CALL tSetTimeDate, do_date_time_menu + MENU_CALL tDispSets, do_dispsets_menu + MENU_OPTION tLanguage, oLanguage, 0 + MENU_CALL tMore, do_settings_menu_more + MENU_CALL tExit, do_return_main_menu + MENU_END do_settings_menu_ble: - MENU_BEGIN tSystSets, .7 - MENU_CALL tInfoMenu, do_info_menu - MENU_CALL tBleTitle, comm_mode0 - MENU_CALL tSetTimeDate, do_date_time_menu - MENU_CALL tDispSets, do_dispsets_menu - MENU_OPTION tLanguage, oLanguage, 0 - MENU_CALL tMore, do_settings_menu_more - MENU_CALL tExit, do_continue_main_menu - MENU_END + MENU_BEGIN tSystSets, .7 + MENU_CALL tInfoMenu, do_info_menu + MENU_CALL tBleTitle, comm_mode0 + MENU_CALL tSetTimeDate, do_date_time_menu + MENU_CALL tDispSets, do_dispsets_menu + MENU_OPTION tLanguage, oLanguage, 0 + MENU_CALL tMore, do_settings_menu_more + MENU_CALL tExit, do_return_main_menu + MENU_END + +do_info_menu: + MENU_BEGIN tInfoMenu, .6 + MENU_DYNAMIC info_menu_serial, 0 + MENU_DYNAMIC info_menu_firmware, 0 + MENU_DYNAMIC info_menu_battery_volts, 0 + MENU_DYNAMIC info_menu_uptime, 0 + MENU_DYNAMIC info_menu_total_dives, 0 + MENU_CALL tExit, do_return_settings + MENU_END + + +do_return_settings_more_deeper: ; entry point for returns from reset sub-menu + call menu_processor_pop ; drop one more stack entry do_return_settings_more: - rcall menu_tree_double_pop ; drop exit line and back to last line - + call menu_processor_double_pop ; drop exit line and back to last line + do_settings_menu_more: - btfsc battery_gauge_available ; piezo buttons available - bra do_settings_menu_more_piezo - btfsc ble_available ; ble available - bra do_settings_menu_more_ostc3p - MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tAltMode, oAltMode, 0 - MENU_OPTION tDvSalinity, oDiveSalinity, 0 - MENU_CALL tResetMenu, do_reset_menu - MENU_CALL tExit, do_return_settings - MENU_END + btfsc battery_gauge_available ; piezo buttons available + bra do_settings_menu_more_piezo + btfsc ble_available ; ble available + bra do_settings_menu_more_ostc3p + ; All MENU_CALLs that are + MENU_BEGIN tSystSets, .6 ; in all of this 3 menus + MENU_CALL tCompassMenu, do_compass_menu ; need to stay together + MENU_CALL tLogOffset, do_log_offset_menu ; on this menu level in + MENU_OPTION tAltMode, oAltMode, 0 ; oder to not mass up the + MENU_OPTION tDvSalinity, oDiveSalinity, 0 ; menu stack on doing the + MENU_CALL tResetMenu, do_reset_menu ; do_return_settings ! + MENU_CALL tExit, do_return_settings + MENU_END -do_settings_menu_more_piezo_exit: + +do_return_settings_menu_more_pz: call TFT_ClearScreen - extern piezo_config - call piezo_config ; Configure buttons + call piezo_config ; Configure buttons + call menu_processor_double_pop ; drop exit line and back to last line do_settings_menu_more_piezo: - MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tAltMode, oAltMode, 0 - MENU_OPTION tDvSalinity, oDiveSalinity, 0 - MENU_CALL tMore, do_settings_piezo_menu - MENU_CALL tExit, do_return_settings - MENU_END + MENU_BEGIN tSystSets, .7 + MENU_CALL tCompassMenu, do_compass_menu + MENU_CALL tLogOffset, do_log_offset_menu + MENU_OPTION tAltMode, oAltMode, 0 + MENU_OPTION tDvSalinity, oDiveSalinity, 0 + MENU_CALL tResetMenu, do_reset_menu + MENU_CALL tMore, do_settings_piezo_menu + MENU_CALL tExit, do_return_settings + MENU_END - extern comm_mode0 +do_settings_menu_more_ostc3p: ; Menu with BLE feature + MENU_BEGIN tSystSets, .6 + MENU_CALL tCompassMenu, do_compass_menu + MENU_CALL tLogOffset, do_log_offset_menu + MENU_OPTION tAltMode, oAltMode, 0 + MENU_OPTION tDvSalinity, oDiveSalinity, 0 + MENU_CALL tResetMenu, do_reset_menu + MENU_CALL tExit, do_return_settings + MENU_END + do_settings_piezo_menu: - ; Menu with features only available in piezo button hardware - MENU_BEGIN tSystSets, .4 - MENU_CALL tResetMenu, do_reset_menu - MENU_OPTION tButtonleft, ocR_button_left, 0 ; left button sensitivity - MENU_OPTION tButtonright, ocR_button_right, 0 ; right button sensitivity - MENU_CALL tExit, do_settings_menu_more_piezo_exit - MENU_END + ; Menu with features only available in piezo button hardware + MENU_BEGIN tSystSets, .3 + MENU_OPTION tButtonleft, ocR_button_left, 0 ; left button sensitivity + MENU_OPTION tButtonright, ocR_button_right, 0 ; right button sensitivity + MENU_CALL tExit, do_return_settings_menu_more_pz + MENU_END -do_settings_menu_more_ostc3p: ; Menu with BLE feature - MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tAltMode, oAltMode, 0 - MENU_OPTION tDvSalinity, oDiveSalinity, 0 - MENU_CALL tResetMenu, do_reset_menu - MENU_CALL tExit, do_return_settings - MENU_END do_compass_menu: - MENU_BEGIN tSystSets, .5 - MENU_CALL tCompassMenu, compass_calibration_loop -; MENU_OPTION tCompassGain, oCompassGain, 0 - MENU_DYNAMIC menu_cal_x, 0 - MENU_DYNAMIC menu_cal_y, 0 - MENU_DYNAMIC menu_cal_z, 0 - MENU_CALL tExit, do_return_settings_more - MENU_END + MENU_BEGIN tSystSets, .5 + MENU_CALL tCompassMenu, compass_calibration_loop ; exits to surfloop +; MENU_OPTION tCompassGain, oCompassGain, 0 + MENU_DYNAMIC menu_cal_x, 0 + MENU_DYNAMIC menu_cal_y, 0 + MENU_DYNAMIC menu_cal_z, 0 + MENU_CALL tExit, do_return_settings_more + MENU_END + ;============================================================================= ; Reset and confirmation menu. do_reset_menu: - MENU_BEGIN tResetMenu, .6 - MENU_CALL tExit, do_return_settings - MENU_CALL tReboot, do_reset_menu2 ; Confirm - MENU_CALL tResetDeco, do_reset_menu3 ; Confirm - MENU_CALL tResetSettings, do_reset_menu4 ; Confirm - MENU_CALL tResetLogbook, do_reset_menu5 ; Confirm - MENU_CALL tResetBattery, new_battery_menu ; New Battery sub menu - MENU_END + MENU_BEGIN tResetMenu, .6 + MENU_CALL tExit, do_return_settings_more + MENU_CALL tReboot, do_reset_menu2 ; Confirm + MENU_CALL tResetDeco, do_reset_menu3 ; Confirm + MENU_CALL tResetSettings, do_reset_menu4 ; Confirm + MENU_CALL tResetLogbook, do_reset_menu5 ; Confirm + MENU_CALL tResetBattery, do_new_battery_menu ; Confirm + MENU_END do_reset_menu2: - MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tReboot, do_reboot ; Reboot - MENU_END + MENU_BEGIN tResetMenu2, .2 + MENU_CALL tAbort, do_return_settings_more_deeper + MENU_CALL tReboot, do_reboot ; Reboot + MENU_END do_reset_menu3: - MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetDeco, do_reset_deco ; Reset Deco - MENU_END + MENU_BEGIN tResetMenu2, .2 + MENU_CALL tAbort, do_return_settings_more_deeper + MENU_CALL tResetDeco, do_reset_deco ; Reset Deco + MENU_END do_reset_menu4: - MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetSettings, do_reset_settings ; Reset all settings - MENU_END + MENU_BEGIN tResetMenu2, .2 + MENU_CALL tAbort, do_return_settings_more_deeper + MENU_CALL tResetSettings, do_reset_settings ; Reset all settings + MENU_END do_reset_menu5: - MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetLogbook, do_reset_logbook ; Reset logbook - MENU_END + MENU_BEGIN tResetMenu2, .2 + MENU_CALL tAbort, do_return_settings_more_deeper + MENU_CALL tResetLogbook, do_reset_logbook ; Reset logbook + MENU_END + do_reset_logbook: - clrf EEADRH ; Make sure to select eeprom bank 0 + clrf EEADRH ; Make sure to select EEPROM bank 0 + clrf EEDATA + read_int_eeprom .2 + write_int_eeprom .16 + read_int_eeprom .3 + write_int_eeprom .17 ; Copy number of dives clrf EEDATA - read_int_eeprom .2 - write_int_eeprom .16 - read_int_eeprom .3 - write_int_eeprom .17 ; Copy number of dives - clrf EEDATA - write_int_eeprom .2 - write_int_eeprom .3 ; Clear total dives - write_int_eeprom .4 - write_int_eeprom .5 - write_int_eeprom .6 ; Reset logbook pointers + write_int_eeprom .2 + write_int_eeprom .3 ; Clear total dives + write_int_eeprom .4 + write_int_eeprom .5 + write_int_eeprom .6 ; Reset logbook pointers call ext_flash_erase_logbook ; And complete logbook (!) - goto do_continue_main_menu ; back to menu + + goto do_return_settings_more_deeper do_reset_deco: SAFE_2BYTE_COPY last_surfpressure_30min,int_I_pres_respiration ; copy surface pressure to deco routine SAFE_2BYTE_COPY last_surfpressure_30min,int_I_pres_surface ; copy surface pressure to deco routine - - call deco_clear_tissue ; set all tissues to Pamb * N2_ratio (C-Code) - banksel common ; back to bank 1, needed after every return from C code - - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - call deco_calc_desaturation_time ; calculate desaturation and no-fly time - banksel common - - goto do_return_settings ; back to menu + + call deco_clear_tissue ; set all tissues to Pamb * N2_ratio (C-Code) + call deco_calc_dive_interval_1min; calculate deco in surface mode + call deco_calc_desaturation_time ; calculate desaturation and no-fly time + banksel common + + goto do_return_settings_more_deeper + do_reset_settings: - call TFT_ClearScreen ; Clear screen - banksel common - extern option_reset_all - call option_reset_all ; Reset all options to factory default. - goto restart ; Restart into surfacemode - -do_continue_menu_3stack: ; Return three levels deep - call menu_processor_pop - goto do_return_settings + call TFT_ClearScreen ; Clear screen + banksel common ; (probably not needed) + call option_reset_all ; Reset all options to factory default. + goto restart ; Restart into surfacemode do_reboot: - call ext_flash_enable_protection ; Enables write protection + call ext_flash_enable_protection ; Enables write protection reset do_date_time_menu: - MENU_BEGIN tSetTimeDate, .4 - MENU_CALL tSetTime, do_time_menu - MENU_CALL tSetDate, do_date_menu - MENU_OPTION tDateFormat,oDateFormat, 0 - MENU_CALL tExit, do_return_settings - MENU_END + MENU_BEGIN tSetTimeDate, .4 + MENU_CALL tSetTime, do_time_menu + MENU_CALL tSetDate, do_date_menu + MENU_OPTION tDateFormat,oDateFormat, 0 + MENU_CALL tExit, do_return_settings + MENU_END + do_date_menu: bsf settime_setdate - MENU_BEGIN tSetDate, .4 - MENU_OPTION tSetDay, oSetDay, 0 - MENU_OPTION tSetMonth, oSetMonth, 0 - MENU_OPTION tSetYear, oSetYear, 0 - MENU_CALL tExit, do_continue_menu_3stack - MENU_END + + MENU_BEGIN tSetDate, .4 + MENU_OPTION tSetDay, oSetDay, 0 + MENU_OPTION tSetMonth, oSetMonth, 0 + MENU_OPTION tSetYear, oSetYear, 0 + MENU_CALL tExit, do_return_settings_deeper + MENU_END do_reset_seconds: clrf secs - extern rtc_set_rtc - call rtc_set_rtc ; writes mins,sec,hours,day,month and year to rtc module + call rtc_set_rtc ; writes mins, sec, hours, day, month and year to RTC module + call menu_processor_pop ; clear the MENU_CALL for do_reset_seconds from the stack + ;bra do_time_menu ; direct jump-back into the menu + do_time_menu: bsf settime_setdate - MENU_BEGIN tSetTime, .4 - MENU_OPTION tSetHours, oSetHours, 0 - MENU_OPTION tSetMinutes,oSetMinutes, 0 - MENU_CALL tSetSeconds, do_reset_seconds - MENU_CALL tExit, do_continue_menu_3stack - MENU_END + + MENU_BEGIN tSetTime, .4 + MENU_OPTION tSetHours, oSetHours, 0 + MENU_OPTION tSetMinutes, oSetMinutes, 0 + MENU_CALL tSetSeconds, do_reset_seconds + MENU_CALL tExit, do_return_settings_deeper + MENU_END -do_toggle_ppo2_max: ; add 0.1bar, with hard-coded max. - movff char_I_ppO2_max,lo ; banksafe - movlw .10 +do_toggle_ppo2_max: ; add 0.1bar, with hard-coded max. + movff char_I_ppO2_max,lo ; banksafe + movlw .10 addwf lo,F - movlw ppo2_highest_setting + movlw ppo2_warning_high_highest cpfsgt lo - bra do_toggle_ppo2_max2 - movlw .120 + bra do_toggle_ppo2_max2 + movlw ppo2_warning_high_lowest movwf lo do_toggle_ppo2_max2: - movff lo,char_I_ppO2_max - return + movff lo,char_I_ppO2_max + return -do_toggle_ppo2_max_deco: ; add 0.1bar, with hard-coded max. - movff char_I_ppO2_max_deco,lo ; banksafe - movlw .10 +do_toggle_ppo2_max_deco: ; add 0.1bar, with hard-coded max. + movff char_I_ppO2_max_deco,lo ; banksafe + movlw .10 addwf lo,F - movlw ppo2_highest_setting_deco + movlw ppo2_warning_deco_highest cpfsgt lo - bra do_toggle_ppo2_max_deco2 - movlw .120 + bra do_toggle_ppo2_max_deco2 + movlw ppo2_warning_deco_lowest movwf lo do_toggle_ppo2_max_deco2: - movff lo,char_I_ppO2_max_deco - return - -do_toggle_ppo2_min: ; sub 0.1bar, with hard-coded min. - movff char_I_ppO2_min,lo ; banksafe - incf lo,F - movlw .21 + movff lo,char_I_ppO2_max_deco + return + +do_toggle_ppo2_min: ; sub 0.1bar, with hard-coded min. + movff char_I_ppO2_min,lo ; banksafe + incf lo,F + movlw ppo2_warning_low_highest cpfsgt lo - bra do_toggle_ppo2_min2 - movlw ppo2_lowest_setting + bra do_toggle_ppo2_min2 + movlw ppo2_warning_low_lowest movwf lo do_toggle_ppo2_min2: - movff lo,char_I_ppO2_min - return + movff lo,char_I_ppO2_min + return -do_toggle_ppo2_min_cc: ; sub 0.1bar, with hard-coded min. - movff char_I_ppO2_min_loop,lo ; banksafe - incf lo,F - movlw ppo2_warning_low_cc_max +do_toggle_ppo2_min_cc: ; sub 0.1bar, with hard-coded min. + movff char_I_ppO2_min_loop,lo ; banksafe + incf lo,F + movlw ppo2_warning_loop_highest cpfsgt lo - bra do_toggle_ppo2_min_cc2 - movlw ppo2_warning_low_cc_min + bra do_toggle_ppo2_min_cc2 + movlw ppo2_warning_loop_lowest movwf lo do_toggle_ppo2_min_cc2: - movff lo,char_I_ppO2_min_loop - return - + movff lo,char_I_ppO2_min_loop + return + ; Logbook offset sub-menu do_log_offset_menu: - MENU_BEGIN tLogOffset, .6 - MENU_DYNAMIC TFT_LogOffset_Logtitle, 0 - MENU_CALL tLogOffsetp1, do_logoffset_plus1 - MENU_CALL tLogOffsetp10, do_logoffset_plus10 - MENU_CALL tLogOffsetm1, do_logoffset_minus1 - MENU_CALL tLogOffsetm10, do_logoffset_minus10 - MENU_CALL tExit, do_return_settings_more - MENU_END + MENU_BEGIN tLogOffset, .6 + MENU_DYNAMIC TFT_LogOffset_Logtitle, 0 + MENU_CALL tLogOffsetp1, do_logoffset_plus1 + MENU_CALL tLogOffsetp10, do_logoffset_plus10 + MENU_CALL tLogOffsetm1, do_logoffset_minus1 + MENU_CALL tLogOffsetm10, do_logoffset_minus10 + MENU_CALL tExit, do_return_settings_more + MENU_END do_logoffset_minus1: - call do_logoffset_common_read ; Read into lo:hi - movlw d'1' + call do_logoffset_common_read ; Read into lo:hi + movlw .1 subwf lo - movlw d'0' + movlw .0 subwfb hi - btfss hi,7 ; <0? - goto do_logoffset_common_write ; Store and return + btfss hi,7 ; <0? + goto do_logoffset_common_write ; Store and return clrf lo clrf hi - goto do_logoffset_common_write ; Store and return + goto do_logoffset_common_write ; Store and return do_logoffset_minus10: - call do_logoffset_common_read ; Read into lo:hi - movlw d'10' + call do_logoffset_common_read ; Read into lo:hi + movlw .10 subwf lo - movlw d'0' + movlw .0 subwfb hi - btfss hi,7 ; <0? - goto do_logoffset_common_write ; Store and return + btfss hi,7 ; <0? + goto do_logoffset_common_write ; Store and return clrf lo clrf hi - goto do_logoffset_common_write ; Store and return + goto do_logoffset_common_write ; Store and return do_logoffset_plus1: - call do_logoffset_common_read ; Read into lo:hi - infsnz lo,F - incf hi,F - goto do_logoffset_common_write ; Store and return + call do_logoffset_common_read ; Read into lo:hi + infsnz lo,F + incf hi,F + goto do_logoffset_common_write ; Store and return do_logoffset_plus10: - call do_logoffset_common_read ; Read into lo:hi - movlw d'10' + call do_logoffset_common_read ; Read into lo:hi + movlw .10 addwf lo - movlw d'0' + movlw .0 addwfc hi - goto do_logoffset_common_write ; Store and return + goto do_logoffset_common_write ; Store and return -do_dispsets_menu_3stack: - bcf in_color_menu - call menu_tree_double_pop ; drop exit line and back to last line +do_return_dispsets_menu: + bcf in_color_menu + call menu_processor_double_pop ; drop exit line and back to last line do_dispsets_menu: - MENU_BEGIN tDispSets, .5 - MENU_OPTION tBright, oBrightness, 0 - MENU_CALL tColorScheme, do_color_scheme - MENU_OPTION tFlip, oFlipScreen, 0 - MENU_CALL tMore, do_dispsets_menu_more - MENU_CALL tExit, do_return_settings - MENU_END + MENU_BEGIN tDispSets, .5 + MENU_OPTION tBright, oBrightness, 0 + MENU_CALL tColorScheme, do_color_scheme + MENU_OPTION tFlip, oFlipScreen, 0 + MENU_CALL tMore, do_dispsets_menu_more + MENU_CALL tExit, do_return_settings + MENU_END + do_dispsets_menu_more: - MENU_BEGIN tDispSets, .6 - MENU_OPTION tMODwarning, oMODwarning, 0 - MENU_OPTION tIBCDwarning, oEnable_IBCD, 0 - MENU_OPTION tVSItext2, oVSItextv2, 0 - MENU_OPTION tVSIgraph, oVSIgraph, 0 - MENU_OPTION tTimeoutDive, oDiveTimeout, 0 - MENU_CALL tExit, do_dispsets_menu_3stack - MENU_END + MENU_BEGIN tDispSets, .7 + MENU_OPTION tMODwarning, oMODwarning, 0 + MENU_OPTION tIBCDwarning, oEnable_IBCD, 0 + MENU_OPTION tVSItext2, oVSItextv2, 0 + MENU_OPTION tVSIgraph, oVSIgraph, 0 + MENU_OPTION tTimeoutDive, oDiveTimeout, 0 + MENU_OPTION tUnits, oUnits, 0 + MENU_CALL tExit, do_return_dispsets_menu + MENU_END - extern oColorSetDive + do_color_scheme: - bsf in_color_menu - MENU_BEGIN tColorScheme, .2 - MENU_OPTION tColorSetDive,oColorSetDive, 0 - MENU_CALL tExit, do_dispsets_menu_3stack - MENU_END + bsf in_color_menu + + MENU_BEGIN tColorScheme, .2 + MENU_OPTION tColorSetDive, oColorSetDive, 0 + MENU_CALL tExit, do_return_dispsets_menu + MENU_END ;============================================================================= - global new_battery_menu - extern surfloop -new_battery_menu: - bsf enable_screen_dumps ; To prevent exiting into COMM mode immediately - call TFT_boot ; Initialize TFT (includes clear screen) - call TFT_Display_FadeIn ; Show splash - movlw .100 - movwf batt_percent ; make sure to reset batt_percent - - ; Default (In cases of timeout or USB): Use old battery +do_new_battery_menu: + MENU_BEGIN tNewBattTitle, .2 + MENU_CALL tAbort, do_return_settings_more_deeper + MENU_CALL tYes, do_new_battery_select + MENU_END + + global do_new_battery_select +do_new_battery_select: + bsf enable_screen_dumps ; To prevent exiting into COMM mode immediately + call TFT_boot ; Initialize TFT (includes clear screen) + call TFT_Display_FadeIn ; Show splash + movlw .100 + movwf batt_percent ; make sure to reset batt_percent + + ; Default (In cases of timeout or USB): Use old battery clrf EEADRH read_int_eeprom 0x07 movff EEDATA,battery_gauge+0 @@ -767,85 +814,84 @@ read_int_eeprom 0x0C movff EEDATA,battery_gauge+5 - call menu_processor_reset ; restart from first icon. - - MENU_BEGIN tNewBattTitle, .1 - MENU_CALL tEnter, new_battery_menu2 - MENU_END - -new_battery_menu2: - ; hardware_flag: - ; 3: 0x0A or 0x13 (2016) - ; cR: 0x05 - ; 2 with BLE: 0x11 - ; Sport: 0x12 - ; 3 with BLE: 0x1A + call menu_processor_reset ; restart from first icon. + + ; hardware_flag: + ; 3: 0x0A or 0x13 (2016) + ; cR: 0x05 + ; 2 with BLE: 0x11 + ; Sport: 0x12 + ; 3 with BLE: 0x1A - movlw 0x0A - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_AA - movlw 0x13 - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_AA_16650 - movlw 0x12 - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_AA - movlw 0x1A - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_AA - movlw 0x11 - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_18650 - movlw 0x05 - cpfseq hardware_flag - bra $+4 - bra menu_new_battery_18650 - bra use_old_batteries ; any unsupported value - + movlw 0x0A + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_AA + movlw 0x13 + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_AA_16650 + movlw 0x12 + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_AA + movlw 0x1A + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_AA + movlw 0x11 + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_18650 + movlw 0x05 + cpfseq hardware_flag + bra $+4 + bra menu_new_battery_18650 + bra use_old_batteries ; any unsupported value + + menu_new_battery_AA_16650: - MENU_BEGIN tNewBattTitle, .5 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNewBattNew36, use_new_36V_batteries - MENU_CALL tNewBattNew15, use_new_15V_batteries - MENU_CALL tNewBattAccu, use_36V_rechargeable - MENU_CALL tNew16650, use_16650_battery - MENU_END - + MENU_BEGIN tNewBattTitle, .5 + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNewBattNew36, use_new_36V_batteries + MENU_CALL tNewBattNew15, use_new_15V_batteries + MENU_CALL tNewBattAccu, use_36V_rechargeable + MENU_CALL tNew16650, use_16650_battery + MENU_END + + menu_new_battery_AA: - MENU_BEGIN tNewBattTitle, .4 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNewBattNew36, use_new_36V_batteries - MENU_CALL tNewBattNew15, use_new_15V_batteries - MENU_CALL tNewBattAccu, use_36V_rechargeable - MENU_END + MENU_BEGIN tNewBattTitle, .4 + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNewBattNew36, use_new_36V_batteries + MENU_CALL tNewBattNew15, use_new_15V_batteries + MENU_CALL tNewBattAccu, use_36V_rechargeable + MENU_END + menu_new_battery_18650: - MENU_BEGIN tNewBattTitle, .2 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNew18650, use_18650_battery - MENU_END + MENU_BEGIN tNewBattTitle, .2 + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNew18650, use_18650_battery + MENU_END - + global use_old_prior_209 use_old_prior_209: clrf EEADRH - read_int_eeprom 0x0F ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah - incfsz EEDATA,F ; Was 0xFF? - return ; No, done. + read_int_eeprom 0x0F ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + incfsz EEDATA,F ; Was 0xFF? + return ; No, done. - call lt2942_get_status ; Check for gauge IC - movlw .3 ; Assume a 18650 - btfss battery_gauge_available ; cR/2 hardware? - movlw .1 ; Assume a Saft - movwf EEDATA - write_int_eeprom 0x0F ; Store the new battery type into EEPROM + call lt2942_get_status ; Check for gauge IC + movlw .3 ; Assume a 18650 + btfss battery_gauge_available ; cR/2 hardware? + movlw .1 ; Assume a Saft + movwf EEDATA + write_int_eeprom 0x0F ; Store the new battery type into EEPROM return - + + global use_old_batteries use_old_batteries: clrf EEADRH @@ -862,130 +908,136 @@ read_int_eeprom 0x0C movff EEDATA,battery_gauge+5 read_int_eeprom 0x0F - movff EEDATA,battery_type ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + movff EEDATA,battery_type ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah - rcall setup_new_saft ; Any other value - incf EEDATA,F ; 1 ... 5 + rcall setup_new_saft ; Any other value + incf EEDATA,F ; 1 ... 5 dcfsnz EEDATA,F - rcall setup_new_15v ;=0 + rcall setup_new_15v ;=0 dcfsnz EEDATA,F - rcall setup_new_saft ;=1 + rcall setup_new_saft ;=1 dcfsnz EEDATA,F - rcall setup_new_panasonic ;=2 - dcfsnz EEDATA,F - rcall setup_new_18650 ;=3 - dcfsnz EEDATA,F - rcall setup_new_16650 ;=4 - - bcf use_old_batt_flag ; clear flag - goto surfloop ; Jump to Surfaceloop! + rcall setup_new_panasonic ;=2 + dcfsnz EEDATA,F + rcall setup_new_18650 ;=3 + dcfsnz EEDATA,F + rcall setup_new_16650 ;=4 + + bcf use_old_batt_flag ; clear flag + goto surfloop ; Jump to Surfaceloop! + setup_new_15v: - bsf charge_disable - bcf TRISE,2 - movlw .100 - movwf batt_percent ; To have 1,5V batteries right after firmware update - movlw .0 - movff WREG,battery_type - return - + bsf charge_disable + bcf TRISE,2 + movlw .100 + movwf batt_percent ; To have 1,5V batteries right after firmware update + movlw .0 + movff WREG,battery_type + return + + setup_new_saft: - banksel battery_capacity - movlw LOW internal_saft_capacity - movwf internal_battery_capacity+0 - movlw HIGH internal_saft_capacity - movwf internal_battery_capacity+1 - movlw LOW saft_capacity - movwf battery_capacity+0 - movlw HIGH saft_capacity - movwf battery_capacity+1 - movlw LOW saft_offset - movwf battery_offset+0 - movlw HIGH saft_offset - movwf battery_offset+1 - banksel common - bsf charge_disable - bcf TRISE,2 - movlw .1 - movff WREG,battery_type - return + banksel battery_capacity + movlw LOW internal_saft_capacity + movwf internal_battery_capacity+0 + movlw HIGH internal_saft_capacity + movwf internal_battery_capacity+1 + movlw LOW saft_capacity + movwf battery_capacity+0 + movlw HIGH saft_capacity + movwf battery_capacity+1 + movlw LOW saft_offset + movwf battery_offset+0 + movlw HIGH saft_offset + movwf battery_offset+1 + banksel common + bsf charge_disable + bcf TRISE,2 + movlw .1 + movff WREG,battery_type + return + -setup_new_panasonic: - banksel battery_capacity - movlw LOW internal_panasonic_capacity - movwf internal_battery_capacity+0 - movlw HIGH internal_panasonic_capacity - movwf internal_battery_capacity+1 - movlw LOW panasonic_capacity - movwf battery_capacity+0 - movlw HIGH panasonic_capacity - movwf battery_capacity+1 - movlw LOW panasonic_offset - movwf battery_offset+0 - movlw HIGH panasonic_offset - movwf battery_offset+1 - banksel common - bcf charge_disable - bsf TRISE,2 - movlw .2 - movff WREG,battery_type - return +setup_new_panasonic: + banksel battery_capacity + movlw LOW internal_panasonic_capacity + movwf internal_battery_capacity+0 + movlw HIGH internal_panasonic_capacity + movwf internal_battery_capacity+1 + movlw LOW panasonic_capacity + movwf battery_capacity+0 + movlw HIGH panasonic_capacity + movwf battery_capacity+1 + movlw LOW panasonic_offset + movwf battery_offset+0 + movlw HIGH panasonic_offset + movwf battery_offset+1 + banksel common + bcf charge_disable + bsf TRISE,2 + movlw .2 + movff WREG,battery_type + return -setup_new_18650: - banksel battery_capacity - clrf internal_battery_capacity+0 - clrf internal_battery_capacity+1 - movlw LOW ncr18650_capacity - movwf battery_capacity+0 - movlw HIGH ncr18650_capacity - movwf battery_capacity+1 - movlw LOW ncr18650_offset - movwf battery_offset+0 - movlw HIGH ncr18650_offset - movwf battery_offset+1 - banksel common - bcf charge_disable - bsf TRISE,2 - movlw .3 - movff WREG,battery_type - return + +setup_new_18650: + banksel battery_capacity + clrf internal_battery_capacity+0 + clrf internal_battery_capacity+1 + movlw LOW ncr18650_capacity + movwf battery_capacity+0 + movlw HIGH ncr18650_capacity + movwf battery_capacity+1 + movlw LOW ncr18650_offset + movwf battery_offset+0 + movlw HIGH ncr18650_offset + movwf battery_offset+1 + banksel common + bcf charge_disable + bsf TRISE,2 + movlw .3 + movff WREG,battery_type + return + setup_new_16650: - banksel battery_capacity - clrf internal_battery_capacity+0 - clrf internal_battery_capacity+1 - movlw LOW ur16650_capacity - movwf battery_capacity+0 - movlw HIGH ur16650_capacity - movwf battery_capacity+1 - movlw LOW ur16650_offset - movwf battery_offset+0 - movlw HIGH ur16650_offset - movwf battery_offset+1 - banksel common - bcf charge_disable - bsf TRISE,2 - movlw .4 - movff WREG,battery_type - return + banksel battery_capacity + clrf internal_battery_capacity+0 + clrf internal_battery_capacity+1 + movlw LOW ur16650_capacity + movwf battery_capacity+0 + movlw HIGH ur16650_capacity + movwf battery_capacity+1 + movlw LOW ur16650_offset + movwf battery_offset+0 + movlw HIGH ur16650_offset + movwf battery_offset+1 + banksel common + bcf charge_disable + bsf TRISE,2 + movlw .4 + movff WREG,battery_type + return + use_16650_battery: - rcall setup_new_16650 - bra use_new_36V_2 + rcall setup_new_16650 + bra use_new_36V_2 use_18650_battery: - rcall setup_new_18650 - bra use_new_36V_2 + rcall setup_new_18650 + bra use_new_36V_2 use_new_36V_batteries: - rcall setup_new_saft - bra use_new_36V_2 + rcall setup_new_saft + bra use_new_36V_2 use_new_15V_batteries: - rcall setup_new_15v + rcall setup_new_15v use_new_36V_2: - call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 - goto surfloop ; Jump to Surface loop! + call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 + goto surfloop ; Jump to Surface loop! use_36V_rechargeable: - rcall setup_new_panasonic - call reset_battery_internal_only - goto surfloop ; Jump to Surface loop! + rcall setup_new_panasonic + call reset_battery_internal_only + goto surfloop ; Jump to Surface loop! - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/option_table.asm --- a/src/option_table.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/option_table.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File option_table.asm REFACTORED VERSION V2.95 +; File option_table.asm REFACTORED VERSION V2.98 ; ; The option table ; @@ -10,274 +10,270 @@ ; 2014-08-03 : mH creation ; -#include "hwos.inc" ; Mandatory header -#include "eeprom_rs232.inc" +#include "hwos.inc" ; Mandatory header +#include "eeprom_rs232.inc" ;============================================================================= ; Options Tables -option_table CODE 0x00700 +option_table CODE 0x00700 -OPTION_UINT8 MACRO lbl, min, max, default, unit, eeprom, register - global lbl -lbl: db 0, default ; Type0 = INT8 - db 1, min - db max, eeprom - dw unit - dw register - ENDM +OPTION_UINT8 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db 1, min + db max, eeprom + dw unit + dw register + ENDM -OPTION_UINT8p2 MACRO lbl, min, max, default, unit, eeprom, register - global lbl -lbl: db 0, default ; Type0 = INT8 - db 2, min - db max, eeprom - dw unit - dw register - ENDM +OPTION_UINT8p2 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db 2, min + db max, eeprom + dw unit + dw register + ENDM -OPTION_UINT8p3 MACRO lbl, min, max, default, unit, eeprom, register - global lbl -lbl: db 0, default ; Type0 = INT8 - db 3, min - db max, eeprom - dw unit - dw register - ENDM +OPTION_UINT8p3 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db 3, min + db max, eeprom + dw unit + dw register + ENDM -; NEW ## deco engine -OPTION_UINT8p5 MACRO lbl, min, max, default, unit, eeprom, register - global lbl -lbl: db 0, default ; Type0 = INT8 - db .5, min - db max, eeprom - dw unit - dw register - ENDM - -OPTION_UINT8p10 MACRO lbl, min, max, default, unit, eeprom, register - global lbl -lbl: db 0, default ; Type0 = INT8 - db .10, min - db max, eeprom - dw unit - dw register - ENDM +OPTION_UINT8p5 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db .5, min + db max, eeprom + dw unit + dw register + ENDM -OPTION_ENUM8 MACRO lbl, max, default, tValue, eeprom, register - global lbl - extern tValue -lbl: db 1, default ; Type1 = ENUM - db LOW(tValue), HIGH(tValue) - db max, eeprom - dw 0 ; No unit - dw register - ENDM +OPTION_UINT8p10 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db .10, min + db max, eeprom + dw unit + dw register + ENDM -OPTION_BOOL MACRO lbl, default, eeprom, register - OPTION_ENUM8 lbl, 2, default, tNo, eeprom, register - ENDM +OPTION_ENUM8 MACRO lbl, max, default, tValue, eeprom, register + global lbl + extern tValue +lbl: db 1, default ; Type1 = ENUM + db LOW(tValue), HIGH(tValue) + db max, eeprom + dw 0 ; No unit + dw register + ENDM + +OPTION_BOOL MACRO lbl, default, eeprom, register + OPTION_ENUM8 lbl, 2, default, tNo, eeprom, register + ENDM -OPTION_STRING MACRO lbl, length, defText, eeprom, register - global lbl -lbl: db 2, LOW(defText) ; Type2 = STRING - db HIGH(defText), 0 - db length, eeprom - dw 0 ; No unit - dw register - ENDM +OPTION_STRING MACRO lbl, length, defText, eeprom, register + global lbl +lbl: db 2, LOW(defText) ; Type2 = STRING + db HIGH(defText), 0 + db length, eeprom + dw 0 ; No unit + dw register + ENDM ;============================================================================= - extern tPercent, tMeters, tMinutes, tGasDisabled, tbar - extern char_I_deco_gas_change, char_I_setpoint_change, char_I_setpoint_cbar - extern char_I_dive_interval, char_I_bottom_time, char_I_bottom_depth - extern char_I_deco_model - extern char_I_extra_time - extern tDefName, tblank - extern char_I_bottom_usage, char_I_deco_usage, tLitersMinute - - ; NEW ## deco engine - extern char_I_PSCR_drop, char_I_PSCR_lungratio - - ; NEW ## bailout gas needs - extern char_I_tank_size, char_I_tank_pres_fill, tLiter, tbar10 - - ; NEW ## CCR max ppO2 limiter - extern char_I_cc_max_frac_o2 - - ; NEW ## no fly altitude - extern char_I_altitude_wait - - ; NEW ## V2.94 - extern char_I_ppO2_max, char_I_ppO2_min, char_I_ppO2_max_deco, char_I_ppO2_min_loop - - ; NEW ## V2.94 / V2.95 - extern char_I_ascent_speed, tMeterMinute - - ; NEW ## V2.95 - extern char_I_gas_change_time, tmin - - ; Option table - ; OPTION_UINT8 Label, min, max, default, text-string, EEPROM location (-1 for RAM only), RAM location - global option_table_begin + extern tPercent, tMeters, tMinutes, tGasDisabled, tbar + extern char_I_deco_gas_change, char_I_setpoint_change, char_I_setpoint_cbar, char_I_dil_change + extern char_I_dive_interval, char_I_bottom_time, char_I_bottom_depth + extern char_I_deco_model + extern char_I_extra_time + extern tDefName, tblank + extern char_I_bottom_usage, char_I_deco_usage, tLitersMinute + extern char_I_PSCR_drop, char_I_PSCR_lungratio + extern char_I_tank_size, char_I_tank_pres_fill, tLiter, tbar10 + extern char_I_cc_max_frac_o2 + extern char_I_altitude_wait + extern char_I_ppO2_max, char_I_ppO2_min, char_I_ppO2_max_deco, char_I_ppO2_min_loop + extern char_I_ascent_speed, tMeterMinute + extern char_I_gas_change_time, tmin + +; Option table +; OPTION_UINT8 Label, min, max, default, text-string, EEPROM location, RAM location + +#DEFINE notext .0 ; no text-string associated +#DEFINE volatile -1 ; do not store to EEPROM + + global option_table_begin option_table_begin: ;============================================================================= ; Manage Decoplaner & Dive parameters - OPTION_UINT8p10 odiveInterval, .0, .240, .0, tMinutes, -1, char_I_dive_interval - OPTION_UINT8p2 obottomTime, .1, .60, .5, tMinutes, -1, char_I_bottom_time - OPTION_UINT8p3 obottomDepth, .12,.120, .21, tMeters, -1, char_I_bottom_depth - OPTION_ENUM8 oDiveMode, 5, 0, tDvOC, .8, opt_dive_mode ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - OPTION_ENUM8 oDecoMode, 2, 1, tZHL16, .9, char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - OPTION_UINT8p10 oPPO2Max, .120, ppo2_warning_high, .160, 0, .10, char_I_ppO2_max - OPTION_UINT8 oLastDeco, .3, .6, .3, tMeters, .11, opt_last_stop - OPTION_UINT8 oGF_low, .10, .100, .30, tPercent, .12, opt_GF_low - OPTION_UINT8 oGF_high, .45, .110, .85, tPercent, .13, opt_GF_high - OPTION_UINT8p5 osatmultgf, .100, .140, .100,tPercent, .14, opt_sat_multiplier_gf ; For GF Mode - OPTION_UINT8p5 odesatmultgf, .60, .100, .100,tPercent, .15, opt_desat_multiplier_gf ; For GF Mode - OPTION_UINT8p10 oPPO2Min, .16, ppo2_warning_low, .19, 0, .16, char_I_ppO2_min - OPTION_UINT8 oaGF_low, .10, .100, .30, tPercent, .17, opt_aGF_low - OPTION_UINT8 oaGF_high, .45, .110, .85, tPercent, .18, opt_aGF_high - OPTION_BOOL oEnable_aGF, 0, .19, opt_enable_aGF ; =1: aGF can be selected underwater - OPTION_UINT8 oCompassGain, 0, 7, 6, tMinutes, .20, opt_compass_gain ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) - OPTION_ENUM8 oSamplingRate, 2, 0, tSetSeconds, .21, opt_sampling_rate ; =1: 10s, =0: 2s + OPTION_UINT8p10 odiveInterval, .0, .240, .0, tMinutes, volatile, char_I_dive_interval + OPTION_UINT8p2 obottomTime, .1, .60, .5, tMinutes, volatile, char_I_bottom_time + OPTION_UINT8p3 obottomDepth, .12, .120, .21, tMeters, volatile, char_I_bottom_depth + OPTION_ENUM8 oDiveMode, .5, .0, tDvOC, .8, opt_dive_mode ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + OPTION_ENUM8 oDecoMode, .2, .1, tZHL16, .9, char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + ; .10 ; in use, see below + OPTION_UINT8 oLastDeco, .3, .6, .3, tMeters, .11, opt_last_stop + OPTION_UINT8 oGF_low, .10, .100, .30, tPercent, .12, opt_GF_low + OPTION_UINT8 oGF_high, .45, .110, .85, tPercent, .13, opt_GF_high + OPTION_UINT8p5 osatmultgf, .100, .140, .100, tPercent, .14, opt_sat_multiplier_gf ; for GF mode + OPTION_UINT8p5 odesatmultgf, .60, .100, .100, tPercent, .15, opt_desat_multiplier_gf ; for GF mode + ; .16 ; in use, see below + OPTION_UINT8 oaGF_low, .10, .100, .30, tPercent, .17, opt_aGF_low + OPTION_UINT8 oaGF_high, .45, .110, .85, tPercent, .18, opt_aGF_high + OPTION_BOOL oEnable_aGF, .0, .19, opt_enable_aGF ; =1: aGF can be selected underwater + OPTION_UINT8 oCompassGain, .0, .7, .6, tMinutes, .20, opt_compass_gain ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) + OPTION_ENUM8 oSamplingRate, .2, .0, tSetSeconds, .21, opt_sampling_rate ; =1: 10s, =0: 2s ;============================================================================= ; Managing Settings - OPTION_UINT8 oExtraTime, 0, .9, 0,tMinutes, .22, char_I_extra_time ; Future TTS - OPTION_ENUM8 oBrightness, 3, 0, tEco, .23, opt_brightness ; =0: Eco, =1:Medium, =2:Full - OPTION_UINT8 oDiveSalinity, 0, 4, 0, tPercent, .24, opt_salinity ; 0-4% - OPTION_ENUM8 oCCRMode, 3, 0, tCCRModeFixedSP, .25, opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP + OPTION_UINT8 oExtraTime, .0, .9, .0, tMinutes, .22, char_I_extra_time ; Future TTS + OPTION_ENUM8 oBrightness, .3, .0, tEco, .23, opt_brightness ; =0: Eco, =1:Medium, =2:Full + OPTION_UINT8 oDiveSalinity, .0, .4, .0, tPercent, .24, opt_salinity ; 0-4% + OPTION_ENUM8 oCCRMode, .3, .0, tCCRModeFixedSP,.25, opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP - IFNDEF french_italian - OPTION_ENUM8 oLanguage, 2, 0, tEnglish, .26, opt_language ; 0=EN, 1=DE - ELSE - OPTION_ENUM8 oLanguage, 2, 0, tFrench, .26, opt_language ; 0=FR, 1=IT - ENDIF - OPTION_ENUM8 oDateFormat, 3, 1, tDateformat,.27, opt_dateformat ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD - OPTION_ENUM8 oUnits, 2, 0, tMetric, .28, opt_units ; 0=Meters, 1=Feets + IFNDEF french_italian + OPTION_ENUM8 oLanguage, .2, .0, tEnglish, .26, opt_language ; 0=EN, 1=DE + ELSE + OPTION_ENUM8 oLanguage, .2, .0, tFrench, .26, opt_language ; 0=FR, 1=IT + ENDIF + OPTION_ENUM8 oDateFormat, .3, .1, tDateformat, .27, opt_dateformat ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD + OPTION_ENUM8 oUnits, .2, .0, tMetric, .28, opt_units ; 0=Meter, 1=Feet ;============================================================================= ; Compass calibration data - OPTION_UINT8 oCalx0, 0,.255,.0, 0, .29, compass_CX_f+0 - OPTION_UINT8 oCalx1, 0,.255,.0, 0, .30, compass_CX_f+1 - OPTION_UINT8 oCaly0, 0,.255,.0, 0, .31, compass_CY_f+0 - OPTION_UINT8 oCaly1, 0,.255,.0, 0, .32, compass_CY_f+1 - OPTION_UINT8 oCalz0, 0,.255,.0, 0, .33, compass_CZ_f+0 - OPTION_UINT8 oCalz1, 0,.255,.0, 0, .34, compass_CZ_f+1 + OPTION_UINT8 oCalx0, .0, .255, .0, notext, .29, compass_CX_f+0 + OPTION_UINT8 oCalx1, .0, .255, .0, notext, .30, compass_CX_f+1 + OPTION_UINT8 oCaly0, .0, .255, .0, notext, .31, compass_CY_f+0 + OPTION_UINT8 oCaly1, .0, .255, .0, notext, .32, compass_CY_f+1 + OPTION_UINT8 oCalz0, .0, .255, .0, notext, .33, compass_CZ_f+0 + OPTION_UINT8 oCalz1, .0, .255, .0, notext, .34, compass_CZ_f+1 ;============================================================================= ; Gas list - OPTION_ENUM8 oGas1, 3, 1, tGasDisabled, .35, opt_gas_type+0; 0=Disabled, 1=First, 2=Travel, 3=Deco - OPTION_ENUM8 oGas2, 3, 0, tGasDisabled, .36, opt_gas_type+1 - OPTION_ENUM8 oGas3, 3, 0, tGasDisabled, .37, opt_gas_type+2 - OPTION_ENUM8 oGas4, 3, 0, tGasDisabled, .38, opt_gas_type+3 - OPTION_ENUM8 oGas5, 3, 0, tGasDisabled, .39, opt_gas_type+4 - OPTION_UINT8 oGas1O2, .7 ,.100, .21, tPercent, .40, opt_gas_O2_ratio+0 - OPTION_UINT8 oGas1He, .1, .100, .0, tPercent, .41, opt_gas_He_ratio+0 - OPTION_UINT8 oGas2O2, .7 ,.100, .21, tPercent, .42, opt_gas_O2_ratio+1 - OPTION_UINT8 oGas2He, .1, .100, .0, tPercent, .43, opt_gas_He_ratio+1 - OPTION_UINT8 oGas3O2, .7 ,.100, .21, tPercent, .44, opt_gas_O2_ratio+2 - OPTION_UINT8 oGas3He, .1, .100, .0, tPercent, .45, opt_gas_He_ratio+2 - OPTION_UINT8 oGas4O2, .7 ,.100, .21, tPercent, .46, opt_gas_O2_ratio+3 - OPTION_UINT8 oGas4He, .1, .100, .0, tPercent, .47, opt_gas_He_ratio+3 - OPTION_UINT8 oGas5O2, .7 ,.100, .21, tPercent, .48, opt_gas_O2_ratio+4 - OPTION_UINT8 oGas5He, .1, .100, .0, tPercent, .49, opt_gas_He_ratio+4 - OPTION_UINT8 oGas1Depth, .0, .99, .0, tMeters, .50, opt_OC_bail_gas_change+0 - OPTION_UINT8 oGas2Depth, .0, .99, .0, tMeters, .51, opt_OC_bail_gas_change+1 - OPTION_UINT8 oGas3Depth, .0, .99, .0, tMeters, .52, opt_OC_bail_gas_change+2 - OPTION_UINT8 oGas4Depth, .0, .99, .0, tMeters, .53, opt_OC_bail_gas_change+3 - OPTION_UINT8 oGas5Depth, .0, .99, .0, tMeters, .54, opt_OC_bail_gas_change+4 - OPTION_UINT8 oDil1O2, .7 ,.100, .21, tPercent, .55, opt_dil_O2_ratio+0 - OPTION_UINT8 oDil1He, .1, .100, .0, tPercent, .56, opt_dil_He_ratio+0 - OPTION_UINT8 oDil2O2, .7 ,.100, .21, tPercent, .57, opt_dil_O2_ratio+1 - OPTION_UINT8 oDil2He, .1, .100, .0, tPercent, .58, opt_dil_He_ratio+1 - OPTION_UINT8 oDil3O2, .7 ,.100, .21, tPercent, .59, opt_dil_O2_ratio+2 - OPTION_UINT8 oDil3He, .1, .100, .0, tPercent, .60, opt_dil_He_ratio+2 - OPTION_UINT8 oDil4O2, .7 ,.100, .21, tPercent, .61, opt_dil_O2_ratio+3 - OPTION_UINT8 oDil4He, .1, .100, .0, tPercent, .62, opt_dil_He_ratio+3 - OPTION_UINT8 oDil5O2, .7 ,.100, .21, tPercent, .63, opt_dil_O2_ratio+4 - OPTION_UINT8 oDil5He, .1, .100, .0, tPercent, .64, opt_dil_He_ratio+4 - OPTION_UINT8 oSetPoint1, .20, .160, .70, tbar, .65, char_I_setpoint_cbar+0 - OPTION_UINT8 oSetPoint2, .20, .160, .90, tbar, .66, char_I_setpoint_cbar+1 - OPTION_UINT8 oSetPoint3, .20, .160, .100, tbar, .67, char_I_setpoint_cbar+2 - OPTION_UINT8 oSetPoint4, .20, .160, .120, tbar, .68, char_I_setpoint_cbar+3 - OPTION_UINT8 oSetPoint5, .20, .160, .140, tbar, .69, char_I_setpoint_cbar+4 - OPTION_UINT8 oSP1Depth, .0, .100, .0, tMeters, .70, char_I_setpoint_change+0 - OPTION_UINT8 oSP2Depth, .0, .100, .0, tMeters, .71, char_I_setpoint_change+1 - OPTION_UINT8 oSP3Depth, .0, .100, .0, tMeters, .72, char_I_setpoint_change+2 - OPTION_UINT8 oSP4Depth, .0, .100, .0, tMeters, .73, char_I_setpoint_change+3 - OPTION_UINT8 oSP5Depth, .0, .100, .0, tMeters, .74, char_I_setpoint_change+4 - OPTION_ENUM8 oDil1, 2, 1, tDilDisabled, .75, opt_dil_type+0 ; 0=Disabled, 1=First, 2=Normal - OPTION_ENUM8 oDil2, 2, 0, tDilDisabled, .76, opt_dil_type+1 - OPTION_ENUM8 oDil3, 2, 0, tDilDisabled, .77, opt_dil_type+2 - OPTION_ENUM8 oDil4, 2, 0, tDilDisabled, .78, opt_dil_type+3 - OPTION_ENUM8 oDil5, 2, 0, tDilDisabled, .79, opt_dil_type+4 - OPTION_UINT8 oDil1Depth, .0, .99, .0, tMeters, .80, char_I_dil_change+0 - OPTION_UINT8 oDil2Depth, .0, .99, .0, tMeters, .81, char_I_dil_change+1 - OPTION_UINT8 oDil3Depth, .0, .99, .0, tMeters, .82, char_I_dil_change+2 - OPTION_UINT8 oDil4Depth, .0, .99, .0, tMeters, .83, char_I_dil_change+3 - OPTION_UINT8 oDil5Depth, .0, .99, .0, tMeters, .84, char_I_dil_change+4 + OPTION_ENUM8 oGas1, .3, .1, tGasDisabled, .35, opt_gas_type+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + OPTION_ENUM8 oGas2, .3, .0, tGasDisabled, .36, opt_gas_type+1 + OPTION_ENUM8 oGas3, .3, .0, tGasDisabled, .37, opt_gas_type+2 + OPTION_ENUM8 oGas4, .3, .0, tGasDisabled, .38, opt_gas_type+3 + OPTION_ENUM8 oGas5, .3, .0, tGasDisabled, .39, opt_gas_type+4 + OPTION_UINT8 oGas1O2, gaslist_min_o2, .100, .21, tPercent, .40, opt_gas_O2_ratio+0 + OPTION_UINT8 oGas1He, .0, gaslist_max_He, .0, tPercent, .41, opt_gas_He_ratio+0 + OPTION_UINT8 oGas2O2, gaslist_min_o2, .100, .21, tPercent, .42, opt_gas_O2_ratio+1 + OPTION_UINT8 oGas2He, .0, gaslist_max_He, .0, tPercent, .43, opt_gas_He_ratio+1 + OPTION_UINT8 oGas3O2, gaslist_min_o2, .100, .21, tPercent, .44, opt_gas_O2_ratio+2 + OPTION_UINT8 oGas3He, .0, gaslist_max_He, .0, tPercent, .45, opt_gas_He_ratio+2 + OPTION_UINT8 oGas4O2, gaslist_min_o2, .100, .21, tPercent, .46, opt_gas_O2_ratio+3 + OPTION_UINT8 oGas4He, .0, gaslist_max_He, .0, tPercent, .47, opt_gas_He_ratio+3 + OPTION_UINT8 oGas5O2, gaslist_min_o2, .100, .21, tPercent, .48, opt_gas_O2_ratio+4 + OPTION_UINT8 oGas5He, .0, gaslist_max_He, .0, tPercent, .49, opt_gas_He_ratio+4 + OPTION_UINT8 oGas1Depth, .0, gaslist_max_change_depth, .0, tMeters, .50, opt_OC_bail_gas_change+0 + OPTION_UINT8 oGas2Depth, .0, gaslist_max_change_depth, .0, tMeters, .51, opt_OC_bail_gas_change+1 + OPTION_UINT8 oGas3Depth, .0, gaslist_max_change_depth, .0, tMeters, .52, opt_OC_bail_gas_change+2 + OPTION_UINT8 oGas4Depth, .0, gaslist_max_change_depth, .0, tMeters, .53, opt_OC_bail_gas_change+3 + OPTION_UINT8 oGas5Depth, .0, gaslist_max_change_depth, .0, tMeters, .54, opt_OC_bail_gas_change+4 + OPTION_UINT8 oDil1O2, gaslist_min_o2, .100, .21, tPercent, .55, opt_dil_O2_ratio+0 + OPTION_UINT8 oDil1He, .0, gaslist_max_He, .0, tPercent, .56, opt_dil_He_ratio+0 + OPTION_UINT8 oDil2O2, gaslist_min_o2, .100, .21, tPercent, .57, opt_dil_O2_ratio+1 + OPTION_UINT8 oDil2He, .0, gaslist_max_He, .0, tPercent, .58, opt_dil_He_ratio+1 + OPTION_UINT8 oDil3O2, gaslist_min_o2, .100, .21, tPercent, .59, opt_dil_O2_ratio+2 + OPTION_UINT8 oDil3He, .0, gaslist_max_He, .0, tPercent, .60, opt_dil_He_ratio+2 + OPTION_UINT8 oDil4O2, gaslist_min_o2, .100, .21, tPercent, .61, opt_dil_O2_ratio+3 + OPTION_UINT8 oDil4He, .0, gaslist_max_He, .0, tPercent, .62, opt_dil_He_ratio+3 + OPTION_UINT8 oDil5O2, gaslist_min_o2, .100, .21, tPercent, .63, opt_dil_O2_ratio+4 + OPTION_UINT8 oDil5He, .0, gaslist_max_He, .0, tPercent, .64, opt_dil_He_ratio+4 + OPTION_UINT8 oSetPoint1, gaslist_sp_min, gaslist_sp_max, .70, tbar, .65, char_I_setpoint_cbar+0 + OPTION_UINT8 oSetPoint2, gaslist_sp_min, gaslist_sp_max, .90, tbar, .66, char_I_setpoint_cbar+1 + OPTION_UINT8 oSetPoint3, gaslist_sp_min, gaslist_sp_max, .100, tbar, .67, char_I_setpoint_cbar+2 + OPTION_UINT8 oSetPoint4, gaslist_sp_min, gaslist_sp_max, .120, tbar, .68, char_I_setpoint_cbar+3 + OPTION_UINT8 oSetPoint5, gaslist_sp_min, gaslist_sp_max, .140, tbar, .69, char_I_setpoint_cbar+4 + OPTION_UINT8 oSP1Depth, .0, .100, .0, tMeters, .70, char_I_setpoint_change+0 + OPTION_UINT8 oSP2Depth, .0, .100, .0, tMeters, .71, char_I_setpoint_change+1 + OPTION_UINT8 oSP3Depth, .0, .100, .0, tMeters, .72, char_I_setpoint_change+2 + OPTION_UINT8 oSP4Depth, .0, .100, .0, tMeters, .73, char_I_setpoint_change+3 + OPTION_UINT8 oSP5Depth, .0, .100, .0, tMeters, .74, char_I_setpoint_change+4 + OPTION_ENUM8 oDil1, .2, .1, tDilDisabled, .75, opt_dil_type+0 ; 0=Disabled, 1=First, 2=Normal + OPTION_ENUM8 oDil2, .2, .0, tDilDisabled, .76, opt_dil_type+1 + OPTION_ENUM8 oDil3, .2, .0, tDilDisabled, .77, opt_dil_type+2 + OPTION_ENUM8 oDil4, .2, .0, tDilDisabled, .78, opt_dil_type+3 + OPTION_ENUM8 oDil5, .2, .0, tDilDisabled, .79, opt_dil_type+4 + OPTION_UINT8 oDil1Depth, .0, .99, .0, tMeters, .80, char_I_dil_change+0 + OPTION_UINT8 oDil2Depth, .0, .99, .0, tMeters, .81, char_I_dil_change+1 + OPTION_UINT8 oDil3Depth, .0, .99, .0, tMeters, .82, char_I_dil_change+2 + OPTION_UINT8 oDil4Depth, .0, .99, .0, tMeters, .83, char_I_dil_change+3 + OPTION_UINT8 oDil5Depth, .0, .99, .0, tMeters, .84, char_I_dil_change+4 ;============================================================================= ; opt_name from 85 to 145 - OPTION_STRING oName, opt_name_length, tDefName, .85, opt_name + OPTION_STRING oName, opt_name_length, tDefName, .85, opt_name ;============================================================================= ; Misc - OPTION_ENUM8 oColorSetDive, 4, 0, tColorSetName0, .146, opt_dive_color_scheme ; Color scheme divemode - OPTION_UINT8 oPressureAdjust, .0,.255, .0, -1, .147, opt_pressure_adjust ; SIGNED int (-20/+20mbar max.) - OPTION_BOOL oSafetyStop, 0, .148, opt_enable_safetystop ; =1: A safety stop is shown - OPTION_UINT8 oCalGasO2, .21,.100, .21, tPercent, .149, opt_calibration_O2_ratio ; Calibration gas %O2 (Do not move in EEPROM, must stay at .149!) - OPTION_BOOL oFlipScreen, 0, .151, opt_flip_screen ; =1: Flip the screen - OPTION_UINT8p10 ocR_button_left, .20, .80, .40, tPercent, .152, opt_cR_button_left ; left button sensitivity - OPTION_UINT8p10 ocR_button_right,.20, .80, .40, tPercent, .153, opt_cR_button_right ; right button sensitivity - OPTION_UINT8 obottom_usage, .5,.50, .20,tLitersMinute, .154, char_I_bottom_usage ; l/min - OPTION_UINT8 odeco_usage, .5,.50, .20,tLitersMinute, .155, char_I_deco_usage ; l/min - OPTION_BOOL oMODwarning, 0, .156, opt_modwarning ; =1: red depth blinking warning - OPTION_BOOL oVSItextv2, 0, .157, opt_vsitextv2 ; =1: use the dynamic (depends on depth) ascend rate limits - OPTION_BOOL oVSIgraph, 0, .158, opt_vsigraph ; =1: draw the graphical VSI bar - OPTION_BOOL oShowppO2, 0, .159, opt_showppo2 ; =1:always show the ppO2 value in the warning position - OPTION_UINT8 oTemperatureAdjust, .0,.255, .0, -1, .160, opt_temperature_adjust ; SIGNED int (-2.0/+2.0 °C max.) - OPTION_UINT8 oSafetyStopLength, .60,.240, .180, -1, .161, opt_safety_stop_length ; [s] - OPTION_UINT8 oSafetyStopStart, .21,.61, .51, -1, .162, opt_safety_stop_start ; [cbar], default 510mbar, min 210mbar, max 610mbar - OPTION_UINT8 oSafetyStopEnd, .19,.39, .29, -1, .163, opt_safety_stop_end ; [cbar], default 290mbar, min 190mbar, max 390mbar - OPTION_UINT8 oSafetyStopReset, .81,.151, .101, -1, .164, opt_safety_stop_reset ; [cbar], default 1010mbar, min 810mbar, max 1510mbar - OPTION_UINT8 oDiveTimeout, .1,.20, divemode_timeout_default, tMinutes, .168, opt_diveTimeout ; Timeout for divemode in minutes - OPTION_UINT8 oPSCR_drop, .0,.15, .4, tPercent,.169, char_I_PSCR_drop ; PSCR Drop [%] - OPTION_UINT8 oPSCR_lungratio,.5,.20, .10, tPercent,.170, char_I_PSCR_lungratio ; PSCR Lung Ratio [1/x] - OPTION_UINT8p10 oPPO2MaxDeco,.120, ppo2_warning_high_deco,.160,0,.171, char_I_ppO2_max_deco ; ppO2 max for deco gases - OPTION_UINT8p10 oPPO2MinCC, ppo2_warning_low_cc_min, ppo2_warning_low_cc_max, ppo2_warning_low_cc, 0, .172, char_I_ppO2_min_loop ; ppO2 min for Loop - OPTION_UINT8 oTankSize1, .1, .40, .11, tLiter, .173, char_I_tank_size+0 ; size of OC gas tank 1 - OPTION_UINT8 oTankSize2, .1, .40, .11, tLiter, .174, char_I_tank_size+1 ; size of OC gas tank 2 - OPTION_UINT8 oTankSize3, .1, .40, .11, tLiter, .175, char_I_tank_size+2 ; size of OC gas tank 3 - OPTION_UINT8 oTankSize4, .1, .40, .11, tLiter, .176, char_I_tank_size+3 ; size of OC gas tank 4 - OPTION_UINT8 oTankSize5, .1, .40, .11, tLiter, .177, char_I_tank_size+4 ; size of OC gas tank 5 - OPTION_UINT8 oTankFillPres1, .5, .29, .20, tbar10, .178, char_I_tank_pres_fill+0 ; fill press of OC gas tank 1 - OPTION_UINT8 oTankFillPres2, .5, .29, .20, tbar10, .179, char_I_tank_pres_fill+1 ; fill press of OC gas tank 2 - OPTION_UINT8 oTankFillPres3, .5, .29, .20, tbar10, .180, char_I_tank_pres_fill+2 ; fill press of OC gas tank 3 - OPTION_UINT8 oTankFillPres4, .5, .29, .20, tbar10, .181, char_I_tank_pres_fill+3 ; fill press of OC gas tank 4 - OPTION_UINT8 oTankFillPres5, .5, .29, .20, tbar10, .182, char_I_tank_pres_fill+4 ; fill press of OC gas tank 5 - OPTION_UINT8 oCCmaxFracO2, .80, .100, .90, tPercent,.183, char_I_cc_max_frac_o2 ; max. O2 % in Loop - OPTION_UINT8 oSimSetpoint, .1, .5, .1, tblank, .184, opt_sim_setpoint_number ; setpoint to use for deco calculation - OPTION_BOOL oCalcAscGas, 0, .185, opt_calc_asc_gasvolume ; calculate OC gas volume needs for ascent - OPTION_BOOL oSimAGF, 0, -1, opt_sim_use_aGF ; use GF (no) or aGF (yes) for deco calculation - OPTION_ENUM8 oAltMode, 4, 0, tAltModeFly, .186, char_I_altitude_wait ; 0=no-fly, 1=1000m, 2=2000m, 3=3000m - OPTION_BOOL oEnable_IBCD, 0, .187, opt_enable_IBCD ; =1: IBCD warning activated - OPTION_UINT8 oAscentSpeed, .5, .10, .10,tMeterMinute,.188, char_I_ascent_speed ; ascent speed - Attention: proper operation with other values than the default of 10m/min has not been validated yet! Do not deviate from the default until further notice! - OPTION_UINT8 oGasChangeTime,.0, .3, .1, tmin ,.189, char_I_gas_change_time ; (extra) time at a stop to change the gas - OPTION_UINT8p5 osatmult, .100, .140, .110,tPercent,.190, opt_sat_multiplier_non_gf ; For NON-GF Mode - OPTION_UINT8p5 odesatmult, .60, .100, .90,tPercent,.191, opt_desat_multiplier_non_gf ; For NON-GF Mode - + OPTION_ENUM8 oColorSetDive, .4, .0, tColorSetName0, .146, opt_dive_color_scheme ; Color scheme divemode + OPTION_UINT8 oPressureAdjust, .0, .255, .0, notext, .147, opt_pressure_adjust ; SIGNED int (-20/+20mbar max.) + OPTION_BOOL oSafetyStop, .0, .148, opt_enable_safetystop ; =1: A safety stop is shown + OPTION_UINT8 oCalGasO2, .21, .100, .21, tPercent, .149, opt_calibration_O2_ratio ; Calibration gas %O2 (Do not move in EEPROM, must stay at .149!) + OPTION_BOOL oFlipScreen, .0, .151, opt_flip_screen ; =1: Flip the screen + OPTION_UINT8p10 ocR_button_left, .20, .80, .40, tPercent, .152, opt_cR_button_left ; left button sensitivity + OPTION_UINT8p10 ocR_button_right, .20, .80, .40, tPercent, .153, opt_cR_button_right ; right button sensitivity + OPTION_UINT8 obottom_usage, .5, .50, .20, tLitersMinute, .154, char_I_bottom_usage ; l/min + OPTION_UINT8 odeco_usage, .5, .50, .20, tLitersMinute, .155, char_I_deco_usage ; l/min + OPTION_BOOL oMODwarning, .0, .156, opt_modwarning ; =1: red depth blinking warning + OPTION_BOOL oVSItextv2, .0, .157, opt_vsitextv2 ; =1: use the dynamic (depends on depth) ascend rate limits + OPTION_BOOL oVSIgraph, .0, .158, opt_vsigraph ; =1: draw the graphical VSI bar + OPTION_BOOL oShowppO2, .0, .159, opt_showppo2 ; =1:always show the ppO2 value in the warning position + OPTION_UINT8 oTemperatureAdjust, .0, .255, .0, notext, .160, opt_temperature_adjust ; SIGNED int (-2.0/+2.0 °C max.) + OPTION_UINT8 oSafetyStopLength, .60, .240, .180, notext, .161, opt_safety_stop_length ; [s] + OPTION_UINT8 oSafetyStopStart, .21, .61, .51, notext, .162, opt_safety_stop_start ; [cbar], default 510mbar, min 210mbar, max 610mbar + OPTION_UINT8 oSafetyStopEnd, .19, .39, .29, notext, .163, opt_safety_stop_end ; [cbar], default 290mbar, min 190mbar, max 390mbar + OPTION_UINT8 oSafetyStopReset, .81, .151, .101, notext, .164, opt_safety_stop_reset ; [cbar], default 1010mbar, min 810mbar, max 1510mbar + OPTION_UINT8 oDiveTimeout, .1, .20, .5, tMinutes, .168, opt_diveTimeout ; Timeout for divemode in minutes + OPTION_UINT8 oPSCR_drop, .0, .15, .4, tPercent, .169, char_I_PSCR_drop ; PSCR Drop [%] + OPTION_UINT8 oPSCR_lungratio, .5, .20, .10, tPercent, .170, char_I_PSCR_lungratio ; PSCR Lung Ratio [1/x] +; .171 ; in use, see below +; .172 ; in use, see below + OPTION_UINT8 oTankSize1, .1, .40, .11, tLiter, .173, char_I_tank_size+0 ; size of OC gas tank 1 + OPTION_UINT8 oTankSize2, .1, .40, .11, tLiter, .174, char_I_tank_size+1 ; size of OC gas tank 2 + OPTION_UINT8 oTankSize3, .1, .40, .11, tLiter, .175, char_I_tank_size+2 ; size of OC gas tank 3 + OPTION_UINT8 oTankSize4, .1, .40, .11, tLiter, .176, char_I_tank_size+3 ; size of OC gas tank 4 + OPTION_UINT8 oTankSize5, .1, .40, .11, tLiter, .177, char_I_tank_size+4 ; size of OC gas tank 5 + OPTION_UINT8 oTankFillPres1, .5, .29, .20, tbar10, .178, char_I_tank_pres_fill+0 ; fill press of OC gas tank 1 + OPTION_UINT8 oTankFillPres2, .5, .29, .20, tbar10, .179, char_I_tank_pres_fill+1 ; fill press of OC gas tank 2 + OPTION_UINT8 oTankFillPres3, .5, .29, .20, tbar10, .180, char_I_tank_pres_fill+2 ; fill press of OC gas tank 3 + OPTION_UINT8 oTankFillPres4, .5, .29, .20, tbar10, .181, char_I_tank_pres_fill+3 ; fill press of OC gas tank 4 + OPTION_UINT8 oTankFillPres5, .5, .29, .20, tbar10, .182, char_I_tank_pres_fill+4 ; fill press of OC gas tank 5 + OPTION_UINT8 oCCmaxFracO2, .80, .100, .90, tPercent, .183, char_I_cc_max_frac_o2 ; max. O2 % in Loop + OPTION_UINT8 oSimSetpoint, .1, .5, .1, tblank, .184, opt_sim_setpoint_number ; setpoint to use for deco calculation + OPTION_BOOL oCalcAscGas, .0, .185, opt_calc_asc_gasvolume ; calculate OC gas volume needs for ascent + OPTION_BOOL oSimAGF, .0, volatile, opt_sim_use_aGF ; use GF (no) or aGF (yes) for deco calculation + OPTION_ENUM8 oAltMode, .4, .0, tAltModeFly, .186, char_I_altitude_wait ; 0=no-fly, 1=1000m, 2=2000m, 3=3000m + OPTION_BOOL oEnable_IBCD, .0, .187, opt_enable_IBCD ; =1: IBCD warning activated + OPTION_UINT8 oAscentSpeed, .5, .10, .10, tMeterMinute, .188, char_I_ascent_speed ; ascent speed - Attention: proper operation with other values than the default of 10m/min has not been validated yet! Do not deviate from the default until further notice! + OPTION_UINT8 oGasChangeTime, .0, .3, .1, tmin, .189, char_I_gas_change_time ; (extra) time at a stop to change the gas + OPTION_UINT8p5 osatmult, .100, .140, .110, tPercent, .190, opt_sat_multiplier_non_gf ; for NON-GF Mode + OPTION_UINT8p5 odesatmult, .60, .100, .90, tPercent, .191, opt_desat_multiplier_non_gf ; for NON-GF Mode + +; ppO2 warnings, sorted by ppO2 levels + OPTION_UINT8p10 oPPO2Min, ppo2_warning_low_lowest, ppo2_warning_low_highest, ppo2_warning_low_default, notext, .16, char_I_ppO2_min ; ppO2 min on OC + OPTION_UINT8p10 oPPO2MinCC, ppo2_warning_loop_lowest, ppo2_warning_loop_highest, ppo2_warning_loop_default, notext, .172, char_I_ppO2_min_loop ; ppO2 min on Loop + OPTION_UINT8p10 oPPO2Max, ppo2_warning_high_lowest, ppo2_warning_high_highest, ppo2_warning_high_default, notext, .10, char_I_ppO2_max ; ppO2 max when not in deco + OPTION_UINT8p10 oPPO2MaxDeco, ppo2_warning_deco_lowest, ppo2_warning_deco_highest, ppo2_warning_deco_default, notext, .171, char_I_ppO2_max_deco ; ppO2 max when in deco + ;============================================================================= ; Set Time/Set Date (RAM only) - OPTION_UINT8 oSetHours, .0, .23, .0, 0, -1, hours - OPTION_UINT8 oSetMinutes, .0, .59, .0, 0, -1, mins - OPTION_UINT8 oSetDay, .1, .31, .0, 0, -1, day - OPTION_UINT8 oSetMonth, .1, .12, .0, 0, -1, month - OPTION_UINT8 oSetYear, .18,.24, .0, 0, -1, year + OPTION_UINT8 oSetHours, .0, .23, .0, .0, volatile, hours + OPTION_UINT8 oSetMinutes, .0, .59, .0, .0, volatile, mins + OPTION_UINT8 oSetDay, .1, .31, .0, .0, volatile, day + OPTION_UINT8 oSetMonth, .1, .12, .0, .0, volatile, month + OPTION_UINT8 oSetYear, .18, .24, .0, .0, volatile, year - global option_table_end + global option_table_end option_table_end: - END \ No newline at end of file + + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/options.asm --- a/src/options.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/options.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File options.asm REFACTORED VERSION V2.91 +; File options.asm REFACTORED VERSION V2.97 ; ; Manage all options data. ; @@ -13,87 +13,75 @@ ; ; Provides a centralized file with -#include "hwos.inc" ; Mandatory header -#include "strings.inc" -#include "convert.inc" -#include "ghostwriter.inc" -#include "eeprom_rs232.inc" -#include "external_flash.inc" -#include "wait.inc" +#include "hwos.inc" ; Mandatory header +#include "strings.inc" +#include "convert.inc" +#include "ghostwriter.inc" +#include "eeprom_rs232.inc" +#include "external_flash.inc" +#include "wait.inc" - extern write_eeprom - extern read_eeprom - extern eeprom_serial_save,eeprom_opt_backup - extern option_table_begin,option_table_end + extern write_eeprom + extern read_eeprom + extern eeprom_serial_save,eeprom_opt_backup + extern option_table_begin,option_table_end - global option_reset_all ; Reset all options to factory default. - global option_check_all ; Check all option and reset option if out of min/max boundary - global option_reset ; Reset FSR0 option to factory default. - global option_save_all ; Save options to EEPROM. - global option_restore_all ; Restore options from EEPROM. - global option_inc ; Increment FSR0 option. - global option_draw ; STRCAT FRS0 option. + global option_reset_all ; Reset all options to factory default. + global option_check_all ; Check all option and reset option if out of min/max boundary + global option_reset ; Reset FSR0 option to factory default. + global option_save_all ; Save options to EEPROM. + global option_restore_all ; Restore options from EEPROM. + global option_inc ; Increment FSR0 option. + global option_draw ; STRCAT FRS0 option. +gui CODE ; Appends to other GUI segment + ;============================================================================= - CBLOCK tmp+0x12 ; Reserve space for wordprocessor & convert - opt_type - opt_default - opt_inc ; Also default+1 (string), and enum low - opt_min ; also enum high - opt_max - opt_unit:2 ; Multi-lingual unit text. - opt_eeprom - opt_backup_tbl:3 - ; Reserved to tmp+0x1C... - ENDC - -gui CODE ; Appends to other GUI segment -;============================================================================= -; Reset all options to factory defauts. +; Reset all options to factory defaults. ; ; INPUT: none ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 option_reset_all: - clrf EEADRH - read_int_eeprom .2 - tstfsz EEDATA ; Total dives=0? - bra option_reset_all2 ; No, skip resetting logbook - read_int_eeprom .3 - tstfsz EEDATA ; Total dives=0? - bra option_reset_all2 ; No, skip resetting logbook + clrf EEADRH + read_int_eeprom .2 + tstfsz EEDATA ; Total dives=0? + bra option_reset_all2 ; No, skip resetting logbook + read_int_eeprom .3 + tstfsz EEDATA ; Total dives=0? + bra option_reset_all2 ; No, skip resetting logbook - 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 - call ext_flash_erase_logbook ; And complete logbook (!) + 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 + call ext_flash_erase_logbook ; And complete logbook (!) option_reset_all2: - clrf lo - clrf hi - call do_logoffset_common_write ; reset Logbook offset + clrf lo + clrf hi + call do_logoffset_common_write ; reset Logbook offset - ; Point to option table begin - movlw LOW(option_table_begin) - movwf FSR0L - movlw HIGH(option_table_begin) - movwf FSR0H + ; Point to option table begin + movlw LOW(option_table_begin) + movwf FSR0L + movlw HIGH(option_table_begin) + movwf FSR0H option_reset_all_1: movlw LOW(option_table_end) cpfseq FSR0L - bra option_reset_all_2 ; Not yet done... + bra option_reset_all_2 ; Not yet done... movlw HIGH(option_table_end) cpfseq FSR0H - bra option_reset_all_2 ; Not yet done... - return ; All done. + bra option_reset_all_2 ; Not yet done... + return ; All done. option_reset_all_2: - rcall option_reset ; Reset one option. - bra option_reset_all_1 ; and loop. + rcall option_reset ; Reset one option. + bra option_reset_all_1 ; and loop. ;============================================================================= ; Check all option and reset option if out of min/max boundary @@ -102,23 +90,23 @@ ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 option_check_all: - ; Point to option table begin - movlw LOW(option_table_begin) - movwf FSR0L - movlw HIGH(option_table_begin) - movwf FSR0H + ; Point to option table begin + movlw LOW(option_table_begin) + movwf FSR0L + movlw HIGH(option_table_begin) + movwf FSR0H option_check_all_1: - movlw LOW(option_table_end) + movlw LOW(option_table_end) cpfseq FSR0L - bra option_check_all_2 ; Not yet done... + bra option_check_all_2 ; Not yet done... movlw HIGH(option_table_end) cpfseq FSR0H - bra option_check_all_2 ; Not yet done... - return ; All done. + bra option_check_all_2 ; Not yet done... + return ; All done. option_check_all_2: - rcall option_check ; check one option. - bra option_check_all_1 ; and loop + rcall option_check ; check one option. + bra option_check_all_1 ; and loop ;============================================================================= ; Read option handle @@ -126,38 +114,38 @@ ; OUTPUT: FSR1 = address of variable. ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 option_read: - movff FSR0L,TBLPTRL - movlw HIGH(option_table_begin); Get 8 high bits. - andlw 0xF0 ; Keep only the 4 highest ones. - iorwf FSR0H,W ; Cat with the known 4 lower ones. - movwf TBLPTRH ; And we have the high byte. - movlw UPPER(option_table_begin) - movwf TBLPTRU + movff FSR0L,TBLPTRL + movlw HIGH(option_table_begin) ; Get 8 high bits. + andlw 0xF0 ; Keep only the 4 highest ones. + iorwf FSR0H,W ; Cat with the known 4 lower ones. + movwf TBLPTRH ; And we have the high byte. + movlw UPPER(option_table_begin) + movwf TBLPTRU - ; Read type, default and register from table - tblrd*+ - movff TABLAT,opt_type - tblrd*+ - movff TABLAT,opt_default - tblrd*+ - movff TABLAT,opt_inc - tblrd*+ - movff TABLAT,opt_min - tblrd*+ - movff TABLAT,opt_max - tblrd*+ - movff TABLAT,opt_eeprom - tblrd*+ - movff TABLAT,opt_unit+0 - tblrd*+ - movff TABLAT,opt_unit+1 - tblrd*+ - movff TABLAT,FSR1L - tblrd*+ - movff TABLAT,FSR1H - movff TBLPTRL,FSR0L ; Advance handle too, for reset_all - movff TBLPTRH,FSR0H - return + ; Read type, default and register from table + tblrd*+ + movff TABLAT,opt_type + tblrd*+ + movff TABLAT,opt_default + tblrd*+ + movff TABLAT,opt_inc + tblrd*+ + movff TABLAT,opt_min + tblrd*+ + movff TABLAT,opt_max + tblrd*+ + movff TABLAT,opt_eeprom + tblrd*+ + movff TABLAT,opt_unit+0 + tblrd*+ + movff TABLAT,opt_unit+1 + tblrd*+ + movff TABLAT,FSR1L + tblrd*+ + movff TABLAT,FSR1H + movff TBLPTRL,FSR0L ; Advance handle too, for reset_all + movff TBLPTRH,FSR0H + return ;============================================================================= ; Check one option and reset if it's out of it's min/max boundaries @@ -166,39 +154,39 @@ ; TRASH: TBLPTR, TABLAT, WREG, FSR1, FSR2, lo ; option_check: - ; Read type, default and register from table - rcall option_read + ; Read type, default and register from table + rcall option_read - ; Switch on type - movf opt_type,W ; Type == STRING ? - xorlw 2 - bz option_check_string ; String: Do not reset strings + ; Switch on type + movf opt_type,W ; Type == STRING ? + xorlw 2 + bz option_check_string ; String: Do not reset strings - movf opt_type,W ; Type == ENUM8 ? - xorlw 1 - bz option_check_enum8 ; ENUM8: Check if lower then max. value only + movf opt_type,W ; Type == ENUM8 ? + xorlw 1 + bz option_check_enum8 ; ENUM8: Check if lower then max. value only - tstfsz opt_min ; opt_min=0? - bra option_check_both ; no - bra option_check_enum8 ; Check max only + tstfsz opt_min ; opt_min=0? + bra option_check_both ; no + bra option_check_enum8 ; Check max only option_check_both: - decf opt_min,W - cpfsgt INDF1 ; bigger then opt_min-1? - bra option_check_reset ; No, reset option -option_check_enum8: ; ENUM8: Check max only - infsnz opt_max,W ; Max = 255? - return ; Yes, igonore max. test - cpfslt INDF1 ; smaller then opt_max+1? - bra option_check_reset ; No, reset option - return ; in range, return + decf opt_min,W + cpfsgt INDF1 ; bigger then opt_min-1? + bra option_check_reset ; No, reset option +option_check_enum8: ; ENUM8: Check max only + infsnz opt_max,W ; Max = 255? + return ; Yes, ignore max. test + cpfslt INDF1 ; smaller then opt_max+1? + bra option_check_reset ; No, reset option + return ; in range, return option_check_reset: - movff opt_default,INDF1 ; reset option to default - return ; Done. + movff opt_default,INDF1 ; reset option to default + return ; Done. option_check_string: - return + return ;============================================================================= ; Reset an option to its default value. @@ -207,179 +195,179 @@ ; TRASH: TBLPTR, TABLAT, WREG, FSR1, FSR2 ; option_reset: - ; Read type, default and register from table - rcall option_read + ; Read type, default and register from table + rcall option_read - ; Switch on type - movf opt_type,W ; Type == STRING ? - xorlw 2 - bz opt_reset_string ; YES: special copy - - movff opt_default,INDF1 ; NO: just a 8bit indirect copy - return + ; Switch on type + movf opt_type,W ; Type == STRING ? + xorlw 2 + bz opt_reset_string ; YES: special copy + + movff opt_default,INDF1 ; NO: just a 8bit indirect copy + return opt_reset_string: - movff FSR1L,FSR2L ; set string destination address. - movff FSR1H,FSR2H + movff FSR1L,FSR2L ; set string destination address. + movff FSR1H,FSR2H - movff opt_default+0,FSR1L ; Get handle to multi-lingual text in FSR1 - movff opt_default+1,FSR1H + movff opt_default+0,FSR1L ; Get handle to multi-lingual text in FSR1 + movff opt_default+1,FSR1H - movff TBLPTRL,opt_backup_tbl+0; TBLPTR trashed by text routine... - movff TBLPTRH,opt_backup_tbl+1 - movff TBLPTRU,opt_backup_tbl+2 + movff TBLPTRL,opt_backup_tbl+0 ; TBLPTR trashed by text routine... + movff TBLPTRH,opt_backup_tbl+1 + movff TBLPTRU,opt_backup_tbl+2 - call strcat_text ; Copy translated text to FSR2 + call strcat_text ; Copy translated text to FSR2 - movff opt_backup_tbl+0,TBLPTRL - movff opt_backup_tbl+1,TBLPTRH - movff opt_backup_tbl+2,TBLPTRU + movff opt_backup_tbl+0,TBLPTRL + movff opt_backup_tbl+1,TBLPTRH + movff opt_backup_tbl+2,TBLPTRU - return + return ;============================================================================= ; Save all options to EEPROM option_save_all: - ;---- Save option serial into EEPROM to detect reset and new version - movlw LOW(eeprom_serial_save) - movwf EEADR - movlw HIGH(eeprom_serial_save) - movwf EEADRH - movlw LOW(eeprom_opt_serial) - movwf EEDATA - call write_eeprom - incf EEADR,F - movlw HIGH(eeprom_opt_serial) - movwf EEDATA - call write_eeprom - - ;---- Save all options - movlw LOW(option_table_begin) - movwf FSR0L - movlw HIGH(option_table_begin) - movwf FSR0H + ;---- Save option serial into EEPROM to detect reset and new version + movlw LOW(eeprom_serial_save) + movwf EEADR + movlw HIGH(eeprom_serial_save) + movwf EEADRH + movlw LOW(eeprom_opt_serial) + movwf EEDATA + call write_eeprom + incf EEADR,F + movlw HIGH(eeprom_opt_serial) + movwf EEDATA + call write_eeprom + + ;---- Save all options + movlw LOW(option_table_begin) + movwf FSR0L + movlw HIGH(option_table_begin) + movwf FSR0H option_save_all_1: - movlw LOW(option_table_end) + movlw LOW(option_table_end) cpfseq FSR0L - bra option_save_all_2 ; Not yet done... + bra option_save_all_2 ; Not yet done... movlw HIGH(option_table_end) cpfseq FSR0H - bra option_save_all_2 ; Not yet done... - return ; All done. + bra option_save_all_2 ; Not yet done... + return ; All done. option_save_all_2: - rcall option_save ; Save one option. - bra option_save_all_1 ; and loop. + rcall option_save ; Save one option. + bra option_save_all_1 ; and loop. - global option_save + global option_save option_save: - rcall option_read - incf opt_eeprom,W ; Should we save it ? - btfsc STATUS,Z ; eeprom address is FFh ? - return ; YES: nothing to do. + rcall option_read + incf opt_eeprom,W ; Should we save it ? + btfsc STATUS,Z ; EEPROM address is FFh ? + return ; YES: nothing to do. - movf opt_eeprom,W ; Compute backup address in EEPROM - addlw LOW(eeprom_opt_backup) ; Add offset - movwf EEADR - movlw HIGH(eeprom_opt_backup) - btfsc STATUS,C ; >256 - addlw .1 ; Yes: +1 - movwf EEADRH + movf opt_eeprom,W ; Compute backup address in EEPROM + addlw LOW(eeprom_opt_backup) ; Add offset + movwf EEADR + movlw HIGH(eeprom_opt_backup) + btfsc STATUS,C ; >256 + addlw .1 ; Yes: +1 + movwf EEADRH - movf opt_type,W ; Option type is string ? - xorlw 2 - bz option_save_string + movf opt_type,W ; Option type is string ? + xorlw 2 + bz option_save_string - ; One byte to save to eeprom - movff INDF1,EEDATA - btfss EEADRH,1 ; EEADR:EEADRH < 512? - call write_eeprom ; Yes, write - return - + ; One byte to save to EEPROM + movff INDF1,EEDATA + btfss EEADRH,1 ; EEADR:EEADRH < 512? + call write_eeprom ; Yes, write + return + option_save_string: - movff POSTINC1,EEDATA ; Write one byte - btfss EEADRH,1 ; EEADR:EEADRH < 512? - call write_eeprom ; Yes, write - infsnz EEADR,F - incf EEADRH,F - - decfsz opt_max ; Decrement string length - bra option_save_string ; And loop while not finished + movff POSTINC1,EEDATA ; Write one byte + btfss EEADRH,1 ; EEADR:EEADRH < 512? + call write_eeprom ; Yes, write + infsnz EEADR,F + incf EEADRH,F - return + decfsz opt_max ; Decrement string length + bra option_save_string ; And loop while not finished + + return ;============================================================================= option_restore_all: - ;---- Read option serial from EEPROM - movlw LOW(eeprom_serial_save) - movwf EEADR - movlw HIGH(eeprom_serial_save) - movf EEADRH - call read_eeprom - movlw LOW(eeprom_opt_serial) - xorwf EEDATA,W - bnz option_restore_bad ; Auto reset if changed. - incf EEADR,F - call read_eeprom - movlw HIGH(eeprom_opt_serial) - xorwf EEDATA,W - bz option_restore_ok ; Auto reset if changed. + ;---- Read option serial from EEPROM + movlw LOW(eeprom_serial_save) + movwf EEADR + movlw HIGH(eeprom_serial_save) + movf EEADRH + call read_eeprom + movlw LOW(eeprom_opt_serial) + xorwf EEDATA,W + bnz option_restore_bad ; Auto reset if changed. + incf EEADR,F + call read_eeprom + movlw HIGH(eeprom_opt_serial) + xorwf EEDATA,W + bz option_restore_ok ; Auto reset if changed. option_restore_bad: - call option_reset_all ; Reset RAM contains - goto option_save_all ; Then save to EEPROM + call option_reset_all ; Reset RAM contains + goto option_save_all ; Then save to EEPROM - ;---- Proper restore + ;---- Proper restore option_restore_ok: - movlw LOW(option_table_begin) - movwf FSR0L - movlw HIGH(option_table_begin) - movwf FSR0H + movlw LOW(option_table_begin) + movwf FSR0L + movlw HIGH(option_table_begin) + movwf FSR0H option_restore_all_1: - movlw LOW(option_table_end) + movlw LOW(option_table_end) cpfseq FSR0L - bra option_restore_all_2 ; Not yet done... + bra option_restore_all_2 ; Not yet done... movlw HIGH(option_table_end) cpfseq FSR0H - bra option_restore_all_2 ; Not yet done... - return ; All done. + bra option_restore_all_2 ; Not yet done... + return ; All done. option_restore_all_2: - rcall option_restore ; Restore one option. - bra option_restore_all_1 ; and loop. + rcall option_restore ; Restore one option. + bra option_restore_all_1 ; and loop. option_restore: - rcall option_read - incf opt_eeprom,W ; Should we save it ? - btfsc STATUS,Z ; eeprom address is FFh ? - return ; YES: nothing to do. + rcall option_read + incf opt_eeprom,W ; Should we save it ? + btfsc STATUS,Z ; EEPROM address is FFh ? + return ; YES: nothing to do. - movf opt_eeprom,W ; Compute backup address in EEPROM - addlw LOW(eeprom_opt_backup) ; Add offset - movwf EEADR - movlw HIGH(eeprom_opt_backup) - btfsc STATUS,C ; >256 - addlw .1 ; Yes: +1 - movwf EEADRH + movf opt_eeprom,W ; Compute backup address in EEPROM + addlw LOW(eeprom_opt_backup) ; Add offset + movwf EEADR + movlw HIGH(eeprom_opt_backup) + btfsc STATUS,C ; >256 + addlw .1 ; Yes: +1 + movwf EEADRH - movf opt_type,W ; Option type is string ? - xorlw 2 - bz option_restore_string + movf opt_type,W ; Option type is string ? + xorlw 2 + bz option_restore_string - ; Read one byte from eeprom - call read_eeprom - movff EEDATA, INDF1 ; And restore option register. - return + ; Read one byte from EEPROM + call read_eeprom + movff EEDATA, INDF1 ; And restore option register. + return option_restore_string: - call read_eeprom ; Read one byte, and - movff EEDATA,POSTINC1 ; restore it - infsnz EEADR,F - incf EEADRH,F - - decfsz opt_max ; Decrement string length - bra option_restore_string ; And loop while not finished - return + call read_eeprom ; Read one byte, and + movff EEDATA,POSTINC1 ; restore it + infsnz EEADR,F + incf EEADRH,F + + decfsz opt_max ; Decrement string length + bra option_restore_string ; And loop while not finished + return ;============================================================================= ; Increment an option, based on type, and boundary. @@ -387,120 +375,117 @@ ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 option_inc: - ; Read type, default and register from table - rcall option_read - - ; Switch on type - movf opt_type,W - bz option_inc_uint8 - dcfsnz WREG - bra option_inc_enum8 - dcfsnz WREG - bra option_inc_string + ; Read type, default and register from table + rcall option_read + + ; Switch on type + movf opt_type,W + bz option_inc_uint8 + dcfsnz WREG + bra option_inc_enum8 + dcfsnz WREG + bra option_inc_string - -option_inc_uint8: ; Defaults type too... - movf INDF1,W - addwf opt_inc,W - cpfslt opt_max - bra option_inc_1 - movf opt_min,W +option_inc_uint8: ; Defaults type too... + movf INDF1,W + addwf opt_inc,W + cpfslt opt_max + bra option_inc_1 + movf opt_min,W option_inc_1: - movwf INDF1 - - ; NEW FROM HERE... ## voting logic (allow sensors for pSCR) + movwf INDF1 + ; Now some rather crude hack into this routine to unify CCR & pSCR mode setting: - movlw .25 ; eeprom address of option oCCRMode - cpfseq opt_eeprom ; skip next line if we deal with this option right now - bra option_inc_2 - btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode - bcf opt_ccr_mode,1 ; in pSCR mode, opt_ccr_mode may only be 0 or 1 + movlw .25 ; EEPROM address of option oCCRMode + cpfseq opt_eeprom ; skip next line if we deal with this option right now + bra option_inc_2 + btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode + bcf opt_ccr_mode,1 ; in pSCR mode, opt_ccr_mode may only be 0 or 1 option_inc_2: -; ...UNTILL HERE ; Now some rather crude hack into this routine to make CCR Calibration more convenient: - movlw .149 ; eeprom address of option CalGasO2 - cpfseq opt_eeprom ; skip next line if we deal with this option right now - return - - btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode - return - movlw .26 - cpfseq INDF1 ; skip next line if current option value is =26 - return - movlw .95 ; current option value =26, advance it to 95 - movwf INDF1 + movlw .149 ; EEPROM address of option CalGasO2 + cpfseq opt_eeprom ; skip next line if we deal with this option right now return -option_inc_enum8: ; Always +1 - incf INDF1,W - cpfsgt opt_max - clrf WREG - movwf INDF1 - return + btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode + return + movlw .26 + cpfseq INDF1 ; skip next line if current option value is = 26 + return + movlw .95 ; current option value =26, advance it to 95 + movwf INDF1 + return + -option_inc_string: ; No edition yet... - return +option_inc_enum8: ; Always +1 + incf INDF1,W + cpfsgt opt_max + clrf WREG + movwf INDF1 + return + + +option_inc_string: ; No editing yet... + return ;============================================================================= ; Strcat option into FSR2 buffer. option_draw: - ; Read type, default and register from table - rcall option_read - - ; Switch on type - movf opt_type,W - bz option_draw_uint8 - dcfsnz WREG - bra option_draw_enum8 - dcfsnz WREG - bra option_draw_string - return ; Unknown: return... + ; Read type, default and register from table + rcall option_read + + ; Switch on type + movf opt_type,W + bz option_draw_uint8 + dcfsnz WREG + bra option_draw_enum8 + dcfsnz WREG + bra option_draw_string + return ; Unknown: return... option_draw_uint8: - movff INDF1,lo ; Draw value. - bsf leftbind - output_8 - bcf leftbind - clrf INDF2 ; Make sure to close string... + movff INDF1,lo ; Draw value. + bsf leftbind + output_8 + bcf leftbind + clrf INDF2 ; Make sure to close string... - movf opt_unit+0,W ; Is there a unit to append ? - iorwf opt_unit+1,W - rcall option_draw_unit + movf opt_unit+0,W ; Is there a unit to append ? + iorwf opt_unit+1,W + rcall option_draw_unit - movf opt_default,W ; Default value - cpfseq lo ; Current value - bra option_draw_uint8_2 ; Not default, add * - return ; Default, Done. + movf opt_default,W ; Default value + cpfseq lo ; Current value + bra option_draw_uint8_2 ; Not default, add * + return ; Default, Done. option_draw_uint8_2: - PUTC "*" - return ; Done. + PUTC "*" + return ; Done. option_draw_unit: - movff opt_unit+0,FSR1L - movff opt_unit+1,FSR1H - goto strcat_text - + movff opt_unit+0,FSR1L + movff opt_unit+1,FSR1H + goto strcat_text ;---- Draw an enumerated value (set of translated strings) option_draw_enum8: - movf INDF1,W ; Get current value. - cpfsgt opt_max ; Bound value - clrf WREG - addwf WREG ; *= 2 - addwf opt_inc,W ; Base text + 2 * value - movwf FSR1L - movlw 0 - addwfc opt_min,W ; Propagate carry - movwf FSR1H ; Into FSR1 - - goto strcat_text + movf INDF1,W ; Get current value. + cpfsgt opt_max ; Bound value + clrf WREG + addwf WREG ; *= 2 + addwf opt_inc,W ; Base text + 2 * value + movwf FSR1L + movlw .0 + addwfc opt_min,W ; Propagate carry + movwf FSR1H ; Into FSR1 + goto strcat_text option_draw_string: - movff POSTINC1,POSTINC2 - decfsz opt_max - bra option_draw_string - return + movff POSTINC1,POSTINC2 + decfsz opt_max + bra option_draw_string + return - END + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/p2_deco.c --- a/src/p2_deco.c Sun Feb 25 18:25:38 2018 +0100 +++ b/src/p2_deco.c Mon Feb 26 16:40:28 2018 +0100 @@ -1,10 +1,10 @@ -// ************************************************************** -// p2_deco.c REFACTORED VERSION V2.95a2 +// *************************************************************************** +// p2_deco.c REFACTORED VERSION V2.97b // // Created on: 12.05.2009 // Author: heinrichs weikamp, contributions by Ralph Lembcke and others // -// ************************************************************** +// *************************************************************************** ////////////////////////////////////////////////////////////////////////////// // OSTC - diving computer code @@ -35,7 +35,7 @@ // 07/xx/08 v102a: debug of bottom time routine // 09/xx/08 v102d: Gradient Factor Model implementation // 10/10/08 v104: renamed to build v103 for v118 stable -// 10/14/08 v104: integration of char_I_depth_last_deco for Gradient Model +// 10/14/08 v104: integration of char_I_depth_last_deco for Gradient Model // 03/31/09 v107: integration of FONT Incon24 // 05/23/10 v109: 5 gas changes & 1 min timer // 07/13/10 v110: cns vault added @@ -90,9 +90,9 @@ // ** V A R I A B L E S D E F I N I T I O N S ** // *********************************************** -#include "p2_definitions.h" -#define TEST_MAIN -#include "shared_definitions.h" +#include "p2_definitions.h" +#define TEST_MAIN +#include "shared_definitions.h" // ambient pressure at different mountain heights @@ -102,22 +102,23 @@ // ambient pressure in aircraft cabin during flying - worst case according to Buhlmann #define P_ambient_fly 0.600 // [bar], 0.600 bar is the value used by Buhlmann for his flying-after-diving calculations - // 0.735 bar is a typical cabin pressure for nowadays commercial jet aircrafts + // 0.735 bar is a typical cabin pressure for nowadays commercial jet aircrafts // ----- // 0.135 bar safety margin // constants and factors -#define ppWater 0.0627 // water vapor partial pressure in the lungs -#define METER_TO_BAR 0.09985 // conversion factor -#define BAR_TO_METER 10.0150 // conversion factor (1.0/METER_TO_BAR) -#define SURFACE_DESAT_FACTOR 0.7042 // surface desaturation safety factor +#define ppWater 0.0627 // water vapor partial pressure in the lungs +#define METER_TO_BAR 0.09985 // conversion factor +#define BAR_TO_METER 10.0150 // conversion factor (1.0/METER_TO_BAR) +#define SURFACE_DESAT_FACTOR 0.7042 // surface desaturation safety factor #define HYST 1.0E-06 // threshold for tissue graphics on-gassing / off-gassing visualization // thresholds -#define GF_warning_threshold 100 // threshold for GF warning (attention threshold is current GF_high) -#define CNS_warning_threshold 100 // threshold for CNS warning -#define CNS_prewarning_threshold 70 // threshold for CNS attention -#define ppO2_prewarn_threshold 120 // threshold for ppO2 attention (master warnings come through options_table.asm) +#define GF_WARNING_THRESHOLD 100 // threshold for GF warning (attention threshold is current GF_high) +#define CNS_WARNING_THRESHOLD 100 // threshold for CNS warning +#define CNS_ATTENTION_THRESHOLD 70 // threshold for CNS attention +#define ppO2_ATTENTION_THRESHOLD 120 // threshold for ppO2 attention (thresholds for warnings come by options_table.asm) +#define ppO2_GAP_TO_SETPOINT 10 // gap between setpoint and max. ppO2 of the pure diluent [cbar] #define GAS_NEEDS_ATTENTION_THRESHOLD 0.70 // threshold for gas needs attention // deco engine states and modes - char_O_deco_status @@ -125,7 +126,7 @@ #define DECO_STATUS_START 0x00 #define DECO_STATUS_FINISHED 0x00 #define DECO_STATUS_STOPS 0x01 -#define DECO_STATUS_ASCENT 0x02 +#define DECO_STATUS_RESULTS 0x02 #define DECO_STATUS_INIT 0x03 #define DECO_MODE_MASK 0x0C @@ -134,23 +135,26 @@ #define DECO_MODE_PSCR 0x08 #define DECO_PLAN_ALTERNATE 0x10 -#define DECO_CNS_CALCULATE 0x20 -#define DECO_VOLUME_CALCULATE 0x40 -#define DECO_ASCENT_DELAYED 0x80 +#define DECO_CNS_CALCULATE 0x20 +#define DECO_VOLUME_CALCULATE 0x40 +#define DECO_ASCENT_DELAYED 0x80 // deco engine states and modes - char_O_main_status //#define DECO_MODE_MASK 0x0C //#define DECO_MODE_LOOP 0x04 //#define DECO_MODE_CCR 0x04 // to be used with == operator in combination with DECO_MODE_MASK only! //#define DECO_MODE_PSCR 0x08 -#define DECO_GASCHANGE_OVRD 0x10 +#define DECO_GASCHANGE_OVRD 0x10 #define DECO_BOTTOM_CALCULATE 0x40 +// deco engine states and modes - tissue_increment +#define TIME_MASK 0x7F // (127 decimal, bits 0-6) +#define TISSUE_FLAG 0x80 // (128 decimal, bit 7 ) // deco engine warnings #define DECO_WARNING_IBCD 0x01 #define DECO_WARNING_IBCD_lock 0x02 -#define DECO_WARNING_MBUBBLES 0x04 +#define DECO_WARNING_MBUBBLES 0x04 #define DECO_WARNING_MBUBBLES_lock 0x08 #define DECO_WARNING_OUTSIDE 0x10 #define DECO_WARNING_OUTSIDE_lock 0x20 @@ -162,7 +166,7 @@ #define INT_FLAG_ZERO 0x0800 #define INT_FLAG_LOW 0x1000 #define INT_FLAG_HIGH 0x2000 -#define INT_FLAG_PREWARNING 0x4000 +#define INT_FLAG_ATTENTION 0x4000 #define INT_FLAG_WARNING 0x8000 @@ -175,28 +179,26 @@ static void calc_hauptroutine_data_input(void); static void calc_hauptroutine_update_tissues(void); static void calc_hauptroutine_calc_deco(void); -static void calc_tissue(void); -static void calc_limit(void); -static void calc_nullzeit(void); +static void calc_alveolar_pressures(void); +static void calc_tissues(void); +static void calc_NDL_time(void); static void calc_ascenttime(void); -static void calc_dive_interval(void); -static void calc_gradient_factor(void); -static void calc_wo_deco_step_1_min(void); +static void calc_CNS_increment(void); static void calc_desaturation_time(void); - -static void sim_extra_time(void); -static void sim_ascent_to_first_stop(void); -static void sim_limit(PARAMETER float GF_current); - -static void update_startvalues(void); -static void gas_switch_set(void); -static void compute_CNS_for_display(void); - +static void calc_ascent_to_first_stop(void); +static void calc_limit(PARAMETER float GF_current); +static void calc_interval(PARAMETER unsigned char time_increment); + +static void gas_find_current(void); +static void gas_set_ratios(void); +static void convert_CNS_for_display(void); +static void convert_sim_CNS_for_display(void); +static void publish_deco_table(void); static void clear_deco_table(void); static void clear_tissue(void); +static unsigned char calc_nextdecodepth(void); static unsigned char gas_find_better(void); -static unsigned char calc_nextdecodepth(void); static unsigned char update_deco_table(PARAMETER unsigned char time_increment); @@ -217,28 +219,28 @@ static float low_depth_alt; // Depth of deepest stop in alternative plan static float float_ascent_speed; // ascent speed from options_table (1.0 .. 10.0 m/min) -static float float_saturation_multiplier; // safety factor for on-gassing rates -static float float_desaturation_multiplier; // safety factor for off-gassing rates -static float float_deco_distance; // additional depth below stop depth for tissue, CNS and gas volume calculation - - -// real context: what we are doing now. - -static float calc_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model -static float CNS_fraction; // current CNS (1.00 = 100%) - -static unsigned short deco_tissue_vector; // 32 bit vector to memories all tissues that are in decompression -static unsigned short IBCD_tissue_vector; // 32 bit vector to memories all tissues that experience IBCD - -// simulation context: used to predict ascent. - -static float sim_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model -static float CNS_sim_norm_fraction; // CNS at end of dive in normal plan -static float CNS_sim_alt_fraction; // CNS at end of dive in alternative plan - -static unsigned char temp_depth_limit; // depth of next stop in meters, used in deco calculations -static unsigned char sim_lead_tissue_no; // Leading compartment number +static float float_deco_distance; // additional depth below stop depth for tissue, CNS and gas volume calculation +static float float_saturation_multiplier; // safety factor for on-gassing rates +static float float_desaturation_multiplier; // safety factor for off-gassing rates + +// real context: what we are doing now + +static float ceiling; // minimum tolerated relative pressure (i.e. without surface pressue) +static float CNS_fraction; // current CNS (1.00 = 100%) + +static unsigned short deco_tissue_vector; // 16 bit vector to memories all tissues that are in decompression +static unsigned short IBCD_tissue_vector; // 16 bit vector to memories all tissues that experience IBCD + +// simulation context: used to predict ascent + +static float sim_ceiling; // minimum tolerated relative pressure (i.e. without surface pressue) +static float sim_CNS_fraction; // CNS increase during predicted ascent, 0.01 = 1% + +static unsigned int int_sim_CNS_fraction; // CNS increase during predicted ascent, in % + +static unsigned char sim_depth_limit; // depth of next stop in meters, used in deco calculations static unsigned char split_N2_He[NUM_COMP]; // used for calculating the desaturation time +static unsigned char NDL_lead_tissue; // used to cache tissue to start with calculating NDL // stops table @@ -252,18 +254,27 @@ static float desat_factor; // used to cache a pre-computed factor static float var_ht; // buffer for a half-time factor -static float pres_target; // target pressure for a compartment +static float pres_target; // target pressure for a compartment static float pres_actual; // current pressure of the compartment -static unsigned short short_time; // time it takes for the compartment to reach the target pressure +static unsigned int int_time; // time it takes for the compartment to reach the target pressure + // transfer variables between gas_volumes() and gas_volumes_helper() + static float float_depth; // depth of the stop or half-way point static float float_time; // duration of the stop or ascent phase static float volume; // computed volume of gas static unsigned char usage; // gas usage in l/min -// 44 byte free space left in this bank +// auxiliary variables for data buffering + +static float N2_equilibrium; // used for N2 tissue graphics scaling +static float temp_tissue; // auxiliary variable to buffer tissue pressures +static float float_pSCR_factor; // pre-computed factor for pSCR ppO2 drop calculation + + +// 35 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char) //---- Bank 6 parameters ----------------------------------------------------- @@ -275,74 +286,73 @@ static unsigned char ci; // used as index to the Buhlmann tables static unsigned char twosectimer = 0; // used for timing the tissue updating -static unsigned char tissue_increment; // Selector for real/simulated tissues and time increment +static unsigned char tissue_increment; // selector for real/simulated tissues and time increment // environmental and gas data -static float pres_respiration; // current depth in absolute pressure -static float pres_surface; // absolute pressure at the surface -static float temp_deco; // simulated current depth in abs.pressure, used for deco calculations +static float pres_surface; // absolute pressure at the surface static unsigned char bottom_depth; // bottom depth in meters, used by CNS and gas needs calculation -static float O2_ratio; // real breathed gas oxygen ratio -static float N2_ratio; // real breathed gas nitrogen ratio -static float He_ratio; // real breathed gas helium ratio - -static float calc_O2_ratio; // simulated breathed gas oxygen ratio -static float calc_N2_ratio; // simulated breathed gas nitrogen ratio -static float calc_He_ratio; // simulated breathed gas helium ratio +static float pres_respiration; // current depth in absolute pressure +static float O2_ratio; // real breathed gas oxygen ratio +static float N2_ratio; // real breathed gas nitrogen ratio +static float He_ratio; // real breathed gas helium ratio +static float pSCR_drop; // real ppO2 drop in pSCR loop + +static float sim_pres_respiration; // simulated current depth in abs.pressure, used for deco calculations +static float sim_O2_ratio; // simulated breathed gas oxygen ratio +static float sim_N2_ratio; // simulated breathed gas nitrogen ratio +static float sim_He_ratio; // simulated breathed gas helium ratio +static float sim_pSCR_drop; // simulated ppO2 drop in pSCR loop static float O2_ppO2; // ppO2 - calculated for pure oxygen at current depth +static float OC_ppO2; // ppO2 - calculated for breathed in OC mode static float pSCR_ppO2; // ppO2 - calculated for breathed from pSCR loop -static float pure_ppO2; // ppO2 - calculated for breathed in OC mode - -static unsigned char char_actual_ppO2; // ppO2 - assumed to be breathed, as integer 100 = 1.00 bar - -static float breathed_ppO2; // partial pressure of breathed oxygen -static float ppN2; // partial pressure of breathed nitrogen -static float ppHe; // partial pressure of breathed helium + +static float ppO2; // partial pressure of breathed oxygen +static float ppN2; // partial pressure of breathed nitrogen +static float ppHe; // partial pressure of breathed helium + + +// Result values from calculation functions + +static float CNS_fraction_inc; // increment of CNS load, 0.01 = 1% + +static unsigned char char_ppO2; // partial pressure of breathed oxygen, as integer 100 = 1.00 bar +static unsigned char NDL_time; // time in minutes until reaching NDL +static unsigned int ascent_time; // time in minutes needed for the ascent // Buhlmann model parameters -static float var_N2_a; // Buhlmann a, for current N2 tissue -static float var_N2_b; // Buhlmann b, for current N2 tissue -static float var_He_a; // Buhlmann a, for current He tissue -static float var_He_b; // Buhlmann b, for current He tissue -static float var_N2_e; // exposition, for current N2 tissue -static float var_He_e; // exposition, for current He tissue -static float var_N2_ht; // half-time for current N2 tissue -static float var_He_ht; // half-time for current N2 tissue - - -// gas switch history +static float var_N2_a; // Buhlmann a, for current N2 tissue +static float var_N2_b; // Buhlmann b, for current N2 tissue +static float var_He_a; // Buhlmann a, for current He tissue +static float var_He_b; // Buhlmann b, for current He tissue +static float var_N2_e; // exposition, for current N2 tissue +static float var_He_e; // exposition, for current He tissue +static float var_N2_ht; // half-time for current N2 tissue +static float var_He_ht; // half-time for current N2 tissue + + +// Gas switch history static unsigned char sim_gas_first_used; // Number of first used gas, for bottom segment -static unsigned char sim_gas_last_used; // number of last used gas -static unsigned char sim_gas_last_depth; // change depth of last used gas - - -// vault to back-up & restore tissue data +static unsigned char sim_gas_last_used; // number of last used gas +static unsigned char sim_gas_last_depth; // change depth of last used gas + + +// Vault to back-up & restore tissue data static float pres_tissue_N2_vault[NUM_COMP]; // stores the nitrogen tissue pressures static float pres_tissue_He_vault[NUM_COMP]; // stores the helium tissue pressures -static float low_depth_norm_vault; // stores a parameter of the GF model for normal plan -static float low_depth_alt_vault; // stores a parameter of the GF model for alternative plan static float cns_vault_float; // stores current CNS (float representation) - -static unsigned int cns_vault_int; // stores current CNS (integer representation) static unsigned char deco_warnings_vault; // stores warnings status -// auxiliary variables for local data buffering - -static float N2_equilibrium; // used for N2 tissue graphics scaling -static float temp_tissue; // auxiliary variable to buffer tissue pressures - - -// 6 byte free space left in this bank +// 8 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char) //---- Bank 7 parameters ----------------------------------------------------- @@ -354,32 +364,36 @@ float pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes float pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes + float sim_pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes float sim_pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes +// bank is full! + //---- Bank 8 parameters ----------------------------------------------------- #ifndef UNIX # pragma udata overlay bank8=0x800 -static char md_pi_subst[256]; // Overlay C-code data stack here, too. +static char md_pi_subst[256]; // Overlay C-code data stack here, too. # define C_STACK md_pi_subst #endif + // Back to bank6 for further tmp data +// Do not delete this assignment, it is needed by the compiler/linker. #ifndef UNIX # pragma udata bank6 #endif + ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -///////////////////////////// THE LOOKUP TABLES ////////////////////////////// +//////////////// THE LOOKUP TABLES //////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -// -// End of PROM code is 17F00, So push tables on PROM top... -// + #ifndef UNIX # pragma romdata Buhlmann_tables = 0x1DD00 // Needs to be in UPPER bank. #endif @@ -432,19 +446,19 @@ 5.75958E-03, 1.51848E-02, 2.88395E-03, 7.62144E-03, 1.84669E-03, 4.88315E-03, - 1.24813E-03, 3.29997E-03, - 8.55371E-04, 2.26041E-03, - 6.03079E-04, 1.59437E-03, - 4.25414E-04, 1.12479E-03, - 3.00019E-04, 7.93395E-04, - 2.11949E-04, 5.60641E-04, - 1.58240E-04, 4.18555E-04, - 1.23548E-04, 3.26795E-04, - 9.66686E-05, 2.55722E-04, - 7.57509E-05, 2.00387E-04, - 5.92416E-05, 1.56716E-04, - 4.63943E-05, 1.22734E-04, - 3.63850E-05, 9.62538E-05 + 1.24813E-03, 3.29997E-03, + 8.55371E-04, 2.26041E-03, + 6.03079E-04, 1.59437E-03, + 4.25414E-04, 1.12479E-03, + 3.00019E-04, 7.93395E-04, + 2.11949E-04, 5.60641E-04, + 1.58240E-04, 4.18555E-04, + 1.23548E-04, 3.26795E-04, + 9.66686E-05, 2.55722E-04, + 7.57509E-05, 2.00387E-04, + 5.92416E-05, 1.56716E-04, + 4.63943E-05, 1.22734E-04, + 3.63850E-05, 9.62538E-05 //------------------------------------- }; @@ -452,22 +466,22 @@ // Integration constant for 1 minute, // Ie. 1- 2^(-1/HT) //----- N2 --------- e 1min He -------- - 1.59104E-01, 3.68109E-01, - 8.29960E-02, 2.05084E-01, - 5.39424E-02, 1.36579E-01, - 3.67742E-02, 9.44046E-02, - 2.53454E-02, 6.56359E-02, - 1.79351E-02, 4.67416E-02, - 1.26840E-02, 3.31991E-02, - 8.96152E-03, 2.35301E-02, - 6.33897E-03, 1.66832E-02, - 4.73633E-03, 1.24808E-02, - 3.69981E-03, 9.75753E-03, - 2.89600E-03, 7.64329E-03, - 2.27003E-03, 5.99417E-03, - 1.77572E-03, 4.69082E-03, - 1.39089E-03, 3.67548E-03, - 1.09097E-03, 2.88359E-03 + 1.59104E-01, 3.68109E-01, + 8.29960E-02, 2.05084E-01, + 5.39424E-02, 1.36579E-01, + 3.67742E-02, 9.44046E-02, + 2.53454E-02, 6.56359E-02, + 1.79351E-02, 4.67416E-02, + 1.26840E-02, 3.31991E-02, + 8.96152E-03, 2.35301E-02, + 6.33897E-03, 1.66832E-02, + 4.73633E-03, 1.24808E-02, + 3.69981E-03, 9.75753E-03, + 2.89600E-03, 7.64329E-03, + 2.27003E-03, 5.99417E-03, + 1.77572E-03, 4.69082E-03, + 1.39089E-03, 3.67548E-03, + 1.09097E-03, 2.88359E-03 //------------------------------------- }; @@ -475,28 +489,28 @@ // The 10 min Value in float notation: // result of 1 - 2^(-10/ht) //---- N2 -------------- He ----------- - 8.23223E-01, 9.89851E-01, - 5.79552E-01, 8.99258E-01, - 4.25651E-01, 7.69737E-01, - 3.12487E-01, 6.29027E-01, - 2.26416E-01, 4.92821E-01, - 1.65547E-01, 3.80407E-01, - 1.19840E-01, 2.86538E-01, - 8.60863E-02, 2.11886E-01, - 6.16117E-02, 1.54849E-01, - 4.63665E-02, 1.18026E-01, - 3.63881E-02, 9.34005E-02, - 2.85855E-02, 7.38569E-02, - 2.24698E-02, 5.83504E-02, - 1.76160E-02, 4.59303E-02, - 1.38222E-02, 3.61528E-02, - 1.08563E-02, 2.84646E-02 + 8.23223E-01, 9.89851E-01, + 5.79552E-01, 8.99258E-01, + 4.25651E-01, 7.69737E-01, + 3.12487E-01, 6.29027E-01, + 2.26416E-01, 4.92821E-01, + 1.65547E-01, 3.80407E-01, + 1.19840E-01, 2.86538E-01, + 8.60863E-02, 2.11886E-01, + 6.16117E-02, 1.54849E-01, + 4.63665E-02, 1.18026E-01, + 3.63881E-02, 9.34005E-02, + 2.85855E-02, 7.38569E-02, + 2.24698E-02, 5.83504E-02, + 1.76160E-02, 4.59303E-02, + 1.38222E-02, 3.61528E-02, + 1.08563E-02, 2.84646E-02 //------------------------------------- }; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -////////////////////////////// THE SUBROUTINES /////////////////////////////// +//////////////// THE SUBROUTINES //////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // @@ -508,7 +522,7 @@ ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/////////////////////// U T I L I T I E S ///////////////////////////////// +//////////////// U T I L I T I E S //////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -676,12 +690,154 @@ } ////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//////////////// THE JUMP-IN CODE for the asm code //////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_hauptroutine +// +// called from: divemode.asm +// +// Called every second during diving, +// updates tissues on every second invocation. +// +// Every few seconds (or slower when TTS > 16): +// - Updates deco table (char_O_deco_time/depth) with new values, +// - updates ascent time, and +// - sets status to zero (so we can check there is new results). +// +void deco_calc_hauptroutine(void) +{ + RESET_C_STACK + calc_hauptroutine(); +} + +////////////////////////////////////////////////////////////////////////////// +// deco_clear_tissue +// +// called from: start.asm +// menu_tree.asm +// simulator.asm +// +// Sets all tissues to equilibrium with Air at ambient pressure, +// resets all CNS values, any warnings and resets all model output. +// +void deco_clear_tissue(void) +{ + RESET_C_STACK + clear_tissue(); +} + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_dive_interval +// +// called from: simulator.asm +// +// Updates tissues and CNS value for char_I_dive_interval minutes on Air +// at ambient pressure and calculates resulting GF factor and ceiling for +// a GF-high of 100% (ceiling and GF factor not used by simulator.asm) +// +void deco_calc_dive_interval(void) +{ + RESET_C_STACK + calc_interval(char_I_dive_interval); +} + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_dive_interval_1min +// +// called from: start.asm +// sleepmode.asm +// surfmode.asm +// menu_tree.asm +// ghostwriter.asm +// +// Updates tissues and CNS value for 1 minute on Air at ambient pressure and +// calculates resulting GF factor and ceiling for a GF-high of 100% (ceiling +// is not used by *.asm files). +// +void deco_calc_dive_interval_1min(void) +{ + RESET_C_STACK + calc_interval(1); +} + + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_dive_interval_1min +// +// called from: sleepmode.asm +// +// Updates tissues and CNS value for 10 minutes on Air at ambient pressure and +// calculates resulting GF factor and ceiling for a GF-high of 100% (ceiling +// is not used by sleepmode.asm). +// +void deco_calc_dive_interval_10min(void) +{ + RESET_C_STACK + calc_interval(10); +} + + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_desaturation_time +// +// called from: start.asm +// surfmode.asm +// menu_tree.asm +// ghostwriter.asm +// +// Computes desaturation and no-fly times. +// +void deco_calc_desaturation_time(void) +{ + RESET_C_STACK + calc_desaturation_time(); +} + +////////////////////////////////////////////////////////////////////////////// +// deco_push_tissues_to_vault +// +// called from: simulator.asm +// +// Makes a backup of the state of the real tissues and the deco engine. +// +void deco_push_tissues_to_vault(void) +{ + RESET_C_STACK + push_tissues_to_vault(); +} + +////////////////////////////////////////////////////////////////////////////// +// deco_pull_tissues_from_vault +// +// called from: simulator.asm +// ghostwriter.asm +// +// Restores the state of the real tissues and the deco engine from the backup. +// +void deco_pull_tissues_from_vault(void) +{ + RESET_C_STACK + pull_tissues_from_vault(); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//////////////// THE FUNCTIONS //////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////// // calc_nextdecodepth // // new in v.102 // // INPUT, changing during dive: -// temp_deco : current depth in absolute pressure +// sim_pres_respiration : current depth in absolute pressure // // INPUT, fixed during dive: // pres_surface @@ -695,69 +851,66 @@ // low_depth_norm/_alt : used for GF model // // OUTPUT -// temp_depth_limit : depth of next stop in meters (if RETURN == true ) -// depth we can ascent to without stop (if RETURN == false) +// sim_depth_limit : depth of next stop in meters (if RETURN == true ) +// depth we can ascent to without stop (if RETURN == false) // // RETURN TRUE if a stop is needed. // static unsigned char calc_nextdecodepth(void) { - overlay unsigned char need_stop; - + overlay unsigned char need_stop; + // compute current depth in meters - overlay float depth = (temp_deco - pres_surface) * BAR_TO_METER; - - // compute depth in meters after 1 minute of ascent at float_ascent_speed (5..10 m/min) - overlay float min_depth = (depth > float_ascent_speed) ? (depth - float_ascent_speed) : 0.0; - - - // allow for 200mbar of weather dependent surface pressure change - assert( depth >= -0.2 ); + overlay float depth = (sim_pres_respiration - pres_surface) * BAR_TO_METER; + + // compute depth in meters after 1 minute of ascent at float_ascent_speed (5..10 m/min) + overlay float min_depth = (depth > float_ascent_speed) ? (depth - float_ascent_speed) : 0.0; + + + // allow for 200mbar of weather dependent surface pressure change + assert( depth >= -0.2 ); //---- check if a stop is needed for deco reasons ---------------------------- - - // switch on deco model - if( char_I_deco_model != 0 ) - { + + // switch on deco model + if( char_I_deco_model != 0 ) + { //---- ZH-L16 + GRADIENT FACTOR Model ------------------------------------ - + overlay float locked_GF_step; overlay float low_depth; - overlay float pres_gradient; - - overlay unsigned char first_stop = 0; - - - // calculate minimum depth we can ascent to in absolute pressure - sim_limit( GF_low ); - - // ...and convert the depth into relative pressure - pres_gradient = sim_lead_tissue_limit - pres_surface; + overlay float limit_depth; + + overlay unsigned char first_stop = 0; + + + // calculate minimum depth we can ascent to in bar relative pressure + calc_limit(GF_low); // check if we can surface directly - if( pres_gradient <= 0.0 ) + if( sim_ceiling <= 0.0 ) { min_depth = 0.0; // set minimum depth to 0 meters = surface goto no_deco_stop; // done. } // convert minimum depth we can ascent to from relative pressure to depth in meters - pres_gradient *= BAR_TO_METER; + limit_depth = sim_ceiling * BAR_TO_METER; // recall low_depth dependent on current plan low_depth = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? low_depth_alt : low_depth_norm; - // Store the deepest point needing a deco stop as the LOW reference for GF. - // NOTE: following stops will be validated using this LOW-HIGH GF scale, - // so if we want to keep coherency, we should not validate this stop - // yet, but apply the search to it, as for all the following stops afterward. - if( pres_gradient > low_depth ) - { + // Store the deepest point needing a deco stop as the LOW reference for GF. + // NOTE: following stops will be validated using this LOW-HIGH GF scale, + // so if we want to keep coherency, we should not validate this stop + // yet, but apply the search to it, as for all the following stops afterward. + if( limit_depth > low_depth ) + { // update GF parameters - low_depth = pres_gradient; - locked_GF_step = GF_delta / low_depth; - + low_depth = limit_depth; + locked_GF_step = GF_delta / low_depth; + // store updated GF parameters dependent on current plan if( char_O_deco_status & DECO_PLAN_ALTERNATE ) { @@ -769,7 +922,7 @@ low_depth_norm = low_depth; locked_GF_step_norm = locked_GF_step; } - } + } else { // recall locked_GF_step dependent on current plan @@ -777,159 +930,149 @@ } // invalidate this stop if we can ascent for 1 minute without going above minimum required deco depth - if( pres_gradient < min_depth ) goto no_deco_stop; - - + if( limit_depth < min_depth ) goto no_deco_stop; + + // if program execution passes here, we need a deco stop - - // Round to multiple of 3 meters - first_stop = 3 * (unsigned char)(0.9995 + pres_gradient * 0.333333); + + // Round to multiple of 3 meters + first_stop = 3 * (unsigned char)(0.9995 + limit_depth * 0.333333); // check a constraint - assert( first_stop < 128 ); - - // apply correction for the shallowest stop, use char_I_depth_last_deco (3..6 m) instead - if( first_stop == 3 ) first_stop = char_I_depth_last_deco; - - // We have a stop candidate. - // But maybe ascending to the next stop will diminish the constraint, - // because the GF might decrease more than the pressure gradient... - while(first_stop > 0) - { + assert( first_stop < 128 ); + + // apply correction for the shallowest stop, use char_I_depth_last_deco (3..6 m) instead + if( first_stop == 3 ) first_stop = char_I_depth_last_deco; + + // We have a stop candidate. + // But maybe ascending to the next stop will diminish the constraint, + // because the GF might decrease more than the pressure gradient... + while(first_stop > 0) + { // Next depth - overlay unsigned char next_stop; - - // invalidate this stop if we can ascent one more minute without going above minimum required deco depth - if( first_stop <= (unsigned char)min_depth ) goto no_deco_stop; + overlay unsigned char next_stop; + + // invalidate this stop if we can ascent one more minute without going above minimum required deco depth + if( first_stop <= (unsigned char)min_depth ) goto no_deco_stop; // compute depth of next stop - if ( first_stop <= char_I_depth_last_deco ) next_stop = 0; - else if ( first_stop == 6 ) next_stop = char_I_depth_last_deco; - else next_stop = first_stop - 3; - - // compute total pressure at the new stop candidate - pres_gradient = next_stop * METER_TO_BAR + pres_surface; - - // compute limit for the new stop candidate - if( (low_depth == 0.0) || (next_stop > low_depth) ) sim_limit( GF_low ); - else sim_limit( GF_high - next_stop * locked_GF_step ); - - // check if ascent to the next stop candidate is possible - if( sim_lead_tissue_limit >= pres_gradient ) goto deco_stop_found; // no - ascent to next_stop forbidden - - // else, validate that stop and loop... - first_stop = next_stop; - } + if ( first_stop <= char_I_depth_last_deco ) next_stop = 0; + else if ( first_stop == 6 ) next_stop = char_I_depth_last_deco; + else next_stop = first_stop - 3; + + // compute limit with the GF of the new stop candidate + if( (low_depth == 0.0) || (next_stop > low_depth) ) calc_limit(GF_low); + else calc_limit(GF_high - next_stop * locked_GF_step); + + // check if ascent to the next stop candidate is possible + if( sim_ceiling * BAR_TO_METER >= next_stop ) goto deco_stop_found; // no - ascent to next_stop forbidden + + // else, validate that stop and loop... + first_stop = next_stop; + } no_deco_stop: - need_stop = 0; // set flag for stop needed to 'no' - temp_depth_limit = (unsigned char)min_depth; // report depth we can ascent to without stop + need_stop = 0; // set flag for stop needed to 'no' + sim_depth_limit = (unsigned char)min_depth; // report depth we can ascent to without stop goto done; deco_stop_found: - need_stop = 1; // set flag for stop needed to 'yes' - temp_depth_limit = (unsigned char)first_stop; // stop depth, in meters + need_stop = 1; // set flag for stop needed to 'yes' + sim_depth_limit = (unsigned char)first_stop; // stop depth, in meters done: - ; - } - else - { + ; + } + else + { //---- ZH-L16 model ------------------------------------------------- - - overlay float pres_gradient; - - - // calculate minimum depth we can ascent to in absolute pressure - sim_limit(1.0); - - // ...and convert the depth into relative pressure - pres_gradient = sim_lead_tissue_limit - pres_surface; + + overlay float limit_depth; + + + // calculate minimum depth we can ascent to in bar relative pressure + calc_limit(1.0); // check if we can surface directly - if (pres_gradient >= 0) - { + if (sim_ceiling >= 0) + { // no - set flag for stop needed to 'yes' - need_stop = 1; + need_stop = 1; // convert stop depth in relative pressure to stop index - pres_gradient *= BAR_TO_METER / 3; + limit_depth = sim_ceiling * BAR_TO_METER / 3; // convert stop index to depth in meters, rounded to multiple of 3 meters - temp_depth_limit = 3 * (short) (pres_gradient + 0.99); - - // correct last stop to 4m/5m/6m - if( temp_depth_limit == 3 ) temp_depth_limit = char_I_depth_last_deco; - } - else + sim_depth_limit = 3 * (short)(limit_depth + 0.99); + + // correct last stop to 4m/5m/6m + if( sim_depth_limit == 3 ) sim_depth_limit = char_I_depth_last_deco; + } + else { // yes - set flag for stop needed to 'no' - need_stop = 0; + need_stop = 0; // set depth we can ascent to as 0 = surface - temp_depth_limit = 0; + sim_depth_limit = 0; } - } - - + } + // After the first deco stop, gas changes are only done at deco stops now! - + // check if a stop is found and there is a better gas to switch to if( need_stop && gas_find_better() ) { // set the new calculation ratios for N2, He and O2 - gas_switch_set(); + gas_set_ratios(); // prime the deco stop with the gas change time update_deco_table(char_I_gas_change_time); } - return need_stop; + return need_stop; } ////////////////////////////////////////////////////////////////////////////// -// copy_deco_table +// publish_deco_table // // Buffer the stops, once computed, so we can continue to display them // while computing the next set. // -static void copy_deco_table(void) +static void publish_deco_table(void) { - // Copy depth of the first (deepest) stop, because when reversing - // order, it will be hard to find... - char_O_first_deco_depth = internal_deco_depth[0]; - char_O_first_deco_time = internal_deco_time [0]; - - { - overlay unsigned char x, y; - - for(x=0; x 16): -// - updates deco table (char_O_deco_time/depth) with new values. -// - updates ascent time, -// - sets status to zero (so we can check there is new results). -// -void deco_calc_hauptroutine(void) -{ - RESET_C_STACK - calc_hauptroutine(); -} - -////////////////////////////////////////////////////////////////////////////// -// Reset decompression model: -// + Set all tissues to equilibrium with Air at ambient pressure. -// + Reset last stop to 0m -// + Reset all model output. -void deco_clear_tissue(void) -{ - RESET_C_STACK - clear_tissue(); -} - -////////////////////////////////////////////////////////////////////////////// - -void deco_calc_wo_deco_step_1_min(void) -{ - RESET_C_STACK - calc_wo_deco_step_1_min(); - } - -////////////////////////////////////////////////////////////////////////////// - -void deco_calc_desaturation_time(void) -{ - RESET_C_STACK - calc_desaturation_time(); -} - -////////////////////////////////////////////////////////////////////////////// - -void deco_calc_dive_interval(void) -{ - RESET_C_STACK - calc_dive_interval(); -} - -////////////////////////////////////////////////////////////////////////////// -// deco_calc_CNS_decrease_15min -// -// new in v.101 -// -// calculates the half time of 90 minutes in 6 steps of 15 min -// (Used in sleep mode, for low battery mode). -// -// Output: int_O_CNS_fraction -// Uses and Updates: CNS_fraction -// -void deco_calc_CNS_decrease_15min(void) -{ - RESET_C_STACK - - // clock down CNS - CNS_fraction = 0.890899 * CNS_fraction; - - // compute integer copy of CNS value - compute_CNS_for_display(); -} ////////////////////////////////////////////////////////////////////////////// @@ -1038,21 +1103,21 @@ // static void gas_find_current(void) { - assert( 1 <= char_I_current_gas && char_I_current_gas <= 6 ); - - if( char_I_current_gas <= NUM_GAS ) // Gas 1-5 - { - sim_gas_last_used = sim_gas_first_used = char_I_current_gas; - - // If current gas is a deco gas get it's change depth. + assert( 1 <= char_I_current_gas && char_I_current_gas <= 6 ); + + if( char_I_current_gas <= NUM_GAS ) // Gas 1-5 + { + sim_gas_last_used = sim_gas_first_used = char_I_current_gas; + + // If current gas is a deco gas get it's change depth. // Set change depth to 0 if the current gas is the first gas or // a travel/normal gas, i.e. if it can be breathed at "any" depth. - if( char_I_deco_gas_change[sim_gas_last_used-1] ) sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1]; + if( char_I_deco_gas_change[sim_gas_last_used-1] ) sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1]; else sim_gas_last_depth = 0; - } - else + } + else { - sim_gas_last_used = sim_gas_first_used = 0; // Gas 6 (the manually set one) has number 0 here + sim_gas_last_used = sim_gas_first_used = 0; // Gas 6 (the manually set one) has number 0 here sim_gas_last_depth = 0; // handle it as a travel/normal gas } } @@ -1061,9 +1126,9 @@ ////////////////////////////////////////////////////////////////////////////// // Find the deco gas with the shallowest change depth beyond current depth // -// INPUT temp_depth_limit : current depth in meters +// INPUT sim_depth_limit : current depth in meters // char_I_deco_gas_change[] : change depths of the deco gases -// sim_gas_last_depth : change depth of the currently used gas, 0 if on the gas set as FIRST +// sim_gas_last_depth : change depth of the currently used gas, 0 if on the gas set as FIRST // // OUTPUT sim_gas_last_depth : switch depth - only if return value is true // sim_gas_last_used : index of the gas (1..5) - only if return value is true @@ -1075,8 +1140,8 @@ overlay unsigned char switch_depth = 255; overlay unsigned char switch_gas = 0; overlay unsigned char j; - - + + // no automatic gas changes in CCR mode and - as of now - in pSCR mode if( char_O_deco_status & DECO_MODE_LOOP ) return 0; @@ -1091,7 +1156,7 @@ // If yes, skip this gas as it is not to be used yet. // Remark: this check will also skip all disabled gases and the gas set // as 'first' because these have their change depth set to 0. - if( temp_depth_limit > char_I_deco_gas_change[j] ) continue; + if( sim_depth_limit > char_I_deco_gas_change[j] ) continue; // Is the change depth of the gas deeper than the change depth of the // gas we are currently one? @@ -1118,7 +1183,7 @@ sim_gas_last_depth = switch_depth; // report its change depth assert( sim_gas_last_depth < switch_depth ); - + return 1; // signal a better gas was found } else @@ -1130,144 +1195,210 @@ ////////////////////////////////////////////////////////////////////////////// // Set calc_N2/He/O2_ratios by sim_gas_last_used // -// Input: sim_gas_last_used : index of gas to use -// N2_ratio, He_ratio : if gas 0 = the manually set gas is in use +// Input: sim_gas_last_used : index of gas to use +// N2_ratio, He_ratio : if gas = 0 (the manually set gas) +// char_I_deco_O2/He_ratio[] : if gas = 1..5 (the configured gases) // -// Output: calc_N2_ratio, calc_He_ratio, calc_O2ratio +// Output: sim_N2_ratio, sim_He_ratio : ratios of the inert gases +// sim_pSCR_drop : ppO2 drop in pSCR loop // -static void gas_switch_set(void) +static void gas_set_ratios(void) { + overlay float sim_IG_ratio; + assert( 0 <= sim_gas_last_used <= NUM_GAS ); - if( sim_gas_last_used == 0 ) // Gas6 = manually set gas. + + // get gas ratios + if( sim_gas_last_used == 0 ) { - calc_O2_ratio = O2_ratio; - calc_He_ratio = He_ratio; + sim_O2_ratio = O2_ratio; + sim_He_ratio = He_ratio; } else { - calc_O2_ratio = char_I_deco_O2_ratio[sim_gas_last_used-1] * 0.01; - calc_He_ratio = char_I_deco_He_ratio[sim_gas_last_used-1] * 0.01; + sim_O2_ratio = 0.01 * char_I_deco_O2_ratio[sim_gas_last_used-1]; + sim_He_ratio = 0.01 * char_I_deco_He_ratio[sim_gas_last_used-1]; } - calc_N2_ratio = 1.0 - calc_O2_ratio - calc_He_ratio; - - assert( 0.0 <= calc_N2_ratio && calc_N2_ratio <= 0.95 ); - assert( 0.0 <= calc_He_ratio && calc_He_ratio <= 1.00 ); - assert( (calc_N2_ratio + calc_He_ratio) <= 1.00 ); + // inert gas ratio (local helper variable) + sim_IG_ratio = 1.00 - sim_O2_ratio; + + // N2 ratio + sim_N2_ratio = sim_IG_ratio - sim_He_ratio; + + // ppO2 drop in pSCR loop + sim_pSCR_drop = sim_IG_ratio * float_pSCR_factor; + + + assert( 0.0 <= sim_N2_ratio && sim_N2_ratio <= 0.95 ); + assert( 0.0 <= sim_He_ratio && sim_He_ratio <= 0.95 ); + assert( (sim_N2_ratio + sim_He_ratio) <= 0.95 ); } ////////////////////////////////////////////////////////////////////////////// -// Compute ppN2 and ppHe +// Compute respired ppN2 and ppHe // -// Input: calc_N2_ratio, calc_He_ratio : simulated gas mix. -// temp_deco : simulated respiration pressure -// float_deco_distance : safety factor -// ppWater : water-vapor pressure inside respiratory tract +// Input: tissue_increment : selector for targeting simulated or real tissues +// char_O_main_status : breathing mode for real tissues +// char_O_deco_status : breathing mode for simulated tissues +// (sim_)O2_ratio : (simulated) O2 ratio breathed +// (sim_)N2_ratio : (simulated) N2 ratio breathed +// (sim_)He_ratio : (simulated) He ratio breathed +// (sim_)pres_respiration : (simulated) respiration pressure +// char_I_const_ppO2 : ppO2 reported from sensors or setpoint +// char_I_PSCR_drop : pSCR parameter +// char_I_PSCR_lungratio : pSCR parameter +// pres_surface : surface pressure +// float_deco_distance : safety factor +// ppWater : water-vapor pressure inside respiratory tract // -// Output: ppN2, ppHe. +// Output: ppN2 : respired N2 partial pressure +// ppHe : respired He partial pressure // -static void sim_alveolar_presures(void) +void calc_alveolar_pressures(void) { - overlay float deco_diluent = temp_deco; - - // read ppO2 reported from sensors or by setpoint // TODO: can be deleted - // char_actual_ppO2 = char_I_const_ppO2; - - - // Take deco offset into account, but not at surface. - // Note: this should be done on ambient pressure, hence before - // computing the diluent partial pressure... - if( deco_diluent > pres_surface ) deco_diluent += float_deco_distance; - - if( char_O_deco_status & DECO_MODE_LOOP ) - { - //---- Loop mode : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR)------- - - // get current setpoint (CCR) or sensor value (CCR, for pSCR see text below) as default - overlay float const_ppO2 = char_I_const_ppO2 * 0.01; - - if( char_O_deco_status & DECO_MODE_PSCR ) + overlay float pres_diluent; + overlay float calc_O2_ratio; + overlay float calc_N2_ratio; + overlay float calc_He_ratio; + overlay float calc_pSCR_drop; + + overlay unsigned char status; + + + assert( 0.00 <= N2_ratio && N2_ratio <= 1.00 ); + assert( 0.00 <= He_ratio && He_ratio <= 1.00 ); + assert( (N2_ratio + He_ratio) <= 1.00 ); + assert( 0.800 < pres_respiration && pres_respiration < 14.0 ); + + assert( 0.00 <= sim_N2_ratio && N2_ratio <= 1.00 ); + assert( 0.00 <= sim_He_ratio && He_ratio <= 1.00 ); + assert( (sim_N2_ratio + sim_He_ratio) <= 1.00 ); + assert( 0.800 < sim_pres_respiration && sim_pres_respiration < 14.0 ); + + + // get input data according to context + if( tissue_increment & TISSUE_FLAG ) + { + //---- real tissues ----------------------------------------------------------- + status = char_O_main_status; + pres_diluent = pres_respiration; + calc_pSCR_drop = pSCR_drop; + + calc_O2_ratio = O2_ratio; + calc_N2_ratio = N2_ratio; + calc_He_ratio = He_ratio; + } + else + { + //---- simulated tissues ------------------------------------------------------ + status = char_O_deco_status; + pres_diluent = sim_pres_respiration; + calc_pSCR_drop = sim_pSCR_drop; + + calc_O2_ratio = sim_O2_ratio; + calc_N2_ratio = sim_N2_ratio; + calc_He_ratio = sim_He_ratio; + + // take deco offset into account, but not at surface + if( pres_diluent > pres_surface ) pres_diluent += float_deco_distance; + } + + //---- OC, CCR and Bailout Mode Gas Calculations ----------------------------------- + + // calculate ppO2 of pure oxygen + O2_ppO2 = (pres_diluent - ppWater); + + // capture failure condition in case pres_respiration is < ppWater (should never happen...) + if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0; + + // calculate ppO2 of the pure gas (diluent) + OC_ppO2 = O2_ppO2 * calc_O2_ratio; + + // calculate pSCR ppO2 + pSCR_ppO2 = OC_ppO2 - calc_pSCR_drop; + + // capture failure condition in case pSCR_ppO2 becomes negative + if( pSCR_ppO2 < 0.0 ) pSCR_ppO2 = 0.0; + + + //---- Loop modes : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR) --- + if( status & DECO_MODE_LOOP ) + { + overlay float const_ppO2; + + // get the current sensor reading (CCR / pSCR if fitted) or the fixed setpoint (CCR) / a zero (pSCR) + const_ppO2 = 0.01 * char_I_const_ppO2; + + // Limit the setpoint to the maximum physically possible ppO2. This prevents for + // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. + // Additionally, if limiting occurs, the ppO2 can be further reduced to account + // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. + + if( const_ppO2 > pres_diluent ) // no ppWater subtracted here to give some margin for + { // sensors delivering data a little bit over target + const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (pres_diluent - ppWater); + } + + // check which kind of loop we are on + if( status & DECO_MODE_PSCR ) { - //---- PSCR mode : compute loop gas ---------------------------------------- - // - // As the ppO2 in the loop changes with water depth, we can not use the current - // sensor value as with CCR mode, but need to compute the ppO2 for the given depth. - // Then we continue with the CCR mode code which calculates the increases of ppN2 - // and ppH2 due to the reduction of the ppO2 in the loop. Essentially, diving a - // PSCR is like diving a CCR with a setpoint lower than the ambient pressure x the - // O2 fraction of the diluent would yield... - // - - // deco_diluent is 0.0 ... in bar - // calc_O2_ratio is 0.0 ... 1 as factor - // char_I_PSCR_drop is 0 ... 15 as % - // char_I_PSCR_lungratio is 5 ... 20 as % - // const_ppO2 is 0.0 ... in bar - - const_ppO2 = (deco_diluent * calc_O2_ratio) - (1 - calc_O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; - - // capture failure condition - if( const_ppO2 < 0.0 ) const_ppO2 = 0.0; - } + //---- pSCR Mode -------------------------------------------------------------------------- + + // Use the sensor value if available, but only in real tissue context! + // In all other cases use calculated ppO2. + if( char_I_const_ppO2 && (tissue_increment & TISSUE_FLAG)) ppO2 = const_ppO2; + else ppO2 = pSCR_ppO2; + } else { - - //---- CCR mode ------------------------------------------------------------ - - // Limit the setpoint to the maximum physically possible ppO2. This prevents for - // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. - // Additionally, if limiting occurs, the ppO2 can be further reduced to account - // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. - - if( const_ppO2 > deco_diluent ) // no ppWater subtracted here to give some margin for - { // sensors delivering data a little bit over target - - const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (deco_diluent - ppWater); - } + //---- CCR Mode --------------------------------------------------------------------------- + + // derive breathed ppO2 from (char_I_)const_ppO2, + // which holds sensor reading or fixed setpoint + ppO2 = const_ppO2; } - if ( const_ppO2 == 0.0 ) char_actual_ppO2 = 0; - else if ( const_ppO2 > 2.545 ) char_actual_ppO2 = 255; - else char_actual_ppO2 = (unsigned char)(const_ppO2*100 + 0.5); - - // Note: ppO2 and ratios are known outside the lungs, so there is no ppWater in the equations below: - deco_diluent -= const_ppO2; - deco_diluent /= calc_N2_ratio + calc_He_ratio; - - // capture all failure conditions, including div/0 in case diluent is pure O2 - if( (deco_diluent < 0.0) || (calc_O2_ratio > 99.5) ) + // adjust diluent pressure (ppN2 + ppHe) for change + // in ppO2 due to setpoint (CCR) or drop (pSCR) + pres_diluent -= const_ppO2; + pres_diluent /= calc_N2_ratio + calc_He_ratio; + + // capture all failure conditions, including div/0 + // in case diluent is pure O2 + if( (pres_diluent < 0.0) || (calc_O2_ratio > 99.5) ) { - deco_diluent = 0.0; - - char_actual_ppO2 = (unsigned char)(temp_deco*100 + 0.5); // without float_deco_distance here as this situation - // is likely to occur only at 6 meters or shallower + pres_diluent = 0.0; + ppO2 = OC_ppO2; } - } - else - { - //---- OC mode: char_actual_ppO2 will be needed for CNS calculation later -------------------------------- - - overlay float ppO2 = pres_respiration * calc_O2_ratio; - - if ( ppO2 > 2.545 ) char_actual_ppO2 = 255; - else char_actual_ppO2 = (unsigned char)(ppO2*100 + 0.5); + } + else + { //---- OC mode --------------------------------------------------------------------------------- + + // breathed ppO2 is ppO2 of pure gas + ppO2 = OC_ppO2; } - - if( deco_diluent > ppWater ) - { - ppN2 = calc_N2_ratio * (deco_diluent - ppWater); - ppHe = calc_He_ratio * (deco_diluent - ppWater); - } - else - { - ppN2 = 0.0; - ppHe = 0.0; - } - - assert( 0.0 <= ppN2 && ppN2 < 14.0 ); - assert( 0.0 <= ppHe && ppHe < 14.0 ); + + // derive char_ppO2 in [cbar], used for calculating CNS% + if ( ppO2 < 0.01 ) char_ppO2 = 0; + else if ( ppO2 >= 2.545 ) char_ppO2 = 255; + else char_ppO2 = (unsigned char)(100 * ppO2 + 0.5); + + + //---- calculate ppN2 and ppHe --------------------------------------------------------------------- + + if( pres_diluent > ppWater ) + { + ppN2 = calc_N2_ratio * (pres_diluent - ppWater); + ppHe = calc_He_ratio * (pres_diluent - ppWater); + } + else + { + ppN2 = 0.0; + ppHe = 0.0; + } } ////////////////////////////////////////////////////////////////////////////// @@ -1276,65 +1407,62 @@ // optimized in v.101 (var_N2_a) // // preload tissues with standard pressure for the given ambient pressure. -// Note: fixed N2_ratio for standard air. // static void clear_tissue(void) { pres_respiration = 0.001 * int_I_pres_respiration; N2_equilibrium = 0.7902 * (pres_respiration - ppWater); - - for(ci=0; ci ppO2_GAP_TO_SETPOINT) ? (unsigned int)(char_I_const_ppO2 - ppO2_GAP_TO_SETPOINT) : 0; + + // ...but never above int_ppO2_max. + if( max_dil < int_ppO2_max ) int_ppO2_max_dil = max_dil; + + // We do not need to guard int_ppO2_max_dil against becoming lower than char_I_ppO2_min because the check + // against char_I_ppO2_min is done first and will then raise a low warning and inhibit further checks. + } + // check for safe range of pure oxygen - if ( int_O_O2_ppO2 >= int_ppO2_max ) int_O_O2_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + if ( int_O_O2_ppO2 >= int_ppO2_max ) int_O_O2_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; // check for safe range of breathed gas - if ( int_O_breathed_ppO2 <= int_ppO2_min ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; - else if ( int_O_breathed_ppO2 >= int_ppO2_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; - else if ( char_O_main_status & DECO_MODE_LOOP ) ; // no attention generated in loop modes - else if ( int_O_breathed_ppO2 >= ppO2_prewarn_threshold ) int_O_breathed_ppO2 |= INT_FLAG_PREWARNING; - + if ( int_O_breathed_ppO2 <= int_ppO2_min ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_breathed_ppO2 >= int_ppO2_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + else if ( char_O_main_status & DECO_MODE_LOOP ) ; // no attention generated in loop modes + else if ( int_O_breathed_ppO2 >= ppO2_ATTENTION_THRESHOLD ) int_O_breathed_ppO2 |= INT_FLAG_ATTENTION; + // check for safe range of pure diluent - if ( int_O_pure_ppO2 <= (unsigned int)char_I_ppO2_min ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; - else if ( int_O_pure_ppO2 >= int_ppO2_max ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; - + if ( int_O_pure_ppO2 <= (unsigned int)char_I_ppO2_min ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pure_ppO2 >= int_ppO2_max ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + else if ( int_O_pure_ppO2 >= int_ppO2_max_dil ) int_O_pure_ppO2 |= INT_FLAG_ATTENTION; + // check for safe range of calculated pSCR loop gas - if ( int_O_pSCR_ppO2 <= int_ppO2_min ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; - else if ( int_O_pSCR_ppO2 >= int_ppO2_max ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; - - - //---- toggle between calculation for NDL (bottom time), deco stops and more deco stops (continue) ------ - + if ( int_O_pSCR_ppO2 <= int_ppO2_min ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pSCR_ppO2 >= int_ppO2_max ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + + + //---- toggle between calculation for NDL (bottom time), ------ + //---- deco stops and more deco stops (continue) ------ + + + // done with the real tissues, all following operations + // target the simulated tissues so clear flag in bit 7 + tissue_increment = 0; + + // branch to the code for the current phase the deco calculations are in switch( char_O_deco_status & DECO_STATUS_MASK ) - { + { overlay unsigned char i; - case DECO_STATUS_INIT: //---- At surface: start a new dive --------------------- - + case DECO_STATUS_INIT: //---- At surface: Start a new dive --------------------- + + // clear the internal stops table from remains lasting from the last dive clear_deco_table(); - copy_deco_table(); - - - char_I_gas_change_time = 1; // TODO: validate proper operation before enabling this options-table parameter - - char_I_ascent_speed = 10; // TODO: validate proper operation before enabling this options-table parameter, - // caution: values < 10 may have an impact on the deco calculation run-times! - - - float_ascent_speed = 1.00 * char_I_ascent_speed; - float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier; - float_saturation_multiplier = 0.01 * char_I_saturation_multiplier; - float_deco_distance = 0.01 * char_I_deco_distance; - - int_O_ascenttime = 0; // reset ascent time in normal plan - int_O_alternate_ascenttime = 0; // reset ascent time in alternative plan - char_O_nullzeit = 0; // reset no decompression limit (NDL) in normal plan - char_O_alternate_nullzeit = 0; // reset no decompression limit (NDL) in alternative plan - char_O_deco_warnings = 0; // reset all deco warning flags - deco_tissue_vector = 0; // reset tissue deco vector - IBCD_tissue_vector = 0; // reset tissue IBCD vector - - int_O_desaturation_time = 65535; // tag desaturation time as invalid (it will not be computed during a dive) - - + + // publish the cleared stops table to the display functions + publish_deco_table(); + + // clear the gas needs table for(i=0; i code execution continues in state DECO_STATUS_START + // + + case DECO_STATUS_START: //---- Bottom Time & initial Ascent -------------------- + default: // clear the internal(!) stops table - clear_deco_table(); + clear_deco_table(); // initialize the simulated tissues with the current state of the real tissues - update_startvalues(); - - // calculate the effect of extended bottom time due to delayed ascent / fTTS on current gas - if( char_O_deco_status & DECO_ASCENT_DELAYED ) sim_extra_time(); - - // calculate if we are within no decompression limit (NDL) - calc_nullzeit(); - - // check which plan we are on - if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + for(i=0; i 0 ) - { - // clear tank pressure needs - if( char_O_deco_status & DECO_VOLUME_CALCULATE ) - for(i=0; i 0 ) + //--- within NDL ----------------------------------------------------- + + // continue with gathering all results + char_O_deco_status &= ~DECO_STATUS_MASK; + char_O_deco_status |= DECO_STATUS_RESULTS; + } + + break; + + + case DECO_STATUS_STOPS: //---- Calculate Stops --------------------------------- + + // calculate the stops + calc_hauptroutine_calc_deco(); + + // calc_hauptroutine_calc_deco iterates in this phase as long as it is + // calculating the stops. Once done, it will set the status to doing the + // results gathering. + + break; + + + case DECO_STATUS_RESULTS: //--- Gathering of all Results ----------------------- + + // if in normal plan, publish the stops table to the display functions + if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) ) publish_deco_table(); + + // The current depth is needed by calc_CNS_planning() and gas_volumes(). + // As it may be needed in different code blocks below but we don't want + // it to be in the code multiple times, it's done here on stockpile. + bottom_depth = (unsigned char)((pres_respiration - pres_surface) * BAR_TO_METER); + + // Calculate the ascent time. + // When within NDL, potential gas switches will be treated as done "on the fly". + calc_ascenttime(); + + // results to publish depend whether within NDL or in deco + if( NDL_time ) + { + //---- within NDL ---------------------------------------------- + + // Calculate the initial ascent (not yet done when within NDL) - + // just to get potential gas switches into the stops table for use + // by gas_volumes(). The stops table can be polluted by now because + // the clean table has already been published to the display + // functions before. + calc_ascent_to_first_stop(); + + // check which plan we are on + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) { - // published (erased) stops table - copy_deco_table(); - - // ** commented out - char_O_deco_last_stop is not used for anything - // - // // set last stop to 0 (for OSTC menu animation) - // char_O_deco_last_stop = 0; - - // clear tank pressure needs - if( char_O_deco_status & DECO_VOLUME_CALCULATE ) - for(i=0; i 9.985 ) int_O_alternate_CNS_fraction = 999 + INT_FLAG_WARNING; - else - { - // convert float to integer - int_O_alternate_CNS_fraction = (unsigned short)(100 * CNS_sim_alt_fraction + 0.5); - - // set warning flag if CNS is >= 100% - if( int_O_alternate_CNS_fraction >= 100 ) - int_O_alternate_CNS_fraction |= INT_FLAG_WARNING; - - // set invalid flag if there is an overflow in the stops table - if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) - int_O_alternate_CNS_fraction |= INT_FLAG_INVALID; - } + // calculate the CNS for the predicted ascent, result in sim_CNS_fraction + calc_CNS_planning(); + + // add current CNS value + sim_CNS_fraction += CNS_fraction; + + // convert to integer value + convert_sim_CNS_for_display(); + + // export result + int_O_alternate_CNS_fraction = int_sim_CNS_fraction; } - else - { - // no - invalidate value (value = 0, invalid flag set) - int_O_alternate_CNS_fraction = INT_FLAG_INVALID; - } - } + + // clear NDL time + char_O_alternate_nullzeit = 0; + + // output ascent time + int_O_alternate_ascenttime = ascent_time; + + } // alternative plan else { //---- normal plan --------------------------------------------------------- - // publish the stops table - copy_deco_table(); - - // was CNS at end of dive calculated? + // shall the CNS at the end of the dive be calculated? if( char_O_deco_status & DECO_CNS_CALCULATE ) { - // yes - compute CNS value to display - if ( CNS_sim_norm_fraction < 0.01 ) int_O_normal_CNS_fraction = 0; - else if ( CNS_sim_norm_fraction >= 9.985 ) int_O_normal_CNS_fraction = 999 + INT_FLAG_WARNING; - else - { - // convert float to integer - int_O_normal_CNS_fraction = (unsigned short)(100 * CNS_sim_norm_fraction + 0.5); - - // set warning flag if CNS is >= 100% - if( int_O_normal_CNS_fraction >= 100 ) - int_O_normal_CNS_fraction |= INT_FLAG_WARNING; - - // set invalid flag if there is an overflow in the stops table - if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) - int_O_normal_CNS_fraction |= INT_FLAG_INVALID; - } + // calculate the CNS for the predicted ascent, result in sim_CNS_fraction + calc_CNS_planning(); + + // add current CNS value + sim_CNS_fraction += CNS_fraction; + + // convert to integer value + convert_sim_CNS_for_display(); + + // export result + int_O_normal_CNS_fraction = int_sim_CNS_fraction; } - else - { - // no - invalidate value (value = 0, invalid flag set) - int_O_normal_CNS_fraction = INT_FLAG_INVALID; - } - - } // aftermath - } // if - - break; - - } // switch + + // clear NDL time + char_O_nullzeit = 0; + + // output ascent time + int_O_ascenttime = ascent_time; + + } // normal plan + } // DECO + + // if requested, calculate the required gas volumes and tank pressures at the end of the dive + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) gas_volumes(); + + // signal that the computation cycle is finished + char_O_deco_status &= ~DECO_STATUS_MASK; + + break; + + } // switch } ////////////////////////////////////////////////////////////////////////////// // calc_hauptroutine_data_input // -// Reset all C-code dive parameters from their ASM-code values. +// Set all C-code dive parameters from their ASM-code values. // Detect gas change condition. // void calc_hauptroutine_data_input(void) { + overlay float IG_ratio; + // get the current pressures - pres_respiration = 0.001 * int_I_pres_respiration; - pres_surface = 0.001 * int_I_pres_surface; + pres_surface = 0.001 * int_I_pres_surface; + pres_respiration = 0.001 * int_I_pres_respiration; + + // N2 tissue pressure at surface equilibrium, used for tissue graphics scaling + N2_equilibrium = 0.7902 * (pres_surface - ppWater); + + // read the GF settings (they may have been switch between GF/aGF) + GF_high = 0.01 * char_I_GF_High_percentage; + GF_low = 0.01 * char_I_GF_Low_percentage; + GF_delta = GF_high - GF_low; // get the currently breathed gas mixture - O2_ratio = 0.01 * char_I_O2_ratio; - He_ratio = 0.01 * char_I_He_ratio; - - // N2 ratios are computed within p2_deco.c from the O2 and He ratios - N2_ratio = 1.0 - O2_ratio - He_ratio; - - // N2 tissue pressure at surface equilibrium, used for tissue graphics scaling - N2_equilibrium = 0.7902 * (pres_surface - ppWater); + O2_ratio = 0.01 * char_I_O2_ratio; + He_ratio = 0.01 * char_I_He_ratio; + + // inert gas ratio (local helper variable) + IG_ratio = 1.00 - O2_ratio; + + // N2 ratio + N2_ratio = IG_ratio - He_ratio; + + // precomputed values for ppO2 drop in pSCR loop + float_pSCR_factor = 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; + pSCR_drop = IG_ratio * float_pSCR_factor; } ////////////////////////////////////////////////////////////////////////////// @@ -1688,212 +1869,60 @@ // void calc_hauptroutine_update_tissues(void) { - overlay float pres_diluent = pres_respiration; - - - assert( 0.00 <= N2_ratio && N2_ratio <= 1.00 ); - assert( 0.00 <= He_ratio && He_ratio <= 1.00 ); - assert( (N2_ratio + He_ratio) <= 1.00 ); - assert( 0.800 < pres_respiration && pres_respiration < 14.0 ); - - - //---- OC, CCR and Bailout Mode Gas Calculations ------------------------------------------------------------ - - // calculate ppO2 of pure oxygen - O2_ppO2 = (pres_respiration - ppWater); - - // capture failure condition in case pres_respiration is < ppWater (should never happen...) - if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0; - - // calculate ppO2 of the pure gas (diluent) - pure_ppO2 = O2_ppO2 * O2_ratio; - - - //---- PSCR Mode Gas Calculation----------------------------------------------------------- - - // With flags set for PSCR we compute the ppO2 in the loop from the diluent's O2 - // ratio and the PSCR parameters. This figure will be used in the pSCR custom view. - // If sensors are used (char_I_const_ppO2 > 0), we will override the calculated ppO2 - // with the sensor data. Then we continue with the CCR mode code which calculates - // the increase of ppN2 and ppH2 due to the reduction of the ppO2 in the loop. - // Essentially, diving a pSCR is like diving a CCR with a setpoint set lower than - // the ambient pressure multiplied with the O2 fraction of the diluent... - - // calculate pSCR ppO2 - // - // pres_respiration is 0.0 ... in bar - // O2_ratio is 0.0 ... 1.0 as factor - // char_I_PSCR_drop is 0 ... 15 as % - // char_I_PSCR_lungratio is 5 ... 20 as % - // pSCRppO2 is 0.0 ... in bar - - pSCR_ppO2 = (pres_respiration * O2_ratio) - (1 - O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; - - // capture failure condition if case pSCR_ppO2 becomes negative - if( pSCR_ppO2 < 0.0 ) pSCR_ppO2 = 0.0; - - - //---- Loop modes : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR) ------------ - if ( char_O_main_status & DECO_MODE_LOOP ) - { - overlay float const_ppO2; - - // get the current sensor reading (CCR / pSCR if fitted) or the fixed setpoint (CCR) / a zero (pSCR) - const_ppO2 = 0.01 * char_I_const_ppO2; - - // Limit the setpoint to the maximum physically possible ppO2. This prevents for - // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. - // Additionally, if limiting occurs, the ppO2 can be further reduced to account - // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. - - if( const_ppO2 > pres_respiration ) // no ppWater subtracted here to give some margin for - { // sensors delivering data a little bit over target - - const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (pres_respiration - ppWater); - } - - // check which kind of loop we are on - if( char_O_main_status & DECO_MODE_PSCR ) - { - //---- pSCR Mode -------------------------------------------------------------------------- - - // check if a sensor is fitted - if( char_I_const_ppO2 ) breathed_ppO2 = const_ppO2; // yes - derive ppO2s from (char_I_)const_ppO2 - else breathed_ppO2 = pSCR_ppO2; // no - derive ppO2s from calculated ppO2 - } - else - { - //---- CCR Mode --------------------------------------------------------------------------- - - // derive breathed ppO2 from (char_I_)const_ppO2, which holds sensor reading or fixed setpoint - breathed_ppO2 = const_ppO2; - } - - // adjust diluent pressure (ppN2 + ppHe) for change in ppO2 due to setpoint (CCR) or drop (pSCR) - pres_diluent -= const_ppO2; - pres_diluent /= N2_ratio + He_ratio; - - // capture all failure conditions, including div/0 in case diluent is pure O2 - if( (pres_diluent < 0.0) || (char_I_O2_ratio == 100) ) - { - pres_diluent = 0.0; - breathed_ppO2 = pure_ppO2; - } - - } - else - { //---- OC mode ----------------------------------------------------------------------------------------- - - // breathed ppO2 is ppO2 of pure gas - breathed_ppO2 = pure_ppO2; - } - - - // derive char_actual_ppO2 in [cbar], used for calculating CNS% - if ( breathed_ppO2 < 0.01 ) char_actual_ppO2 = 0; - else if ( breathed_ppO2 >= 2.545 ) char_actual_ppO2 = 255; - else char_actual_ppO2 = (unsigned char)(100 * breathed_ppO2 + 0.5); - - - //---- export ppO2 values in [cbar] for warning generation and display purpose ------------------------------ + overlay float EAD, END; + + //---- calculations part ---------------------------------------------------------------------- + + // calculate ppN2 and ppHe + calc_alveolar_pressures(); + + // calculate the tissues + calc_tissues(); + + // calculate ceiling (at GF_high) and current GF + calc_limit(GF_high); + + // calculate EAD (Equivalent Air Depth): equivalent depth for the same N2 level with plain air + EAD = (ppN2 / 0.7902 + ppWater - pres_surface) * BAR_TO_METER; + + // calculate END (Equivalent Narcotic Depth): here O2 is treated as narcotic, too + // Source cited: The Physiology and Medicine of Diving by Peter Bennett and David Elliott, + // 4th edition, 1993, W.B.Saunders Company Ltd, London. + END = (pres_respiration - ppHe - pres_surface) * BAR_TO_METER; + + + //---- export ppO2 values in [cbar] for warning generation and display purpose ---------------- // pure oxygen ppO2 if ( O2_ppO2 < 0.01 ) int_O_O2_ppO2 = 0; else if ( O2_ppO2 >= 9.995 ) int_O_O2_ppO2 = 999; - else int_O_O2_ppO2 = (unsigned int)(100 * O2_ppO2 + 0.5); + else int_O_O2_ppO2 = (unsigned int)(100 * O2_ppO2 + 0.5); // pure gas ppO2 - if ( pure_ppO2 < 0.01 ) int_O_pure_ppO2 = 0; - else if ( pure_ppO2 >= 9.995 ) int_O_pure_ppO2 = 999; - else int_O_pure_ppO2 = (unsigned int)(100 * pure_ppO2 + 0.5); + if ( OC_ppO2 < 0.01 ) int_O_pure_ppO2 = 0; + else if ( OC_ppO2 >= 9.995 ) int_O_pure_ppO2 = 999; + else int_O_pure_ppO2 = (unsigned int)(100 * OC_ppO2 + 0.5); // calculated pSCR ppO2 if ( pSCR_ppO2 < 0.01 ) int_O_pSCR_ppO2 = 0; else if ( pSCR_ppO2 >= 9.995 ) int_O_pSCR_ppO2 = 999; - else int_O_pSCR_ppO2 = (unsigned int)(100 * pSCR_ppO2 + 0.5); + else int_O_pSCR_ppO2 = (unsigned int)(100 * pSCR_ppO2 + 0.5); // breathed ppO2 - if ( breathed_ppO2 < 0.01 ) int_O_breathed_ppO2 = 0; - else if ( breathed_ppO2 >= 9.995 ) int_O_breathed_ppO2 = 999; - else int_O_breathed_ppO2 = (unsigned int)(100 * breathed_ppO2 + 0.5); - - - //---- calculate ppN2, ppHe and EAD, END ------------------------------------------------------------------- - - if( pres_diluent > ppWater ) - { - overlay float EAD, END; - - ppN2 = N2_ratio * (pres_diluent - ppWater); - ppHe = He_ratio * (pres_diluent - ppWater); - - // EAD : Equivalent Air Depth. Equivalent depth for the same N2 level with plain air. - // ppN2 = 79% * (P_EAD - ppWater) - // EAD = (P_EAD - Psurface) * 10 - // ie: EAD = (ppN2 / 0.7902 + ppWater -Psurface) * 10 - - EAD = (ppN2 / 0.7902 + ppWater - pres_surface) * BAR_TO_METER; - - if( (EAD < 0.0) || (EAD > 245.5) ) EAD = 0.0; - - char_O_EAD = (unsigned char)(EAD + 0.5); - - - // END : Equivalent Narcotic Depth. - // Here we count O2 as narcotic too. Hence everything but helium (has a narcosis - // factor of 0.23 btw). Hence the formula becomes: - // END * BarPerMeter * (1.0 - 0.0) - ppWater + Psurface == Pambient - ppHe - ppWater - // ie: END = (Pambient - ppHe - Psurface) * BAR_TO_METER - // - // Source cited: - // The Physiology and Medicine of Diving by Peter Bennett and David Elliott, - // 4th edition, 1993, W.B.Saunders Company Ltd, London. - - END = (pres_respiration - ppHe - pres_surface) * BAR_TO_METER; - - if( (END < 0.0) || (END > 245.5) ) END = 0.0; - - char_O_END = (unsigned char)(END + 0.5); - } - else - { - ppN2 = ppHe = 0.0; - - char_O_EAD = char_O_END = 0; - } - - - //---- calculate decompression status ---------------------------------------------------------------------- - - // Calculate tissues - calc_tissue(); - - // Calculate limit for surface, ie. GF_high. - calc_limit(); - - - // Fill int_O_ceiling (in mbar) if ceiling is below the surface - if( (calc_lead_tissue_limit - pres_surface) > 0 ) - { - -// compatibility version - int_O_ceiling = (short)((calc_lead_tissue_limit - pres_surface) * 1000); - -// new version -// // Round up to next 10 cm so that the ceiling disappears on the display only when the ceiling -// // limit is really zero. This will coincident then with TTS switching back to NDL time. -// int_O_ceiling = (short)((calc_lead_tissue_limit - pres_surface) * 1000 + 9); - - - // limit int_O_ceiling to 16000 mbar (150 m) - if( int_O_ceiling > 16000) int_O_ceiling = 16000; - } - else - { - int_O_ceiling = 0; - } - - int_O_gtissue_press = (short)((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) * 1000); + if ( ppO2 < 0.01 ) int_O_breathed_ppO2 = 0; + else if ( ppO2 >= 9.995 ) int_O_breathed_ppO2 = 999; + else int_O_breathed_ppO2 = (unsigned int)(100 * ppO2 + 0.5); + + + //---- export EAD and END --------------------------------------------------------------------- + + // EAD + if( (EAD < 0.0) || (EAD > 245.5) ) char_O_EAD = 0; + else char_O_EAD = (unsigned char)(EAD + 0.5); + + // END + if( (END < 0.0) || (END > 245.5) ) char_O_END = 0; + else char_O_END = (unsigned char)(END + 0.5); } @@ -1910,6 +1939,7 @@ { overlay unsigned char loop; + for(loop = 0; loop < 16; ++loop) { // limit loops to 512ms, using timer 5 @@ -1917,8 +1947,8 @@ // calc_nextdecodepth() // - // INPUT temp_deco : current depth in absolute pressure - // OUTPUT temp_depth_limit : depth of next stop in meters + // INPUT sim_pres_respiration : current depth in absolute pressure + // OUTPUT sim_depth_limit : depth of next stop in meters // RETURN true if a stop is needed // // The function manages gas changes by itself, including priming @@ -1926,13 +1956,13 @@ // if( calc_nextdecodepth() ) { - if( temp_depth_limit == 0 ) goto Surface; // this check should not bee needed as in + if( sim_depth_limit == 0 ) goto Surface; // this check should not bee needed as in // this case the RETURN value will be false - //---- stop required at temp_depth_limit ------------------------------------- + //---- stop required at sim_depth_limit ------------------------------------- // convert stop depth in meters to absolute pressure - temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; + sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface; // add one minute to the current stop, or add a new stop, // or abort deco calculation if the deco table is full. @@ -1941,22 +1971,18 @@ else { //---- no stop required -------------------------------------- - + // ascend by float_ascent_speed for 1 minute - temp_deco -= float_ascent_speed * METER_TO_BAR; + sim_pres_respiration -= float_ascent_speed * METER_TO_BAR; // finish deco calculation if surface is reached - if( temp_deco <= pres_surface ) + if( sim_pres_respiration <= pres_surface ) { Surface: - // set deco engine status to done (DECO_STATUS_FINISHED) + // continue with gathering all results in the next calculation phase char_O_deco_status &= ~DECO_STATUS_MASK; - - // ** commented out - char_O_deco_last_stop is not used for anything - // - // // surface reached (to animate menu) - // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE)) char_O_deco_last_stop = 0; - + char_O_deco_status |= DECO_STATUS_RESULTS; + return; } } @@ -1966,55 +1992,50 @@ // program 1 minute interval on simulated tissues (Flagbit 7 = 0) tissue_increment = 1; - + // compute current ppN2 and ppHe - sim_alveolar_presures(); - + calc_alveolar_pressures(); + // update the tissues - calc_tissue(); + calc_tissues(); } - - // ** commented out - char_O_deco_last_stop is not used for anything - // - // // surface not reached, need more stops... store reached depth for menu animation. - // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) ) char_O_deco_last_stop = temp_depth_limit; } ////////////////////////////////////////////////////////////////////////////// -// Simulate ascent to first deco stop. +// Calculate ascent to first deco stop. // // -// Modified: temp_deco : current depth in ascent and deco simulation, in bar absolute pressure +// Modified: sim_pres_respiration : current depth in ascent and deco simulation, in bar absolute pressure // -void sim_ascent_to_first_stop(void) +void calc_ascent_to_first_stop(void) { overlay unsigned char fast = 1; // 1 = 1 minute steps, 0 = 2 seconds steps overlay unsigned char gaschange = 0; // 1 = do a gas change, 0 = no better gas available - - + + //---- Loop until first deco stop or surface is reached ---------- for(;;) { // depth in absolute pressure we came from - overlay float old_deco = temp_deco; - + overlay float old_deco = sim_pres_respiration; + // try ascending 1 full minute (fast) or 2 seconds (!fast) - if ( fast ) temp_deco -= float_ascent_speed * METER_TO_BAR; // 1 min at float_ascent_speed ( 5 .. 10 m/min) - else temp_deco -= (float_ascent_speed/30.0) * METER_TO_BAR; // 2 sec at float_ascent_speed (17 .. 33 cm/min) + if ( fast ) sim_pres_respiration -= float_ascent_speed * METER_TO_BAR; // 1 min at float_ascent_speed ( 5 .. 10 m/min) + else sim_pres_respiration -= (float_ascent_speed/30.0) * METER_TO_BAR; // 2 sec at float_ascent_speed (17 .. 33 cm/min) // but don't go over surface - if( temp_deco < pres_surface ) temp_deco = pres_surface; - - // compute sim_lead_tissue_limit - if ( char_I_deco_model != 0 ) sim_limit(GF_low); - else sim_limit(1.0); + if( sim_pres_respiration < pres_surface ) sim_pres_respiration = pres_surface; + + // compute current ceiling of the simulated tissues + if ( char_I_deco_model != 0 ) calc_limit(GF_low); + else calc_limit(1.0); // did we overshoot the first deco stop? - if( temp_deco < sim_lead_tissue_limit ) + if( sim_pres_respiration < (sim_ceiling + pres_surface) ) { // YES - back to last depth below first stop - temp_deco = old_deco; + sim_pres_respiration = old_deco; // switch to 2 seconds ascent if not yet in, else done if( fast ) @@ -2029,13 +2050,13 @@ } // If code execution passes along here, we did not overshoot the first stop. - + // did we reach the surface? if yes, done! - if( temp_deco == pres_surface ) break; + if( sim_pres_respiration == pres_surface ) break; // depth in meters where we are now (no round-up) - temp_depth_limit = (unsigned char)((temp_deco - pres_surface) * BAR_TO_METER); - + sim_depth_limit = (unsigned char)((sim_pres_respiration - pres_surface) * BAR_TO_METER); + // Check if there is a better gas to switch to, but only in alternative plan mode // or if override is set. If yes, introduce a stop for the gas change. if( ((char_O_deco_status & DECO_PLAN_ALTERNATE) || (char_O_main_status & DECO_GASCHANGE_OVRD)) @@ -2043,35 +2064,35 @@ { // depth in meters we came from overlay unsigned char old_depth_limit = (unsigned char)((old_deco - pres_surface) * BAR_TO_METER); - - // adjust temp_depth_limit to the gas change depth, but not deeper than the depth we came from - temp_depth_limit = (sim_gas_last_depth < old_depth_limit) ? sim_gas_last_depth : old_depth_limit; - + + // adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from + sim_depth_limit = (sim_gas_last_depth < old_depth_limit) ? sim_gas_last_depth : old_depth_limit; + // create a stop for the gas change update_deco_table(char_I_gas_change_time); // set the new calculation values for N2, He and O2 - gas_switch_set(); - + gas_set_ratios(); + // signal to create a stop for the gas change and update the tissues gaschange = char_I_gas_change_time; - + // Adjust the depth for the tissue update to the stop depth. In case of fast mode, this // imposes that the ascent from the 'old_deco' depth to this stop took 1 minute although // we might have only ascended one or two meters... - temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; - } - + sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface; + } + // Did one minute pass by and/or do we have a gas change? // Remark: The 2 seconds ascent iterations towards the first deco stop in !fast speed may take // up to 28 seconds in total - for this rough half of a minute no tissue updates will be computed. // Well, it could be done by setting tissue_increment = 0 in !fast condition and making calls to - // sim_alveolar_presures() and calc_tissue() - see code commented out below. + // calc_alveolar_pressures() and calc_tissues() - see code commented out below. if( fast || gaschange ) { // program interval on simulated tissues (flag bit 7 = 0) tissue_increment = fast + gaschange; - + // clear gas change signal gaschange = 0; // } @@ -2081,92 +2102,83 @@ // tissue_increment = 0; // } // { - // compute ppN2/ppHe for current depth from temp_deco - sim_alveolar_presures(); + // compute ppN2/ppHe for current depth from sim_pres_respiration + calc_alveolar_pressures(); // update the tissues - calc_tissue(); + calc_tissues(); } } } -////////////////////////////////////////////////////////////////////////////// -// Simulate extra time at the current depth. -// -// This routine is used for the futureTTS / delayed ascent feature. -// -void sim_extra_time(void) -{ - overlay unsigned char backup = tissue_increment; // back-up tissue_increment - - tissue_increment = char_I_extra_time; // program interval on simulated tissues (Flagbit 7 = 0) - - calc_tissue(); // update the tissues - - tissue_increment = backup; // restore tissue_increment -} ////////////////////////////////////////////////////////////////////////////// -// calc_tissue +// calc_tissues // -// optimized in v.101 +// INPUT: ppN2 : partial pressure of inspired N2 +// ppHe : partial pressure of inspired He +// tissue_increment : integration time and tissue selector (real or simulated) // -// INPUT: ppN2, ppHe, tissue_increment -// MODIFIED: pres_tissue_N2[], pres_tissue_He[] -// OUTPUT: char_O_tissue_N2_saturation[], char_O_tissue_He_saturation[] +// MODIFIED: pres_tissue_N2[] : tissue N2 pressures (in real tissues context) +// pres_tissue_He[] : tissue He pressures (in real tissues context) +// sim_pres_tissue_N2[] : tissue N2 pressures (in simulated tissues context) +// sim_pres_tissue_He[] : tissue He pressures (in simulated tissues context) // -static void calc_tissue() +// OUTPUT: char_O_tissue_N2_saturation[] : tissue N2 pressures scaled for display purpose (in real tissues context) +// char_O_tissue_He_saturation[] : tissue He pressures scaled for display purpose (in real tissues context) +// +static void calc_tissues() { overlay float temp_tissue_N2; overlay float temp_tissue_He; overlay unsigned char period; overlay unsigned char i; - - - assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m - assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m - - - for (ci=0;ci 0) - // or if one 2 second period is to do (if i = 0) - - if( i == 0 ) // check if we shall do one 2-seconds period + + + assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m + assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m + + + for (ci=0;ci 0) + // or if one 2 second period is to do (if i = 0) + + if( i == 0 ) // check if we shall do one 2-seconds period { - read_Buhlmann_times(0); // YES, program coefficients for a 2 seconds period - period = 1; // set period length (in cycles) - i = 1; // and one cycle to do + read_Buhlmann_times(0); // YES, program coefficients for a 2 seconds period + period = 1; // set period length (in cycles) + i = 1; // and one cycle to do } - else if( i > 9 ) // check if we can start with 10 minutes periods + else if( i > 9 ) // check if we can start with 10 minutes periods { - read_Buhlmann_times(2); // YES, program coefficients for 10 minutes periods - period = 10; // set period length (in cycles) to ten + read_Buhlmann_times(2); // YES, program coefficients for 10 minutes periods + period = 10; // set period length (in cycles) to ten } - else // we shall do 1 to 9 minutes + else // we shall do 1 to 9 minutes { - read_Buhlmann_times(1); // program coefficients for 1 minute periods - period = 1; // set period length (in cycles) to one + read_Buhlmann_times(1); // program coefficients for 1 minute periods + period = 1; // set period length (in cycles) to one } do { //---- N2 ------------------------------------------------------------------------------- - temp_tissue = (tissue_increment & 128) ? pres_tissue_N2[ci] : sim_pres_tissue_N2[ci]; + temp_tissue = (tissue_increment & TISSUE_FLAG) ? pres_tissue_N2[ci] : sim_pres_tissue_N2[ci]; temp_tissue = (ppN2 - temp_tissue) * var_N2_e; temp_tissue_safety(); - if( tissue_increment & 128 ) + if( tissue_increment & TISSUE_FLAG ) { // The temp variable takes on purpose just the tissue increment from the last loop's iteration. temp_tissue_N2 = temp_tissue; // Update the real tissues if either we are on the 2 seconds interval, // or if we shall advance the tissues on a one or several minutes basis. - if( twosectimer || (tissue_increment & 127) ) pres_tissue_N2[ci] += temp_tissue; + if( twosectimer || (tissue_increment & TIME_MASK) ) pres_tissue_N2[ci] += temp_tissue; } else { @@ -2177,22 +2189,21 @@ //---- He ------------------------------------------------------------------------------- - - temp_tissue = (tissue_increment & 128) ? pres_tissue_He[ci] : sim_pres_tissue_He[ci]; + + temp_tissue = (tissue_increment & TISSUE_FLAG) ? pres_tissue_He[ci] : sim_pres_tissue_He[ci]; temp_tissue = (ppHe - temp_tissue) * var_He_e; temp_tissue_safety(); - if( tissue_increment & 128 ) + if( tissue_increment & TISSUE_FLAG ) { // The temp variable takes on purpose just the tissue increment from the last loop's iteration. temp_tissue_He = temp_tissue; // Update the real tissues if either we are on the 2 seconds interval, // or if we shall advance the tissues on a one or several minutes basis. - if( twosectimer || (tissue_increment & 127) ) pres_tissue_He[ci] += temp_tissue; - + if( twosectimer || (tissue_increment & TIME_MASK) ) pres_tissue_He[ci] += temp_tissue; } else { @@ -2200,38 +2211,37 @@ // so we do not need to check of the 2 seconds interval. sim_pres_tissue_He[ci] += temp_tissue; } - // decrement loop counter i -= period; - + // check if we need to switch from 10 minute periods to 1 minute periods if( (i > 0) && (period = 10) && (i < 10) ) { - read_Buhlmann_times(1); // program coefficients for 1 minute periods + read_Buhlmann_times(1); // program coefficients for 1 minute periods period = 1; // set period length (in cycles) to one } } while( i ); - - + + // have the computations been done for the "real" tissues? - if( (tissue_increment & 128) && (twosectimer || (tissue_increment & 127)) ) + if( (tissue_increment & TISSUE_FLAG) && (twosectimer || (tissue_increment & TIME_MASK)) ) { // net tissue balance temp_tissue = temp_tissue_N2 + temp_tissue_He; - + // check tissue on-/off-gassing and IBCD with applying a threshold of +/-HYST // - if ( temp_tissue < -HYST ) // Check if the tissue is off-gassing + if ( temp_tissue < -HYST ) // Check if the tissue is off-gassing { - deco_tissue_vector |= (1 << ci); // tag tissue as being in decompression - IBCD_tissue_vector &= ~(1 << ci); // tag tissue as not experiencing mentionable IBCD + deco_tissue_vector |= (1 << ci); // tag tissue as being in decompression + IBCD_tissue_vector &= ~(1 << ci); // tag tissue as not experiencing mentionable IBCD } else if ( temp_tissue > +HYST ) // check if the tissue in on-gassing { - deco_tissue_vector &= ~(1 << ci); // tag tissue as not being in decompression - + deco_tissue_vector &= ~(1 << ci); // tag tissue as not being in decompression + if( ((temp_tissue_N2 > 0.0) && (temp_tissue_He < 0.0)) // check for counter diffusion || ((temp_tissue_N2 < 0.0) && (temp_tissue_He > 0.0)) ) { @@ -2239,19 +2249,19 @@ } } - + // keep the saturating / desaturating flags from last invocation char_O_tissue_N2_saturation[ci] &= 128; char_O_tissue_He_saturation[ci] &= 128; - + // flip the flags applying a hysteresis of HYST (actual value: see #define of HYST) if( temp_tissue_N2 > +HYST ) char_O_tissue_N2_saturation[ci] = 128; // set flag for tissue pressure is increasing else if( temp_tissue_N2 < -HYST ) char_O_tissue_N2_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) if( temp_tissue_He > +HYST ) char_O_tissue_He_saturation[ci] = 128; // set flag for tissue pressure is increasing else if( temp_tissue_He < -HYST ) char_O_tissue_He_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) - - + + // For N2 tissue display purpose: // Scale tissue press so that saturation in 70m on AIR gives a value of approx. 80. // The surface steady-state tissue loading of [0.7902 * (pres_respiration - ppWater)] bar @@ -2259,13 +2269,13 @@ // This scaling is adapted to the capabilities of the tissue graphics in the custom views. temp_tissue = (pres_tissue_N2[ci] / N2_equilibrium) * 10; - // limit to 127 to leave space for sat/desat flag + // limit to 127 to leave space for sat/desat flag if (temp_tissue > 127) temp_tissue = 127; // export as integer char_O_tissue_N2_saturation[ci] += (unsigned char)temp_tissue; - + // For H2 tissue display purpose: // Scale tissue press so that saturation in 120m on TMX 10/70 gives a value of approx. 70. // With no He in a tissue, result will be 0. @@ -2274,122 +2284,205 @@ // limit to 127 to leave space for sat/desat flag if (temp_tissue > 127) temp_tissue = 127; - + // export as integer char_O_tissue_He_saturation[ci] += (unsigned char)temp_tissue; - } - - }// for + } //if + + } // for + + + // set deco flag if we are in deco and at least one of the real tissues is off-gassing + // clear deco flag if all of the real tissues are on-gassing + if ( (char_O_nullzeit == 0) && deco_tissue_vector ) char_O_deco_warnings |= DECO_FLAG; + else if ( !deco_tissue_vector ) char_O_deco_warnings &= ~DECO_FLAG; } ////////////////////////////////////////////////////////////////////////////// // calc_limit // -// New in v.111 : separated from calc_tissue(), and depends on GF value. +// Input: +// tissue_increment : selector for context: real or simulated tissues +// sim_pres_tissue_N2/_He : tissue pressures (used in simulated tissues context) +// pres_tissue_N2/_He : tissue pressures (used in real tissues context) // -static void calc_limit(void) +// Output: +// sim_ceiling : ceiling in bar relative pressure (only in simulated tissues context) +// ceiling : ceiling in bar relative pressure (only in real tissues context) +// int_O_ceiling : ceiling in mbar relative pressure (only in real tissues context) +// int_O_gradient_factor : gradient factor in % (only in real tissues context) +// +// Modified: +// char_O_deco_warnings : for IBCD, microbubbles and outside warning (only in real tissues context) +// +static void calc_limit(PARAMETER float GF_parameter) { - char_O_gtissue_no = 0; - calc_lead_tissue_limit = 0.0; - - // clear IBCD, microbubbles and outside warning flags (locked warnings will be preserved) - char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE); - - - for(ci=0; ci= threshold ) - { - char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); - - if( gf >= 1.0 ) - { - char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); - } - } + // context is real tissues + calc_pres_tissue_N2 = pres_tissue_N2[ci]; + calc_pres_tissue_He = pres_tissue_He[ci]; } else { - if( gf >= 1.0 ) - { - char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + // context is simulated tissues + calc_pres_tissue_N2 = sim_pres_tissue_N2[ci]; + calc_pres_tissue_He = sim_pres_tissue_He[ci]; + } + + // overall tissue pressure + pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He; + + // get the coefficients for tissue ci + read_Buhlmann_coefficients(); + + // adapt the coefficients according to the N2/He ratio in the tissue + var_N2_a = (var_N2_a * calc_pres_tissue_N2 + var_He_a * calc_pres_tissue_He) / pres_tissue; + var_N2_b = (var_N2_b * calc_pres_tissue_N2 + var_He_b * calc_pres_tissue_He) / pres_tissue; + + // calculate minimum ambient pressure that the tissue can withstand according to straight Buhlmann + pres_min = (pres_tissue - var_N2_a) * var_N2_b; + + // next calculations are only relevant when invoked on the real tissues + if( tissue_increment & TISSUE_FLAG ) + { + overlay float supersat; + overlay float threshold; - if( gf >= threshold ) + // calculate current supersaturation value (1.0 = 100%) of this tissue + supersat = (pres_tissue - pres_respiration) / (pres_tissue - pres_min); + + // check if tissue is in supersaturation + if( supersat > 0.0 ) + { + // memorize highest supersaturation found + if( supersat > lead_supersat ) lead_supersat = supersat; + + // set a threshold value for the microbubbles and outside warnings + // ToDo: finalize the definition of the threshold + threshold = 0.02 * ci + 0.9; + + // check if this tissue is likely to develop microbubbles + // and/or if this tissue is outside of the Buhlmann model + if( ci <= 5 ) { - char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + if( supersat >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( supersat >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } + } + else // ci > 5 + { + if( supersat >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( supersat >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } } } } - - - // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. - // Note: the correction factor depends both on GF and b, - // Actual values are in the 1.5 .. 1.0 range (for a GF=30%), - // so that can change who is the leading gas... - // Note: Also depends of the GF. So the calculus is different for GF_low, current GF, or GF_high... - // *BUT* calc_tissue() is used to compute bottom time, hence what would happen at surface, - // hence at GF_high. - if( char_I_deco_model != 0 ) pres_min = ( pres_tissue - var_N2_a * ( GF_high) ) * var_N2_b - / ( GF_high + var_N2_b * (1.0 - GF_high) ); + + // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. + // Note: the correction factor depends both on GF and b, so that can change who is the + // leading gas... + if( char_I_deco_model != 0 ) pres_min = ( pres_tissue - (var_N2_a * GF_parameter) ) + / ( 1.0 - GF_parameter + (GF_parameter / var_N2_b ) ); // check if this tissue requires a higher ambient pressure than was found to be needed up to now - if( pres_min > calc_lead_tissue_limit ) - { - char_O_gtissue_no = ci; - calc_lead_tissue_limit = pres_min; - } - } - - // check IBCD condition - if( !IBCD_tissue_vector ) + if( pres_min > lead_tissue_limit ) + { + lead_tissue_limit = pres_min; + lead_tissue_no = ci; + } + } // for + + + // compile outputs + if( tissue_increment & TISSUE_FLAG ) { - char_O_deco_warnings &= ~DECO_WARNING_IBCD; // no IBCD in any tissue, clear flag + //--- real tissues ----------------------------------------------------- + + // check if leading tissue is in IBCD condition + if( (IBCD_tissue_vector & (1 << lead_tissue_no)) + && ((pres_tissue_N2[lead_tissue_no] + pres_tissue_He[lead_tissue_no]) > pres_respiration) ) + { + // leading tissue is in IBCD condition and in super-saturation, so issue a warning. + char_O_deco_warnings |= (DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock); + } + + + // compute ceiling in bar relative pressure + ceiling = lead_tissue_limit - pres_surface; + + // convert ceiling to int_O_ceiling in mbar + if ( ceiling <= 0 ) int_O_ceiling = 0; + else if ( ceiling > 16 ) int_O_ceiling = 16000; + // Compatibility version + else int_O_ceiling = (short)(ceiling * 1000); + + // New version: Rounds up to next 10 cm so that the ceiling disappears on the display only when the + // ceiling limit is really zero. This will coincident then with TTS switching back to NDL time. + // else int_O_ceiling = (short)(ceiling * 1000 + 9); + + + // convert highest supersaturation found to int_O_gradient_factor in % (1.0 = 100%) + // limit to 255 because of constraints in ghostwriter code + if ( lead_supersat <= 0.0 ) int_O_gradient_factor = 0; + else if( lead_supersat > 2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING; + else + { + int_O_gradient_factor = (unsigned int)(100 * lead_supersat + 0.5); + + if ( int_O_gradient_factor >= GF_WARNING_THRESHOLD ) + int_O_gradient_factor |= INT_FLAG_WARNING; + + else if ( int_O_gradient_factor >= char_I_GF_High_percentage ) + int_O_gradient_factor |= INT_FLAG_ATTENTION; + } } - else if( (IBCD_tissue_vector & (1 << char_O_gtissue_no)) - && ((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) > pres_respiration) ) + else { - // leading tissue is in IBCD condition and in super-saturation, set flags. - char_O_deco_warnings |= (DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock); + //--- simulated tissues ------------------------------------------------ + + // compute ceiling for the simulated tissues in bar relative pressure + sim_ceiling = lead_tissue_limit - pres_surface; } - - // set deco flag if we are in deco and at least one of the real tissues is off-gassing - // clear deco flag if all of the real tissues are on-gassing - if ( (char_O_nullzeit == 0) && deco_tissue_vector ) char_O_deco_warnings |= DECO_FLAG; - else if ( !deco_tissue_vector ) char_O_deco_warnings &= ~DECO_FLAG; - - - assert( char_O_gtissue_no < NUM_COMP ); - assert( 0.0 <= calc_lead_tissue_limit && calc_lead_tissue_limit <= 14.0); } ////////////////////////////////////////////////////////////////////////////// -// calc_nullzeit +// calc_NDL_time // // calculates the remaining bottom time // @@ -2397,97 +2490,153 @@ // exponential term to the M-value equation, making it impossible to // invert... So we have to make a fast-simu until we find a better way. // -// Input: pres_respiration -// Output: char_O_nullzeit / char_O_alternate_nullzeit +// Input: ppN2 +// ppHe // -static void calc_nullzeit(void) +// Output: NDL_time +// +static void calc_NDL_time(void) { - overlay unsigned char nullzeit = 240; - - - //---- Compute ppN2 and ppHe --------------------------------------------- - temp_deco = pres_respiration; - sim_alveolar_presures(); - - for(ci=0; ci= NUM_COMP ) ci -= NUM_COMP; + + // read Buhlmann a and b coefficients for tissue ci + read_Buhlmann_coefficients(); + + // read the loading factors for 10 minute periods + read_Buhlmann_times(2); - overlay float t = tN2 + tHe; - overlay unsigned char ndl; - overlay unsigned char period = 10; - - read_Buhlmann_coefficients(); - read_Buhlmann_times(2); // Starts with a 10min period. - - //---- Simulate for that tissue -------------------------------------- - // NOTE: No need to simulate for longer than the already found NDL. - for(ndl=0; ndl 0.0 ) dTN2 *= float_saturation_multiplier; - else dTN2 *= float_desaturation_multiplier; - - if( dTHe > 0.0 ) dTHe *= float_saturation_multiplier; - else dTHe *= float_saturation_multiplier; - - // adopt M0 value when using the GF extension - if (char_I_deco_model != 0 ) M0 = GF_high * (M0 - pres_surface) + pres_surface; - - //---- Simulate off-gassing while going to surface - // TODO ! - // dTN2 -= exp( ... ascent time ... ppN2...) - // dTHe -= exp( ... ascent time ... ppHe...) - - //---- Ok now, and still ok to surface after 1 or 10 minutes ? - if( (t <= M0) && (t + dTN2 + dTHe <= M0) ) - { - tN2 += dTN2; // YES: apply gas loadings, - tHe += dTHe; - t = tN2 + tHe; + // get the tissue pressures for N2 and He + calc_pres_tissue_N2 = sim_pres_tissue_N2[ci]; + calc_pres_tissue_He = sim_pres_tissue_He[ci]; + + // calculate the total pressure tissue + pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He; + + + // simulate an increasing bottom time and check when we hit the NDL ------------------------ + for( NDL_tissue = 0; NDL_tissue < NDL_time; ) // not needed to simulate for longer than the already found NDL + { + overlay float var_a; + overlay float var_b; + overlay float pres_limit; + overlay float delta_pres_tissue_N2; + overlay float delta_pres_tissue_He; + + + // adopt a and b coefficients to current N2/He ratio inside the tissue + var_a = (var_N2_a * calc_pres_tissue_N2 + var_He_a * calc_pres_tissue_He) / pres_tissue; + var_b = (var_N2_b * calc_pres_tissue_N2 + var_He_b * calc_pres_tissue_He) / pres_tissue; + + // compute pressure limit for tissues under surface pressure conditions + pres_limit = (var_a + pres_surface / var_b); + + // adopt pressure limit when using the GF extension + if (char_I_deco_model != 0 ) pres_limit = GF_high * (pres_limit - pres_surface) + pres_surface; + + //---- Check if this tissue is already beyond the NDL + if( pres_tissue > pres_limit) + { + // NO - finish the outer loop, + i = NUM_COMP; + + // and finish the inner loop + break; + } + + // compute delta to tissue pressures in 10 or 1 minutes of time ahead + delta_pres_tissue_N2 = (ppN2 - calc_pres_tissue_N2) * var_N2_e; + delta_pres_tissue_He = (ppHe - calc_pres_tissue_He) * var_He_e; + + // apply safety factors to the pressure deltas + // NDL can be computed while ascending, so we have to check if we are saturating or desaturating + if( delta_pres_tissue_N2 > 0.0 ) delta_pres_tissue_N2 *= float_saturation_multiplier; + else delta_pres_tissue_N2 *= float_desaturation_multiplier; + + if( delta_pres_tissue_He > 0.0 ) delta_pres_tissue_He *= float_saturation_multiplier; + else delta_pres_tissue_He *= float_saturation_multiplier; + + // Simulate off-gassing while going to surface + // TODO ! + // delta_pres_tissue_N2 -= exp( ... ascent time ... ppN2...) + // delta_pres_tissue_He -= exp( ... ascent time ... ppHe...) + + // within NDL now, but still within in 10 or 1 minutes from now? + if( pres_tissue + delta_pres_tissue_N2 + delta_pres_tissue_He <= pres_limit ) + { + // YES - apply the pressure deltas to tissues + calc_pres_tissue_N2 += delta_pres_tissue_N2; + calc_pres_tissue_He += delta_pres_tissue_He; - ndl += period; // increment NDL, - - continue; // and loop. - } - - //---- Should we retry with smaller steps ? - if( period == 10 ) - { - read_Buhlmann_times(1); // 1min coefs. - period = 1; - - continue; - } - - //---- ELSE make a linear approx for the last minute - // Useful to have a meaningful rounding of NDL. - // But ONLY if positive (negative casted to unsigned is bad). - if( M0 > t ) ndl += (unsigned char)(0.5f + (M0-t)/(dTN2+dTHe)); - - break; - } - - // Keep the shortest NDL found - if ( ndl < nullzeit ) nullzeit = ndl; - } - - if( char_O_deco_status & DECO_PLAN_ALTERNATE) char_O_alternate_nullzeit = nullzeit; - else char_O_nullzeit = nullzeit; + // update the overall tissue pressure + pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He; + + // increment the NDL + NDL_tissue += period; + + // do next loop + continue; + } + + // NO - if delta pressures were for 10 minutes of time ahead, try with 1 minute ahead + if( period == 10 ) + { + // reduce period to 1 minute + period = 1; + + // read the loading factors for 1 minute periods + read_Buhlmann_times(1); + + // do next loop + continue; + } + + // NO - not even within NDL in just one more minute, so make a linear approx for the last minute + // (make a meaningful rounding of NDL, but ONLY if positive: negative casted to unsigned is bad) + if( pres_limit > pres_tissue ) + NDL_tissue += (unsigned char)(0.5 + (pres_limit - pres_tissue ) + / (delta_pres_tissue_N2 + delta_pres_tissue_He) ); + + // finish the inner loop + break; + } + + // is the current NDL short than the shortest so far? + if ( NDL_tissue < NDL_time ) + { + // keep the current's tissue NDL as the new shortest NDL + NDL_time = NDL_tissue; + + // store the causing tissue + new_NDL_lead_tissue = ci; + } + + // if NDL is > 0 the outer loop will continues with the next tissue + // if NDL found to be overrun, outer loop will be terminated through i = NUM_COMP statement + } + + // store the NDL dominating tissue for to start with in the next NDL calculation + NDL_lead_tissue = new_NDL_lead_tissue; } ////////////////////////////////////////////////////////////////////////////// @@ -2496,22 +2645,27 @@ // Sum up ascent from bottom to surface at float_ascent_speed, // but 1 minute per meter for the final ascent, and all stops. // -// Result in int_O_ascenttime, -// or int_O_alternate_ascenttime if doing the alternative plan. +// Input: char_I_depth_last_deco +// pres_respiration +// pres_surface +// float_ascent_speed +// internal_deco_depth[] +// +// Output: ascent_time // static void calc_ascenttime(void) { - overlay unsigned char x; - overlay unsigned short sum; - + overlay unsigned char x; + + // preset final ascent overlay float final = (float)char_I_depth_last_deco; - // calculate depth - overlay float ascent = (pres_respiration - pres_surface) * BAR_TO_METER; - + // calculate depth + overlay float ascent = (pres_respiration - pres_surface) * BAR_TO_METER; + // check if we are already in final ascent - if (ascent <= final) + if (ascent <= final) { // yes - all ascent is final ascent final = ascent; @@ -2521,99 +2675,28 @@ { // no - subtract final ascent part from overall ascent ascent -= final; - + // compute time for ascent part without final ascent - ascent /= float_ascent_speed; + ascent /= float_ascent_speed; } - - // add 1 minute for each meter of final ascent + + // add 1 minute for each meter of final ascent ascent += final; - + // convert to integer - sum = (unsigned short)(ascent + 0.5); + ascent_time = (unsigned short)(ascent + 0.5); // add all stop times - for(x=0; x 999) sum = 999; - + if( ascent_time > 999) ascent_time = 999; + // tag result as invalid if there is an overflow in the stops table - if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) sum |= INT_FLAG_INVALID; - - // route result to output variable - if( char_O_deco_status & DECO_PLAN_ALTERNATE ) int_O_alternate_ascenttime = sum; - else int_O_ascenttime = sum; -} - -////////////////////////////////////////////////////////////////////////////// -// update_startvalues -// -// updated in v.102 -// -void update_startvalues(void) -{ - overlay unsigned char x; - - // Start ascent simulation with current tissue partial pressures. - for(x=0; x sim_lead_tissue_limit ) - { - sim_lead_tissue_no = ci; - sim_lead_tissue_limit = p; - } - } // for ci - - assert( sim_lead_tissue_no < NUM_COMP ); - assert( 0.0 <= sim_lead_tissue_limit && sim_lead_tissue_limit <= 14.0 ); -} ////////////////////////////////////////////////////////////////////////////// // clear_deco_table @@ -2621,14 +2704,14 @@ // static void clear_deco_table(void) { - overlay unsigned char x; - - for(x=0; x 0 ); // No stop at surface... + assert( sim_depth_limit > 0 ); // No stop at surface... // loop through internal deco table for(x=0; x respiration (currently off-gassing) - // GF = 0.00 when respiration == tissue, ie. dissolved gases are at equilibrium. - // GF = 1.00 when respiration == limit. - temp_tissue = N2 + He; - if( temp_tissue <= pres_respiration ) - { - gf = 0.0; - int_O_gradient_factor = 0; - } - else - { - overlay float limit = calc_lead_tissue_limit; - // NOTE: in GF model, calc_lead_tissue_limit include already the - // correction due to gradient factor. To compute the actual - // current GF, we need to (re-)compute the raw ambient-pressure - // limit from the Buhlmann model. - if( char_I_deco_model != 0 ) - { - ci = char_O_gtissue_no; - - read_Buhlmann_coefficients(); - - var_N2_a = (var_N2_a * N2 + var_He_a * He) / temp_tissue; - var_N2_b = (var_N2_b * N2 + var_He_b * He) / temp_tissue; - - limit = (temp_tissue - var_N2_a) * var_N2_b; - } - - gf = (temp_tissue - pres_respiration) / (temp_tissue - limit); - - // limit to 255 because of constraints in ghostwriter code - if ( gf <= 0.0 ) int_O_gradient_factor = 0; - else if( gf > 2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING; - else - { - int_O_gradient_factor = (unsigned int)(100 * gf + 0.5); - - if ( int_O_gradient_factor >= GF_warning_threshold ) - int_O_gradient_factor |= INT_FLAG_WARNING; - - else if ( int_O_gradient_factor >= char_I_GF_High_percentage ) - int_O_gradient_factor |= INT_FLAG_PREWARNING; - } - } -} ////////////////////////////////////////////////////////////////////////////// // calc_desaturation_time @@ -2768,21 +2790,22 @@ // void calc_desaturation_time_helper(void) { - if( pres_actual > pres_target ) // check if actual pressure is higher then target pressure - { // YES - compute remaining time + if( pres_actual > pres_target ) // check if actual pressure is higher then target pressure + { // YES - compute remaining time overlay float pres_ratio; - + pres_ratio = pres_actual / pres_target; // Compute desaturation time with result rounded up to multiples of 10 minutes. - // Main purpose is to avoid confusion, because the times do not clock down in one minute steps any more - // but get constantly re-computed according to current ambient pressure and may therefor make steps of - // several minutes forwards and backwards as ambient pressure rises and falls. - short_time = (unsigned short)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 ); + // Main purpose is to avoid confusion, because the times do not clock down in + // one minute steps any more but get constantly re-computed according to current + // ambient pressure and may therefor make steps of several minutes forwards and + // backwards as ambient pressure rises and falls. + int_time = (unsigned int)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 ); } else - { // NO - desaturation state reached, no remaining time - short_time = 0; + { // NO - desaturation state reached, no remaining time + int_time = 0; } } @@ -2791,34 +2814,42 @@ // void calc_desaturation_time(void) { - assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); - assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); - - - N2_ratio = 0.7902; // fraction of N2 in respired air - pres_surface = 0.001 * int_I_pres_surface; // surface pressure in bar - N2_equilibrium = N2_ratio * (pres_surface - ppWater); // partial pressure of N2 in respired air - desat_factor = 0.06931 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; // pre-computed term for later use: - // 10 [Min] * 0.01 [%] * 0.6931 [ln(2)] * ... + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + // fraction of inert gases in respired air + N2_ratio = 0.7902; + He_ratio = 0.0; + + // surface pressure in bar + pres_surface = 0.001 * int_I_pres_surface; + + // partial pressure of N2 in respired air + N2_equilibrium = N2_ratio * (pres_surface - ppWater); + + // pre-computed term for later use: 10 [Min] * 0.01 [%] * 0.6931 [=log(2)] * ... + desat_factor = 0.06931 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; + + // initialize vars int_O_desaturation_time = 0; - int_O_nofly_time = 0; - - - for(ci=NUM_COMP; ci>0;) - { - overlay float pres_tissue_max; - overlay float P_ambient_altitude; - overlay signed char search_direction; - overlay unsigned short nofly_N2 = 0; - overlay unsigned short nofly_He = 0; - overlay unsigned short nofly_last = ~0; - - + int_O_nofly_time = 0; + + + for(ci=NUM_COMP; ci>0;) + { + overlay float pres_tissue_max; + overlay float P_ambient_altitude; + overlay signed char search_direction; + overlay unsigned int nofly_N2 = 0; + overlay unsigned int nofly_He = 0; + overlay unsigned int nofly_last = ~0; + + ci -= 1; - - read_Buhlmann_ht(); + + read_Buhlmann_ht(); read_Buhlmann_coefficients(); - + // get selected target altitude switch( char_I_altitude_wait ) { @@ -2827,19 +2858,18 @@ case 3: P_ambient_altitude = P_ambient_3000m; break; default: P_ambient_altitude = P_ambient_fly; break; } - + // Target pressure for the tissue is the Buhlmann limit. We use the Buhlmann // coefficients for N2 also for He because it is easier to calculate and the // N2 coefficients are more conservative than those for He, so we are on the // safe side, too. - pres_tissue_max = (P_ambient_altitude/var_N2_b + var_N2_a); - + pres_tissue_max = (P_ambient_altitude/var_N2_b + var_N2_a); + // Adjust target pressure in case the GF model is in use by GF-high if( char_I_deco_model != 0 ) - { - pres_tissue_max = ((pres_tissue_max - P_ambient_altitude) * char_I_GF_High_percentage * 0.01) + P_ambient_altitude; - } - + pres_tissue_max = P_ambient_altitude + + 0.01 * char_I_GF_High_percentage * (pres_tissue_max - P_ambient_altitude); + // // Desaturation time @@ -2849,7 +2879,7 @@ pres_actual = pres_tissue_N2[ci] - N2_equilibrium; // N2: half-time of the current tissue - var_ht = var_N2_ht; + var_ht = var_N2_ht; // Calculate desaturation time for N2 in tissue. // Desaturated state is defined as residual tissue pressure <= 1.05 x ppN2 respired @@ -2858,15 +2888,15 @@ calc_desaturation_time_helper(); - if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; - - - // He: actual amount of tissue pressure above equilibrium. - pres_actual = pres_tissue_He[ci]; // equilibrium for He is 0 bar + if( int_time > int_O_desaturation_time) int_O_desaturation_time = int_time; + + + // He: actual amount of tissue pressure above equilibrium: equilibrium for He is 0 bar + pres_actual = pres_tissue_He[ci]; // He: half-time of the current tissue - var_ht = var_He_ht; - + var_ht = var_He_ht; + // Calculate desaturation time for He in the tissue. // Desaturated state is defined as residual tissue pressure <= 0.05 x ppN2 respired @@ -2874,7 +2904,7 @@ calc_desaturation_time_helper(); - if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; + if( int_time > int_O_desaturation_time) int_O_desaturation_time = int_time; // @@ -2883,15 +2913,15 @@ // initialize search direction search_direction = 0; - + for(;;) { // N2: actual amount of tissue pressure above equilibrium. pres_actual = pres_tissue_N2[ci] - N2_equilibrium; - + // N2: half-time of the current tissue - var_ht = var_N2_ht; - + var_ht = var_N2_ht; + // Calculate no-fly time for N2 in the tissue. // Flying is permitted when the N2 pressure fits into the assigned fraction above equilibrium. @@ -2905,22 +2935,22 @@ else { calc_desaturation_time_helper(); - nofly_N2 = short_time; + nofly_N2 = int_time; } - + // He: actual amount of tissue pressure above equilibrium - equilibrium for He is 0 bar. pres_actual = pres_tissue_He[ci]; // He: half-time of the current tissue - var_ht = var_He_ht; - + var_ht = var_He_ht; + // Calculate no-fly time for He in the tissue. // Flying is permitted when the He pressure fits into the assigned fraction. - pres_target = ((100 - split_N2_He[ci]) * 0.01) * (pres_tissue_max - N2_equilibrium); + pres_target = (0.01 * (100 - split_N2_He[ci])) * (pres_tissue_max - N2_equilibrium); calc_desaturation_time_helper(); - nofly_He = short_time; + nofly_He = int_time; // Because the sum of N2 and He tissue pressures needs to fit into the Buhlmann limit for @@ -2931,12 +2961,12 @@ // in the deco calculation code (although we tackle the same base problem here), so we just let // the computer try out which split will balance the no-fly times induced by the N2 and the He // at best. - + // first of all, skip any optimization in case the current compartment is not the leading one if( (nofly_N2 <= int_O_nofly_time) && (nofly_He <= int_O_nofly_time) ) break; // check if the N2 requires more waiting time than the He - if( nofly_N2 >= nofly_He ) + if( nofly_N2 >= nofly_He ) { // check if the search direction has changed, which means we are beyond the // optimum now, or if we are at the upper stop limit of split_N2_He @@ -2949,8 +2979,8 @@ } // store the no-fly time found in this iteration - nofly_last = nofly_N2; - + nofly_last = nofly_N2; + // increase the N2 fraction of the split and set search direction towards more N2 split_N2_He[ci] += 1; search_direction = +1; @@ -2960,7 +2990,7 @@ // check if the search direction has changed, which means we are beyond the // optimum now, or if we are at the lower stop limit of split_N2_He if( (search_direction > 0) || (split_N2_He[ci] == 1) ) - { + { // Either the just completed iteration was more close to the optimum or the one before // was, so we take the best (i.e. shortest) time of both as the final no-fly time. int_O_nofly_time = (nofly_He < nofly_last) ? nofly_He : nofly_last; @@ -2968,388 +2998,292 @@ } // store the no-fly time found in this iteration - nofly_last = nofly_He; - + nofly_last = nofly_He; + // decrease the N2 fraction of the split and set search direction towards less N2 split_N2_He[ci] -= 1; search_direction = -1; } - + } // for(;;) } // for(compartments) - + // Rescale int_O_desaturation_time and int_O_nofly_time to full minutes for display purpose int_O_desaturation_time *= 10; int_O_nofly_time *= 10; - + // Limit int_O_desaturation_time and int_O_nofly_time to 5999 = 99 hours + 59 minutes // because of display space constraints and rounding done above. if( int_O_desaturation_time > 5999 ) int_O_desaturation_time = 5999; if( int_O_nofly_time > 5999 ) int_O_nofly_time = 5999; - // Clear the microbubbles warning when the current gradient factor is < GF_warning_threshold. + // Clear the microbubbles warning when the current gradient factor is < GF_WARNING_THRESHOLD. // As the locked warning will stay set, this will cause the warning be be displayed in attention // color instead of warning color. - if( int_O_gradient_factor < GF_warning_threshold ) char_O_deco_warnings &= ~DECO_WARNING_MBUBBLES; - + if( int_O_gradient_factor < GF_WARNING_THRESHOLD ) + char_O_deco_warnings &= ~DECO_WARNING_MBUBBLES; + // clear some warnings when the desaturation time has become zero - if( int_O_desaturation_time == 0 ) char_O_deco_warnings &= ~( DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock - + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock - + DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); + if( int_O_desaturation_time == 0 ) + char_O_deco_warnings &= ~( DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock + + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock + + DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); } ////////////////////////////////////////////////////////////////////////////// -// calc_wo_deco_step_1_min +// Calculate desaturation of the real tissues for a given time interval // -// optimized in v.101 (...saturation_multiplier) -// desaturation slowed down to 70,42% +// Caution: Works on the real tissues! +// If in doubt, use this function only inside a context surrounded with +// push_tissues_to_vault() / pull_tissues_from_vault() ! +// +// Input: int_I_pres_surface : surface pressure in mbar +// time_interval : time interval in minutes, must be limited to 254 at max // -// Input: int_I_pres_surface [mbar] +// Modified: tissue pressures +// CNS value +// ceiling and current GF // -static void calc_wo_deco_step_1_min(void) +static void calc_interval(PARAMETER unsigned char time_interval) { - assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); - assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); - assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + overlay unsigned char time; + + + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + // setup input data for deco routines - pres_respiration = pres_surface = int_I_pres_surface * 0.001; - - N2_ratio = 0.7902; // according to Buhlmann + pres_respiration = pres_surface = 0.001 * int_I_pres_surface ; + + N2_ratio = 0.7902; // according to Buhlmann N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling - ppN2 = N2_ratio * (pres_respiration - ppWater); - ppHe = 0.0; - - float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; - float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - - - // program what to do: 128 = Flag for "real" tissues, 1 = 1 minute - tissue_increment = 128 + 1; - - // update the pressure in the tissues N2/He in accordance with the new ambient pressure - calc_tissue(); - - // clock down CNS by a 1 minute step - //CNS_fraction *= 0.992327946; // is done in deco_calc_CNS_decrease_15min - - // compute integer copy of CNS value - //compute_CNS_for_display(); // is done in deco_calc_CNS_decrease_15min - - // reset deco engine start condition (probably not needed to be done here...) - char_O_deco_status &= ~DECO_STATUS_MASK; // clear bits - char_O_deco_status |= DECO_STATUS_INIT; // set bits - - // reset some more data that are not applicable in surface mode - char_O_nullzeit = 0; - int_O_ascenttime = 0; - int_O_alternate_ascenttime = 0; - clear_deco_table(); - - // calculate gradient factor - calc_gradient_factor(); -} - -////////////////////////////////////////////////////////////////////////////// -// calc_dive_interval -// -// Prepare tissue for delay before the next dive simulation. -// -// Inputs: char_I_dive_interval == delay before dive (in 1 Minute steps). -// Modified: CNS_fraction, int_O_CNS_fraction -// pres_tissue_N2/He[] -// -// Should be protected by deco_push_tissues_to_vault(), -// deco_pull_tissues_from_vault() -// -// desaturation slowed down to 70,42%. -// -static void calc_dive_interval(void) -{ - overlay unsigned char t; - - //---- Initialize simulation parameters ---------------------------------- - pres_respiration = pres_surface = int_I_pres_surface * 0.001; - - N2_ratio = 0.7902; // according to buehlmann - N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling - ppN2 = N2_ratio * (pres_respiration - ppWater); - ppHe = 0.0; - - float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; - float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - - //---- Perform simulation ------------------------------------------------ - - // Calculate tissues: - // Because tissue_increment is limited to 127 minutes, we have to do two passes - // in case char_I_dive_interval is bigger than 127. - // Ops: char_I_dive_interval must be limited to 254! - - t = char_I_dive_interval; - - if ( t == 255 ) t = 254; - - if ( t > 127 ) // extra pass needed? + ppN2 = N2_ratio * (pres_respiration - ppWater); + ppHe = 0.0; + + float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; + float_saturation_multiplier = 0.01 * char_I_saturation_multiplier; + + + // Calculate the tissues: + // Because calc_tissues() can calculate for 127 minutes at max, + // the tissue updating may need to be done in two chunks. + + time = time_interval; + + // first chunk for the part exceeding 127 minutes + if( time > 127) { - tissue_increment = 127 // dive interval length in minutes - | 128; // Flag to update the "real" tissues - - calc_tissue(); // update tissues - - t -= 127; // calculate remaining dive interval length + // do a full 127 minutes on the real tissues + tissue_increment = 127 | TISSUE_FLAG; + calc_tissues(); + + // determine the remaining part + time -= 127; } - tissue_increment = t // dive interval length in minutes to do - | 128; // Flag to update the "real" tissues - calc_tissue(); // update tissues - + // program the remaining part (or full part if not exceeding 127 minutes) + tissue_increment = time | TISSUE_FLAG; + + // update the N2 and He pressures in the tissues for the remaining part of the time interval + calc_tissues(); + // Calculate CNS: // To speed up things and because on most invocations of this code char_I_dive_interval // is a multiple of 10 minutes, we loop the loop-counter down using two speeds. - t = char_I_dive_interval; - - while ( t ) + time = time_interval; + + while ( time ) { - if( t > 9 ) + if( time > 9 ) { CNS_fraction *= 0.925874712; // Half-time = 90min -> 10 min: (1/2)^(1/9) - t -= 10; // fast speed looping + time -= 10; // fast speed looping } else { CNS_fraction *= 0.992327946; // Half-time = 90min -> 1 min: (1/2)^(1/90) - t -= 1; // slow speed looping + time -= 1; // slow speed looping } - } + } // compute integer copy of CNS value - compute_CNS_for_display(); + convert_CNS_for_display(); + + + // calculate ceiling (for a GF high of 100%) and gradient factor + calc_limit(1.0); } -////////////////////////////////////////////////////////////////////////////// -// clear_CNS_fraction -// -// new in v.101 -// -void clear_CNS_fraction(void) -{ - CNS_fraction = CNS_sim_norm_fraction = CNS_sim_alt_fraction = 0; - int_O_CNS_fraction = int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = 0; -} ////////////////////////////////////////////////////////////////////////////// -// calc_CNS_fraction +// calc_CNS_increment // -// Input: char_actual_ppO2 : current ppO2 [decibars] -// tissue_increment : time increment and tissue selector -// CNS_fraction : current CNS% as float before period +// Input: char_ppO2 : current ppO2 [decibars] +// tissue_increment : time increment and tissue selector +// +// Output: CNS_fraction_inc : increment of the CNS value // -// Output: CNS_fraction, int_O_CNS_fraction - for the real tissues -// CNS_sim_norm_fraction, int_O_normal_CNS_fraction - in simulation mode, normal plan -// CNS_sim_alt_fraction, int_O_alternate_CNS_fraction - in simulation mode, alternative plan -// -void calc_CNS_fraction(void) +void calc_CNS_increment(void) { - overlay float time_factor = 1.0; // default is 2sec - overlay float CNS_fraction_temp = 0.0; - - assert( char_actual_ppO2 > 15 ); - + overlay float time_factor = 1.0; // default is 2sec + + assert( char_ppO2 > 15 ); + // All deco code is now invoked every second. But as the CNS update is based on // 2 seconds periods, we skip every 2nd seconds-based invocation of this function. - // 128 = 128 (flag for "real" CNS) + 0 (2 seconds period) + // TISSUE_FLAG = 128 (flag for "real" CNS) + 0 (2 seconds period) // To distribute computational load, the CNS% is calculated in "the other second" // than the tissues. - if( (tissue_increment == 128) && (twosectimer) ) return; - + if( (tissue_increment == TISSUE_FLAG) && (twosectimer) ) return; + // adjust time factor if minute-based stepping is commanded, mask out flag bit - if( tissue_increment & 127 ) time_factor = 30.0 * (float)(tissue_increment & 127); - - - //------------------------------------------------------------------------ - // Don't increase CNS below 0.5 bar, but keep it steady. - if (char_actual_ppO2 < 50) - ; // no changes - //------------------------------------------------------------------------ - // Below (and including) 1.60 bar - else if (char_actual_ppO2 < 61) - CNS_fraction_temp = time_factor/(-533.07 * char_actual_ppO2 + 54000.0); - else if (char_actual_ppO2 < 71) - CNS_fraction_temp = time_factor/(-444.22 * char_actual_ppO2 + 48600.0); - else if (char_actual_ppO2 < 81) - CNS_fraction_temp = time_factor/(-355.38 * char_actual_ppO2 + 42300.0); - else if (char_actual_ppO2 < 91) - CNS_fraction_temp = time_factor/(-266.53 * char_actual_ppO2 + 35100.0); - else if (char_actual_ppO2 < 111) - CNS_fraction_temp = time_factor/(-177.69 * char_actual_ppO2 + 27000.0); - else if (char_actual_ppO2 < 152) - CNS_fraction_temp = time_factor/( -88.84 * char_actual_ppO2 + 17100.0); - else if (char_actual_ppO2 < 167) - CNS_fraction_temp = time_factor/(-222.11 * char_actual_ppO2 + 37350.0); - //------------------------------------------------------------------------ - // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity: - // J Appl Physiol 92: 248--256, 2002, doi:10.1152/japplphysiol.00434.2001 - // Formula (A1) based on value for 1.55 and c=20 - // example calculation: Sqrt((1.7/1.55)^20)*0.000404 - else if (char_actual_ppO2 < 172) - CNS_fraction_temp = time_factor*0.00102; - else if (char_actual_ppO2 < 177) - CNS_fraction_temp = time_factor*0.00136; - else if (char_actual_ppO2 < 182) - CNS_fraction_temp = time_factor*0.00180; - else if (char_actual_ppO2 < 187) - CNS_fraction_temp = time_factor*0.00237; - else if (char_actual_ppO2 < 192) - CNS_fraction_temp = time_factor*0.00310; - else if (char_actual_ppO2 < 198) - CNS_fraction_temp = time_factor*0.00401; - else if (char_actual_ppO2 < 203) - CNS_fraction_temp = time_factor*0.00517; - else if (char_actual_ppO2 < 233) - CNS_fraction_temp = time_factor*0.0209; - else - CNS_fraction_temp = time_factor*0.0482; // value for 2.5 bar, used for 2.33 bar and above - - - // Check from where we were called: - // flag (bit 7) is set -> we were called from calc_hauptroutine() - // flag (bit 7) not set -> we were called from the deco planning routines - if ( tissue_increment & 128 ) CNS_fraction += CNS_fraction_temp; // real tissues - else if ( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction += CNS_fraction_temp; // alternative plan - else CNS_sim_norm_fraction += CNS_fraction_temp; // normal plan - + if( tissue_increment & TIME_MASK ) time_factor = 30.0 * (float)(tissue_increment & TIME_MASK); + + + //------------------------------------------------------------------------ + // Don't increase CNS below 0.5 bar, but keep it steady. + if (char_ppO2 < 50) CNS_fraction_inc = 0; // no CNS increase below 0.5 bar ppO2 + //------------------------------------------------------------------------ + // Below (and including) 1.60 bar + else if (char_ppO2 < 61) CNS_fraction_inc = time_factor/(-533.07 * char_ppO2 + 54000.0); + else if (char_ppO2 < 71) CNS_fraction_inc = time_factor/(-444.22 * char_ppO2 + 48600.0); + else if (char_ppO2 < 81) CNS_fraction_inc = time_factor/(-355.38 * char_ppO2 + 42300.0); + else if (char_ppO2 < 91) CNS_fraction_inc = time_factor/(-266.53 * char_ppO2 + 35100.0); + else if (char_ppO2 < 111) CNS_fraction_inc = time_factor/(-177.69 * char_ppO2 + 27000.0); + else if (char_ppO2 < 152) CNS_fraction_inc = time_factor/( -88.84 * char_ppO2 + 17100.0); + else if (char_ppO2 < 167) CNS_fraction_inc = time_factor/(-222.11 * char_ppO2 + 37350.0); + //------------------------------------------------------------------------ + // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity: + // J Appl Physiol 92: 248--256, 2002, doi:10.1152/japplphysiol.00434.2001 + // Formula (A1) based on value for 1.55 and c=20 + // example calculation: Sqrt((1.7/1.55)^20)*0.000404 + else if (char_ppO2 < 172) CNS_fraction_inc = time_factor*0.00102; + else if (char_ppO2 < 177) CNS_fraction_inc = time_factor*0.00136; + else if (char_ppO2 < 182) CNS_fraction_inc = time_factor*0.00180; + else if (char_ppO2 < 187) CNS_fraction_inc = time_factor*0.00237; + else if (char_ppO2 < 192) CNS_fraction_inc = time_factor*0.00310; + else if (char_ppO2 < 198) CNS_fraction_inc = time_factor*0.00401; + else if (char_ppO2 < 203) CNS_fraction_inc = time_factor*0.00517; + else if (char_ppO2 < 233) CNS_fraction_inc = time_factor*0.0209; + else CNS_fraction_inc = time_factor*0.0482; // value for 2.5 bar, used for 2.33 bar and above } ////////////////////////////////////////////////////////////////////////////// // calc_CNS_planning // -// Compute CNS during predicted ascent. +// Compute CNS increase during predicted ascent // -// Note: Needs a call to deco_push_tissues_to_vault(), -// deco_pull_tissues_from_vault() to avoid trashing everything... -// -// Input: CNS_fraction, internal_deco_time[], internal_deco_depth[], internal_deco_gas[] -// Output: CNS_fraction, int_O_normal_CNS_fraction / int_O_alternate_CNS_fraction +// Input: internal_deco_time[], internal_deco_depth[], internal_deco_gas[] +// Output: sim_CNS_fraction // void calc_CNS_planning(void) { - // start with CNS% we already have - if( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction = CNS_fraction; - else CNS_sim_norm_fraction = CNS_fraction; - - - //---- CCR mode : do the full TTS at once --------------------------------- + // null sim_CNS_fraction + sim_CNS_fraction = 0.0; + + //---- CCR mode : do the full TTS at once --------------------------------- if( ((char_O_deco_status & DECO_MODE_MASK) == DECO_MODE_CCR) ) - { - overlay unsigned short t; // needs 16 bits here ! + { + overlay unsigned short t; // needs 16 bits here ! // get current ppO2 from sensors or setpoint - char_actual_ppO2 = char_I_const_ppO2; + char_ppO2 = char_I_const_ppO2; // calculate CNS% for the period of additional staying at bottom depth (fTTS / delayed ascent) if( char_O_deco_status & DECO_ASCENT_DELAYED) { - tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time - calc_CNS_fraction(); + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_increment(); // calculate the CNS increment + sim_CNS_fraction += CNS_fraction_inc; // sum up } - + // get the ascent time dependent on the current plan t = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? int_O_alternate_ascenttime : int_O_ascenttime; - + // start simulating CNS% in chunks of 127 minutes tissue_increment = 127; while( t > 127 ) { t -= 127; // tissue_increment is limited to 127 minutes because of flag in bit 7 - calc_CNS_fraction(); // calculate CNS in chunks of full 127 minutes + calc_CNS_increment(); // calculate CNS in chunks of full 127 minutes + sim_CNS_fraction += CNS_fraction_inc; // sum up } tissue_increment = (char)t; // get the remaining minutes <= 127 - calc_CNS_fraction(); // calculate CNS for the remaining minutes - } + calc_CNS_increment(); // calculate CNS for the remaining minutes + sim_CNS_fraction += CNS_fraction_inc; // sum up + } else //---- OC mode and pSCR without sensors: have to follow all gas switches... ----- - { + { overlay float float_actual_ppO2; overlay float abs_pres; overlay unsigned char stop_depth; overlay unsigned char last_gas; - overlay unsigned char i; // stop table index - - + overlay unsigned char i; // stop table index + + // retrieve bottom gas: 1-5 for the configured gases or 0 for the manually set gas last_gas = sim_gas_last_used = sim_gas_first_used; // get the calc_N2/He/O2_ratios of the bottom gas - gas_switch_set(); + gas_set_ratios(); // calculate absolute pressure abs_pres = pres_surface + bottom_depth * METER_TO_BAR; - - // switch on deco mode pSCR / OC - if( char_O_deco_status & DECO_MODE_PSCR ) - { - //---- pSCR calculated -------------------------------------------- - - // abs_pres is 0.0 ... in bar - // calc_O2_ratio is 0.0 ... 1.0 as factor - // char_I_PSCR_drop is 0 ... 15 as % - // char_I_PSCR_lungratio is 5 ... 20 as % - // float_actual_ppO2 is 0.0 ... in cbar (!) - - float_actual_ppO2 = (100 * abs_pres * calc_O2_ratio) - - (1.0 - calc_O2_ratio) * char_I_PSCR_drop * char_I_PSCR_lungratio; - } - else - { - //---- OC --------------------------------------------------------- - - float_actual_ppO2 = abs_pres * calc_O2_ratio * 100; // in cbar (!) - } - - // caution: float_actual_ppO2 is in cbar here! - if ( float_actual_ppO2 < 0.0 ) char_actual_ppO2 = 0; - else if ( float_actual_ppO2 > 254.5 ) char_actual_ppO2 = 255; - else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); - + + // calculate OC ppO2 (ppWater omitted here on purpose) + float_actual_ppO2 = abs_pres * sim_O2_ratio; + + // correct ppO2 in case of pSCR mode by drop + if( char_O_deco_status & DECO_MODE_PSCR ) float_actual_ppO2 -= sim_pSCR_drop; + + // convert ppO2 from float to char + if ( float_actual_ppO2 < 0.0 ) char_ppO2 = 0; + else if ( float_actual_ppO2 > 2.545 ) char_ppO2 = 255; + else char_ppO2 = (unsigned char)(100 * float_actual_ppO2 + 0.5); + // simulate extended bottom time (fTTS) / delay before ascent (bailout) if configured if( char_O_deco_status & DECO_ASCENT_DELAYED ) { - tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time - calc_CNS_fraction(); + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_increment(); // calculate the CNS increment + sim_CNS_fraction += CNS_fraction_inc; // sum up } - + // For simplicity reason (non-linearity of the relation between ppO2 and CNS increments), the // whole ascent is calculated with bottom ppO2. This errs, but it does so to the safe side. - + // calculate ascent time (integer division and generous round-up) tissue_increment = bottom_depth / char_I_ascent_speed + 1; - - // ** commented out - not needed when char_I_ascent_speed is limited to a - // ** minimum of 2.something, it is indeed limited to 5. + + // ** commented out - not needed when char_I_ascent_speed is limited to a minimum + // ** of 2.something, it is indeed limited to a minimum of 5. // // // limit tissue_increment to 127 minutes - // if( tissue_increment > 127 ) tissue_increment = 127; + // if( tissue_increment > 127 ) tissue_increment = 127; // simulate the CNS increase - calc_CNS_fraction(); - - - //---- Stops --------------------------------------------------------- + calc_CNS_increment(); // calculate the CNS increment + sim_CNS_fraction += CNS_fraction_inc; // sum up + + + //---- Stops --------------------------------------------------------- - for(i=0; i 254.5 ) char_actual_ppO2 = 255; - else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); - - + + // calculate OC ppO2 (ppWater omitted here on purpose) + float_actual_ppO2 = abs_pres * sim_O2_ratio; + + // correct ppO2 in case of pSCR mode by drop + if( char_O_deco_status & DECO_MODE_PSCR ) float_actual_ppO2 -= sim_pSCR_drop; + + // convert ppO2 from float to char + if ( float_actual_ppO2 < 0.0 ) char_ppO2 = 0; + else if ( float_actual_ppO2 > 2.545 ) char_ppO2 = 255; + else char_ppO2 = (unsigned char)(100 * float_actual_ppO2 + 0.5); + // ** Currently, stop times per stop entry are limited to 99 minutes in update_deco_table(), // ** so the following code block is not needed at times. // - // // tissue_increment is limited to 127 when fed to deco_calc_CNS_fraction(), + // // tissue_increment is limited to 127 when fed to calc_CNS_increment(), // // so if the stop is longer than 127 minutes (but not longer than 254 minutes!) // // we need to calculate the CNS in two chunks. // if( tissue_increment > 127) // { - // tissue_increment -= 127; // subtract full 127 minutes and do the "remaining" minutes first - // calc_CNS_fraction(); - // tissue_increment = 127; // catch up with the previously subtracted full 127 minutes + // tissue_increment -= 127; // subtract full 127 minutes and do the "remaining" minutes first + // calc_CNS_increment(); // calculate the CNS increment + // sim_CNS_fraction += CNS_fraction_inc; // sum up + // tissue_increment = 127; // catch up with the previously subtracted full 127 minutes // } - // calculate CNS% for the stop - calc_CNS_fraction(); - } - } + // calculate CNS% for the stop + calc_CNS_increment(); // calculate the CNS increment + sim_CNS_fraction += CNS_fraction_inc; // sum up + } + } } @@ -3421,25 +3345,25 @@ // // calculates volumes and required tank fill pressures for each gas. // -// Input: bottom_depth depth of the bottom segment -// char_I_bottom_time duration of the bottom segment -// char_I_extra_time extra bottom time for fTTS / delayed ascent -// float_ascent_speed ascent speed, in meters/minute -// sim_gas_first_used the bottom gas (1-5 for configured gases, 0 for the manual gas) -// internal_deco_depth[] depth of the stops -// internal_deco_time[] duration of the stops -// internal_deco_gas[] gas breathed at the stops -// char_I_bottom_usage gas consumption during bottom part and initial ascent, in liters/minute -// char_I_deco_usage gas consumption during stops and following ascents, in liters/minute -// char_I_tank_size[] size of the tanks for gas 1-5, in liters -// char_I_tank_pres_fill[] fill pressure of the tanks +// Input: bottom_depth depth of the bottom segment +// char_I_bottom_time duration of the bottom segment +// char_I_extra_time extra bottom time for fTTS / delayed ascent +// float_ascent_speed ascent speed, in meters/minute +// sim_gas_first_used the bottom gas (1-5 for configured gases, 0 for the manual gas) +// internal_deco_depth[] depth of the stops +// internal_deco_time[] duration of the stops +// internal_deco_gas[] gas breathed at the stops +// char_I_bottom_usage gas consumption during bottom part and initial ascent, in liters/minute +// char_I_deco_usage gas consumption during stops and following ascents, in liters/minute +// char_I_tank_size[] size of the tanks for gas 1-5, in liters +// char_I_tank_pres_fill[] fill pressure of the tanks // -// Output: int_O_gas_volumes[] amount of gas needed, in liters -// int_O_tank_pres_need[] in bar, + flags for fast evaluation by dive mode warnings: -// 2^15: pres_need >= pres_fill -// 2^14: pres_need >= press_fill * GAS_NEEDS_ATTENTION_THRESHOLD -// 2^11: pres_need == 0 -// 2^10: pres_need invalid +// Output: int_O_gas_volumes[] amount of gas needed, in liters +// int_O_tank_pres_need[] in bar, + flags for fast evaluation by dive mode warnings: +// 2^15: pres_need >= pres_fill +// 2^14: pres_need >= press_fill * GAS_NEEDS_ATTENTION_THRESHOLD +// 2^11: pres_need == 0 +// 2^10: pres_need invalid // void gas_volumes_helper(void) { @@ -3447,7 +3371,7 @@ // We use 1.0 for the surface pressure to have stable results when used through // the deco calculator (simulation mode). volume = (float_depth * METER_TO_BAR + 1.0) * float_time * usage; - + return; } @@ -3462,35 +3386,35 @@ overlay unsigned char stop_depth_last; overlay unsigned char i; - - //---- initialization ---------------------------------------------------- - + + //---- initialization ---------------------------------------------------- + // null the volume accumulators - for(i=0; i 0 if( float_depth > 0.0 ) { // compute ascent time float_time = float_depth / float_ascent_speed; - + // compute average depth between bottom and first stop float_depth = (float)bottom_depth - float_depth * 0.5; @@ -3551,10 +3473,10 @@ // switch the usage (SAC rate) to deco usage rate // for stops, intermediate and final ascent usage = char_I_deco_usage; - + // is there a (first) stop? if yes, goto stops processing if( stop_depth ) goto stops; - + // add demand of a 3 minutes safety stop at 5 meters, at least for contingency... float_time = 3.0; float_depth = 5.0; @@ -3566,16 +3488,16 @@ volumes[stop_gas-1] += volume; // proceed to volume conversion and pressure calculations - goto done; - - + goto done; + + //---- intermediate ascent demand --------------------------------------- inter_ascents: // store last stop depth and gas stop_depth_last = stop_depth; stop_gas_last = stop_gas; - + // check if we are at the end of the stops table if( i < NUM_STOPS-1 ) { @@ -3612,7 +3534,7 @@ // compute ascent time float_time = float_depth / float_ascent_speed; - + // compute average depth between the two stops float_depth = (float)stop_depth_last - float_depth * 0.5; @@ -3626,32 +3548,32 @@ //---- next stop demand ------------------------------------------------- stops: - + // convert depth of the stop float_depth = (float)stop_depth; - + // get the next gas stop_gas = internal_deco_gas[i]; - + // do we we have a gas change? if( stop_gas_last && (stop_gas != stop_gas_last) ) { // yes - spend an additional char_I_gas_change_time on the old gas float_time = (float)char_I_gas_change_time; - + // calculate gas demand gas_volumes_helper(); // add result volumes[stop_gas_last-1] += volume; } - + // calculate and add demand on new gas for the full stop duration if( stop_gas ) { // get the duration of the stop float_time = (float)stop_time; - + // calculate gas demand gas_volumes_helper(); @@ -3668,16 +3590,16 @@ // float_depth: depth of last stop // stop_gas : gas from last stop (0 or 1-5) - + // volumes are only calculated for gases 1-5, but not the manually configured one if( stop_gas ) { // set ascent time according to an ascent speed of 1 meter per minute float_time = float_depth; - + // set half-way depth float_depth *= 0.5; - + // calculate gas demand gas_volumes_helper(); @@ -3686,12 +3608,12 @@ } - //---- convert results for the assembler interface ----------------------------- + //---- convert results for the assembler interface ----------------------------- done: - for(i=0; i= 65534.5 ) + if( volumes[i] >= 65534.5 ) { int_O_gas_volumes[i] = 65535; int_O_tank_pres_need[i] = 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill @@ -3699,18 +3621,18 @@ else { overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[i]; - + // No distinct rounding done here because volumes are not accurate to the single liter anyhow - + // convert gas volumes to integers - int_O_gas_volumes[i] = (unsigned short)volumes[i]; - + int_O_gas_volumes[i] = (unsigned short)volumes[i]; + // compute how much pressure in the tank will be needed [in bar] (integer-division) int_O_tank_pres_need[i] = (unsigned short)(int_O_gas_volumes[i] / char_I_tank_size[i]); - + // limit to 999 bar because of display constraints if( int_O_tank_pres_need[i] > 999 ) int_O_tank_pres_need[i] = 999; - + // set flags for fast evaluation by divemode check for warnings if ( int_O_tank_pres_need[i] == 0 ) { @@ -3726,8 +3648,8 @@ else if( int_O_tank_pres_need[i] >= tank_pres_fill * GAS_NEEDS_ATTENTION_THRESHOLD ) { // set pre-warning flag - int_O_tank_pres_need[i] |= INT_FLAG_PREWARNING; - } + int_O_tank_pres_need[i] |= INT_FLAG_ATTENTION; + } // set invalid flag if there is an overflow in the stops table if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) @@ -3739,7 +3661,7 @@ ////////////////////////////////////////////////////////////////////////////// -void compute_CNS_for_display(void) +void convert_CNS_for_display(void) { if ( CNS_fraction < 0.01 ) int_O_CNS_fraction = 0; else if ( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING; @@ -3747,69 +3669,72 @@ { // convert float to integer int_O_CNS_fraction = (unsigned short)(100 * CNS_fraction + 0.5); - - // compute warnings - if ( int_O_CNS_fraction >= CNS_warning_threshold ) - { - // reset pre-warning and set main warning flag - int_O_CNS_fraction &= ~INT_FLAG_PREWARNING; - int_O_CNS_fraction |= INT_FLAG_WARNING; - } - else if ( int_O_CNS_fraction >= CNS_prewarning_threshold ) - { - // reset main warning but set pre-warning flag - int_O_CNS_fraction &= ~INT_FLAG_WARNING; - int_O_CNS_fraction |= INT_FLAG_PREWARNING; - } - else - { - // clear both warnings - int_O_CNS_fraction &= ~(INT_FLAG_WARNING + INT_FLAG_PREWARNING); - } + + // set warnings + if ( int_O_CNS_fraction >= CNS_WARNING_THRESHOLD ) int_O_CNS_fraction |= INT_FLAG_WARNING; + else if ( int_O_CNS_fraction >= CNS_ATTENTION_THRESHOLD ) int_O_CNS_fraction |= INT_FLAG_ATTENTION; + } +} + +////////////////////////////////////////////////////////////////////////////// + +void convert_sim_CNS_for_display(void) +{ + if ( sim_CNS_fraction < 0.01 ) int_sim_CNS_fraction = 0; + else if ( sim_CNS_fraction >= 9.985 ) int_sim_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_sim_CNS_fraction = (unsigned short)(100 * sim_CNS_fraction + 0.5); + + // set warning flag if CNS is >= 100% + if ( int_sim_CNS_fraction >= CNS_WARNING_THRESHOLD ) int_sim_CNS_fraction |= INT_FLAG_WARNING; + else if ( int_sim_CNS_fraction >= CNS_ATTENTION_THRESHOLD ) int_sim_CNS_fraction |= INT_FLAG_ATTENTION; + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) int_sim_CNS_fraction |= INT_FLAG_INVALID; } } ////////////////////////////////////////////////////////////////////////////// - -void deco_push_tissues_to_vault(void) +// push_tissues_to_vault & pull_tissues_from_vault +// +// ATTENTION: Do not use from inside the deco engine! +// The vault is exclusively reserved to back-up and restore the real +// tissues and related data when entering / leaving simulation mode! +// + +void push_tissues_to_vault(void) { - overlay unsigned char x; - - RESET_C_STACK - - low_depth_norm_vault = low_depth_norm; - low_depth_alt_vault = low_depth_alt; - cns_vault_float = CNS_fraction; - cns_vault_int = int_O_CNS_fraction; + overlay unsigned char x; + + cns_vault_float = CNS_fraction; deco_warnings_vault = char_O_deco_warnings; - for (x=0;x WREG - addwf temp1,W ; Result in BCD - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. + addwf lo,F ; 1s + swapf hi,W ; swap to bit 7-4 -> WREG + addwf lo,W ; Result in BCD + banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/shared_definitions.h --- a/src/shared_definitions.h Sun Feb 25 18:25:38 2018 +0100 +++ b/src/shared_definitions.h Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; -; shared_definitions.h REFACTORED VERSION V2.95a1 +; shared_definitions.h REFACTORED VERSION V2.97 ; ; Declare variables used both in C and ASM code ; @@ -45,8 +45,8 @@ #endif #ifdef __18CXX - //------------------------------------------------------------------------ - // C-style declarations: + //------------------------------------------------------------------------ + // C-style declarations: # ifndef TEST_MAIN # define VAR_UCHAR(n) extern unsigned char n # define TAB_UCHAR(n,size) extern unsigned char n[size] @@ -59,8 +59,8 @@ # define TAB_UINT(n,size) unsigned short n[size] # endif #else - ;------------------------------------------------------------------------- - ; ASM-style declarations: + ;------------------------------------------------------------------------- + ; ASM-style declarations: #define VAR_UCHAR(n) n res 1 #define TAB_UCHAR(n,size) n res size #define VAR_UINT(n) n res 2 @@ -85,50 +85,47 @@ #ifdef __18CXX - //---- BANK 3 DATA ------------------------------------------------------- - // Gather all data C-code --> ASM-code + //---- BANK 3 DATA ------------------------------------------------------- + // Gather all data C-code --> ASM-code + // Memory usage: 41 Bytes left # pragma udata overlay bank3=0x300 #else - ; In ASM, put the same bank, in overlay mode, at the same address + ; In ASM, put the same bank, in overlay mode, at the same address bank3 udata_ovr 0x300 #endif -VAR_UINT (int_O_gtissue_press); // pressure of leading compartment +VAR_UINT (int_O_desaturation_time); // time until tissues desaturated to 5% remains, in minutes +VAR_UINT (int_O_nofly_time); // altitude / no-fly waiting time time in minutes -VAR_UINT (int_O_desaturation_time); // time until tissues desaturated to 5% remains, in minutes -VAR_UINT (int_O_nofly_time); // altitude / no-fly waiting time time in minutes - -VAR_UINT (int_O_ascenttime); // time-to-surface (TTS) in minutes -VAR_UINT (int_O_alternate_ascenttime); // TTS for the alternative dive plan +VAR_UINT (int_O_ascenttime); // time-to-surface (TTS) in minutes +VAR_UINT (int_O_alternate_ascenttime); // TTS for the alternative dive plan -VAR_UINT (int_O_CNS_fraction); // current CNS% -VAR_UINT (int_O_normal_CNS_fraction); // CNS% at end of dive in normal dive plan -VAR_UINT (int_O_alternate_CNS_fraction); // CNS% at end of dive in alternative plan +VAR_UINT (int_O_CNS_fraction); // current CNS% +VAR_UINT (int_O_normal_CNS_fraction); // CNS% at end of dive in normal dive plan +VAR_UINT (int_O_alternate_CNS_fraction); // CNS% at end of dive in alternative plan -VAR_UINT (int_O_gradient_factor); // current gradient factor in % +VAR_UINT (int_O_gradient_factor); // current gradient factor in % -VAR_UCHAR (char_O_nullzeit); // remaining NDL time in minutes -VAR_UCHAR (char_O_alternate_nullzeit); // remaining NDL time for the alternative dive plan +VAR_UCHAR (char_O_nullzeit); // remaining NDL time in minutes +VAR_UCHAR (char_O_alternate_nullzeit); // remaining NDL time for the alternative dive plan VAR_UCHAR (char_O_main_status); // setup of the deco engine regarding the real tissue computations -VAR_UCHAR (char_O_deco_status); // setup of the deco engine regarding the decompression computations +VAR_UCHAR (char_O_deco_status); // setup of the deco engine regarding the decompression computations -VAR_UCHAR (char_O_gtissue_no); // number of the leading compartment +VAR_UCHAR (char_O_EAD); // equivalent air depth (EAD) of breathed gas +VAR_UCHAR (char_O_END); // equivalent narcosis depth (END) of breathed gas -VAR_UCHAR (char_O_EAD); // equivalent air depth (EAD) of breathed gas -VAR_UCHAR (char_O_END); // equivalent narcosis depth (END) of breathed gas +VAR_UCHAR (char_O_first_deco_depth); // depth of first stop (deco or gas change) +VAR_UCHAR (char_O_first_deco_time) ; // duration of first stop -VAR_UCHAR (char_O_first_deco_depth); // depth of first stop (deco or gas change) -VAR_UCHAR (char_O_first_deco_time) ; // duration of first stop +TAB_UCHAR (char_O_deco_depth, NUM_STOPS); // stops table: depth, ... +TAB_UCHAR (char_O_deco_time, NUM_STOPS); // ... duration, and +TAB_UCHAR (char_O_deco_gas, NUM_STOPS); // ... gas breathed -TAB_UCHAR (char_O_deco_depth, NUM_STOPS); // stops table: depth, ... -TAB_UCHAR (char_O_deco_time, NUM_STOPS); // ... duration, and -TAB_UCHAR (char_O_deco_gas, NUM_STOPS); // ... gas breathed +TAB_UCHAR (char_O_deco_time_for_log, NUM_STOPS); // variant of the stops table for logging purpose -TAB_UCHAR (char_O_deco_time_for_log, NUM_STOPS); // variant of the stops table for logging purpose - -TAB_UCHAR (char_O_tissue_N2_saturation, NUM_COMP); // nitrogen tissue pressures for display purpose -TAB_UCHAR (char_O_tissue_He_saturation, NUM_COMP); // helium tissue pressures for display purpose +TAB_UCHAR (char_O_tissue_N2_saturation, NUM_COMP); // nitrogen tissue pressures for display purpose +TAB_UCHAR (char_O_tissue_He_saturation, NUM_COMP); // helium tissue pressures for display purpose VAR_UCHAR (char_O_deco_warnings); // vector of warnings generated by the deco engine @@ -136,86 +133,75 @@ TAB_UINT (int_O_tank_pres_need, NUM_GAS); // tank pressures needed in bar VAR_UINT (int_O_ceiling); // ultimate ascent bound in mbar relative pressure -VAR_UINT (int_O_O2_ppO2); // ppO2 of pure O2 at current depth +VAR_UINT (int_O_O2_ppO2); // ppO2 of pure O2 at current depth VAR_UINT (int_O_pure_ppO2); // ppO2 of the current gas or dil if breathed pure -VAR_UINT (int_O_pSCR_ppO2); // ppO2 calculated in pSCR loop +VAR_UINT (int_O_pSCR_ppO2); // ppO2 calculated in pSCR loop VAR_UINT (int_O_breathed_ppO2); // ppO2 actually breathed (= char_O_pure_ppO2 if in OC) #ifdef __18CXX - //---- BANK 4 DATA ------------------------------------------------------- - // Gather all data ASM-code --> C-code + //---- BANK 4 DATA ------------------------------------------------------- + // Gather all data ASM-code --> C-code + // Memory usage: 183 bytes left # pragma udata overlay bank4=0x400 #else - ; In ASM, put the same bank, in overlay mode, at the same address + ; In ASM, put the same bank, in overlay mode, at the same address bank4 udata_ovr 0x400 #endif -VAR_UINT (int_I_pres_respiration); // absolute pressure breathed -VAR_UINT (int_I_pres_surface); // absolute pressure at surface - -VAR_UCHAR (char_I_current_gas); // number of gas currently breathed (1..5 for configured gases, 6 for the manual gas) -VAR_UCHAR (char_I_He_ratio); // helium ratio of the currently breathed gas -VAR_UCHAR (char_I_O2_ratio); // oxygen ratio of the currently breathed gas +VAR_UINT (int_I_pres_respiration); // absolute pressure breathed +VAR_UINT (int_I_pres_surface); // absolute pressure at surface -VAR_UCHAR (char_I_saturation_multiplier); // safety factor, 100 = no conservatism, 150 = 50% faster saturation -VAR_UCHAR (char_I_desaturation_multiplier);// safety factor, 100 = no conservatism, 66 = 50% slower desaturation +VAR_UCHAR (char_I_current_gas); // number of gas currently breathed (1..5 for configured gases, 6 for the manual gas) +VAR_UCHAR (char_I_He_ratio); // helium ratio of the currently breathed gas +VAR_UCHAR (char_I_O2_ratio); // oxygen ratio of the currently breathed gas -VAR_UCHAR (char_I_GF_High_percentage); // GF model high value -VAR_UCHAR (char_I_GF_Low_percentage); // GF model low value +VAR_UCHAR (char_I_saturation_multiplier); // safety factor, 100 = no conservatism, 150 = 50% faster saturation +VAR_UCHAR (char_I_desaturation_multiplier); // safety factor, 100 = no conservatism, 66 = 50% slower desaturation -VAR_UCHAR (char_I_deco_distance); // assumed extra depth below required depth for CNS and gas volumes calculations -VAR_UCHAR (char_I_depth_last_deco); // depth of the last deco stop in meters +VAR_UCHAR (char_I_GF_High_percentage); // GF model high value +VAR_UCHAR (char_I_GF_Low_percentage); // GF model low value -VAR_UCHAR (char_I_deco_model); // deco model selection: 0 = ZH-L16, 1 = ZH-L16-GF (with gradient factors) +VAR_UCHAR (char_I_deco_distance); // assumed extra depth below required depth for CNS and gas volumes calculations +VAR_UCHAR (char_I_depth_last_deco); // depth of the last deco stop in meters -VAR_UCHAR (char_I_bottom_depth); // bottom depth, used for gas volume calculations -VAR_UCHAR (char_I_bottom_time); // bottom time, used for gas volume calculations - -VAR_UCHAR (char_I_dive_interval); // duration of surface break before next dive in minutes, used in simulation -VAR_UCHAR (char_I_sim_advance_time); // 'fast forward' of dive time, used in simulation (+5 min function) +VAR_UCHAR (char_I_deco_model); // deco model selection: 0 = ZH-L16, 1 = ZH-L16-GF (with gradient factors) -VAR_UCHAR (char_I_const_ppO2); // ppO2 reported from sensors or by setpoint - -TAB_UCHAR (char_I_deco_gas_change,NUM_GAS); // change depths of the OC gases +VAR_UCHAR (char_I_bottom_depth); // bottom depth, used for gas volume calculations +VAR_UCHAR (char_I_bottom_time); // bottom time, used for gas volume calculations -TAB_UCHAR (char_I_setpoint_change,NUM_GAS); // change depth for the setpoints in meter -TAB_UCHAR (char_I_setpoint_cbar, NUM_GAS); // setpoints in cbar +VAR_UCHAR (char_I_dive_interval); // duration of surface break before next dive in minutes, used in simulation +VAR_UCHAR (char_I_sim_advance_time); // 'fast forward' of dive time, used in simulation (+5 min function) -TAB_UCHAR (char_I_deco_O2_ratio, NUM_GAS); // oxygen ratios of the configured gases, used for deco calculations -TAB_UCHAR (char_I_deco_He_ratio, NUM_GAS); // helium ratios of the configured gases, used for deco calculations +VAR_UCHAR (char_I_const_ppO2); // ppO2 reported from sensors or by setpoint -TAB_UCHAR (char_I_tank_size, NUM_GAS); // tank sizes, used for pressure needs calculation -TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS); // tank fill pressures, used for generating warnings +TAB_UCHAR (char_I_deco_gas_change,NUM_GAS); // change depths of the OC gases +TAB_UCHAR (char_I_dil_change, NUM_GAS); // change depths of the diluent gases. Attention: must be placed after char_I_deco_gas_change! Remark: not used by C code, only by ASM code -VAR_UCHAR (char_I_cc_max_frac_o2); // limiter for maximum O2% in loop -VAR_UCHAR (char_I_PSCR_drop); // pSCR parameter drop [%] -VAR_UCHAR (char_I_PSCR_lungratio); // pSCR parameter lung ratio [1/x] +TAB_UCHAR (char_I_setpoint_change,NUM_GAS); // change depth for the setpoints in meter +TAB_UCHAR (char_I_setpoint_cbar, NUM_GAS); // setpoints in cbar -VAR_UCHAR (char_I_altitude_wait); // selector for altitude / no-fly waiting time calculation +TAB_UCHAR (char_I_deco_O2_ratio, NUM_GAS); // oxygen ratios of the configured gases, used for deco calculations +TAB_UCHAR (char_I_deco_He_ratio, NUM_GAS); // helium ratios of the configured gases, used for deco calculations -VAR_UCHAR (char_I_bottom_usage); // gas consumption during bottom part and initial ascent in liters/minute -VAR_UCHAR (char_I_deco_usage); // gas consumption during deco stops and following ascents in liters/minute - -VAR_UCHAR (char_I_extra_time); // extra bottom time for fTTs and delayed ascent calculation in minutes +TAB_UCHAR (char_I_tank_size, NUM_GAS); // tank sizes, used for pressure needs calculation +TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS); // tank fill pressures, used for generating warnings -VAR_UCHAR (char_I_ppO2_max); // warning threshold for maximum ppO2 during working phase of the dive -VAR_UCHAR (char_I_ppO2_max_deco); // warning threshold for maximum ppO2 during deco phase of the dive -VAR_UCHAR (char_I_ppO2_min); // warning threshold for maximum ppO2 when breathing OC -VAR_UCHAR (char_I_ppO2_min_loop); // warning threshold for maximum ppO2 when breathing from CCR or pSCR +VAR_UCHAR (char_I_cc_max_frac_o2); // limiter for maximum O2% in loop +VAR_UCHAR (char_I_PSCR_drop); // pSCR parameter drop [%] +VAR_UCHAR (char_I_PSCR_lungratio); // pSCR parameter lung ratio [1/x] -VAR_UCHAR (char_I_ascent_speed); // ascent speed in meters/minute -VAR_UCHAR (char_I_gas_change_time); // extra time spent during a stop for doing a gas change, in minutes +VAR_UCHAR (char_I_altitude_wait); // selector for altitude / no-fly waiting time calculation +VAR_UCHAR (char_I_bottom_usage); // gas consumption during bottom part and initial ascent in liters/minute +VAR_UCHAR (char_I_deco_usage); // gas consumption during deco stops and following ascents in liters/minute -#ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -// VAR_UCHAR (char_I_step_is_1min); // Use 1min integration for tissue and CNS. DELETED ## V2.95 - made local to p2_deco.c -// VAR_UINT (int_I_temp); // new in v101 DELETED ## no fly -// VAR_UINT (int_I_divemins); // Dive time (minutes) DELETED ## V2.95 - not used by p2_deco.c -// VAR_UCHAR (char_I_temp); // new in v101 DELETED ## no fly -// VAR_UCHAR (char_I_actual_ppO2); // DELETED ## V2.94 -// VAR_UCHAR (char_I_first_gas); // Gas used at start of dive (bottom mix) DELETED ## V2.95 - made local to p2_deco.c -// VAR_UCHAR (char_I_N2_ratio); // N2 ratio of the currently breathed gas DELETED ## V2.95 - not read from ASM, but actually computed by p2_deco.c from H2 and O2 ratio -// VAR_UCHAR (char_O_deco_last_stop); // Depth reached during deco planning. DELETED ## V2.95 - not used in ASM -// VAR_UCHAR (temp_bankx400); // reserved space for temporary variables -#endif +VAR_UCHAR (char_I_extra_time); // extra bottom time for fTTs and delayed ascent calculation in minutes + +VAR_UCHAR (char_I_ppO2_max); // warning threshold for maximum ppO2 during working phase of the dive +VAR_UCHAR (char_I_ppO2_max_deco); // warning threshold for maximum ppO2 during deco phase of the dive +VAR_UCHAR (char_I_ppO2_min); // warning threshold for maximum ppO2 when breathing OC +VAR_UCHAR (char_I_ppO2_min_loop); // warning threshold for maximum ppO2 when breathing from CCR or pSCR + +VAR_UCHAR (char_I_ascent_speed); // ascent speed in meters/minute +VAR_UCHAR (char_I_gas_change_time); // extra time spent during a stop for doing a gas change, in minutes diff -r f5de1ff88814 -r b455b31ce022 src/simulator.asm --- a/src/simulator.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/simulator.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,118 +1,119 @@ ;============================================================================= ; -; File simulator.asm REFACTORED VERSION V2.95a1 +; File simulator.asm REFACTORED VERSION V2.98 ; ; Decoplan interface to C model code. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-07-09 : [jDG] Creation... +; 2011-07-09 : [jDG] Creation... -#include "hwos.inc" ; Mandatory include -#include "convert.inc" ; output_* -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "strings.inc" ; STRCPY,... -#include "tft.inc" ; WIN_LEFT,... -#include "wait.inc" ; speed_* +#include "hwos.inc" ; Mandatory include +#include "convert.inc" ; output_* +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "strings.inc" ; STRCPY,... +#include "tft.inc" ; WIN_LEFT,... +#include "wait.inc" ; speed_* #include "start.inc" #include "divemode.inc" #include "math.inc" #include "eeprom_rs232.inc" #include "tft_outputs.inc" #include "gaslist.inc" +#include "isr.inc" -gui CODE +gui CODE - extern deco_clear_tissue - extern deco_push_tissues_to_vault - extern deco_calc_dive_interval - extern deco_calc_hauptroutine - extern deco_pull_tissues_from_vault - extern TFT_display_decotype_surface1 - extern get_first_dil_to_WREG - extern get_first_gas_to_WREG - extern setup_dil_registers - extern setup_gas_registers - extern deco_setup_cc_diluents - extern deco_setup_oc_gases + extern deco_clear_tissue + extern deco_push_tissues_to_vault + extern deco_calc_dive_interval + extern deco_calc_hauptroutine + extern deco_pull_tissues_from_vault + extern TFT_display_decotype_surface1 + extern get_first_dil_to_WREG + extern get_first_gas_to_WREG + extern setup_dil_registers + extern setup_gas_registers + extern deco_setup_cc_diluents + extern deco_setup_oc_gases + extern log_screendump_and_onesecond + extern logbook_preloop_tasks + extern do_return_demo_planner - extern log_screendump_and_onesecond, logbook_preloop_tasks - extern do_planner_menu - -;---- Private temp variables ------------------------------------------------- +;---- Private local variables ------------------------------------------------- - CBLOCK tmp+0x12 ; Reserved space for word processor and convert - decoplan_index ; within each page - decoplan_gindex ; global index - decoplan_last ; Depth of last stop (CF#29) - decoplan_flags ; Various private flags. - decoplan_page ; page number - decoplan_warnings ; deco engine warnings (ex reserved to tmp+0x18...) - ENDC - + CBLOCK local1 ; max size is 16 Byte !!! + decoplan_index ; within each page + decoplan_gindex ; global index + decoplan_last ; Depth of last stop (CF#29) + decoplan_flags ; Various private flags. + decoplan_page ; page number + decoplan_warnings ; deco engine warnings + gas_counter ; counter for looping through the gases + row_pos ; used for positioning of graphic elements + ENDC ; used: 8 byte, remaining: 8 byte + ;---- Defines ---------------------------------------------------------------- #define decoplan_last_ceiling_shown decoplan_flags,0 -#define decoplan_abort decoplan_flags,1 +#define decoplan_abort decoplan_flags,1 ;---- Demo deco planner ------------------------------------------------------ - global do_demo_planner + global do_demo_planner do_demo_planner: btfsc FLAG_gauge_mode ; =1: In Gauge mode - goto do_planner_menu + goto do_return_demo_planner btfsc FLAG_apnoe_mode ; =1: In Apnea mode - goto do_planner_menu + goto do_return_demo_planner bcf decoplan_abort ; initialize (clear) abort flag bcf is_bailout ; clear bailout condition (may have remained set from last invocation) rcall deco_planer btfss decoplan_abort ; skip recall deco_show_plan if calculations were aborted rcall deco_show_plan - goto do_planner_menu + goto do_return_demo_planner global deco_setup deco_setup: - banksel common btfsc FLAG_ccr_mode bra deco_setup_cc btfsc FLAG_pscr_mode bra deco_setup_cc deco_setup_oc: - call get_first_gas_to_WREG ; gets first gas (1-5) into WREG - call setup_gas_registers ; with WREG=Gas 1-5 + call get_first_gas_to_WREG ; gets first gas (1-5) into WREG + call setup_gas_registers ; with WREG=Gas 1-5 call deco_setup_oc_gases ; setup OC/Bailout Gases and configure for OC deco calculation bra deco_setup_cont deco_setup_cc: - call get_first_dil_to_WREG ; gets first gas (1-5) into WREG - call setup_dil_registers ; with WREG=Gas 1-5 + call get_first_dil_to_WREG ; gets first gas (1-5) into WREG + call setup_dil_registers ; with WREG=Gas 1-5 call deco_setup_cc_diluents ; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation deco_setup_cont: - ; use ambient conditions for simulation ## V2.94 - #include "isr.inc" + ; use ambient conditions for simulation SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ; copy surface pressure to deco routine - + movlw deco_distance movff WREG,char_I_deco_distance movff opt_last_stop,char_I_depth_last_deco movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage - + ; overwrite GF if aGF is wanted bsf use_agf TSTOSS opt_sim_use_aGF bcf use_agf - btfsc use_agf ; =1: Use aGF + btfsc use_agf ; =1: Use aGF movff opt_aGF_low,char_I_GF_Low_percentage - btfsc use_agf ; =1: Use aGF + btfsc use_agf ; =1: Use aGF movff opt_aGF_high,char_I_GF_High_percentage bcf is_bailout - + ; setup char_I_const_ppO2 for CC modes clrf WREG btfsc FLAG_pscr_mode @@ -120,256 +121,248 @@ btfss FLAG_ccr_mode return ; done if not in CCR mode movff opt_sim_setpoint_number,WREG ; configure CCR computations to selected setpoint - decf WREG,W ; 1-5 -> 0-4 - lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list - movff PLUSW1,char_I_const_ppO2 ; setup setpoint + decf WREG,W ; 1-5 -> 0-4 + lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list + movff PLUSW1,char_I_const_ppO2 ; setup setpoint return - + ;============================================================================= ; Launch deco planning -; - global deco_planer +; + global deco_planer deco_planer: - call speed_fastest ; Quick ! - call deco_push_tissues_to_vault - rcall deco_setup ; Setup all model parameters. + call speed_fastest ; Quick ! + call deco_push_tissues_to_vault ; C-code: back-up state of the real tissues + banksel common + rcall deco_setup ; Setup all model parameters. ;---- Specific settings ------------------------------------------------------ - ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent - movff char_O_deco_status,WREG ; bank-safe copy - bcf WREG,DECO_PLAN_FLAG ; normal plan mode, - bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), - bsf WREG,DECO_VOLUME_FLAG ; enable gas volume calculation, and - bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation - movff WREG,char_O_deco_status ; bank-safe copy back + ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent + movff char_O_deco_status,WREG ; bank-safe copy + bcf WREG,DECO_PLAN_FLAG ; normal plan mode, + bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), + bsf WREG,DECO_VOLUME_FLAG ; enable gas volume calculation, and + bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff WREG,char_O_deco_status ; bank-safe copy back - ; configure the deco engine for total-dive gas volume calculation - movff char_O_main_status,WREG ; bank-safe copy - bsf WREG,DECO_BOTTOM_FLAG ; set bottom flag - movff WREG,char_O_main_status ; bank-safe copy back + ; configure the deco engine for total-dive gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bsf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back deco_planer_redo: + ; show deco calculation is in progress + call TFT_ClearScreen + WIN_COLOR color_greenish + TEXT_SMALL .20,.40, tCalculating + WIN_COLOR color_lightblue + WIN_SMALL .1,.215 + STRCPY_TEXT_PRINT tAbort - ; show deco calculation is in progress - call TFT_ClearScreen - WIN_COLOR color_greenish - TEXT_SMALL .20,.40, tCalculating - WIN_COLOR color_lightblue - WIN_SMALL .1,.215 - STRCPY_TEXT_PRINT tAbort - - ; configure the deco engine for restart: - movff char_O_deco_status,WREG ; bank-safe copy - bsf WREG,DECO_STATUS_0_FLAG ; configure init ... - bsf WREG,DECO_STATUS_1_FLAG ; ... state, - movff WREG,char_O_deco_status ; bank-safe copy back + ; configure the deco engine for restart: + movff char_O_deco_status,WREG ; bank-safe copy + bsf WREG,DECO_STATUS_0_FLAG ; configure init ... + bsf WREG,DECO_STATUS_1_FLAG ; ... state, + movff WREG,char_O_deco_status ; bank-safe copy back ;---- Add delay at surface, if needed ---------------------------------------- - - banksel char_I_dive_interval - tstfsz char_I_dive_interval - call deco_calc_dive_interval + banksel char_I_dive_interval + tstfsz char_I_dive_interval + call deco_calc_dive_interval ;---- Dive loop -------------------------------------------------------------- + ; Compute dive ambient conditions + banksel char_I_bottom_depth + movf char_I_bottom_depth,W + mullw .100 + movlw LOW(.1000) + addwf PRODL,W + movwf int_I_pres_respiration+0 + movlw HIGH(.1000) + addwfc PRODH,W + movwf int_I_pres_respiration+1 + banksel common - ; Compute dive ambient conditions - banksel char_I_bottom_depth - movf char_I_bottom_depth,W - mullw .100 - movlw LOW(.1000) - addwf PRODL,W - movwf int_I_pres_respiration+0 - movlw HIGH(.1000) - addwfc PRODH,W - movwf int_I_pres_respiration+1 - - banksel common + movff char_I_bottom_time,char_I_sim_advance_time + + clrf TMR5L + clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - movff char_I_bottom_time,char_I_sim_advance_time - - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H + call deco_calc_hauptroutine ; C-code: initialization + complete bottom time part + banksel common - call deco_calc_hauptroutine ; initialization + complete bottom time part - banksel common - ;---- BAILOUT: Switch to OC gases for ascent cycles -------------------------- - - btfss is_bailout ; Doing a bailout deco plan ? - bra deco_planer_finishing ; NO - keep gases + btfss is_bailout ; Doing a bailout deco plan ? + bra deco_planer_finishing ; NO - keep gases ; YES - switch to OC gas - ; reconfigure the deco engine for delayed ascent mode - movff char_O_deco_status,lo ; bank-safe copy - bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation - movff lo,char_O_deco_status ; bank-safe copy back + ; reconfigure the deco engine for delayed ascent mode + movff char_O_deco_status,lo ; bank-safe copy + bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation + movff lo,char_O_deco_status ; bank-safe copy back - ; configure the deco engine for delayed ascent part gas volume calculation - movff char_O_main_status,WREG ; bank-safe copy - bcf WREG,DECO_BOTTOM_FLAG ; set bottom flag - movff WREG,char_O_main_status ; bank-safe copy back + ; configure the deco engine for delayed ascent part gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bcf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back - ; reconfigure gas settings to OC gases - call get_first_gas_to_WREG ; get first gas (1-5) into WREG - call setup_gas_registers ; With WREG=Gas 1-5 (or 6, not applicable here) - call deco_setup_oc_gases ; With WREG=Gas 1-5 (or 6, not applicable here) - - ; set the gas change override flag to allow gas changes before deco stops as done in alternative plan - movff char_O_main_status,lo ; bank-safe copy - bsf lo,DECO_GASCHANGE_OVRD ; set flag for gas change override - movff lo,char_O_main_status ; bank-safe copy back + ; reconfigure gas settings to OC gases + call get_first_gas_to_WREG ; get first gas (1-5) into WREG + call setup_gas_registers ; With WREG=Gas 1-5 (or 6, not applicable here) + call deco_setup_oc_gases ; With WREG=Gas 1-5 (or 6, not applicable here) + + ; set the gas change override flag to allow gas changes before deco stops as done in alternative plan + movff char_O_main_status,lo ; bank-safe copy + bsf lo,DECO_GASCHANGE_OVRD ; set flag for gas change override + movff lo,char_O_main_status ; bank-safe copy back ;---- Wait until status reaches zero ------------------------------------------- +deco_planer_finishing: + call deco_calc_hauptroutine ; C-code: Simulate more dive time to trigger the deco calculations + banksel common -deco_planer_finishing: - call deco_calc_hauptroutine ; Simulate more dive time to trigger the deco calculations - banksel common - - btfss switch_left ; check if left button was pressed - bra deco_planer_finishing_1 ; NO - continue calculations - bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called - bra deco_planer_finishing_2 ; do some clean-up and return + btfss switch_left ; check if left button was pressed + bra deco_planer_finishing_1 ; NO - continue calculations + bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called + bra deco_planer_finishing_2 ; do some clean-up and return deco_planer_finishing_1: - movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common - movlw DECO_STATUS_MASK ; bit mask for deco status bit set - andwf lo,W ; mask out bits showing state of computation - tstfsz WREG ; check if a compute cycle is finished (bits 1 and 0 == 0) - bra deco_planer_finishing ; NO - needs more computation cycles + movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common + movlw DECO_STATUS_MASK ; bit mask for deco status bit set + andwf lo,W ; mask out bits showing state of computation + tstfsz WREG ; check if a compute cycle is finished (bits 1 and 0 == 0) + bra deco_planer_finishing ; NO - needs more computation cycles ;---- Done: add CNS from decoplan, and restore tissues - deco_planer_finishing_2: - movff char_O_deco_warnings,decoplan_warnings ; copy warnings - - call deco_pull_tissues_from_vault ; restore "real" deco data - banksel common ; back to bank 1 + + call deco_pull_tissues_from_vault ; C-code: restore status of the real tissues + banksel common ; back to bank 1 - movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz + movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz movwf T3CON - goto speed_normal ;(and return) + goto speed_normal ; (and return) ;----------------------------------------------------------------------------- ; Draw a stop of the deco plan (simulator or dive). -; Inputs: lo = depth. Range 3m...93m -; + 0x80 if this is a switch-gas stop. -; up = minutes. range 1'..240'. -; win_top = line to draw on screen. -; Trashed: up, lo, win_height, win_leftx2, win_width, win_color*, +; Inputs: lo = depth +; hi = minutes +; win_top = line to draw on screen. +; +; Trashed: hi, lo, +; win_height, win_leftx2, win_width, win_color*, ; WREG, PROD, TBLPTR TABLAT. ; deco_plan_show_stop: + ;---- Print depth ---------------------------------------------------- + lfsr FSR2,char_O_deco_gas ; needed to be initialized here every time because... + movf decoplan_gindex,W ; ...FSR2 is also used for string operations + movff PLUSW2,WREG ; get current gas and copy it to WREG for color-coding + call TFT_color_code_gas ; set output color dependent on gas (1-5) - ;---- Print depth ---------------------------------------------------- - bcf lo,7 ; clear gas-switch flag (not used any more anyhow) - lfsr FSR2,char_O_deco_gas - movf decoplan_gindex,W ; index - movff PLUSW2,WREG ; get current gas - rcall simulator_color_gas ; set output color dependent on gas (1-5) + lfsr FSR2,buffer - lfsr FSR2,buffer - - TSTOSS opt_units ; 0=Meters, 1=Feets - bra deco_plan_show_nstd_stop_metric + TSTOSS opt_units ; 0=Meters, 1=Feets + bra deco_plan_show_nstd_stop_metric - WIN_LEFT .85 - movf lo,W ; lo = m - mullw .100 ; PRODL:PRODH = mbar - movff PRODL,lo - movff PRODH,hi - ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... - movff lo,xA+0 - movff hi,xA+1 - movlw LOW d'334' ; 334feet/100m - movwf xB+0 - movlw HIGH d'334' - movwf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 328) - movlw d'50' ; round up - addwf xC+0,F - movlw 0 - addwfc xC+1,F - addwfc xC+2,F - addwfc xC+3,F - movlw d'100' - movwf xB+0 - clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value - bsf leftbind - bsf ignore_digit4 ; Only full feet - output_16 - bcf leftbind - STRCAT_PRINT "ft " - bra deco_plan_show_nstd_stop_common + WIN_LEFT .85 + movf lo,W ; lo = m + mullw .100 ; PRODL:PRODH = mbar + movff PRODL,lo + movff PRODH,hi + ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... + movff lo,xA+0 + movff hi,xA+1 + movlw LOW d'334' ; 334feet/100m + movwf xB+0 + movlw HIGH d'334' + movwf xB+1 + call mult16x16 ; xA*xB=xC (lo:hi * 328) + movlw d'50' ; round up + addwf xC+0,F + movlw .0 + addwfc xC+1,F + addwfc xC+2,F + addwfc xC+3,F + movlw d'100' + movwf xB+0 + clrf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movff xC+0,lo + movff xC+1,hi ; restore lo and hi with updated value + bsf leftbind + bsf ignore_digit4 ; Only full feet + output_16 + bcf leftbind + STRCAT_PRINT "ft " + bra deco_plan_show_nstd_stop_common deco_plan_show_nstd_stop_metric: - WIN_LEFT .90 - bsf leftbind - output_8 ; outputs into Postinc2! - bcf leftbind - STRCAT_PRINT "m " + WIN_LEFT .90 + bsf leftbind + output_8 ; outputs into Postinc2! + bcf leftbind + STRCAT_PRINT "m " + deco_plan_show_nstd_stop_common: - ;---- Print duration ------------------------------------------------- - WIN_LEFT .135 - lfsr FSR2,buffer - - movf lo,W ; Swap up & lo - movff up,lo - movwf up + ;---- Print duration ------------------------------------------------- + WIN_LEFT .135 + lfsr FSR2,buffer - output_8 ; Allow up to 240' - STRCAT "' " ; 1 to 3 chars for depth. - clrf WREG - movff WREG,buffer+.3 ; limit to 4 chars - STRCAT_PRINT "" + movf lo,W ; Swap hi & lo + movff hi,lo + movwf hi + + output_8 ; Allow up to 240' + clrf WREG + movff WREG,buffer+.3 ; limit to 2 chars + STRCAT_PRINT "" - movf lo,W ; Swap back up & lo - movff up,lo - movwf up + movf lo,W ; Swap back hi & lo + movff hi,lo + movwf hi - ;--------------------------------------------------------------------- - ; Draw the bar graph used for deco stops (deco plan in simulator or dive). - incf win_top,F - movlw .19 - movwf win_height - movlw .118 - movwf win_leftx2 ; column left (0-159) - movlw .16 - movwf win_width+0 ; column max width. - clrf win_width+1 + ;--------------------------------------------------------------------- + ; Draw the bar graph used for deco stops (deco plan in simulator or dive). + incf win_top,F + movlw .19 + movwf win_height + movlw .118 + movwf win_leftx2 ; column left (0-159) + movlw .16 + movwf win_width+0 ; column max width. + clrf win_width+1 - ; Draw used area (up = minutes): - movlw .16 ; Limit length (16min) - cpfslt up - movwf up - movff up,win_bargraph ; Active width, the rest is cleared. - call TFT_box + ; Draw used area (hi = minutes): + movlw .16 ; Limit length (16min) + cpfslt hi + movwf hi + movff hi,win_bargraph ; Active width, the rest is cleared. + call TFT_box - ; Restore win_top - call TFT_standard_color - decf win_top,F ; Restore win_top - return + ; Restore win_top + call TFT_standard_color + decf win_top,F ; Restore win_top + return ;----------------------------------------------------------------------------- ; Clear unused area below last stop ; Inputs: win_top : last used area... deco_plan_show_clear_bottom: - movf win_top,W ; Get back from bank0 - sublw .239 ; No: bottom row in planning - movwf win_height + movf win_top,W ; Get back from bank0 + sublw .239 ; No: bottom row in planning + movwf win_height - WIN_LEFT .85 ; Full dive menu width - movlw .159-.85+1 - movwf win_width+0 - clrf win_width+1 + WIN_LEFT .85 ; Full dive menu width + movlw .159-.85+.1 + movwf win_width+0 + clrf win_width+1 - clrf win_color1 ; Fill with black - clrf win_color2 + clrf win_color1 ; Fill with black + clrf win_color2 - goto TFT_box ; and return + goto TFT_box ; and return ;----------------------------------------------------------------------------- ; Display the deco plan (simulator). @@ -377,381 +370,331 @@ ; decoplan_page = page number. ; deco_show_plan_page: - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag - ;---- Is there deco stops ? ------------------------------------------ - movff char_O_first_deco_depth,WREG - iorwf WREG - bnz deco_plan_show_1 + ;---- Is there deco stops ? ------------------------------------------ + movff char_O_first_deco_depth,WREG + iorwf WREG + bnz deco_plan_show_1 - ;---- No Deco -------------------------------------------------------- - call TFT_standard_color - TEXT_SMALL .80, .0, tNoDeco - bsf decoplan_last_ceiling_shown - return + ;---- No Deco -------------------------------------------------------- + call TFT_standard_color + TEXT_SMALL .80, .0, tNoDeco + bsf decoplan_last_ceiling_shown + return deco_plan_show_1: - lfsr FSR0,char_O_deco_depth ; Initialize indexed addressing. - lfsr FSR1,char_O_deco_time + lfsr FSR0,char_O_deco_depth ; Initialize indexed addressing. + lfsr FSR1,char_O_deco_time - clrf decoplan_index ; Start with index = 0 - clrf win_top ; and row = 0 + clrf decoplan_index ; Start with index = 0 + clrf win_top ; and row = 0 - ; Read stop parameters, indexed by decoplan_index and decoplan_page - movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index - mullw .8 ; 8 lines/page in deco plan - movf decoplan_index,W - addwf PRODL,W - movwf decoplan_gindex ; --> decoplan_gindex + ; Read stop parameters, indexed by decoplan_index and decoplan_page + movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index + mullw .8 ; 8 lines/page in deco plan + movf decoplan_index,W + addwf PRODL,W + movwf decoplan_gindex ; --> decoplan_gindex - bcf decoplan_last_ceiling_shown ; Not finished yet... + bcf decoplan_last_ceiling_shown ; Not finished yet... deco_plan_show_2: - btfsc decoplan_gindex,5 ; Reached table length (32) ? - bra deco_plan_show_99 ; YES: finished... + btfsc decoplan_gindex,5 ; Reached table length (32) ? + bra deco_plan_show_99 ; YES: finished... - ; Read stop parameters, indexed by decoplan_index - movf decoplan_gindex,W ; index - movff PLUSW1,up ; char_O_deco_time [gindex] --> up - movff PLUSW0,lo ; char_O_deco_depth[gindex] - movf lo,W - bz deco_plan_show_99 ; depth == 0 : finished. + ; Read stop parameters, indexed by decoplan_index + movf decoplan_gindex,W ; index + movff PLUSW0,lo ; char_O_deco_depth[gindex] + movff PLUSW1,hi ; char_O_deco_time [gindex] + movf lo,W + bz deco_plan_show_99 ; depth == 0 : finished. - ; Display the stop line - rcall deco_plan_show_stop + ; Display the stop line + rcall deco_plan_show_stop - ; Next - movlw .24 - addwf win_top,F ; row: += 24 - incf decoplan_index,F ; local index += 1 - incf decoplan_gindex,F ; global index += 1 + ; Next + movlw .24 + addwf win_top,F ; row: += 24 + incf decoplan_index,F ; local index += 1 + incf decoplan_gindex,F ; global index += 1 - ; Max number of lines/page reached ? - movlw .8 ; 8 lines/page in deco plan - cpfseq decoplan_index - bra deco_plan_show_2 ; NO: loop + ; Max number of lines/page reached ? + movlw .8 ; 8 lines/page in deco plan + cpfseq decoplan_index + bra deco_plan_show_2 ; NO: loop - ; Check if next stop is end-of-list ? - movf decoplan_gindex,W - movf PLUSW0,W ; char_O_deco_depth[gindex] - bz deco_plan_show_99 ; End of list... + ; Check if next stop is end-of-list ? + movf decoplan_gindex,W + movf PLUSW0,W ; char_O_deco_depth[gindex] + bz deco_plan_show_99 ; End of list... - ; Display the message "more..." - rcall deco_plan_show_clear_bottom ; Clear from next line + ; Display the message "more..." + rcall deco_plan_show_clear_bottom ; Clear from next line - call TFT_standard_color - TEXT_SMALL .88, .220, tMore - return + call TFT_standard_color + TEXT_SMALL .88, .220, tMore + return deco_plan_show_99: - bsf decoplan_last_ceiling_shown ; Nothing more in table to display. - rcall deco_plan_show_clear_bottom ; Clear from next line - return + bsf decoplan_last_ceiling_shown ; Nothing more in table to display. + rcall deco_plan_show_clear_bottom ; Clear from next line + return ;----------------------------------------------------------------------------- ; Loop to show all pages of the deco plan (surface mode) - global deco_show_plan + global deco_show_plan deco_show_plan: - clrf decoplan_page - call TFT_ClearScreen - WIN_COLOR color_greenish - btfsc is_bailout - bra deco_show_plan_bail_title - TEXT_SMALL .1,.1, tDivePlan - bra deco_show_plan2 + clrf decoplan_page + call TFT_ClearScreen + WIN_COLOR color_greenish + btfsc is_bailout + bra deco_show_plan_bail_title + TEXT_SMALL .1,.1, tDivePlan + bra deco_show_plan2 deco_show_plan_bail_title: - TEXT_SMALL .1,.1, tDiveBailout + TEXT_SMALL .1,.1, tDiveBailout deco_show_plan2: - call TFT_standard_color - ;---- Display Plan Parameters - WIN_SMALL .0,.25 - STRCPY "Int:" - movff char_I_dive_interval,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "'" - WIN_SMALL .0,.50 - STRCPY_TEXT tBtTm_short - movff char_I_bottom_time,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "'" - WIN_SMALL .0,.75 - STRCPY_TEXT tDepth - PUTC ":" - movff char_I_bottom_depth,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "m" - - WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors - - ;---- Check for Stop Table Overflow - btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning - bra deco_show_plan2a ; NO - skip - ;---- Display Overflow warning - call TFT_warnings_color ; YES - show overflow warning - STRCAT_PRINT "incomplete" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors + call TFT_standard_color + ;---- Display Plan Parameters + WIN_SMALL .0,.25 + STRCPY "Int:" + movff char_I_dive_interval,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "'" + WIN_SMALL .0,.50 + STRCPY_TEXT tBtTm_short + movff char_I_bottom_time,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "'" + WIN_SMALL .0,.75 + STRCPY_TEXT tDepth + PUTC ":" + movff char_I_bottom_depth,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "m" + WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors -deco_show_plan2a: - ;---- Check for IBCD Warning - btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning - bra deco_show_plan2b ; NO - skip - ;---- Display IBCD warning - call TFT_attention_color ; YES - show IBCD warning - STRCAT_PRINT "IBCD!" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors - + ;---- Check for Stop Table Overflow + btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning + bra deco_show_plan2a ; NO - skip + ;---- Display Overflow warning + call TFT_warnings_color ; YES - show overflow warning + STRCAT_PRINT "incomplete" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors + +deco_show_plan2a: + ;---- Check for IBCD Warning + btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning + bra deco_show_plan2b ; NO - skip + ;---- Display IBCD warning + call TFT_attention_color ; YES - show IBCD warning + STRCAT_PRINT "IBCD!" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors + deco_show_plan2b: - ;---- Display Sat/Desat Factors --> is skipped if there were warnings - STRCAT_PRINT "SD:" - WIN_SMALL .25,.105 - movff char_I_saturation_multiplier,lo - output_8 - STRCAT "/" - movff char_I_desaturation_multiplier,lo - output_8 - STRCAT_PRINT "" + ;---- Display Sat/Desat Factors --> omitted if there were warnings + STRCAT_PRINT "SD:" + WIN_SMALL .25,.105 + movff char_I_saturation_multiplier,lo + output_8 + STRCAT "/" + movff char_I_desaturation_multiplier,lo + output_8 + STRCAT_PRINT "" deco_show_plan_m1: - call TFT_standard_color ; clean-up from warnings + call TFT_standard_color ; clean-up from warnings - ;---- Get Model - movff char_I_deco_model,WREG - iorwf WREG - bz deco_show_plan_m2 + ;---- Get Model + movff char_I_deco_model,WREG + iorwf WREG + bz deco_show_plan_m2 - ;---- Display GF low/high values - WIN_SMALL .0,.130 - STRCAT_PRINT "GF:" - WIN_SMALL .25,.130 - movff char_I_GF_Low_percentage,lo - output_99x - STRCAT "/" - movff char_I_GF_High_percentage,lo - output_99x - STRCAT_PRINT "" + ;---- Display GF low/high values + WIN_SMALL .0,.130 + STRCAT_PRINT "GF:" + WIN_SMALL .25,.130 + movff char_I_GF_Low_percentage,lo + output_99x + STRCAT "/" + movff char_I_GF_High_percentage,lo + output_99x + STRCAT_PRINT "" deco_show_plan_m2: - ;---- Display Deco Mode - WIN_SMALL .0,.155 - lfsr FSR2,buffer - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - call TFT_display_decotype_surface1 - btfss FLAG_ccr_mode ; current dive mode = CCR ? - bra deco_show_plan2c ; NO - branch - WIN_SMALL .25,.155 - STRCPY "SP:" ; output setpoint used for calculation - movff opt_sim_setpoint_number,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "" + ;---- Display Deco Mode + WIN_SMALL .0,.155 + lfsr FSR2,buffer + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + call TFT_display_decotype_surface1 + btfss FLAG_ccr_mode ; current dive mode = CCR ? + bra deco_show_plan2c ; NO - branch + WIN_SMALL .25,.155 + STRCPY "SP:" ; output setpoint used for calculation + movff opt_sim_setpoint_number,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "" deco_show_plan2c: - ;---- Display TTS result - WIN_SMALL .0,.180 - STRCPY_TEXT tTTS - STRCAT ": " - movff int_O_ascenttime+0,lo - movff int_O_ascenttime+1,hi - bsf leftbind - output_16 - bcf leftbind - STRCAT_PRINT "'" + ;---- Display TTS result + WIN_SMALL .0,.180 + STRCPY_TEXT tTTS + STRCAT ": " + movff int_O_ascenttime+0,lo + movff int_O_ascenttime+1,hi + bsf leftbind + output_16 + bcf leftbind + STRCAT_PRINT "'" - ;---- Display CNS result - WIN_TOP .205 - STRCPY_TEXT tCNS2 ; "CNS:" - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - bcf leftbind - STRCAT "%\x92" ; "->" - movff int_O_normal_CNS_fraction+0,lo - movff int_O_normal_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - bcf leftbind - STRCAT_PRINT "%" - call TFT_standard_color - - ;---- Loop through pages + ;---- Display CNS result + WIN_TOP .205 + STRCPY_TEXT tCNS2 ; "CNS:" + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + STRCAT "%\x92" ; "->" + movff int_O_normal_CNS_fraction+0,lo + movff int_O_normal_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + STRCAT_PRINT "%" + call TFT_standard_color + + ;---- Loop through pages deco_show_plan_1: - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right - - rcall deco_show_plan_page - incf decoplan_page,F - call logbook_preloop_tasks + ; Clear the complete stop result column: + WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right + + rcall deco_show_plan_page + incf decoplan_page,F + call logbook_preloop_tasks deco_show_plan_2: - btfsc switch_right - bra deco_show_plan_3 - btfsc switch_left - return ; Return to simulator menu - call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second - btfsc sleepmode ; Timeout? - goto restart - bra deco_show_plan_2 + btfsc switch_right + bra deco_show_plan_3 + btfsc switch_left + return ; Return to simulator menu + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second + btfsc sleepmode ; Timeout? + goto restart + bra deco_show_plan_2 deco_show_plan_3: - btfss decoplan_last_ceiling_shown - bra deco_show_plan_1 - ; All stops shown - -;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- + btfss decoplan_last_ceiling_shown + bra deco_show_plan_1 + ; All stops shown - banksel common - movff char_O_deco_status,WREG ; get deco calculation status - btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode - bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display - bsf is_bailout ; YES - redo 2nd deco-plan in bailout mode - rcall deco_planer_redo ; redo plan computation +;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- + movff char_O_deco_status,WREG ; get deco calculation status + btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode + bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display + bsf is_bailout ; YES - redo 2nd deco-plan in bailout mode + rcall deco_planer_redo ; redo plan computation - btfss decoplan_abort ; shall we abort? - bra deco_show_plan ; NO - display bailout stops - return ; YES + btfss decoplan_abort ; shall we abort? + bra deco_show_plan ; NO - display bailout stops + return ; YES -;---- In OC+BAIL modes, show the gas Usage special page ----------------------- -simulator_show_decoplan5_0: - - movlb .1 - - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right +;---- In OC+BAIL modes, show the gas usage special page ----------------------- +simulator_show_decoplan5_0: + ; Clear the complete stop result column: + WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right - movlw .25 - movwf waitms_temp ; Row for gas list is .25+.25 - clrf wait_temp ; Gas counter - lfsr FSR0,int_O_gas_volumes ; Initialize indexed addressing. + movlw .25 + movwf row_pos ; Row for gas list is .25+.25 + clrf gas_counter ; Gas counter + lfsr FSR0,int_O_gas_volumes ; Initialize indexed addressing. - WIN_LEFT .80 ; Set column - call TFT_standard_color + WIN_LEFT .80 ; Set column + call TFT_standard_color simulator_show_decoplan5_loop: - movff wait_temp,PRODL ; Copy to PRODL first - incf wait_temp,F ; Increment gas # + movff gas_counter,PRODL ; Copy to PRODL first + incf gas_counter,F ; Increment gas # + + movff gas_counter,WREG ; copy current gas to WREG for color-coding + call TFT_color_code_gas ; set output color according to gas (1-5) - movff wait_temp,WREG - rcall simulator_color_gas ; set output color according to gas (number 1-5 in WREG) + lfsr FSR2,buffer + bsf short_gas_decriptions + bsf divemode ; Tweak "customview_show_mix:" + call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + bcf divemode ; Tweak "customview_show_mix:" - lfsr FSR2,buffer - bsf short_gas_decriptions - bsf divemode ; Tweak "customview_show_mix:" - call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - bcf divemode ; Tweak "customview_show_mix:" - movlw .25 - addwf waitms_temp,F ; Increase row position - movff waitms_temp,win_top ; Set Row + addwf row_pos,F ; Increase row position + movff row_pos,win_top ; Set Row + + movff POSTINC0,lo ; Read (16bit) result, low first, + movff POSTINC0,hi ; then high. - movff POSTINC0,lo ; Read (16bit) result, low first, - movff POSTINC0,hi ; then high. + movf lo,W + andwf hi,W + incf WREG ; > 65535? + bnz simulator_show_decoplan5_1 ; NO + STRCAT_PRINT ">65500" ; YES + bra simulator_show_decoplan5_2 - movf lo,W - andwf hi,W - incf WREG ; > 65535? - bnz simulator_show_decoplan5_2 ; NO - STRCAT_PRINT ">65500" ; YES - bra simulator_show_decoplan5_1 - -simulator_show_decoplan5_2: - PUTC ":" - bsf leftbind - output_16 ; No decimal anymore. - bcf leftbind - STRCAT_PRINT "" ; No unit: can be bars or litters. - - ; Loop for all 5 gas simulator_show_decoplan5_1: - movlw d'5' ; list all five gases - cpfseq wait_temp ; All gases shown? + PUTC ":" + bsf leftbind + output_16 ; No decimal anymore. + bcf leftbind + STRCAT_PRINT "" + + ; Loop for all 5 gas +simulator_show_decoplan5_2: + movlw d'5' ; list all five gases + cpfseq gas_counter ; All gases shown? bra simulator_show_decoplan5_loop ; No - - WIN_COLOR color_greenish - WIN_SMALL .80,.25 - STRCPY_TEXT tGasUsage ; OC: "Gas Usage" - STRCAT_PRINT ":" - call TFT_standard_color - call logbook_preloop_tasks + + WIN_COLOR color_greenish + + movlw .30 + addwf row_pos,F ; Increase row position + movff row_pos,win_top ; Set Row + STRCPY_TEXT_PRINT tBarLiter ; "Bar Liter" + + WIN_SMALL .80,.25 + STRCPY_TEXT tGasUsage ; "Gas Usage" + STRCAT_PRINT ":" + + call TFT_standard_color + call logbook_preloop_tasks simulator_show_decoplan5_3: - btfss switch_right + btfss switch_right bra simulator_show_decoplan5_3a bcf switch_right - clrf decoplan_page + clrf decoplan_page bra deco_show_plan_1 ; toggle between stops plan and gas usage simulator_show_decoplan5_3a: - btfss switch_left + btfss switch_left bra simulator_show_decoplan5_4 - bcf is_bailout ; Back to normal - bcf ccr_diluent_setup ; init for OC/Bailout - return ; Return to simulator menu - -simulator_show_decoplan5_4: - call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second - btfsc sleepmode ; Timeout? - goto restart - bra simulator_show_decoplan5_3 - + bcf is_bailout ; Back to normal + bcf ccr_diluent_setup ; init for OC/Bailout + return ; Return to simulator menu -simulator_color_gas: ; set output color dependent on gas (1-5, in WREG) - movwf tft_temp1 ; used in TFT_set_color anyway - dcfsnz tft_temp1,F - movlw color_white ; color for Gas 1 - dcfsnz tft_temp1,F - movlw color_green ; color for Gas 2 - dcfsnz tft_temp1,F - movlw color_red ; Color for Gas 3 - dcfsnz tft_temp1,F - movlw color_yellow ; color for Gas 4 - dcfsnz tft_temp1,F - movlw color_cyan ; color for Gas 5 - goto TFT_set_color ; set color and return... - -;============================================================================= -; - global do_demo_divemode -do_demo_divemode: - extern option_save_all - call option_save_all ; Save all settings into EEPROM before starting simulation - call deco_push_tissues_to_vault - banksel common ; Bank1 +simulator_show_decoplan5_4: + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second + btfsc sleepmode ; Timeout? + goto restart + bra simulator_show_decoplan5_3 - ; +++ COMMENTED OUT FOR TESTING PURPOSE ONLY !!! +++ - ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ - bsf restore_deco_data ; Restore tissue and CNS after simulator use - - bcf pressure_refresh - btfss pressure_refresh ; Wait for sensor - bra $-2 - - bsf simulatormode_active ; Set Flag - ; Compute dive ambient conditions - banksel char_I_bottom_depth - movf char_I_bottom_depth,W - mullw .100 - movff PRODL,rel_pressure+0 - movff PRODH,rel_pressure+1 - movlw LOW(.1000) - addwf PRODL,W - movff WREG,sim_pressure+0 - movlw HIGH(.1000) - addwfc PRODH,W - movff WREG,sim_pressure+1 - - banksel common ; Bank1 - bsf divemode - goto diveloop ; Switch into Divemode! - - - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/sleepmode.asm --- a/src/sleepmode.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/sleepmode.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,113 +1,129 @@ ;============================================================================= ; -; File sleepmode.asm +; File sleepmode.asm Version 2.98 ; ; Sleepmode ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. -;============================================================================= +;============================================================================== ; HISTORY ; 2011-08-12 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "surfmode.inc" -#include "tft.inc" -#include "isr.inc" -#include "start.inc" -#include "adc_lightsensor.inc" -#include "math.inc" -#include "ms5541.inc" -#include "wait.inc" -#include "eeprom_rs232.inc" -#include "external_flash.inc" -#include "ghostwriter.inc" -#include "i2c.inc" -#include "mcp.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "surfmode.inc" +#include "tft.inc" +#include "isr.inc" +#include "start.inc" +#include "adc_lightsensor.inc" +#include "math.inc" +#include "ms5541.inc" +#include "wait.inc" +#include "eeprom_rs232.inc" +#include "external_flash.inc" +#include "ghostwriter.inc" +#include "i2c.inc" +#include "mcp.inc" - extern vault_decodata_into_eeprom + extern vault_decodata_into_eeprom + + + ;---- Private local variables ------------------------------------------------- -gui CODE + CBLOCK local1 ; max size is 16 Byte !!! + sm_temp1 ; sleepmode temporary 1 + sm_temp2 ; sleepmode temporary 2 + sm_timer1 ; timer for pressure check every 10 seconds + sm_timer2 ; timer for 10 minutes tasks (updating of tissues) + sm_timer3 ; timer for 15 minutes tasks (updating of surface pressure) + ENDC ; used: 5 byte, remaining: 11 byte + + +gui CODE + +;============================================================================== global sleeploop -sleeploop: ; enter sleepmode! - call disable_ir_s8 ; IR/S8 off - call mcp_sleep - bcf LEDg - bcf LEDr - movff menupos3,customview_surfmode; save last customview +sleeploop: ; enter sleepmode! + call disable_ir_s8 ; IR/S8 off + call mcp_sleep + bcf LEDg + bcf LEDr call TFT_Display_FadeOut - call TFT_DisplayOff ; display off - bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - call disable_rs232 ; USB off - call vault_decodata_into_eeprom ; store deco data - call ext_flash_enable_protection ; enable write protection for external flash - call update_battery_registers ; update battery registers into EEPROM - clrf divemins+0 - clrf divemins+1 - clrf apnoe_max_pressure+0 - clrf apnoe_max_pressure+1 + call TFT_DisplayOff ; display off + bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + call disable_rs232 ; USB off + call vault_decodata_into_eeprom ; store deco data + call ext_flash_enable_protection ; enable write protection for external flash + call update_battery_registers ; update battery registers into EEPROM + clrf sm_temp1 + clrf sm_temp2 + clrf sm_timer1 + clrf sm_timer2 + clrf sm_timer3 call speed_normal - bsf no_sensor_int ; No sensor interrupt - clrf ADCON0 ; Power-Down ADC Module + bsf no_sensor_int ; No sensor interrupt + clrf ADCON0 ; Power-Down ADC Module + sleeploop_pre: - bcf deep_sleep ; Normal sleepmode - call I2C_sleep_accelerometer - call I2C_sleep_compass - btfss analog_switches - bra sleeploop_loop ; no analog switches + bcf deep_sleep ; Normal sleepmode + call I2C_sleep_accelerometer + call I2C_sleep_compass + btfss analog_switches + bra sleeploop_loop ; no analog switches - bsf power_sw1 - btfss power_sw1 - bra $-4 - bsf power_sw2 - btfss power_sw2 - bra $-4 - movlw .4 ; Wait for button circuity - movwf apnoe_max_pressure+0 ; Used as temp + bsf power_sw1 + btfss power_sw1 + bra $-4 + bsf power_sw2 + btfss power_sw2 + bra $-4 + movlw .4 ; Wait for button circuity + movwf sm_temp1 ; Used as temp bcf onesecupdate + sleeploop_pre1: rcall sleepmode_sleep - btfss onesecupdate ; Wait 1 second - bra sleeploop_pre1 - bcf onesecupdate - decfsz apnoe_max_pressure+0,F - bra sleeploop_pre1 + btfss onesecupdate ; Wait 1 second + bra sleeploop_pre1 + bcf onesecupdate + decfsz sm_temp1,F + bra sleeploop_pre1 + movlw .32 ; Wait for button circuity + movwf sm_temp1 ; Used as temp - movlw .32 ; Wait for button circuity - movwf apnoe_max_pressure+0 ; Used as temp sleeploop_pre2: call get_analog_switches - decfsz apnoe_max_pressure+0,F - bra sleeploop_pre2 - - bcf PIR1,TMR1IF - bcf INTCON,INT0IF - bcf INTCON3,INT1IF - bcf PIR5,TMR7IF - bcf switch_left - bcf switch_right - bcf analog_sw2_pressed - bcf analog_sw1_pressed - bsf PIE1,0 ; (Re)Start Timer 1 Interrupt - bsf PIE2,1 ; (Re)Start Timer 2 Interrupt - bsf PIE5,3 ; (Re)Start Timer 7 Interrupt - bsf INTCON,4 ; (Re)Start INT0 Interrupt - bsf INTCON3,3 ; (Re)Start INT1 Interrupt + decfsz sm_temp1,F + bra sleeploop_pre2 + + bcf PIR1,TMR1IF + bcf INTCON,INT0IF + bcf INTCON3,INT1IF + bcf PIR5,TMR7IF + bcf switch_left + bcf switch_right + bcf analog_sw2_pressed + bcf analog_sw1_pressed + bsf PIE1,0 ; (Re)Start Timer 1 Interrupt + bsf PIE2,1 ; (Re)Start Timer 2 Interrupt + bsf PIE5,3 ; (Re)Start Timer 7 Interrupt + bsf INTCON,4 ; (Re)Start INT0 Interrupt + bsf INTCON3,3 ; (Re)Start INT1 Interrupt sleeploop_loop: - btfsc onesecupdate ; one second in sleep? - rcall onesec_sleep ; check switches, check pressure sensor, etc. + btfsc onesecupdate ; one second in sleep? + rcall onesec_sleep ; check switches, check pressure sensor, etc. + + btfss sleepmode ; wake up? (This bit will be set in other routines) + goto restart ; yes - btfss sleepmode ; wake up? (This bit will be set in other routines) - goto restart ; yes - - btfsc deep_sleep ; Enter deep sleep? - bra deepsleep ; Yes + btfsc deep_sleep ; Enter deep sleep? + bra deepsleep ; Yes + no_deepsleep: - - rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) + rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) ; Any button pressed in sleep? ; btfsc switch_left @@ -115,207 +131,229 @@ ; btfsc switch_right ; rcall onesec_sleep1a ; -; btfss sleepmode ; wake up? (This bit will be set in other routines) -; goto restart ; yes +; btfss sleepmode ; wake up? (This bit will be set in other routines) +; goto restart ; yes - bra sleeploop_loop ; do loop until someting happens + bra sleeploop_loop ; do loop until something happens deepsleep: - btfss analog_switches - bra no_deepsleep ; no analog switches, no deep sleep required + btfss analog_switches + bra no_deepsleep ; no analog switches, no deep sleep required - bcf PIE1,0 ; Stop Timer 1 Interrupt - bcf PIE2,1 ; Stop Timer 2 Interrupt - bcf PIE5,3 ; Stop Timer 7 Interrupt - bcf INTCON,4 ; Stop INT0 Interrupt - bcf INTCON3,3 ; Stop INT1 Interrupt - bcf power_sw1 - bcf power_sw2 - rcall deepsleep_get_accel ; Read accelerometer into WREG - movwf apnoe_max_pressure+0 ; Store init value - -deepsleep_loop: - btfsc onesecupdate ; one second in sleep? - rcall onesec_deepsleep ; check accelerometer + bcf PIE1,0 ; Stop Timer 1 Interrupt + bcf PIE2,1 ; Stop Timer 2 Interrupt + bcf PIE5,3 ; Stop Timer 7 Interrupt + bcf INTCON,4 ; Stop INT0 Interrupt + bcf INTCON3,3 ; Stop INT1 Interrupt + bcf power_sw1 + bcf power_sw2 + rcall deepsleep_get_accel ; Read accelerometer into WREG + movwf sm_temp1 ; Store init value - btfsc onesecupdate ; one second in sleep? - rcall onesec_sleep ; check switches, check pressure sensor, etc. +deepsleep_loop: + btfsc onesecupdate ; one second in sleep? + rcall onesec_deepsleep ; check accelerometer + + btfsc onesecupdate ; one second in sleep? + rcall onesec_sleep ; check switches, check pressure sensor, etc. rcall sleepmode_sleep - - btfss deep_sleep ; Enter normal sleepmode? - bra sleeploop_pre ; Yes - bra deepsleep_loop ; do loop until someting happens + btfss deep_sleep ; Enter normal sleepmode? + bra sleeploop_pre ; Yes + + bra deepsleep_loop ; do loop until something happens onesec_deepsleep: - rcall deepsleep_get_accel ; Read accelerometer into WREG - subwf apnoe_max_pressure+0,W ; apnoe_max_pressure+0 - accel_DZ+0 -> WREG - btfsc STATUS,N ; Result negative? - negf WREG ; Yes, negate it - movwf apnoe_max_pressure+1 ; change of acceleration in Z-axis - movlw .50 ; Threshold (mg) - cpfslt apnoe_max_pressure+1 ; bigger then the threshold? - bcf deep_sleep ; Yes! + rcall deepsleep_get_accel ; Read accelerometer into WREG + subwf sm_temp1,W ; sm_temp1 - accel_DZ+0 -> WREG + btfsc STATUS,N ; Result negative? + negf WREG ; Yes, negate it + movwf sm_temp2 ; change of acceleration in Z-axis + movlw .50 ; Threshold (mg) + cpfslt sm_temp2 ; bigger then the threshold? + bcf deep_sleep ; Yes! ; extern piezo_config_tx -; movff apnoe_max_pressure+0,WREG +; movff sm_temp1,WREG ; call piezo_config_tx ; movff accel_DZ+0,WREG ; call piezo_config_tx -; movff apnoe_max_pressure+1,WREG +; movff sm_temp2,WREG ; call piezo_config_tx + return - + deepsleep_get_accel: - call I2C_init_compass ; required for compass1 - call I2C_init_accelerometer ; required for compass2 - call I2C_RX_accelerometer ; read Accelerometer - call I2C_sleep_compass ; required for compass1 - call I2C_sleep_accelerometer ; required for compass2 + call I2C_init_compass ; required for compass1 + call I2C_init_accelerometer ; required for compass2 + call I2C_RX_accelerometer ; read Accelerometer + call I2C_sleep_compass ; required for compass1 + call I2C_sleep_accelerometer ; required for compass2 movff accel_DZ+0,WREG return - + onehour_sleep: - call update_battery_registers ; update battery registers into EEPROM - call vault_decodata_into_eeprom ; update deco data - bcf onehourupdate ; all done - return + call update_battery_registers ; update battery registers into EEPROM + call vault_decodata_into_eeprom ; update deco data + bcf onehourupdate ; all done + return onemin_sleep: - btfsc onehourupdate ; one hour in sleep? - rcall onehour_sleep ; Yes + btfsc onehourupdate ; one hour in sleep? + rcall onehour_sleep ; Yes + + btfsc battery_gauge_available + call get_battery_voltage ; Check for charger - btfsc battery_gauge_available - call get_battery_voltage ; Check for charger - - ;---- adjust airpressure compensation any 15 minutes - incf divemins+1,F ; counts to 14... - movlw d'14' - cpfsgt divemins+1 - bra onemin_sleep2 ; 15 minutes not done! - -; Tasks every 15 minutes in sleep - bsf deep_sleep ; enter deep-sleep mode - - clrf divemins+1 ; reset counter - - call deco_calc_CNS_decrease_15min ; compute CNS decay in sleep only + ;---- update tissues and CNS every 10 minutes when gradient factor is 0 (no supersaturation in any tissue any more) + movff int_O_gradient_factor+0,WREG ; get gradient factor, only the lower byte is used for the value + tstfsz WREG ; gradient factor = 0? + bra onemin_sleep1 ; NO - continue with air pressure compensation + incf sm_timer2,F ; count-up... + movlw d'9' ; ...to 9 + cpfsgt sm_timer2 ; 10 minutes over? + bra onemin_sleep1 ; NO - continue with air pressure compensation + clrf sm_timer2 ; reset counter + SAFE_2BYTE_COPY amb_pressure, int_I_pres_respiration ; copy pressure to deco routine + call deco_calc_dive_interval_10min ; calculate 10 minutes under surface conditions banksel common - SAFE_2BYTE_COPY last_surfpressure_15min, last_surfpressure_30min ; save older airpressure - SAFE_2BYTE_COPY amb_pressure, last_surfpressure_15min ; save new airpressure +onemin_sleep1: + ;---- adjust air pressure compensation any 15 minutes + incf sm_timer3,F ; count-up... + movlw d'14' ; ...to 14 + cpfsgt sm_timer3 ; 15 minutes over? + bra onemin_sleep2 ; NO - continue with every-minute-tasks - movlw LOW max_surfpressure - movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar - movlw HIGH max_surfpressure - movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar + ; Tasks every 15 minutes in sleep + bsf deep_sleep ; enter deep-sleep mode + clrf sm_timer3 ; reset counter + + SAFE_2BYTE_COPY last_surfpressure_15min, last_surfpressure_30min ; save older air pressure + SAFE_2BYTE_COPY amb_pressure, last_surfpressure_15min ; save new air pressure + + movlw LOW max_surfpressure + movff WREG,sub_a+0 ; max. "allowed" air pressure in mbar + movlw HIGH max_surfpressure + movff WREG,sub_a+1 ; max. "allowed" air pressure in mbar movff last_surfpressure_15min+0,sub_b+0 movff last_surfpressure_15min+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Is 1080mbar < amb_pressure ? - bra onemin_sleep2 ; NO: current airpressure is lower then "allowed" airpressure, ok! + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Is 1080mbar < amb_pressure ? + bra onemin_sleep2 ; NO: current air pressure is lower then "allowed" air pressure, ok! - ; not ok! Overwrite with max. "allowed" airpressure - movlw LOW max_surfpressure - movff WREG,last_surfpressure_15min+0 ; max. "allowed" airpressure in mbar - movlw HIGH max_surfpressure - movff WREG,last_surfpressure_15min+1 ; max. "allowed" airpressure in mbar + ; not ok! Overwrite with max. "allowed" air pressure + movlw LOW max_surfpressure + movff WREG,last_surfpressure_15min+0 ; max. "allowed" air pressure in mbar + movlw HIGH max_surfpressure + movff WREG,last_surfpressure_15min+1 ; max. "allowed" air pressure in mbar onemin_sleep2: -; Tasks every minute in sleep - SAFE_2BYTE_COPY amb_pressure, int_I_pres_respiration ; LOW copy pressure to deco routine - call deco_calc_wo_deco_step_1_min ; "calc_tissue_sleep" - banksel common + ; Tasks every minute in sleep + + ;---- update tissues and CNS every minute when gradient factor is >0 (supersaturation in at least one tissue) + movff int_O_gradient_factor+0,WREG ; get gradient factor, only the lower byte is used for the value + tstfsz WREG ; gradient factor = 0? + bra onemin_sleep3 ; NO - do tissue update on 1 minute schedule + bra onemin_sleep4 ; YES - tissue update is done on 10 minutes schedule - bcf oneminupdate ; all done +onemin_sleep3: + SAFE_2BYTE_COPY amb_pressure, int_I_pres_respiration ; copy pressure to deco routine + call deco_calc_dive_interval_1min ; calculate 1 minute under surface conditions + banksel common + +onemin_sleep4: + bcf oneminupdate ; all done return onesec_sleep: - btfsc oneminupdate ; one minute in sleep? - rcall onemin_sleep ; do oneminute tasks, e.g. calculate desaturation + btfsc oneminupdate ; one minute in sleep? + rcall onemin_sleep ; do one-minute tasks, e.g. calculate desaturation - btfsc battery_gauge_available - call get_battery_voltage ; Check for charger + btfsc battery_gauge_available + call get_battery_voltage ; Check for charger - incf divemins+0,F ; counts to #test_pressure_in_sleep (10) + incf sm_timer1,F ; counts to #test_pressure_in_sleep (10) movlw d'10' - cpfsgt divemins+0 ; here: temp variable - bra onesec_sleep1 ; #test_pressure_in_sleep not done yet + cpfsgt sm_timer1 ; here: temp variable + bra onesec_sleep1 ; #test_pressure_in_sleep not done yet - clrf divemins+0 ; clear counter - rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!) - ; compare current ambient pressure with wake_up_from_sleep - movlw LOW wake_up_from_sleep - movwf sub_a+0 ; power on if ambient pressure is greater threshold - movlw HIGH wake_up_from_sleep - movwf sub_a+1 ; power on if ambient pressure is greater threshold + clrf sm_timer1 ; clear counter + rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!) + ; compare current ambient pressure with wake_up_from_sleep + movlw LOW wake_up_from_sleep + movwf sub_a+0 ; power on if ambient pressure is greater threshold + movlw HIGH wake_up_from_sleep + movwf sub_a+1 ; power on if ambient pressure is greater threshold SAFE_2BYTE_COPY amb_pressure, sub_b - call subU16 ; Is (1160mbar - averaged(amb_pressure)) < 0 ? - btfsc neg_flag ; Wake up from Sleep? - bra onesec_sleep1a ; Yes, skip button checks, wake up! + call subU16 ; Is (1160mbar - averaged(amb_pressure)) < 0 ? + btfsc neg_flag ; Wake up from Sleep? + bra onesec_sleep1a ; Yes, skip button checks, wake up! - btfsc battery_gauge_available - bra onesec_sleep1 ; No wake-up with cR hardware - btfsc vusb_in ; USB plugged in? - bra onesec_sleep1a ; Yes, skip button checks, wake up! + btfsc battery_gauge_available + bra onesec_sleep1 ; No wake-up with cR hardware + btfsc vusb_in ; USB plugged in? + bra onesec_sleep1a ; Yes, skip button checks, wake up! onesec_sleep1: - bcf onesecupdate ; all done. -; Check switches + bcf onesecupdate ; all done. + ; Check switches btfsc switch_left - bra onesec_sleep1a + bra onesec_sleep1a btfsc switch_right - bra onesec_sleep1a + bra onesec_sleep1a + ; No button pressed -; bcf INTCON,INT0IF ; Clear flag -; bcf INTCON3,INT1IF ; Clear flag +; bcf INTCON,INT0IF ; Clear flag +; bcf INTCON3,INT1IF ; Clear flag + return -onesec_sleep1a: ; At least one button pressed or amb_pressure > wake_up_from_sleep -; bcf INTCON,INT0IF ; Clear flag -; bcf INTCON3,INT1IF ; Clear flag - bcf sleepmode ; wake up! +onesec_sleep1a: ; At least one button pressed or amb_pressure > wake_up_from_sleep +; bcf INTCON,INT0IF ; Clear flag +; bcf INTCON3,INT1IF ; Clear flag + bcf sleepmode ; wake up! SAFE_2BYTE_COPY last_surfpressure_30min, amb_pressure ; copy for compatibility movlw .0 - movff WREG,sensor_state_counter ; Reset sensor state counter - bcf no_sensor_int ; normal sensor interrupt mode + movff WREG,sensor_state_counter ; Reset sensor state counter + bcf no_sensor_int ; normal sensor interrupt mode return - -pressuretest_sleep_fast: ; Get pressure without averaging (Faster to save some power in sleep mode) - banksel isr_backup ; Back to Bank0 ISR data - clrf amb_pressure_avg+0 ; pressure average registers - clrf amb_pressure_avg+1 - clrf temperature_avg+0 - clrf temperature_avg+1 - call get_temperature_start ; and start temperature integration (73,5us) - banksel common - rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) - rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) - banksel isr_backup ; Back to Bank0 ISR data - call get_temperature_value ; State 1: Get temperature - call get_pressure_start ; Start pressure integration. - banksel common - rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) - rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) - banksel isr_backup ; Back to Bank0 ISR data - call get_pressure_value ; State2: Get pressure (51us) - call calculate_compensation ; calculate temperature compensated pressure (27us) - banksel common - SAFE_2BYTE_COPY amb_pressure_avg, amb_pressure ; copy for compatibility + +pressuretest_sleep_fast: ; Get pressure without averaging (Faster to save some power in sleep mode) + banksel isr_backup ; Back to Bank0 ISR data + clrf amb_pressure_avg+0 ; pressure average registers + clrf amb_pressure_avg+1 + clrf temperature_avg+0 + clrf temperature_avg+1 + call get_temperature_start ; and start temperature integration (73,5us) + banksel common + rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) + rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) + banksel isr_backup ; Back to Bank0 ISR data + call get_temperature_value ; State 1: Get temperature + call get_pressure_start ; Start pressure integration. + banksel common + rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) + rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) + banksel isr_backup ; Back to Bank0 ISR data + call get_pressure_value ; State2: Get pressure (51us) + call calculate_compensation ; calculate temperature compensated pressure (27us) + banksel common + SAFE_2BYTE_COPY amb_pressure_avg, amb_pressure ; copy for compatibility return sleepmode_sleep: - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. - clrf T7GCON ; Reset Timer7 Gate Control register - movlw b'10001101' ; 1:1 Prescaler -> 2seconds@32768Hz, not synced - movwf T7CON + banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. + clrf T7GCON ; Reset Timer7 Gate Control register + movlw b'10001101' ; 1:1 Prescaler -> 2seconds@32768Hz, not synced + movwf T7CON sleep sleep - clrf T7GCON ; Reset Timer7 Gate Control register - movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced - movwf T7CON - banksel common ; Bank1 + clrf T7GCON ; Reset Timer7 Gate Control register + movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced + movwf T7CON + banksel common ; Bank1 return END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/start.asm --- a/src/start.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/start.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File start.asm REFACTORED VERSION V2.95a1 +; File start.asm REFACTORED VERSION V2.98 ; ; Startup subroutines ; @@ -9,219 +9,223 @@ ; HISTORY ; 2011-08-06 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "ms5541.inc" -#include "isr.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "eeprom_rs232.inc" -#include "math.inc" -#include "tft.inc" -#include "surfmode.inc" -#include "wait.inc" -#include "rtc.inc" -#include "external_flash.inc" -#include "convert.inc" -#include "strings.inc" -#include "tft_outputs.inc" -#include "adc_lightsensor.inc" -#include "i2c.inc" +#include "hwos.inc" ; Mandatory header +#include "ms5541.inc" +#include "isr.inc" +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "eeprom_rs232.inc" +#include "math.inc" +#include "tft.inc" +#include "surfmode.inc" +#include "wait.inc" +#include "rtc.inc" +#include "external_flash.inc" +#include "convert.inc" +#include "strings.inc" +#include "tft_outputs.inc" +#include "adc_lightsensor.inc" +#include "i2c.inc" - extern init_ostc - extern option_restore_all + extern init_ostc + extern option_restore_all + extern deco_setup + extern restore_decodata_from_eeprom + extern color_image + extern oPressureAdjust + extern option_reset + extern option_save + extern option_save_all + extern option_check_all + extern do_new_battery_select + extern use_old_batteries + extern use_old_prior_209 ;============================================================================= ; Reset vector: What to do on device wake-up and hard reset. ; -reset_v code 0x00000 -; goto start - goto 0x1FF00 ; Bootloader +reset_v code 0x00000 - ORG 0x00004 ; Needed for second-level bootloader +; goto start + goto 0x1FF00 ; Bootloader + + ORG 0x00004 ; Needed for second-level bootloader goto start + ;============================================================================= -boot CODE - global start + +boot CODE + global start start: - lfsr FSR0,0x000 ; Clear rambank 0-14 + lfsr FSR0,0x000 ; Clear rambank 0-14 clear_rambank: clrf POSTINC0 movlw 0x0F - cpfseq FSR0H ; Bank 14 done? - bra clear_rambank ; clear... + cpfseq FSR0H ; Bank 14 done? + bra clear_rambank ; clear... - call init_ostc + call init_ostc - ; Get button type from Bootloader-Info - movlw .16 - movff WREG,analog_counter ; init averaging - bsf analog_switches - movlw 0x7C - movwf TBLPTRL - movlw 0xF7 - movwf TBLPTRH - movlw 0x01 - movwf TBLPTRU - TBLRD*+ ; Reads 0x07 for analog buttons + ; Get button type from Bootloader-Info + movlw .16 + movff WREG,analog_counter ; init averaging + bsf analog_switches + movlw 0x7C + movwf TBLPTRL + movlw 0xF7 + movwf TBLPTRH + movlw 0x01 + movwf TBLPTRU + TBLRD*+ ; Reads 0x07 for analog buttons movlw 0x07 cpfseq TABLAT - bcf analog_switches + bcf analog_switches ; read button polarity - movlw LOW .897 + movlw LOW .897 movwf EEADR - movlw HIGH .897 + movlw HIGH .897 movwf EEADRH - call read_eeprom ; EEDATA into EEPROM@EEADR - clrf EEADRH ; Reset EEADRH - movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) + call read_eeprom ; EEDATA into EEPROM@EEADR + clrf EEADRH ; Reset EEADRH + movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) -; Air pressure compensation after reset - call get_calibration_data ; Get calibration data from pressure sensor - banksel common ; get_calibration_data uses isr_backup + ; Air pressure compensation after reset + call get_calibration_data ; get calibration data from pressure sensor + banksel common ; get_calibration_data uses isr_backup - call TFT_DisplayOff ; display off - bsf LEDr ; Status LED - bcf pressure_refresh -; First pass will not have valid temperature! - btfss pressure_refresh ; Air pressure compensation + call TFT_DisplayOff ; turn off display + bsf LEDr ; turn on red LED + bcf pressure_refresh + ; First pass will not have valid temperature! + btfss pressure_refresh ; Air pressure compensation bra $-2 - ; Second pass + ; Second pass bcf pressure_refresh - btfss pressure_refresh ; Air pressure compensation + btfss pressure_refresh ; Air pressure compensation bra $-2 - bcf LEDr - + bcf LEDr + clrf rel_pressure+0 clrf rel_pressure+1 clrf surface_interval+0 clrf surface_interval+1 - SAFE_2BYTE_COPY amb_pressure, last_surfpressure + SAFE_2BYTE_COPY amb_pressure, last_surfpressure - movlw LOW max_surfpressure - movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar - movlw HIGH max_surfpressure - movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar + movlw LOW max_surfpressure + movff WREG,sub_a+0 ; max. "allowed" air pressure in mbar + movlw HIGH max_surfpressure + movff WREG,sub_a+1 ; max. "allowed" air pressure in mbar movff last_surfpressure+0,sub_b+0 movff last_surfpressure+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Is 1080mbar < amb_pressure ? - bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Is 1080mbar < amb_pressure ? + bra start_copy_pressure ; NO: current air pressure is lower then "allowed" air pressure, ok! - ; not ok! Overwrite with max. "allowed" airpressure - movlw LOW max_surfpressure - movff WREG,last_surfpressure+0 ; max. "allowed" airpressure in mbar - movlw HIGH max_surfpressure - movff WREG,last_surfpressure+1 ; max. "allowed" airpressure in mbar + ; not ok! Overwrite with max. "allowed" air pressure + movlw LOW max_surfpressure + movff WREG,last_surfpressure+0 ; max. "allowed" air pressure in mbar + movlw HIGH max_surfpressure + movff WREG,last_surfpressure+1 ; max. "allowed" air pressure in mbar start_copy_pressure: movff last_surfpressure+0,last_surfpressure_15min+0 movff last_surfpressure+1,last_surfpressure_15min+1 movff last_surfpressure+0,last_surfpressure_30min+0 - movff last_surfpressure+1,last_surfpressure_30min+1 ; resets all airpressure registers - -; reset deco data for surface mode - movlw .21 ; 21% - movff WREG,char_I_O2_ratio ; ... oxygen - movlw .0 ; 0% - movff WREG,char_I_He_ratio ; ... helium + movff last_surfpressure+1,last_surfpressure_30min+1 ; resets all air pressure registers ; initialize GF high (needed by deco engine for color-coding the GF value) movff opt_GF_high,char_I_GF_High_percentage - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; breathing at surface - movff int_I_pres_respiration+0,int_I_pres_surface+0 ; surface pressue - movff int_I_pres_respiration+1,int_I_pres_surface+1 + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; breathing at surface + movff int_I_pres_respiration+0,int_I_pres_surface+0 ; surface pressure + movff int_I_pres_respiration+1,int_I_pres_surface+1 - extern deco_setup - call deco_setup ; set up all model parameters. - call deco_clear_tissue ; Set all tissues to Pamb * N2_ratio (C-Code) - banksel common ; back to bank 1, needed after every return from C code + call deco_setup ; set up all model parameters (code located in simulator.asm) + + call deco_clear_tissue ; Set all tissues to Pamb * N2_ratio (code located in p2_deco.c) + banksel common ; back to bank 1, needed after every return from C code call rtc_init ; init clock - movlw HIGH .512 ; =2 - movwf EEADRH - read_int_eeprom .0 - clrf EEADRH - movlw 0xAA - cpfseq EEDATA ; =0xAA - bra no_deco_restore ; No + movlw HIGH .512 ; =2 + movwf EEADRH + read_int_eeprom .0 + clrf EEADRH + movlw 0xAA + cpfseq EEDATA ; =0xAA + bra no_deco_restore ; No + call restore_decodata_from_eeprom ; Reload deco data and date/time from eeprom +no_deco_restore: + call deco_calc_dive_interval_1min ; calculate deco in surface mode + call deco_calc_desaturation_time ; calculate desaturation and no-fly time + banksel common - extern restore_decodata_from_eeprom - call restore_decodata_from_eeprom ; Reload deco data and date/time from eeprom - -no_deco_restore: - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - call deco_calc_desaturation_time ; calculate desaturation and no-fly time - banksel common - bcf menubit ; clear menu flag -; Check for Power-on reset here - extern use_old_prior_209 - ; ***************************************************************************** + ; Check for Power-on reset here + + ; ***************************************************************************** ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" - ; ***************************************************************************** + ; ***************************************************************************** - ; Try to migrate the old battery status from firmware 2.09 or earlier.. - btfsc RCON,POR ; Was this a power-on reset? - call use_old_prior_209 ; No + ; Try to migrate the old battery status from firmware 2.09 or earlier.. + btfsc RCON,POR ; Was this a power-on reset? + call use_old_prior_209 ; No - bcf use_old_batt_flag - btfsc RCON,POR ; Was this a power-on reset? - bsf use_old_batt_flag ; No - - call lt2942_get_status ; Check for gauge IC - btfss battery_gauge_available ; cR or 2 hardware? - bra power_on_return2 ; no + bcf use_old_batt_flag + btfsc RCON,POR ; Was this a power-on reset? + bsf use_old_batt_flag ; No + + call lt2942_get_status ; Check for gauge IC + btfss battery_gauge_available ; cR or 2 hardware? + bra power_on_return2 ; no - movlw .30 - movff WREG,opt_cR_button_right - movff WREG,opt_cR_button_left ; Reset on power-on reset - call piezo_config ; Yes, configure buttons - call piezo_config ; Yes, configure buttons (2 times) + movlw .30 + movff WREG,opt_cR_button_right + movff WREG,opt_cR_button_left ; Reset on power-on reset + call piezo_config ; Yes, configure buttons + call piezo_config ; Yes, configure buttons (2 times) power_on_return2: ; check firmware and reset Custom Functions after an update movlw d'1' - movwf EEADR ; =1 - movwf EEADRH ; =1 - call read_eeprom ; read current version x - movff EEDATA,temp1 - incf EEADR,F ; set to 0x102 - call read_eeprom ; read current version y - movff EEDATA,temp2 - clrf EEADRH ; Reset EEADRH + movwf EEADR ; =1 + movwf EEADRH ; =1 + call read_eeprom ; read current version x + movff EEDATA,lo + incf EEADR,F ; set to 0x102 + call read_eeprom ; read current version y + movff EEDATA,hi + clrf EEADRH ; Reset EEADRH movlw softwareversion_x - cpfseq temp1 ; compare version x - bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM + cpfseq lo ; compare version x + bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM movlw softwareversion_y - cpfseq temp2 ; compare version y - bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM - bra restart ; x and y are equal -> do not reset cf - + cpfseq hi ; compare version y + bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM + bra restart ; x and y are equal -> do not reset cf + check_firmware_new: - call TFT_boot ; Initialize TFT (includes clear screen) - clrf CCPR1L ; Backlight off - WIN_TOP .50 - WIN_LEFT .10 - movlw LOW 0x1E000 - movwf TBLPTRL - movlw HIGH 0x1E000 - movwf TBLPTRH - movlw UPPER 0x1E000 - movwf TBLPTRU - extern color_image - call color_image ; Show logo + call TFT_boot ; Initialize TFT (includes clear screen) + clrf CCPR1L ; Backlight off + WIN_TOP .50 + WIN_LEFT .10 + movlw LOW 0x1E000 + movwf TBLPTRL + movlw HIGH 0x1E000 + movwf TBLPTRH + movlw UPPER 0x1E000 + movwf TBLPTRU + call color_image ; Show logo call TFT_standard_color - WIN_SMALL .10,.100 - STRCPY_PRINT "Update successful!" ; Hard coded since language switch does not work here - WIN_SMALL .10,.140 - STRCPY "New Firmware: " + WIN_SMALL .10,.100 + STRCPY_PRINT "Update successful!" ; Hard coded since language switch does not work here + WIN_SMALL .10,.140 + STRCPY "New Firmware: " movlw softwareversion_x movwf lo bsf leftbind @@ -231,30 +235,29 @@ movwf lo output_99x bcf leftbind - STRCAT_PRINT "" ; Print second row - call TFT_Display_FadeIn ; Display resulting surface screen. + STRCAT_PRINT "" ; Print second row + call TFT_Display_FadeIn ; Display resulting surface screen. -; place "after-update reset" here... - extern oPressureAdjust, option_reset, option_save - lfsr FSR0,oPressureAdjust - call option_reset ; Reset FSR0 option to factory default. - lfsr FSR0,oPressureAdjust - call option_save ; Save in EEPROM + ; place "after-update reset" here... + lfsr FSR0,oPressureAdjust + call option_reset ; Reset FSR0 option to factory default. + lfsr FSR0,oPressureAdjust + call option_save ; Save in EEPROM + + rcall backup_flash_page ; backup the first 128 bytes from flash to EEPROM - rcall backup_flash_page ; backup the first 128bytes from flash to EEPROM - - movlw d'1' ; store current version in EEPROM - movwf EEADR ; =1 - movwf EEADRH ; =1 + movlw d'1' ; store current version in EEPROM + movwf EEADR ; =1 + movwf EEADRH ; =1 movlw softwareversion_x - movwf EEDATA - call write_eeprom ; write version x - incf EEADR,F ; set to 0x102 + movwf EEDATA + call write_eeprom ; write version x + incf EEADR,F ; set to 0x102 movlw softwareversion_y - movwf EEDATA - call write_eeprom ; write version y - clrf EEADRH ; Reset EEADRH + movwf EEDATA + call write_eeprom ; write version y + clrf EEADRH ; Reset EEADRH movlw .7 movwf lo @@ -263,194 +266,197 @@ bcf onesecupdate btfss onesecupdate bra $-2 - decfsz lo,F ; Wait 10 seconds... + decfsz lo,F ; Wait 10 seconds... bra check_firmware_new2 - global restart + global restart restart: - clrf STKPTR ; Never return from here - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + clrf STKPTR ; Never return from here + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND - extern option_save_all, option_check_all + btfsc menubit ; Return from Menu/COMM mode or timeout? + call option_save_all ; Yes, save all settings into EEPROM - btfsc menubit ; Return from Menu/COMM mode or timeout? - call option_save_all ; Yes, save all settings into EEPROM - - call option_restore_all ; Restore everything from EEPROM into RAM - call option_check_all ; Check all options (and reset if not within their min/max boundaries) - call option_save_all ; Save all settings into EEPROM after they have been checked + call option_restore_all ; Restore everything from EEPROM into RAM + call option_check_all ; Check all options (and reset if not within their min/max boundaries) + call option_save_all ; Save all settings into EEPROM after they have been checked - clrf flag1 ; clear all flags - clrf flag2 - clrf flag3 - clrf flag4 - clrf flag5 - clrf flag6 - clrf flag7 - clrf flag8 - clrf flag9 - clrf flag10 - ; Do not clear flag11 (Sensor calibration and charger status) - clrf flag12 - ; Do not clear flag13 (Important hardware flags) - clrf flag14 - clrf hardware_flag ; hardware descriptor flag - bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! + clrf flag1 ; clear all flags + clrf flag2 + clrf flag3 + clrf flag4 + clrf flag5 + clrf flag6 + clrf flag7 + clrf flag8 + clrf flag9 + clrf flag10 + ; Do not clear flag11 (Sensor calibration and charger status) + clrf flag12 + ; Do not clear flag13 (Important hardware flags) + clrf flag14 + clrf hardware_flag ; hardware descriptor flag - ; configure hardware_flag byte + bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! - bsf ambient_sensor ; Set flag - bsf optical_input ; Set flag + ; configure hardware_flag byte + bsf ambient_sensor ; Set flag + bsf optical_input ; Set flag + + call lt2942_get_status ; Check for gauge IC + btfss battery_gauge_available ; cR/2 hardware? + bra restart2 ; No - call lt2942_get_status ; Check for gauge IC - btfss battery_gauge_available ; cR/2 hardware? - bra restart2 ; No + call lt2942_init ; Yes, init battery gauge IC + bcf optical_input ; Clear flag - call lt2942_init ; Yes, init battery gauge IC - bcf optical_input ; Clear flag - - banksel 0xF16 - bcf ANCON0,7 ; AN7 Digital input - banksel common - bcf lightsen_power ; Power-down ambient light sensor - bcf ambient_sensor ; Clear flag - nop - btfss PORTF,2 ; Light sensor available? - bsf ambient_sensor ; Yes. - banksel 0xF16 - bsf ANCON0,7 ; AN7 Analog again - banksel common - bsf lightsen_power ; Power-up ambient light sensor again - + banksel 0xF16 + bcf ANCON0,7 ; AN7 Digital input + banksel common + bcf lightsen_power ; Power-down ambient light sensor + bcf ambient_sensor ; Clear flag + nop + btfss PORTF,2 ; Light sensor available? + bsf ambient_sensor ; Yes. + banksel 0xF16 + bsf ANCON0,7 ; AN7 Analog again + banksel common + bsf lightsen_power ; Power-up ambient light sensor again + restart2: - btfsc vusb_in - bra restart3 ; USB (and powered on) - bcf PORTE,0 ; Start comms - WAITMS d'1' - btfss vusb_in - bra restart3 ; USB (and powered off) - bsf ble_available ; ble available -restart3: - bsf PORTE,0 ; Stop comms - btfsc ble_available ; ble available? - bra restart4 ; Yes, can't be a cR - btfss battery_gauge_available ; Rechargeable - bra restart4 ; No, can't be a cR - bsf analog_o2_input ; Set flag for analog + btfsc vusb_in + bra restart3 ; USB (and powered on) + bcf PORTE,0 ; Start comms + WAITMS d'1' + btfss vusb_in + bra restart3 ; USB (and powered off) + bsf ble_available ; ble available + +restart3: + bsf PORTE,0 ; Stop comms + btfsc ble_available ; ble available? + bra restart4 ; Yes, can't be a cR + btfss battery_gauge_available ; Rechargeable + bra restart4 ; No, can't be a cR + bsf analog_o2_input ; Set flag for analog + + ; The hardware_flag is now: + ; 0x11: 2 with BLE + ; 0x13: 2 with BLE & ambient + ; 0x05: cR + ; 0x0A: 3 + ; 0x1A: 3 with BLE + restart4: - ; The hardware_flag is now: - ; 3: 0x0A - ; cR: 0x05 - ; 2 with BLE: 0x11 - ; 3 with BLE: 0x1A - ; 2 with ambient: 0x13 - ; Select high altitude (Fly) mode? movff last_surfpressure_30min+0,sub_b+0 movff last_surfpressure_30min+1,sub_b+1 - movlw HIGH high_altitude_threshold + movlw HIGH high_altitude_threshold movwf sub_a+1 - movlw LOW high_altitude_threshold ; Hard-wired 880mbar + movlw LOW high_altitude_threshold ; hard-wired 880mbar movwf sub_a+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Result negative (Ambient>880mbar)? - bsf high_altitude_mode ; No, Set Flag! - - btfss analog_o2_input - bsf TRISB,3 - btfss battery_gauge_available - bsf TRISG,0 - call ext_flash_disable_protection ; Disable write protection for external flash + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; result negative (ambient > 880mbar)? + bsf high_altitude_mode ; NO - set flag! - bsf flip_screen ; Flip 180° - TSTOSS opt_flip_screen ; =1: Flip the screen - bcf flip_screen ; Normal orientation - - btfsc use_old_batt_flag ; =1: load old battery information after power-on reset - goto use_old_batteries ; Returns to "surfloop"! + btfss analog_o2_input + bsf TRISB,3 + btfss battery_gauge_available + bsf TRISG,0 + call ext_flash_disable_protection ; disable write protection for external flash - btfsc RCON,POR ; Was this a power-on reset? - goto surfloop ; Jump to Surfaceloop! - bsf RCON,POR ; Set bit for next detection - ; Things to do after a power-on reset - extern new_battery_menu,use_old_batteries - goto new_battery_menu ; Returns to "surfloop"! + bsf flip_screen ; flip 180° + TSTOSS opt_flip_screen ; =1: Flip the screen + bcf flip_screen ; normal orientation + + btfsc use_old_batt_flag ; =1: load old battery information after power-on reset + goto use_old_batteries ; returns to "surfloop"! + + btfsc RCON,POR ; was this a power-on reset? + goto surfloop ; jump to surface loop! + bsf RCON,POR ; set bit for next detection + ; Things to do after a power-on reset + goto do_new_battery_select ; returns to "surfloop"! ;============================================================================= ; Setup all flags and parameters for divemode and simulator computations. ; global restart_set_modes_and_flags -restart_set_modes_and_flags: ; "Call"ed from divemode, as well! - call option_restore_all ; Restore everything from EEPROM +restart_set_modes_and_flags: ; "Call"ed from divemode, as well! + call option_restore_all ; Restore everything from EEPROM - ; Setup sampling rate - movlw .2 - movwf samplingrate - TSTOSS opt_sampling_rate ; =1: 10s, =0: 2s - bra restart_set_modes_and_flags1 - movlw .10 - movwf samplingrate + ; Setup sampling rate + movlw .2 + movwf samplingrate + TSTOSS opt_sampling_rate ; =1: 10s, =0: 2s + bra restart_set_modes_and_flags1 + movlw .10 + movwf samplingrate + restart_set_modes_and_flags1: - bcf twosecupdate ; to have divemode routines in sync - - bcf FLAG_apnoe_mode - bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - bcf FLAG_gauge_mode ; =1: In Gauge mode - bcf FLAG_pscr_mode - call disable_ir_s8 ; IR off + bcf twosecupdate ; to have divemode routines in sync + bcf FLAG_apnoe_mode + bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bcf FLAG_gauge_mode ; =1: In Gauge mode + bcf FLAG_pscr_mode + call disable_ir_s8 ; IR off - ; Setup char_I_saturation_multiplier and char_I_desaturation_multiplier - movff opt_sat_multiplier_gf,char_I_saturation_multiplier - movff opt_desat_multiplier_gf,char_I_desaturation_multiplier - movff char_I_deco_model,lo ; 0 = ZH-L16, 1 = ZH-L16-GF - tstfsz lo - bra restart_set_modes_and_flags1b - movff opt_sat_multiplier_non_gf,char_I_saturation_multiplier - movff opt_desat_multiplier_non_gf,char_I_desaturation_multiplier - -restart_set_modes_and_flags1b: - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - tstfsz lo - bra restart_set_modes_and_flags2 - ; OC Mode - - return + ; Setup char_I_saturation_multiplier and char_I_desaturation_multiplier + movff opt_sat_multiplier_gf,char_I_saturation_multiplier + movff opt_desat_multiplier_gf,char_I_desaturation_multiplier + movff char_I_deco_model,lo ; 0 = ZH-L16, 1 = ZH-L16-GF + tstfsz lo + bra restart_set_modes_and_flags1b + movff opt_sat_multiplier_non_gf,char_I_saturation_multiplier + movff opt_desat_multiplier_non_gf,char_I_desaturation_multiplier + +restart_set_modes_and_flags1b: + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + tstfsz lo + bra restart_set_modes_and_flags2 + + ; OC Mode + return restart_set_modes_and_flags2: - decfsz lo,F - bra restart_set_modes_and_flags3 - ; CC Mode - btfsc analog_o2_input ; cR? - bra restart_set_modes_and_flags2b ; Yes, skip mode check - btfsc optical_input ; 3 - bra restart_set_modes_and_flags2b ; Yes, skip mode check - ; Make sure Sensor is not selected - ; opt_ccr_mode must be <> 1 (=0: Fixed SP, =1: Sensor, =2: Auto SP) - banksel opt_ccr_mode - movlw .1 - cpfseq opt_ccr_mode ; = Sensor? - bra restart_set_modes_and_flags2b ; No - clrf opt_ccr_mode ; Yes, reset to Fixed SP + decfsz lo,F + bra restart_set_modes_and_flags3 + + ; CC Mode + btfsc analog_o2_input ; cR? + bra restart_set_modes_and_flags2b ; Yes, skip mode check + btfsc optical_input ; 3 + bra restart_set_modes_and_flags2b ; Yes, skip mode check + + ; Make sure Sensor is not selected + ; opt_ccr_mode must be <> 1 (=0: Fixed SP, =1: Sensor, =2: Auto SP (CCR only)) + banksel opt_ccr_mode + movlw .1 + cpfseq opt_ccr_mode ; = Sensor? + bra restart_set_modes_and_flags2b ; No + clrf opt_ccr_mode ; Yes, reset to Fixed SP + restart_set_modes_and_flags2b: - banksel common - bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active - call enable_ir_s8 ; Enable IR/S8-Port - return + banksel common + bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active + call enable_ir_s8 ; Enable IR/S8-Port + return restart_set_modes_and_flags3: - decfsz lo,F - bra restart_set_modes_and_flags4 - ; Gauge Mode - bsf FLAG_gauge_mode ; =1: In Gauge mode - return + decfsz lo,F + bra restart_set_modes_and_flags4 + + ; Gauge Mode + bsf FLAG_gauge_mode ; =1: In Gauge mode + return restart_set_modes_and_flags4: - decfsz lo,F - bra restart_set_modes_and_flags5 - ; Apnea Mode - bsf FLAG_apnoe_mode - return ; start in Surfacemode + decfsz lo,F + bra restart_set_modes_and_flags5 + ; Apnea Mode + bsf FLAG_apnoe_mode + return ; start in Surfacemode restart_set_modes_and_flags5: ; PSCR Mode @@ -474,29 +480,30 @@ bsf FLAG_pscr_mode return ; start in Surfacemode - -backup_flash_page: ; backup the first 128bytes from flash to EEPROM - ; Start address in internal flash - movlw 0x00 - movwf TBLPTRL - movwf TBLPTRH - movwf TBLPTRU + +; backup the first 128bytes from flash to EEPROM +backup_flash_page: + ; Start address in internal flash + movlw 0x00 + movwf TBLPTRL + movwf TBLPTRH + movwf TBLPTRU - movlw .128 - movwf lo ; Byte counter - clrf EEADR - movlw .3 - movwf EEADRH ; Setup backup address + movlw .128 + movwf lo ; Byte counter + clrf EEADR + movlw .3 + movwf EEADRH ; Setup backup address - TBLRD*- ; Dummy read to be in 128 byte block + TBLRD*- ; Dummy read to be in 128 byte block backup_flash_loop: - tblrd+* ; Table Read with Pre-Increment - movff TABLAT,EEDATA ; put 1 byte - call write_eeprom ; save it in EEPROM - incf EEADR,F - decfsz lo,F ; 128byte done? - bra backup_flash_loop ; No - clrf EEADRH ; Reset EEADRH - return ; Done. + tblrd+* ; Table Read with Pre-Increment + movff TABLAT,EEDATA ; put 1 byte + call write_eeprom ; save it in EEPROM + incf EEADR,F + decfsz lo,F ; 128byte done? + bra backup_flash_loop ; No + clrf EEADRH ; Reset EEADRH + return ; Done. END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/start.inc --- a/src/start.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/start.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File start.inc V2.95 +; File start.inc V2.97 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. diff -r f5de1ff88814 -r b455b31ce022 src/surfmode.asm --- a/src/surfmode.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/surfmode.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,108 +1,111 @@ ;============================================================================= ; -; File surfmode.asm REFACTORED VERSION V2.94 +; File surfmode.asm REFACTORED VERSION V2.98 ; ; Surfacemode ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-08-07 : [mH] moving from OSTC code +; 2011-08-07 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "start.inc" -#include "tft.inc" -#include "tft_outputs.inc" -#include "isr.inc" -#include "adc_lightsensor.inc" -#include "menu_processor.inc" -#include "strings.inc" -#include "sleepmode.inc" -#include "wait.inc" ; speed_* -#include "external_flash.inc" -#include "customview.inc" -#include "divemode.inc" -#include "mcp.inc" ; RX -#include "i2c.inc" -#include "comm.inc" -#include "eeprom_rs232.inc" -#include "calibrate.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "start.inc" +#include "tft.inc" +#include "tft_outputs.inc" +#include "isr.inc" +#include "adc_lightsensor.inc" +#include "menu_processor.inc" +#include "strings.inc" +#include "sleepmode.inc" +#include "wait.inc" ; speed_* +#include "external_flash.inc" +#include "customview.inc" +#include "divemode.inc" +#include "mcp.inc" ; RX +#include "i2c.inc" +#include "comm.inc" +#include "eeprom_rs232.inc" +#include "calibrate.inc" - extern do_main_menu + extern do_main_menu + extern color_image + + + ;---- Private local variables ------------------------------------------------- -#DEFINE menu_pos_row .215 -#DEFINE menu_pos_column .1 -#DEFINE view_row .215 -#DEFINE view_column .124 + CBLOCK local1 ; max size is 16 Byte !!! + ; currently not used + ENDC ; used: 0 byte, remaining: 16 byte + -gui CODE +#DEFINE menu_pos_row .215 +#DEFINE menu_pos_column .1 +#DEFINE view_row .215 +#DEFINE view_column .124 +gui CODE ;============================================================================= ; Boot tasks for all modes global surfloop surfloop: - call speed_normal - bcf no_sensor_int ; Normal pressure mode + call speed_normal + bcf no_sensor_int ; Normal pressure mode - bcf LEDr + bcf LEDr - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM output to GND - call TFT_boot ; Initialize TFT (includes clear screen) - bcf restore_deco_data + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM output to GND + call TFT_boot ; Initialize TFT (includes clear screen) + bcf restore_deco_data - WIN_TOP .50 - WIN_LEFT .10 - movlw LOW 0x1E000 - movwf TBLPTRL - movlw HIGH 0x1E000 - movwf TBLPTRH - movlw UPPER 0x1E000 - movwf TBLPTRU - extern color_image - call color_image ; Show logo + WIN_TOP .50 + WIN_LEFT .10 + movlw LOW 0x1E000 + movwf TBLPTRL + movlw HIGH 0x1E000 + movwf TBLPTRH + movlw UPPER 0x1E000 + movwf TBLPTRU + call color_image ; Show logo - WIN_TOP .100 - WIN_LEFT .34 - extern ostc_logo_block - movlw LOW(ostc_logo_block) - movwf TBLPTRL - movlw HIGH ostc_logo_block;&0xFFFF - movwf TBLPTRH - movlw UPPER(ostc_logo_block) - movwf TBLPTRU - call color_image - call TFT_Display_FadeIn ; Show splash - call TFT_serial ; Show serial and firmware version + WIN_TOP .100 + WIN_LEFT .34 + extern ostc_logo_block + movlw LOW ostc_logo_block + movwf TBLPTRL + movlw HIGH ostc_logo_block ; &0xFFFF + movwf TBLPTRH + movlw UPPER ostc_logo_block + movwf TBLPTRU + call color_image + call TFT_Display_FadeIn ; Show splash + call TFT_serial ; Show serial and firmware version - ;---- Do any usefull initializes that takes time ------------------------- - call restart_set_modes_and_flags ; Sets decomode flags + ;---- Do any useful initializes that takes time ------------------------- + call restart_set_modes_and_flags ; Sets deco mode flags bcf pressure_refresh - call I2C_init_compass - call I2C_init_accelerometer + call I2C_init_compass + call I2C_init_accelerometer clrf ext_flash_address+0 clrf ext_flash_address+1 clrf ext_flash_address+2 - movlw surface_sp ; in cbar - call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + movlw surface_sp ; in cbar + call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics clrf timeout_counter2 - clrf timeout_counter3 - bcf menubit ; clear menu flag - bcf premenu +; clrf timeout_counter3 ; not used / required [rl] + bcf menubit ; clear menu flag + bcf premenu clrf last_pressure+0 clrf last_pressure+1 - bcf is_bailout ; =1: Bailout - bcf ccr_diluent_setup ; Use OC gases for gaslist routine + bcf is_bailout ; =1: Bailout + bcf ccr_diluent_setup ; Use OC gases for gaslist routine - bcf simulatormode_active ; Quit simulator mode (if active) - - ; MOVE from here to below ## V2.94 - ; bcf switch_left - ; bcf switch_right + bcf simulatormode_active ; Quit simulator mode (if active) ;---- Fade to standard surface view -------------------------------------- ; Wait 1 second @@ -114,80 +117,73 @@ btfss onesecupdate bra $-2 - call TFT_Display_FadeOut ; Go to black screen - call TFT_ClearScreen ; Then change everything - WIN_TOP .0 - WIN_LEFT .0 - WIN_FONT FT_SMALL - bcf win_invert ; Reset invert flag + call TFT_Display_FadeOut ; Go to black screen + call TFT_ClearScreen ; Then change everything + WIN_TOP .0 + WIN_LEFT .0 + WIN_FONT FT_SMALL + bcf win_invert ; Reset invert flag - WIN_COLOR color_lightblue - WIN_SMALL menu_pos_column,menu_pos_row - STRCPY_TEXT_PRINT tMenu ;"" - call TFT_standard_color + WIN_COLOR color_lightblue + WIN_SMALL menu_pos_column,menu_pos_row + STRCPY_TEXT_PRINT tMenu ;"" + call TFT_standard_color ; Logo - WIN_TOP .0 - WIN_LEFT .70 - movlw LOW(ostc_logo_block) - movwf TBLPTRL - movlw HIGH ostc_logo_block;&0xFFFF - movwf TBLPTRH - movlw UPPER(ostc_logo_block) - movwf TBLPTRU - call color_image + WIN_TOP .0 + WIN_LEFT .70 + movlw LOW ostc_logo_block + movwf TBLPTRL + movlw HIGH ostc_logo_block ; &0xFFFF + movwf TBLPTRH + movlw UPPER ostc_logo_block + movwf TBLPTRU + call color_image call TFT_clock ; display time - call update_surfloop60 + call update_surfloop60 call get_battery_voltage ; get battery voltage call TFT_update_batt_voltage ; display battery voltage call TFT_update_surf_press ; display surface pressure call TFT_temp_surfmode ; Displays temperature call TFT_display_decotype_surface - call calc_deko_divemode_sensor - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - tstfsz lo - bra surfloop_no_oc ; Not OC - call TFT_show_OC_startgas_surface; Show first gas and "OSTC2-like" active gases + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + tstfsz lo + bra surfloop_no_oc ; Not OC + call TFT_show_OC_startgas_surface; Show first gas and "OSTC2-like" active gases surfloop_no_oc: - movff customview_surfmode,menupos3 ; Reload last customview - call surf_customview_mask ; Update #menupos3 view + movff customview_surfmode,menupos3; Reload last customview + call surf_customview_mask ; Update #menupos3 view - call TFT_Display_FadeIn ; Display resulting surface screen. + call TFT_Display_FadeIn ; Display resulting surface screen. - ; MOVED from above to here ## V2.94 bcf switch_left bcf switch_right - - ;---- Late initialisations ----------------------------------------------- - movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine ## not used any more (!?) - movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values ## not used any more (!?) + + ;---- Late initializations ----------------------------------------------- + movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine + movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine - movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values - movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure + movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values + movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure - ; NEW ## no fly movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage - - ; Startup tasks for all modes - ; Desaturation time needs: - ; int_I_pres_surface - ; char_I_desaturation_multiplier + + ; Startup tasks for all modes + ; Desaturation time needs: + ; int_I_pres_surface + ; char_I_desaturation_multiplier call deco_calc_desaturation_time ; calculate desaturation time - - ; REPLACE ## (code unification) - ; movlb b'00000001' ; select ram bank 1 - ; BY banksel common - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - call enable_rs232 ; Also sets to speed_normal ... + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + call enable_rs232 ; Also sets to speed_normal ... surfloop_loop: btfss onesecupdate ; do every second tasks? @@ -201,12 +197,12 @@ call get_battery_voltage ; get battery voltage call TFT_update_batt_voltage ; display battery voltage call set_dive_modes ; tests if depth>threshold - btfss secs,0 ; Every two seconds... + btfss secs,0 ; Every two seconds... call TFT_temp_surfmode ; Displays temperature - btfss secs,0 ; Every two seconds... - call surfmode_check_for_warnings ; ... check for warnings (and display/update) them + btfss secs,0 ; Every two seconds... + call surfmode_check_for_warnings ; ... check for warnings (and display/update) them bcf onesecupdate ; every second tasks done - + surfloop_loop2: ; Tasks approx. every 50ms for all modes call test_switches_surfmode ; check switches @@ -228,262 +224,187 @@ bcf pressure_refresh ; until new pressure is available ; Updates every 1/4 second - btfss quarter_second_update - bra surfloop_loop2b + btfss quarter_second_update + bra surfloop_loop2b + + bcf quarter_second_update + + ; Update Sensors + call calc_deko_divemode_sensor + + btfsc FLAG_ccr_mode ; In CCR mode? + bra surfloop_loop2a1 ; Yes. + btfss FLAG_pscr_mode ; In PSCR mode? + bra surfloop_loop2a ; No, skip - bcf quarter_second_update - - call calc_deko_divemode_sensor - - btfsc FLAG_ccr_mode ; In CCR mode? - bra surfloop_loop2a1 ; Yes. - btfss FLAG_pscr_mode ; In PSCR mode? - bra surfloop_loop2a ; No, skip - -surfloop_loop2a1: - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz surfloop_loop2a ; No, skip +surfloop_loop2a1: + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz surfloop_loop2a ; No, skip - call TFT_surface_sensor ; ...update sensor data in surface mode - call TFT_sensor_surface_warning ; Show a warning arrow-down behind sensor readings when sensor is end-of-life - movlw .9 - cpfseq menupos3 ; in Sensor mV surface custom view? - bra surfloop_loop2a ; No - extern TFT_sensor_mV - call TFT_sensor_mV ; Yes, update mV readings (Each 1/4 second and not each second as in customview.asm) + call TFT_surface_sensor ; ...update sensor data in surface mode + call TFT_sensor_surface_warning ; Show a warning arrow-down behind sensor readings when sensor is end-of-life + movlw .9 + cpfseq menupos3 ; in Sensor mV surface custom view? + bra surfloop_loop2a ; No + extern TFT_sensor_mV + call TFT_sensor_mV ; Yes, update mV readings (Each 1/4 second and not each second as in customview.asm) surfloop_loop2a: - movlw .6 - cpfseq menupos3 ; in compass view? - bra surfloop_loop2b ; No - extern TFT_surface_compass_heading - call TFT_surface_compass_heading ; Yes, update compass heading value + movlw .6 + cpfseq menupos3 ; in compass view? + bra surfloop_loop2b ; No + extern TFT_surface_compass_heading + call TFT_surface_compass_heading ; Yes, update compass heading value surfloop_loop2b: btfsc toggle_customview ; Next view? - call surf_customview_toggle ; Yes, show next customview (and delete this flag) + call surf_customview_toggle ; Yes, show next customview (and delete this flag) + + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + bra surfloop_loop3 - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - bra surfloop_loop3 - - ; DELETE - In surface mode, only charing is available now - but now you can see the charging status :-) ## USB - ; To do USB communication, you now need to be in menu or logbook mode - ;btfsc vusb_in ; USB plugged in? - ;call comm_mode ; Start COMM mode - - bra surfloop_loop4 + ;btfsc vusb_in ; USB plugged in? + ;call comm_mode ; Start COMM mode + + bra surfloop_loop4 + surfloop_loop3: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag - call rs232_get_byte - btfsc rs232_recieve_overflow - bra surfloop_loop4 - movlw "l" - cpfseq RCREG1 - bra surfloop_loop4 - call TFT_dump_screen ; Dump the screen contents + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag + call rs232_get_byte + btfsc rs232_receive_overflow + bra surfloop_loop4 + movlw "l" + cpfseq RCREG1 + bra surfloop_loop4 + call TFT_dump_screen ; Dump the screen contents + surfloop_loop4: - btfsc sleepmode ; Sleepmode active? - goto sleeploop ; Yes, switch into sleepmode! + btfss sleepmode ; shall we go into sleepmode? + bra surfloop_loop ; NO - loop in surfacemode + movff menupos3,customview_surfmode; YES - save last customview + goto sleeploop ; switch into sleepmode - bra surfloop_loop ; loop surfacemode update_surfloop60: ; One minute tasks for all modes - call TFT_date ; Update date - - ; REPLACE ## no fly 2 - ; call calc_deko_surfmode ; calculate desaturation time every minute - ; BY - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode. int_I_pres_surface gets updated by - call deco_calc_desaturation_time ; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar + call TFT_date ; Update date + + call deco_calc_dive_interval_1min; calculate deco in surface mode. int_I_pres_surface gets updated by + call deco_calc_desaturation_time ; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar banksel common - - ; NEW ## deco engine + ; update tissue diagram if it is on display - movlw .5 ; number of tissue custom view - cpfseq menupos3 ; is this the current customview? - bra update_surfloop60_1 ; NO - call TFT_standard_color ; YES - set standard color - call TFT_surface_tissues ; show tissue diagram + movlw .5 ; number of tissue custom view + cpfseq menupos3 ; is this the current customview? + bra update_surfloop60_1 ; NO + call TFT_standard_color ; YES - set standard color + call TFT_surface_tissues ; show tissue diagram + update_surfloop60_1: - - ; NEW ## no fly ; update last dive info if it is on display - movlw .8 ; number of the last dive info customview - cpfseq menupos3 ; is this the current customview? - bra update_surfloop60_2 ; NO - call TFT_standard_color ; YES - set standard color - call TFT_surface_lastdive ; show last dive infos + movlw .8 ; number of the last dive info customview + cpfseq menupos3 ; is this the current customview? + bra update_surfloop60_2 ; NO + call TFT_standard_color ; YES - set standard color + call TFT_surface_lastdive ; show last dive infos + update_surfloop60_2: - - bcf oneminupdate + bcf oneminupdate return - extern check_cns_violation,check_warn_battery,check_and_store_gf_violation + extern check_cns_violation,check_warn_battery,check_and_store_gf_violation surfmode_check_for_warnings: + bcf warning_active ; Clear flag + clrf warning_counter ; Clear counter - ; DELETE ## (screen flicker) - ; movf warning_counter_backup,W - ; cpfseq warning_counter ; warning_counter_backup = warning_counter? - ; call TFT_clear_warning_text ; No, clear all warnings - ; movff warning_counter,warning_counter_backup ; copy warning_counter - - bcf warning_active ; Clear flag - clrf warning_counter ; Clear counter + ; Warnings for all modes + call check_warn_battery ; Check if the battery level should be displayed/warned - ; Warnings for all modes - call check_warn_battery ; Check if the battery level should be displayed/warned - - ; DELETE HERE... ## (general fix) - ; rcall surfmode_check_for_nofly ; Check if nofly time should be shown - ; rcall surfmode_check_for_desat ; Check if desat time should be shown - - ; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more ## no fly - ; rcall surfmode_check_for_interval ; Check if surface interval should be shown - - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - bra surfmode_check_for_warnings2 - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - bra surfmode_check_for_warnings2 + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + bra surfmode_check_for_warnings2 + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + bra surfmode_check_for_warnings2 - ; Warnings only in deco modes - - ; ...INSERT HERE ## (general fix) - desat and no-fly time belong to deco modes - rcall surfmode_check_for_desat ; Check if desat time should be shown - rcall surfmode_check_for_nofly ; Check if nofly time should be shown - - call check_cns_violation ; Check CNS value and display it, if required - call check_and_store_gf_violation ; Check GF value and display it, if required + ; Warnings only in deco modes + rcall surfmode_check_for_desat ; Check if desat time should be shown + rcall surfmode_check_for_nofly ; Check if nofly time should be shown + call check_cns_violation ; Check CNS value and display it, if required + call check_and_store_gf_violation; Check GF value and display it, if required - ; NEW ## microbubbles - movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings - btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? extern warn_mbubbles - call warn_mbubbles ; YES + call warn_mbubbles ; YES surfmode_check_for_warnings2: -; Setup warning_page number - incf warning_page,F - bcf STATUS,C - rlcf warning_page,W ; *2 - cpfsgt warning_counter ; > warning_counter - clrf warning_page ; No, clear - - ; NEW ## (screen flicker) -; Clear both rows of warnings if there is nothing to show at all - tstfsz warning_counter ; any warnings? - bra surfmode_check_for_warnings3 ; YES - look if second row needs to be cleared - call TFT_clear_warning_text ; NO - clear complete warnings area - return -surfmode_check_for_warnings3: + ; Setup warning_page number + incf warning_page,F + bcf STATUS,C + rlcf warning_page,W ; *2 + cpfsgt warning_counter ; > warning_counter + clrf warning_page ; No, clear -; Clear 2nd row of warnings if there is nothing to show (on this page) - btfss second_row_warning ; =1: The second row contains a warning - call TFT_clear_warning_text_2nd_row ; No, clear this row - return ; Done. + ; Clear both rows of warnings if there is nothing to show at all + tstfsz warning_counter ; any warnings? + bra surfmode_check_for_warnings3; YES - look if second row needs to be cleared + call TFT_clear_warning_text ; NO - clear complete warnings area + return -; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more ## no fly -; -;surfmode_check_for_interval: -; movf surface_interval+0,W ; Is interval null ? -; iorwf surface_interval+1,W -; bnz surfmode_check_for_interval2 ; No -; return -;surfmode_check_for_interval2: -; incf warning_counter,F ; increase counter -; call TFT_interval -; return - +surfmode_check_for_warnings3: + ; Clear 2nd row of warnings if there is nothing to show (on this page) + btfss second_row_warning ; =1: The second row contains a warning + call TFT_clear_warning_text_2nd_row ; No, clear this row + return ; Done. surfmode_check_for_desat: - ; REPLACE ## no fly - ; movf desaturation_time+0,W ; Is nofly null ? - ; iorwf desaturation_time+1,W - ; BY banksel int_O_desaturation_time - movf int_O_desaturation_time+0,W ; Is nofly null ? - iorwf int_O_desaturation_time+1,W - - bnz surfmode_check_for_desat2 ; No - - ; NEW ## no fly - banksel common - - return - -surfmode_check_for_desat2: - ; NEW ## no fly - banksel common - - incf warning_counter,F ; increase counter - call TFT_desaturation_time - return + movf int_O_desaturation_time+0,W ; is nofly-time null ? + iorwf int_O_desaturation_time+1,W + banksel common + bnz surfmode_check_for_desat_1 ; NO + return +surfmode_check_for_desat_1: ; YES + incf warning_counter,F ; increase counter + call TFT_desaturation_time ; show desaturation time + return surfmode_check_for_nofly: - ; REPLACE ## no fly - ; movf nofly_time+0,W ; Is nofly null ? - ; iorwf nofly_time+1,W - ; BY banksel int_O_nofly_time - movf int_O_nofly_time+0,W ; Is nofly null ? - iorwf int_O_nofly_time+1,W - - bnz surfmode_check_for_nofly2 ; No... - - ; NEW ## no fly + movf int_O_nofly_time+0,W ; is nofly-time null ? + iorwf int_O_nofly_time+1,W banksel common - - return - -surfmode_check_for_nofly2: - ; NEW ## no fly - banksel common - - incf warning_counter,F ; increase counter - call TFT_nofly_time - return + bnz surfmode_check_for_nofly_1 ; No... + return +surfmode_check_for_nofly_1: ; YES + incf warning_counter,F ; increase counter + call TFT_nofly_time ; show nofly-time + return ;============================================================================= -; DELETE - not used any more ## no fly -; global calc_deko_surfmode -;calc_deko_surfmode: -; -; ; DELETE - deco_calc_wo_deco_step_1_min uses int_I_pres_surface, not int_I_pres_respiration ## no fly -; ; SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine -; -; call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode -; -; ; NEW ## no fly -; ; call deco_calc_desaturation_time -; -; banksel common -; return - -test_switches_surfmode: ; checks switches in surfacemode +test_switches_surfmode: ; checks switches in surfacemode btfsc switch_right bra test_switches_surfmode2 btfsc switch_left - bra test_switches_surfmode3 - - ; No button press + bra test_switches_surfmode3 + ; No button pressed return test_switches_surfmode3: - movlw .6 - cpfseq menupos3 ; in compass view? - bra test_switches_surfmode3a ; No + movlw .6 + cpfseq menupos3 ; in compass view? + bra test_switches_surfmode3a ; No - btfsc premenu ; already shown "Bearing" - bra test_switches_surfmode3b ; Yes, remove it + btfsc premenu ; already shown "Bearing" + bra test_switches_surfmode3b ; Yes, remove it - extern TFT_surf_set_bearing - call TFT_surf_set_bearing ; Yes. - bcf switch_left - return + extern TFT_surf_set_bearing + call TFT_surf_set_bearing ; Yes. + bcf switch_left + return test_switches_surfmode3a: bcf switch_left @@ -491,51 +412,51 @@ return test_switches_surfmode3b: - ; Clear "Heading?" - WIN_BOX_BLACK .158,.190, .15, .99 ; top, bottom, left, right - bcf premenu - bcf switch_left - return + ; Clear "Heading?" + WIN_BOX_BLACK .158,.190, .15, .99 ; top, bottom, left, right + bcf premenu + bcf switch_left + return test_switches_surfmode2: - movlw .6 - cpfseq menupos3 ; in compass view? - bra test_switches_surfmode2a ; No - btfss premenu ; "Heading?" shown? - bra test_switches_surfmode2a ; No - ; Set new heading - bcf premenu - bsf compass_bearing_set - movff compass_heading_shown+0,compass_bearing+0 - movff compass_heading_shown+1,compass_bearing+1 + movlw .6 + cpfseq menupos3 ; in compass view? + bra test_switches_surfmode2a ; No + btfss premenu ; "Heading?" shown? + bra test_switches_surfmode2a ; No + ; Set new heading + bcf premenu + bsf compass_bearing_set + movff compass_heading_shown+0,compass_bearing+0 + movff compass_heading_shown+1,compass_bearing+1 bcf switch_right - return + return test_switches_surfmode2a: bcf switch_right bsf toggle_customview - bcf premenu - clrf timeout_counter2 ; and reset timeout + bcf premenu + clrf timeout_counter2 ; and reset timeout return global timeout_surfmode timeout_surfmode: - movlw timeout_surfacemode ; [s] Default timeout - btfsc menu_show_sensors2 ; In the "Calibrate" menu? - movlw timeout_calibrate_menu ; [s] CCR Calibrate Menu timeout - btfsc menubit ; in Menu? - bra timeout_testmode ; No, done. - ; Must be in surface mode - btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - bra timeout_testmode ; No, not CCR - movlw timeout_ccr_surface ; [s] CCR Surface mode timeout + movlw timeout_surfacemode ; [s] Default timeout + btfsc menu_show_sensors2 ; In the "Calibrate" menu? + movlw timeout_calibrate_menu ; [s] CCR Calibrate Menu timeout + btfsc menubit ; in Menu? + bra timeout_testmode ; No, done. + ; Must be in surface mode + btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bra timeout_testmode ; No, not CCR + movlw timeout_ccr_surface ; [s] CCR Surface mode timeout global timeout_testmode timeout_testmode: - incf timeout_counter2,F ; increase timeout counter - cpfsgt timeout_counter2 ; Compare with timeout_counter2 - return ; return, no timeout - bsf sleepmode ; Set Flag - return ; Return + incf timeout_counter2,F ; increase timeout counter + cpfsgt timeout_counter2 ; Compare with timeout limit + return ; return, no timeout + bsf sleepmode ; Set Flag + return ; Return - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/surfmode.inc --- a/src/surfmode.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/surfmode.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File surfmode.inc REFACTORED VERSION V2.92 +; File surfmode.inc REFACTORED VERSION V2.97 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,109 +8,107 @@ ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code - extern surfloop -; extern calc_deko_surfmode DELETED - not used any more ## no fly - extern timeout_surfmode - extern timeout_testmode + extern surfloop + extern timeout_surfmode + extern timeout_testmode ; Surfacemode/Homescreen layout: ; row=0...239 ; column=0...159 (x2) -#DEFINE surf_clock_row .0 -#DEFINE surf_clock_column .5 -#DEFINE surf_date_row .25 -#DEFINE surf_date_column .1 +#DEFINE surf_clock_row .0 +#DEFINE surf_clock_column .5 +#DEFINE surf_date_row .25 +#DEFINE surf_date_column .1 -#DEFINE batt_voltage_row .8 -#DEFINE batt_voltage_column .45 -#DEFINE batt_percent_row .26 -#DEFINE batt_percent_column .60 +#DEFINE batt_voltage_row .8 +#DEFINE batt_voltage_column .45 +#DEFINE batt_percent_row .26 +#DEFINE batt_percent_column .60 -#DEFINE surf_desat_row .103 -#DEFINE surf_desat_column .65 -#DEFINE surf_nofly_row .128 -#DEFINE surf_nofly_column .65 +#DEFINE surf_desat_row .103 +#DEFINE surf_desat_column .65 +#DEFINE surf_nofly_row .128 +#DEFINE surf_nofly_column .65 -#DEFINE surf_warning1_column .40 -#DEFINE surf_warning1_row .191 -#DEFINE surf_warning2_column surf_warning1_column -#DEFINE surf_warning2_row surf_warning1_row+.24 -#DEFINE surf_warning_length .11 ; total string length +#DEFINE surf_warning1_column .40 +#DEFINE surf_warning1_row .191 +#DEFINE surf_warning2_column surf_warning1_column +#DEFINE surf_warning2_row surf_warning1_row+.24 +#DEFINE surf_warning_length .11 ; total string length -#DEFINE surf_temp_row .185 -#DEFINE surf_temp_column .120 ; CHANGED - clear overlapp with warning text area ## temp -#DEFINE surf_press_row .160 -#DEFINE surf_press_column .98 +#DEFINE surf_temp_row .185 +#DEFINE surf_temp_column .120 +#DEFINE surf_press_row .160 +#DEFINE surf_press_column .98 -#DEFINE surf_gaslist_row .66 -#DEFINE surf_gaslist_column .2 -#DEFINE surf_gaslist_spacing .24 +#DEFINE surf_gaslist_row .66 +#DEFINE surf_gaslist_column .2 +#DEFINE surf_gaslist_spacing .24 -#DEFINE surf_customview_title_row .52 -#DEFINE surf_customview_title_column .15 +#DEFINE surf_customview_title_row .52 +#DEFINE surf_customview_title_column .15 -#DEFINE surf_customtext_row1 .66 -#DEFINE surf_customtext_row2 surf_customtext_row1+.24 -#DEFINE surf_customtext_row3 surf_customtext_row2+.24 -#DEFINE surf_customtext_row4 surf_customtext_row3+.24 -#DEFINE surf_customtext_row5 surf_customtext_row4+.24 -#DEFINE surf_customtext_column .5 +#DEFINE surf_customtext_row1 .66 +#DEFINE surf_customtext_row2 surf_customtext_row1+.24 +#DEFINE surf_customtext_row3 surf_customtext_row2+.24 +#DEFINE surf_customtext_row4 surf_customtext_row3+.24 +#DEFINE surf_customtext_row5 surf_customtext_row4+.24 +#DEFINE surf_customtext_column .5 -#DEFINE surf_compass_mask_row surf_customtext_row2 -#DEFINE surf_compass_mask_column .10 -#DEFINE surf_compass_head_row surf_customtext_row4-.8 -#DEFINE surf_compass_head_column .10 +#DEFINE surf_compass_mask_row surf_customtext_row2 +#DEFINE surf_compass_mask_column .10 +#DEFINE surf_compass_head_row surf_customtext_row4-.8 +#DEFINE surf_compass_head_column .10 -#DEFINE surf_compass_bear_column .15 -#DEFINE surf_compass_bear_row surf_customtext_row5 +#DEFINE surf_compass_bear_column .15 +#DEFINE surf_compass_bear_row surf_customtext_row5 -#DEFINE surf_hud_sensor1_column .112 -#DEFINE surf_hud_sensor1_row .87 -#DEFINE surf_hud_sensor2_column surf_hud_sensor1_column -#DEFINE surf_hud_sensor2_row .111 -#DEFINE surf_hud_sensor3_column surf_hud_sensor1_column -#DEFINE surf_hud_sensor3_row .135 +#DEFINE surf_hud_sensor1_column .112 +#DEFINE surf_hud_sensor1_row .87 +#DEFINE surf_hud_sensor2_column surf_hud_sensor1_column +#DEFINE surf_hud_sensor2_row .111 +#DEFINE surf_hud_sensor3_column surf_hud_sensor1_column +#DEFINE surf_hud_sensor3_row .135 -#DEFINE surf_menu_sensor1_column .80 -#DEFINE surf_menu_sensor1_row .60 -#DEFINE surf_menu_sensor2_column surf_menu_sensor1_column -#DEFINE surf_menu_sensor2_row surf_menu_sensor1_row+.27*.1 -#DEFINE surf_menu_sensor3_column surf_menu_sensor1_column -#DEFINE surf_menu_sensor3_row surf_menu_sensor1_row+.27*.2 -#DEFINE surf_menu_sensor4_column surf_menu_sensor1_column -#DEFINE surf_menu_sensor4_row surf_menu_sensor1_row-.27*.1 -#DEFINE surf_menu2_sensor1_row .47 -#DEFINE surf_menu2_sensor2_row surf_menu2_sensor1_row+.27*.1 -#DEFINE surf_menu2_sensor3_row surf_menu2_sensor1_row+.27*.2 -#DEFINE surf_menu2_ambient_row surf_menu2_sensor1_row+.27*.4 -#DEFINE surf_menu2_ambient_column .95 - +#DEFINE surf_menu_sensor1_column .80 +#DEFINE surf_menu_sensor1_row .60 +#DEFINE surf_menu_sensor2_column surf_menu_sensor1_column +#DEFINE surf_menu_sensor2_row surf_menu_sensor1_row+.27*.1 +#DEFINE surf_menu_sensor3_column surf_menu_sensor1_column +#DEFINE surf_menu_sensor3_row surf_menu_sensor1_row+.27*.2 +#DEFINE surf_menu_sensor4_column surf_menu_sensor1_column +#DEFINE surf_menu_sensor4_row surf_menu_sensor1_row-.27*.1 +#DEFINE surf_menu2_sensor1_row .47 +#DEFINE surf_menu2_sensor2_row surf_menu2_sensor1_row+.27*.1 +#DEFINE surf_menu2_sensor3_row surf_menu2_sensor1_row+.27*.2 +#DEFINE surf_menu2_ambient_row surf_menu2_sensor1_row+.27*.4 +#DEFINE surf_menu2_ambient_column .95 + #DEFINE surf_mV_sensor_status_column .145 -#DEFINE surf_tissue_diagram_top .66 -#DEFINE surf_tissue_diagram_bottom surf_tissue_diagram_top+.117 ; 183 -#DEFINE surf_tissue_diagram_left .5 -#DEFINE surf_tissue_diagram_right surf_decotype_column-.5 -#DEFINE surf_tissue_N2_row surf_tissue_diagram_top+.1 -#DEFINE surf_tissue_N2_column surf_tissue_diagram_left+.5 -#DEFINE surf_tissue_He_row surf_tissue_diagram_top+.56 -#DEFINE surf_tissue_He_column surf_tissue_N2_column +#DEFINE surf_tissue_diagram_top .66 +#DEFINE surf_tissue_diagram_bottom surf_tissue_diagram_top+.117 ; 183 +#DEFINE surf_tissue_diagram_left .5 +#DEFINE surf_tissue_diagram_right surf_decotype_column-.5 +#DEFINE surf_tissue_N2_row surf_tissue_diagram_top+.1 +#DEFINE surf_tissue_N2_column surf_tissue_diagram_left+.5 +#DEFINE surf_tissue_He_row surf_tissue_diagram_top+.56 +#DEFINE surf_tissue_He_column surf_tissue_N2_column -#DEFINE surf_decotype_row .60 -#DEFINE surf_decotype_column .100 +#DEFINE surf_decotype_row .60 +#DEFINE surf_decotype_column .100 ; OSTC2-style start gas and boxes -#DEFINE surf_decotype_boxes_top surf_decotype_row+.30+.25-.1 -#DEFINE surf_decotype_boxes_bottom surf_decotype_boxes_top+.22 -#DEFINE surf_decotype_boxes_left1 surf_decotype_column+.5 -#DEFINE surf_decotype_boxes_left2 surf_decotype_boxes_left1+.9 -#DEFINE surf_decotype_boxes_left3 surf_decotype_boxes_left1+.18 -#DEFINE surf_decotype_boxes_left4 surf_decotype_boxes_left1+.27 -#DEFINE surf_decotype_boxes_left5 surf_decotype_boxes_left1+.36 - - #DEFINE surf_mV_sensor_column .5 - #DEFINE surf_mV_sensor1_row .90 - #DEFINE surf_mV_sensor2_row surf_mV_sensor1_row+.24 - #DEFINE surf_mV_sensor3_row surf_mV_sensor2_row+.24 +#DEFINE surf_decotype_boxes_top surf_decotype_row+.30+.25-.1 +#DEFINE surf_decotype_boxes_bottom surf_decotype_boxes_top+.22 +#DEFINE surf_decotype_boxes_left1 surf_decotype_column+.5 +#DEFINE surf_decotype_boxes_left2 surf_decotype_boxes_left1+.9 +#DEFINE surf_decotype_boxes_left3 surf_decotype_boxes_left1+.18 +#DEFINE surf_decotype_boxes_left4 surf_decotype_boxes_left1+.27 +#DEFINE surf_decotype_boxes_left5 surf_decotype_boxes_left1+.36 +#DEFINE surf_mV_sensor_column .5 +#DEFINE surf_mV_sensor1_row .90 +#DEFINE surf_mV_sensor2_row surf_mV_sensor1_row+.24 +#DEFINE surf_mV_sensor3_row surf_mV_sensor2_row+.24 diff -r f5de1ff88814 -r b455b31ce022 src/text_english.inc --- a/src/text_english.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/text_english.inc Mon Feb 26 16:40:28 2018 +0100 @@ -136,7 +136,7 @@ TCODE tGF_high, "GF high:" TCODE tSaturationMult, "Saturation :" ; ## MODIFIED (layout) TCODE tDesaturationMult,"Desaturation:" - TCODE tFTTSMenu, "fTTS/Delay:" ; Future TTS / Ascent Delay ## MODIFIED (layout) + TCODE tFTTSMenu, "fTTS/fB/O:" ; Future TTS / Ascent Delay ## MODIFIED (layout) TCODE taGFMenu, "Alternative GF" ; Alternative GF TCODE taGF_low, "aGF low :" ; aGF low ## MODIFIED (layout) TCODE taGF_high, "aGF high:" ; aGF high @@ -150,6 +150,7 @@ TCODE tCalcAscGas, "Calc.Gas (B/O):" ; ## NEW bailout gas needs TCODE tTankSizes, "Tank Sizes" ; ## NEW bailout gas needs TCODE tLiter, " l" ; ## NEW bailout gas needs + TCODE tBarLiter, "Bar Liter" TCODE tTankFillPress, "Tank Press Budget"; TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs diff -r f5de1ff88814 -r b455b31ce022 src/text_french.inc --- a/src/text_french.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/text_french.inc Mon Feb 26 16:40:28 2018 +0100 @@ -136,7 +136,7 @@ TCODE tGF_high, "GF Haut:" TCODE tSaturationMult, "Saturation:" TCODE tDesaturationMult, "Désaturation:" - TCODE tFTTSMenu, "Future DTR:" ; Future TTS + TCODE tFTTSMenu, "fDTR/fB/O:" ; Future TTS TCODE taGFMenu, "GF Alternatif" ; Alternative GF TCODE taGF_low, "aGF Bas:" ; aGF Low TCODE taGF_high, "aGF Haut:" ; aGF High @@ -150,6 +150,7 @@ TCODE tCalcAscGas, "Calc.Gaz (B/O):" ; ## NEW bailout gas needs TCODE tTankSizes, "Volumes Blocs" ; Tank Sizes ## NEW bailout gas needs TCODE tLiter, " l" ; ## NEW bailout gas needs + TCODE tBarLiter, "Bar Litre" TCODE tTankFillPress, "Pressions Blocs" ; Tank Press Budget ## NEW bailout gas needs TCODE tGas1, "Gaz 1:" ; ## NEW bailout gas needs TCODE tGas2, "Gaz 2:" ; ## NEW bailout gas needs diff -r f5de1ff88814 -r b455b31ce022 src/text_german.inc --- a/src/text_german.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/text_german.inc Mon Feb 26 16:40:28 2018 +0100 @@ -57,7 +57,7 @@ TCODE tGaslist, "OC Gas Liste" TCODE tGaslistCC, "CC Gas Liste" ; CC Diluents TCODE tGasEdit, "Gas einstellen" - TCODE tType, "Type: " + TCODE tType, "Typ: " TCODE tGasDisabled, "Deaktiviert" ; Disabled TCODE tGasFirst, "Start" ; First TCODE tGasTravel, "Reise" ; Travel @@ -123,20 +123,20 @@ TCODE tDvApnea, "Apnoe" TCODE tDvPSCR, "pSCR" TCODE tDvCC, "CC" - TCODE tDkMode, "Decotype:ZH-L16" ; ## MODIFIED (memory needs) + TCODE tDkMode, "Decotyp:ZH-L16" ; ## MODIFIED (memory needs) TCODE tZHL16, " " ; keep order, enum from here... ## MODIFIED (memory needs) TCODE tZHL16GF, "+GF" ; ...up to here! ## MODIFIED (memory needs) TCODE tPPO2Max, "Max. :" TCODE tPPO2DECO, "Max. Deko:" TCODE tPPO2MIN, "Min. :" TCODE tPPO2MINCC, "Min. Loop:" - TCODE tLastDecostop, "Letzt.Stop:" + TCODE tLastDecostop, "Letzt.Stopp:" TCODE tDecoparameters, "Deko Parameter" TCODE tGF_low, "GF low :" TCODE tGF_high, "GF high:" TCODE tSaturationMult, "Sättigung :" TCODE tDesaturationMult, "Entsättigung:" - TCODE tFTTSMenu, "fTTS/Verz.:" ; Future TTS + TCODE tFTTSMenu, "fTTS/fB/O:" ; Future TTS TCODE taGFMenu, "Alternativ-GF" ; Alternative GF TCODE taGF_low, "aGF low :" ; aGF low TCODE taGF_high, "aGF high:" ; aGF high @@ -144,12 +144,13 @@ TCODE tDiveaGF_active, "aGF aktiv" ; aGF Active TCODE tppO2settings, "ppO2 Parameter" ; ppO2 Settings TCODE tsafetystopmenu, "Sicherheitsstop:" ; Safety Stop: - TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tGasUsage, "Verbrauch" ; Gas Usage TCODE tSetBotUse, "Reise Gas: " ; Bottom Gas: (space) TCODE tSetDecoUse, "Deko Gas: " ; Deco Gas: (space) TCODE tCalcAscGas, "Gasmenge(B/O):" TCODE tTankSizes, "Tank Größen" TCODE tLiter, " l" + TCODE tBarLiter, "Barliter" TCODE tTankFillPress, "Tank Nutzmenge" TCODE tGas1, "Gas 1:" TCODE tGas2, "Gas 2:" @@ -165,7 +166,7 @@ TCODE tMedium, "Mittel" TCODE tHigh, "Hoch" TCODE tDvSalinity, "Salinität: " ; Salinity - TCODE tShowppO2, "ständig zeigen:" ; Always show ppO2: + TCODE tShowppO2, "Ständig zeigen:" ; Always show ppO2: TCODE tFlip, "Anzeige drehen:" ; Rotate Screen TCODE tMODwarning, "MOD Warnung:" ; MOD warning TCODE tIBCDwarning, "IBCD Warnung:" ; IBCD Warning @@ -307,7 +308,7 @@ ; Logbook TCODE tCNS2, "ZNS:" - TCODE tAVG, "Mit:" + TCODE tAVG, "Mittel:" TCODE tGF, "GF:" TCODE tSAT, "Sät:" ; Sat: diff -r f5de1ff88814 -r b455b31ce022 src/text_italian.inc --- a/src/text_italian.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/text_italian.inc Mon Feb 26 16:40:28 2018 +0100 @@ -136,7 +136,7 @@ TCODE tGF_high, "GF Alto:" TCODE tSaturationMult, "Saturazione:" TCODE tDesaturationMult, "Desaturazione:" - TCODE tFTTSMenu, "TTS Futuro:" ; Future TTS + TCODE tFTTSMenu, "fTTS/fB/O:" ; Future TTS TCODE taGFMenu, "GF Alternativo" ; Alternative GF TCODE taGF_low, "aGF Basso:" ; aGF low TCODE taGF_high, "aGF Alto:" ; aGF high @@ -210,6 +210,7 @@ TCODE tMinutes, "'" TCODE tPercent, "%" TCODE tLitersMinute, "l/min" + TCODE tBarLiter, "Bar Liter" TCODE tbar, "bar" ; bar TCODE tbar10, "0 bar" ; bar ## NEW 2.95 TCODE tMeterMinute, "m/min" ; meter per minute ## NEW ascent speed diff -r f5de1ff88814 -r b455b31ce022 src/tft.asm --- a/src/tft.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/tft.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft.asm +; File tft.asm ## V2.97 ; ; Managing the TFT screen ; @@ -17,56 +17,43 @@ #include "eeprom_rs232.inc" ;============================================================================= -; TFT_frame needs to backup coordinates. - CBLOCK tmp - save_top - save_height - save_left - save_width - ds_line ; Current line (0..239). - ds_column ; Current columnx2 (0..159) - ds_pixel:2 ; Current pixel color. - ds_count ; Repetition count. - ENDC - -;============================================================================= ; Basic bit-level macros -RD_H macro - bsf tft_rd,0 - endm +RD_H macro + bsf tft_rd,0 + endm -RD_L macro - bcf tft_rd,0 - endm +RD_L macro + bcf tft_rd,0 + endm -RS_H macro - bsf tft_rs,0 - endm +RS_H macro + bsf tft_rs,0 + endm -RS_L macro - bcf tft_rs,0 - endm +RS_L macro + bcf tft_rs,0 + endm -NCS_H macro - bsf tft_cs,0 - endm +NCS_H macro + bsf tft_cs,0 + endm -NCS_L macro - bcf tft_cs,0 - endm +NCS_L macro + bcf tft_cs,0 + endm -WR_H macro - bsf tft_nwr,0 - endm +WR_H macro + bsf tft_nwr,0 + endm -WR_L macro - bcf tft_nwr,0 - endm +WR_L macro + bcf tft_nwr,0 + endm ;============================================================================= -; Byte-leve macros -; +; Byte-level macros + Index_out macro low_b movlw low_b rcall TFT_CmdWrite @@ -80,96 +67,95 @@ endm -basic CODE -; -; +basic CODE + ;;============================================================================= ;; TFT_write_flash_image ;; ;; Inputs: FSR2 = EEPROM address / 256 -;; win_left, win_top : imagte CENTER position +;; win_left, win_top : image CENTER position ;; Outputs: win_height, win_width. -;; image copyed on screen. +;; image copied on screen. ;; Trashed: PROD, hi, lo ;; ; global TFT_write_flash_image ;TFT_write_flash_image: -; ; Get back the full 24bit EEPROM address -; clrf ext_flash_address+0 -; movff FSR2L,ext_flash_address+1 -; movf FSR2H,W -; iorlw 0x30 -; movwf ext_flash_address+2 +; ; Get back the full 24bit EEPROM address +; clrf ext_flash_address+0 +; movff FSR2L,ext_flash_address+1 +; movf FSR2H,W +; iorlw 0x30 +; movwf ext_flash_address+2 ; -; ; Read header: width and height -; global TFT_write_flash_image_addr +; ; Read header: width and height +; global TFT_write_flash_image_addr ;TFT_write_flash_image_addr: ; call ext_flash_read_block_start -; movff SSP2BUF,win_width+0 -; movwf SSP2BUF ; Write to buffer to initiate new read -; btfss SSP2STAT, BF ; Next byte ready ? -; bra $-2 ; NO: wait... -; movff SSP2BUF,win_width+1 -; movwf SSP2BUF ; Write to buffer to initiate new read -; btfss SSP2STAT, BF ; Next byte ready ? -; bra $-2 ; NO: wait... -; movff SSP2BUF,win_height -; movwf SSP2BUF ; Write to buffer to initiate new read -; btfss SSP2STAT, BF ; Next byte ready ? -; bra $-2 ; NO: wait... -; movff SSP2BUF,WREG ; drop 4th byte. -; movwf SSP2BUF ; Write to buffer to initiate new read -; btfss SSP2STAT, BF ; Next byte ready ? -; bra $-2 ; NO: wait... +; movff SSP2BUF,win_width+0 +; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Next byte ready ? +; bra $-2 ; NO: wait... +; movff SSP2BUF,win_width+1 +; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Next byte ready ? +; bra $-2 ; NO: wait... +; movff SSP2BUF,win_height +; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Next byte ready ? +; bra $-2 ; NO: wait... +; movff SSP2BUF,WREG ; drop 4th byte. +; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Next byte ready ? +; bra $-2 ; NO: wait... ; -; ; Sanity check on header to avoid badly uploaded images. -; iorwf WREG ; Check height < 256 -; bnz TFT_write_flash_image_failed -; movf win_width+1,W ; Check width < 512 -; andlw 0xFE -; bnz TFT_write_flash_image_failed +; ; Sanity check on header to avoid badly uploaded images. +; iorwf WREG ; Check height < 256 +; bnz TFT_write_flash_image_failed +; movf win_width+1,W ; Check width < 512 +; andlw 0xFE +; bnz TFT_write_flash_image_failed ; -; ; Center image on win_top, win_left values -; bcf STATUS,C ; Clear carry -; rrcf win_height,W ; And get height/2 -; subwf win_top,F ; top -= height/2 -; rrcf win_width+1,W ; Get 9th bit into carry -; rrcf win_width+0,W ; Get width/2 (in 0..320 range) -; bcf STATUS,C -; rrcf WREG,W ; Get width/2 in 0..160 range -; subwf win_leftx2,F ; left -= width/2 +; ; Center image on win_top, win_left values +; bcf STATUS,C ; Clear carry +; rrcf win_height,W ; And get height/2 +; subwf win_top,F ; top -= height/2 +; rrcf win_width+1,W ; Get 9th bit into carry +; rrcf win_width+0,W ; Get width/2 (in 0..320 range) +; bcf STATUS,C +; rrcf WREG,W ; Get width/2 in 0..160 range +; subwf win_leftx2,F ; left -= width/2 ; -; rcall TFT_box_write ; Inputs : win_top, win_leftx2, win_height, win_width(in 1..320 range) +; rcall TFT_box_write ; Inputs : win_top, win_leftx2, win_height, win_width(in 1..320 range) ; -; ; Compute number of pixels to move (result on 17 bits !) -; clrf TBLPTRU -; movf win_width+0,W -; mulwf win_height ; Result in PRODL:H -; movf win_width+1,W -; bz TFT_write_flash_image_1 ; width > 8bits ? -; movf win_height,W ; YES: add extra -; addwf PRODH,F -; rlcf TBLPTRU ; And carry into upper register. +; ; Compute number of pixels to move (result on 17 bits !) +; clrf TBLPTRU +; movf win_width+0,W +; mulwf win_height ; Result in PRODL:H +; movf win_width+1,W +; bz TFT_write_flash_image_1 ; width > 8bits ? +; movf win_height,W ; YES: add extra +; addwf PRODH,F +; rlcf TBLPTRU ; And carry into upper register. ;TFT_write_flash_image_1: -; incf PRODH,F ; Pre-condition nested loops -; incf TBLPTRU,F +; incf PRODH,F ; pre-condition nested loops +; incf TBLPTRU,F ; -; ; Write pixels -; Index_out 0x22 ; Frame Memory Data Write start -; RS_H ; Data +; ; Write pixels +; Index_out 0x22 ; Frame Memory Data Write start +; RS_H ; Data ; ;TFT_write_flash_image_loop: -; btfss SSP2STAT, BF ; Buffer full? -; bra $-2 ; NO: wait... -; movff SSP2BUF,PORTH ; Read lo -; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Buffer full? +; bra $-2 ; NO: wait... +; movff SSP2BUF,PORTH ; Read lo +; movwf SSP2BUF ; Write to buffer to initiate new read ; -; btfss SSP2STAT, BF ; Buffer full? -; bra $-2 ; NO: wait... -; movff SSP2BUF,PORTA ; And read hi -; movwf SSP2BUF ; Write to buffer to initiate new read +; btfss SSP2STAT, BF ; Buffer full? +; bra $-2 ; NO: wait... +; movff SSP2BUF,PORTA ; And read hi +; movwf SSP2BUF ; Write to buffer to initiate new read ; WR_L -; WR_H ; Write 1 Pixel +; WR_H ; Write 1 Pixel ; ; decfsz PRODL,F ; bra TFT_write_flash_image_loop @@ -178,76 +164,75 @@ ; decfsz TBLPTRU,F ; bra TFT_write_flash_image_loop ; -; btfss SSP2STAT, BF ; Buffer full? -; bra $-2 ; No, wait -; movf SSP2BUF,W ; Read dummy byte +; btfss SSP2STAT, BF ; Buffer full? +; bra $-2 ; No, wait +; movf SSP2BUF,W ; Read dummy byte ; -; bsf flash_ncs ; CS=1 -; movlw 0x00 ; NOP, to stop window mode -; bra TFT_CmdWrite ; This routine "returns" +; bsf flash_ncs ; CS=1 +; movlw 0x00 ; NOP, to stop window mode +; bra TFT_CmdWrite ; This routine "returns" ; ; ;---- Draw a 4x4 red square in place of missing images... ;TFT_write_flash_image_failed: -; movlw -1 -; addwf win_leftx2,F -; movlw -2 -; addwf win_top,F -; movlw 2 -; movwf win_width+0 -; clrf win_width+1 -; movlw 4 -; movwf win_height -; movlw color_red -; rcall TFT_set_color -; goto TFT_box +; movlw -1 +; addwf win_leftx2,F +; movlw -2 +; addwf win_top,F +; movlw 2 +; movwf win_width+0 +; clrf win_width+1 +; movlw 4 +; movwf win_height +; movlw color_red +; rcall TFT_set_color +; goto TFT_box ; ;;============================================================================= -; - global TFT_CmdWrite + global TFT_CmdWrite TFT_CmdWrite: - RS_L ; Command - clrf PORTA ; Upper - bcf INTCON,GIE - movwf PORTH ; Lower + RS_L ; Command + clrf PORTA ; Upper + bcf INTCON,GIE + movwf PORTH ; Lower WR_L - WR_H ; Tick - bsf INTCON,GIE - return; + WR_H ; Tick + bsf INTCON,GIE + return - global TFT_DataWrite + global TFT_DataWrite TFT_DataWrite: - RS_H ; Data - bcf INTCON,GIE - movwf PORTH ; Lower + RS_H ; Data + bcf INTCON,GIE + movwf PORTH ; Lower WR_L - WR_H ; Tick - bsf INTCON,GIE + WR_H ; Tick + bsf INTCON,GIE return ;============================================================================= -; - global TFT_ClearScreen + + global TFT_ClearScreen TFT_ClearScreen: - Index_out 0x50 ; Window Horizontal Start Address - Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x51 ; Window Horizontal End Address - Parameter_out 0x00, 0xEF ; 0-239 - Index_out 0x52 ; Window Vertical Start Address - Parameter_out 0x00, 0x00 ; 0-319 - Index_out 0x53 ; Window Vertical End Address - Parameter_out 0x01, 0x3F ; 0-319 - Index_out 0x20 ; Frame Memory Horizontal Address - Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x21 ; Frame Memory Vertical Address - Parameter_out 0x01, 0x3F ; 0-319 + Index_out 0x50 ; Window Horizontal Start Address + Parameter_out 0x00, 0x00 ; 0-239 + Index_out 0x51 ; Window Horizontal End Address + Parameter_out 0x00, 0xEF ; 0-239 + Index_out 0x52 ; Window Vertical Start Address + Parameter_out 0x00, 0x00 ; 0-319 + Index_out 0x53 ; Window Vertical End Address + Parameter_out 0x01, 0x3F ; 0-319 + Index_out 0x20 ; Frame Memory Horizontal Address + Parameter_out 0x00, 0x00 ; 0-239 + Index_out 0x21 ; Frame Memory Vertical Address + Parameter_out 0x01, 0x3F ; 0-319 - Index_out 0x22 ; Frame Memory Data Write start + Index_out 0x22 ; Frame Memory Data Write start - RD_H ; Not Read - RS_H ; Data - NCS_L ; Not CS - clrf PORTH ; Data Lower + RD_H ; Not Read + RS_H ; Data + NCS_L ; Not CS + clrf PORTH ; Data Lower movlw d'10' movwf tft_temp3 @@ -256,32 +241,32 @@ movwf tft_temp2 TFT_ClearScreen3: clrf tft_temp1 ; 30*10*256=76800 Pixels -> Clear complete 240*320 - bcf INTCON,GIE + bcf INTCON,GIE TFT_ClearScreen4: WR_L WR_H ; Tick decfsz tft_temp1,F bra TFT_ClearScreen4 - bsf INTCON,GIE + bsf INTCON,GIE decfsz tft_temp2,F bra TFT_ClearScreen3 decfsz tft_temp3,F bra TFT_ClearScreen2 - - movlw 0x00 ; NOP, to stop window mode - bra TFT_CmdWrite ; And return -; return + + movlw 0x00 ; NOP, to stop window mode + bra TFT_CmdWrite ; And return + ;============================================================================= -; - global TFT_DisplayOff + + global TFT_DisplayOff TFT_DisplayOff: - clrf CCPR1L ; PWM OFF + clrf CCPR1L ; PWM OFF clrf PORTA - clrf PORTH - RD_L ; LOW + clrf PORTH + RD_L ; LOW nop - RS_L ; LOW + RS_L ; LOW bcf tft_nwr nop bcf tft_cs @@ -295,7 +280,8 @@ ; ----------------------------- ; TFT boot ; ----------------------------- - global TFT_boot + + global TFT_boot TFT_boot: clrf PORTA clrf PORTH @@ -320,66 +306,66 @@ WAITMS d'5' bsf tft_nreset WAITMS d'150' - bsf lightsen_power ; Supply power to light sensor + bsf lightsen_power ; Supply power to light sensor -; Data Transfer Synchronization + ; Data Transfer Synchronization Parameter_out 0x00, 0x00 Parameter_out 0x00, 0x00 - + ; Get screentype from Bootloader-Info - movlw 0x7B - movwf TBLPTRL - movlw 0xF7 - movwf TBLPTRH - movlw 0x01 - movwf TBLPTRU - TBLRD*+ ; Reads .110 for cR and USB OSTC3, .0 for BLE (2 and 3), and .2 for display1 OSTC + movlw 0x7B + movwf TBLPTRL + movlw 0xF7 + movwf TBLPTRH + movlw 0x01 + movwf TBLPTRU + TBLRD*+ ; Reads .110 for cR and USB OSTC3, .0 for BLE (2 and 3), and .2 for display1 OSTC movlw 0x02 cpfseq TABLAT - bra TFT_boot_0 ; Display0 + bra TFT_boot_0 ; Display0 TFT_boot_1: -; Init through config table... - movlw 0x74 - movwf TBLPTRL - movlw 0xF7 - movwf TBLPTRH - movlw 0x01 - movwf TBLPTRU - bsf screen_type - bra TFT_boot_com + ; Init through config table... + movlw 0x74 + movwf TBLPTRL + movlw 0xF7 + movwf TBLPTRH + movlw 0x01 + movwf TBLPTRU + bsf screen_type + bra TFT_boot_com TFT_boot_0: -; Init through config table... - movlw LOW display0_config_table - movwf TBLPTRL - movlw HIGH display0_config_table - movwf TBLPTRH - movlw UPPER display0_config_table - movwf TBLPTRU - bcf screen_type - + ; Init through config table... + movlw LOW display0_config_table + movwf TBLPTRL + movlw HIGH display0_config_table + movwf TBLPTRH + movlw UPPER display0_config_table + movwf TBLPTRU + bcf screen_type + TFT_boot_com: - rcall display0_init_loop + rcall display0_init_loop - Index_out 0x03 - btfsc flip_screen ; 180° rotation ? - bra TFT_boot2 ; Yes + Index_out 0x03 + btfsc flip_screen ; 180° rotation ? + bra TFT_boot2 ; Yes - btfss screen_type ; display1? - bra TFT_boot1a ; no - Parameter_out 0x10, 0x00 ; display1 - bra TFT_boot3 + btfss screen_type ; display1? + bra TFT_boot1a ; no + Parameter_out 0x10, 0x00 ; display1 + bra TFT_boot3 TFT_boot1a: - Parameter_out 0x50, 0x20 ; display0 - bra TFT_boot3 + Parameter_out 0x50, 0x20 ; display0 + bra TFT_boot3 TFT_boot2: - btfss screen_type ; display1? - bra TFT_boot2a ; no - Parameter_out 0x10, 0x30 ; display1 - bra TFT_boot3 + btfss screen_type ; display1? + bra TFT_boot2a ; no + Parameter_out 0x10, 0x30 ; display1 + bra TFT_boot3 TFT_boot2a: - Parameter_out 0x50, 0x10 ; display0 + Parameter_out 0x50, 0x10 ; display0 TFT_boot3: Index_out 0x22 rcall TFT_ClearScreen @@ -388,48 +374,48 @@ return display0_config_table: - ; Reg, Dat0, Dat1 or 0xFF,0x00,0x00 for end - db 0xA4,0x00,0x01,0xFF,.002,0x00 - db 0x09,0x00,0x01,0x92,0x04,0x00 - db 0x93,0x04,0x02,0x94,0x00,0x02 - db 0x07,0x00,0x00,0x10,0x04,0x30 - db 0x11,0x02,0x37,0x12,0x11,0x8D - db 0x13,0x11,0x00,0x01,0x01,0x00 - db 0x02,0x02,0x00,0x03,0x50,0x20 - db 0x0A,0x00,0x08,0x0D,0x00,0x00 - db 0x0E,0x00,0x30,0xFF,.151,0x00 - db 0x12,0x11,0xBD,0x20,0x00,0x00 - db 0x21,0x00,0x00,0x30,0x06,0x02 - db 0x31,0x56,0x0D,0x32,0x05,0x07 - db 0x33,0x06,0x09,0x34,0x00,0x00 - db 0x35,0x09,0x06,0x36,0x57,0x05 - db 0x37,0x0D,0x06,0x38,0x02,0x06 - db 0x39,0x00,0x00,0xFF,0x00,0x00 + ; Reg, Dat0, Dat1 or 0xFF,0x00,0x00 for end + db 0xA4,0x00,0x01,0xFF,.002,0x00 + db 0x09,0x00,0x01,0x92,0x04,0x00 + db 0x93,0x04,0x02,0x94,0x00,0x02 + db 0x07,0x00,0x00,0x10,0x04,0x30 + db 0x11,0x02,0x37,0x12,0x11,0x8D + db 0x13,0x11,0x00,0x01,0x01,0x00 + db 0x02,0x02,0x00,0x03,0x50,0x20 + db 0x0A,0x00,0x08,0x0D,0x00,0x00 + db 0x0E,0x00,0x30,0xFF,.151,0x00 + db 0x12,0x11,0xBD,0x20,0x00,0x00 + db 0x21,0x00,0x00,0x30,0x06,0x02 + db 0x31,0x56,0x0D,0x32,0x05,0x07 + db 0x33,0x06,0x09,0x34,0x00,0x00 + db 0x35,0x09,0x06,0x36,0x57,0x05 + db 0x37,0x0D,0x06,0x38,0x02,0x06 + db 0x39,0x00,0x00,0xFF,0x00,0x00 display0_init_loop: - TBLRD*+ - movlw 0xFF - cpfseq TABLAT - bra display0_config_write ; Write Config pair to Display - ; Delay ms or quit (return) - TBLRD*+ - tstfsz TABLAT ; End of config? - bra $+4 ; No - return ; Done. - movf TABLAT,W - call WAITMSX ; Wait WREG milliseconds - TBLRD*+ ; Dummy read (Third byte of delay command) - bra display0_init_loop ; Loop + TBLRD*+ + movlw 0xFF + cpfseq TABLAT + bra display0_config_write ; Write Config pair to Display + ; Delay ms or quit (return) + TBLRD*+ + tstfsz TABLAT ; End of config? + bra $+4 ; No + return ; Done. + movf TABLAT,W + call WAITMSX ; Wait WREG milliseconds + TBLRD*+ ; Dummy read (Third byte of delay command) + bra display0_init_loop ; Loop -display0_config_write: ; With command in WREG - movf TABLAT,W - rcall TFT_CmdWrite ; Write command - TBLRD*+ ; Get config0 - movff TABLAT,PORTA - TBLRD*+ ; Get config1 - movf TABLAT,W - rcall TFT_DataWrite ; Write config - bra display0_init_loop ; Loop +display0_config_write: ; With command in WREG + movf TABLAT,W + rcall TFT_CmdWrite ; Write command + TBLRD*+ ; Get config0 + movff TABLAT,PORTA + TBLRD*+ ; Get config1 + movf TABLAT,W + rcall TFT_DataWrite ; Write config + bra display0_init_loop ; Loop ;============================================================================= @@ -437,81 +423,80 @@ ; ; Trashes: WREG, PRODL ; Typical usage: -; clrf CCPR1L ; Backlight off -; [draw splash screen] -; call TFT_DisplayFadeIn -; - global TFT_Display_FadeIn +; clrf CCPR1L ; Backlight off +; [draw splash screen] +; call TFT_DisplayFadeIn + + global TFT_Display_FadeIn TFT_Display_FadeIn: - movlw CCP1CON_VALUE ; See hwos.inc - movwf CCP1CON - bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor! - clrf CCPR1L ; Backlight off - to be sure - movff max_CCPR1L,PRODL + movlw CCP1CON_VALUE ; See hwos.inc + movwf CCP1CON + bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor! + clrf CCPR1L ; Backlight off - to be sure + movff max_CCPR1L,PRODL TFT_Display_FadeIn_0: - incf CCPR1L,F ; Duty cycle - WAITMS d'2' - decfsz PRODL,F - bra TFT_Display_FadeIn_0 - bcf tft_is_dimming ; dimming done. - return + incf CCPR1L,F ; Duty cycle + WAITMS d'2' + decfsz PRODL,F + bra TFT_Display_FadeIn_0 + bcf tft_is_dimming ; dimming done. + return ;============================================================================= ; Smooth lighting-off of the display: ; Trashes: WREG, PRODL - global TFT_Display_FadeOut + + global TFT_Display_FadeOut TFT_Display_FadeOut: - movff max_CCPR1L,PRODL - bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor! + movff max_CCPR1L,PRODL + bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor! TFT_Display_FadeOut_0: - movff PRODL,CCPR1L ; Duty cycle - WAITMS d'1' - decfsz PRODL,F - bra TFT_Display_FadeOut_0 - clrf CCPR1L - return + movff PRODL,CCPR1L ; Duty cycle + WAITMS d'1' + decfsz PRODL,F + bra TFT_Display_FadeOut_0 + clrf CCPR1L + return ;============================================================================= - global box_std_block, box_black_block, box_color_block + global box_std_block, box_black_block, box_color_block -box_std_block: ; Use white color - setf WREG - bra box_common -box_black_block: ; Use black color - clrf WREG +box_std_block: ; Use white color + setf WREG + bra box_common +box_black_block: ; Use black color + clrf WREG box_common: box_color_block: - rcall TFT_set_color - VARARGS_BEGIN - VARARGS_GET8 win_top - VARARGS_GET8 win_height - VARARGS_GET8 win_leftx2 - VARARGS_GET8 win_width - VARARGS_END - bra TFT_box + rcall TFT_set_color + VARARGS_BEGIN + VARARGS_GET8 win_top + VARARGS_GET8 win_height + VARARGS_GET8 win_leftx2 + VARARGS_GET8 win_width + VARARGS_END + bra TFT_box ;----------------------------------------------------------------------------- - global box_frame_std, box_frame_common, box_frame_color, box_frame_color16 + global box_frame_std, box_frame_common, box_frame_color, box_frame_color16 box_frame_std: - setf WREG - rcall TFT_set_color - + setf WREG + rcall TFT_set_color box_frame_common: - VARARGS_BEGIN - VARARGS_GET8 win_top - VARARGS_GET8 win_height - VARARGS_GET8 win_leftx2 - VARARGS_GET8 win_width - VARARGS_END - bra TFT_frame - + VARARGS_BEGIN + VARARGS_GET8 win_top + VARARGS_GET8 win_height + VARARGS_GET8 win_leftx2 + VARARGS_GET8 win_width + VARARGS_END + bra TFT_frame box_frame_color: - rcall TFT_set_color + rcall TFT_set_color box_frame_color16: - bra box_frame_common + bra box_frame_common ;;============================================================================= ;; Init for half_pixel_write @@ -519,172 +504,176 @@ ;; Inputs: win_leftx2 ;; Outputs: win_color:2 ;; Trashed: WREG, PROD -; global init_pixel_write +; +; global init_pixel_write ;init_pixel_write: -; movf win_leftx2,W -; mullw 2 -; rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) -; setf WREG -; bra TFT_set_color +; movf win_leftx2,W +; mullw 2 +; rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) +; setf WREG +; bra TFT_set_color ;----------------------------------------------------------------------------- ; Writes two half-pixels at position (win_top,win_leftx2) ; Inputs: win_leftx2, win_top, win_color:2 ; Trashed: WREG, PROD - global pixel_write + + global pixel_write pixel_write: - movf win_leftx2,W - mullw 2 ; win_leftx2 x 2 -> PRODH:PRODL - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) - rcall half_pixel_write ; Write this half-one. - - movf win_leftx2,W ; Address of next one - mullw 2 - infsnz PRODL ; +1 - incf PRODH - rcall pixel_write_col320 - bra half_pixel_write ; Note: Cmd 0x20 is mandatory, because - ; of the autoincrement going vertical + movf win_leftx2,W + mullw 2 ; win_leftx2 x 2 -> PRODH:PRODL + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + rcall half_pixel_write ; Write this half-one. + movf win_leftx2,W ; Address of next one + mullw 2 + infsnz PRODL ; +1 + incf PRODH + rcall pixel_write_col320 + bra half_pixel_write ; Note: Cmd 0x20 is mandatory, because + ; of the auto-increment going vertical global pixel_write_col320 pixel_write_col320: - btfsc screen_type ; display1? - bra pixel_write_col320_d1 ; Yes - ; Display0 - btfss flip_screen ; 180° rotation? - bra pixel_write_noflip_H ; No - bra pixel_write_flip_H ; Yes -pixel_write_col320_d1: ; Display1 - btfsc flip_screen ; 180° rotation? - bra pixel_write_noflip_H ; Yes for d1 -pixel_write_flip_H: ; Flip d0 - movf PRODL,W ; 16bits 319 - PROD --> PROD - sublw LOW(.319) ; 319-W --> W - movwf PRODL - movf PRODH,W - btfss STATUS,C ; Borrow = /CARRY - incf WREG - sublw HIGH(.319) - movwf PRODH + btfsc screen_type ; display1? + bra pixel_write_col320_d1 ; Yes + ; Display0 + btfss flip_screen ; 180° rotation? + bra pixel_write_noflip_H ; No + bra pixel_write_flip_H ; Yes +pixel_write_col320_d1: ; Display1 + btfsc flip_screen ; 180° rotation? + bra pixel_write_noflip_H ; Yes for d1 +pixel_write_flip_H: ; Flip d0 + movf PRODL,W ; 16bits 319 - PROD --> PROD + sublw LOW(.319) ; 319-W --> W + movwf PRODL + movf PRODH,W + btfss STATUS,C ; Borrow = /CARRY + incf WREG + sublw HIGH(.319) + movwf PRODH pixel_write_noflip_H: - Index_out 0x21 ; Frame Memory Vertical Address - bra TFT_DataWrite_PROD ; and return... + Index_out 0x21 ; Frame Memory Vertical Address + bra TFT_DataWrite_PROD ; and return... ;----------------------------------------------------------------------------- ; Writes one half-pixel at position (win_top,win_leftx2). ; Inputs: win_leftx2, win_top, win_color:2 ; Trashed: WREG, PROD - global half_pixel_write + + global half_pixel_write half_pixel_write: - movf win_top,W ; d'0' ... d'239' - ; Variant with Y position in WREG. + movf win_top,W ; d'0' ... d'239' + ; Variant with Y position in WREG. half_pixel_write_1: - btfss flip_screen ; 180° rotation? - sublw .239 ; 239-Y --> Y - mullw 1 ; Copy row to PRODL (PRODH=0) - Index_out 0x20 ; Frame Memory Horizontal Address - rcall TFT_DataWrite_PROD + btfss flip_screen ; 180° rotation? + sublw .239 ; 239-Y --> Y + mullw .1 ; Copy row to PRODL (PRODH=0) + Index_out 0x20 ; Frame Memory Horizontal Address + rcall TFT_DataWrite_PROD - Index_out 0x22 ; Frame Memory Data Write start - RS_H ; Data - bcf INTCON,GIE - movff win_color1,PORTA ; Upper - movff win_color2,PORTH ; Lower - WR_L - WR_H ; Tick - bsf INTCON,GIE - return + Index_out 0x22 ; Frame Memory Data Write start + RS_H ; Data + bcf INTCON,GIE + movff win_color1,PORTA ; Upper + movff win_color2,PORTH ; Lower + WR_L + WR_H ; Tick + bsf INTCON,GIE + return ;----------------------------------------------------------------------------- ; Writes a vertical line of half-pixel at position (win_top,win_leftx2,win_height). ; Inputs: win_leftx2, win_top, win_height, win_color:2 ; Trashed: WREG, PROD, TABLAT, TBLPTRL + global half_vertical_line half_vertical_line: - clrf TABLAT ; Loop index. + clrf TABLAT ; Loop index. half_vertical_line_loop: - movf win_leftx2,W ; Init X position. - mullw 2 - movf TABLAT,W ; Get loop index - andlw 1 ; Just low bit - xorwf PRODL,F ; And use it to jitter current X position - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + movf win_leftx2,W ; Init X position. + mullw .2 + movf TABLAT,W ; Get loop index + andlw .1 ; Just low bit + xorwf PRODL,F ; And use it to jitter current X position + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) - movf win_height,W ; Index reached height (Bank0 read) ? - xorwf TABLAT,W - btfsc STATUS,Z ; Equals ? - return ; Yes: done. - movf win_top,W ; Y = top + index (Bank0 read) - addwf TABLAT,W - rcall half_pixel_write_1 - incf TABLAT,F ; index++ - bra half_vertical_line_loop + movf win_height,W ; Index reached height (Bank0 read) ? + xorwf TABLAT,W + btfsc STATUS,Z ; Equals ? + return ; Yes: done. + movf win_top,W ; Y = top + index (Bank0 read) + addwf TABLAT,W + rcall half_pixel_write_1 + incf TABLAT,F ; index++ + bra half_vertical_line_loop ;----------------------------------------------------------------------------- ; Writes a horizontal line of half-pixel at position (win_top,win_leftx2,win_width). ; Inputs: win_leftx2, win_top, win_width, win_color:2 ; Trashed: WREG, PROD, TABLAT, TBLPTRL + global half_horizontal_line half_horizontal_line: - clrf TABLAT ; Loop index. + clrf TABLAT ; Loop index. half_horizontal_line_loop: - movf win_leftx2,W ; Init X position. - mullw 2 - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) - movf win_width,W ; Index reached height (Bank0 read) ? - xorwf TABLAT,W - btfsc STATUS,Z ; Equals ? - return ; Yes: done. - movf win_top,W ; Y = top + index (Bank0 read) - addwf TABLAT,W - rcall half_pixel_write_1 - incf TABLAT,F ; index++ - bra half_horizontal_line_loop + movf win_leftx2,W ; Init X position. + mullw .2 + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + movf win_width,W ; Index reached height (Bank0 read) ? + xorwf TABLAT,W + btfsc STATUS,Z ; Equals ? + return ; Yes: done. + movf win_top,W ; Y = top + index (Bank0 read) + addwf TABLAT,W + rcall half_pixel_write_1 + incf TABLAT,F ; index++ + bra half_horizontal_line_loop ;----------------------------------------------------------------------------- ; TFT Data Cmd via W -; - global TFT_DataWrite_PROD + + global TFT_DataWrite_PROD TFT_DataWrite_PROD: -; RD_H ; Keep high - RS_H ; Data - bcf INTCON,GIE - movff PRODH,PORTA ; Move high byte to PORTA - movff PRODL,PORTH ; Move low byte to PORTH +; RD_H ; Keep high + RS_H ; Data + bcf INTCON,GIE + movff PRODH,PORTA ; Move high byte to PORTA + movff PRODL,PORTH ; Move low byte to PORTH WR_L - WR_H ; Tick - bsf INTCON,GIE + WR_H ; Tick + bsf INTCON,GIE return TFT_DataRead_PROD: - Index_out 0x22 ; Frame Memory Data Read start + Index_out 0x22 ; Frame Memory Data Read start TFT_CmdRead_PROD: - setf TRISA ; PortA as input. - setf TRISH ; PortH as input. - RS_H ; Data - WR_H ; Not write - RD_L ; Read! - nop - nop - nop - RD_H ; Tick - nop - nop - nop - RD_L ; Read! - nop - ; nop - ; nop - movff PORTA,PRODH - movff PORTH,PRODL - RD_H ; Tick - nop - clrf TRISA ; PortA as output - clrf TRISH ; PortH as output + setf TRISA ; PortA as input. + setf TRISH ; PortH as input. + RS_H ; Data + WR_H ; Not write + RD_L ; Read! + nop + nop + nop + RD_H ; Tick + nop + nop + nop + RD_L ; Read! + nop + ;nop + ;nop + movff PORTA,PRODH + movff PORTH,PRODL + RD_H ; Tick + nop + clrf TRISA ; PortA as output + clrf TRISH ; PortH as output return ;============================================================================= @@ -692,235 +681,234 @@ ; Inputs : win_top, win_leftx2, win_height, win_width. ; Output : PortA/PortH commands. ; Trashed: PROD -; - global TFT_box_write + + global TFT_box_write TFT_box_write: - movf win_leftx2,W ; Compute left = 2*leftx2 --> PROD + movf win_leftx2,W ; Compute left = 2*leftx2 --> PROD mullw 2 - global TFT_box_write_16bit_win_left -TFT_box_write_16bit_win_left: ; With column in PRODL:PRODH - btfsc screen_type ; display1? - bra TFT_box_write_16bit_win_left_d1 ; Yes - ; Display0 - btfsc flip_screen ; 180° rotation? - bra DISP_box_flip_H ; Yes - bra TFT_box_write_16bit_win_left_com ; No -TFT_box_write_16bit_win_left_d1: ; Display1 - btfss flip_screen ; 180° rotation? - bra DISP_box_flip_H ; No for d1 - ; Yes for d1 + global TFT_box_write_16bit_win_left +TFT_box_write_16bit_win_left: ; With column in PRODL:PRODH + btfsc screen_type ; display1? + bra TFT_box_write_16bit_win_left_d1 ; Yes + ; Display0 + btfsc flip_screen ; 180° rotation? + bra DISP_box_flip_H ; Yes + bra TFT_box_write_16bit_win_left_com ; No +TFT_box_write_16bit_win_left_d1: ; Display1 + btfss flip_screen ; 180° rotation? + bra DISP_box_flip_H ; No for d1 + ; Yes for d1 TFT_box_write_16bit_win_left_com: - ;---- Normal horizontal window --------------------------------------- - Index_out 0x52 ; Window Vertical Start Address - rcall TFT_DataWrite_PROD ; Output left - Index_out 0x21 ; Frame Memory Vertical Address - rcall TFT_DataWrite_PROD ; Output left + ;---- Normal horizontal window --------------------------------------- + Index_out 0x52 ; Window Vertical Start Address + rcall TFT_DataWrite_PROD ; Output left + Index_out 0x21 ; Frame Memory Vertical Address + rcall TFT_DataWrite_PROD ; Output left - movf win_width+0,W ; right = left + width - 1 + movf win_width+0,W ; right = left + width - 1 addwf PRODL,F movf win_width+1,W addwfc PRODH,F - decf PRODL,F ; decrement result - btfss STATUS,C + decf PRODL,F ; decrement result + btfss STATUS,C decf PRODH,F - Index_out 0x53 ; Window Vertical End Address - rcall TFT_DataWrite_PROD - bra DISP_box_noflip_H + Index_out 0x53 ; Window Vertical End Address + rcall TFT_DataWrite_PROD + bra DISP_box_noflip_H - ;---- Flipped horizontal window -------------------------------------- + ;---- Flipped horizontal window -------------------------------------- DISP_box_flip_H: - movf PRODL,W ; 16bits 319 - PROD --> PROD - sublw LOW(.319) ; 319-W --> W - movwf PRODL - movf PRODH,W - btfss STATUS,C ; Borrow = /CARRY - incf WREG - sublw HIGH(.319) - movwf PRODH + movf PRODL,W ; 16bits 319 - PROD --> PROD + sublw LOW(.319) ; 319-W --> W + movwf PRODL + movf PRODH,W + btfss STATUS,C ; Borrow = /CARRY + incf WREG + sublw HIGH(.319) + movwf PRODH - Index_out 0x53 ; Window Vertical Start Address - rcall TFT_DataWrite_PROD ; Output left - Index_out 0x21 ; Frame Memory Vertical Address - rcall TFT_DataWrite_PROD ; Output left + Index_out 0x53 ; Window Vertical Start Address + rcall TFT_DataWrite_PROD ; Output left + Index_out 0x21 ; Frame Memory Vertical Address + rcall TFT_DataWrite_PROD ; Output left - movf win_width+0,W ; 16bits PROD - width --> PROD - subwf PRODL,F ; PRODL - WREG --> PRODL - movf win_width+1,W - subwfb PRODH,F - infsnz PRODL ; PROD+1 --> PROD - incf PRODH + movf win_width+0,W ; 16bits PROD - width --> PROD + subwf PRODL,F ; PRODL - WREG --> PRODL + movf win_width+1,W + subwfb PRODH,F + infsnz PRODL ; PROD+1 --> PROD + incf PRODH - Index_out 0x52 ; Window Vertical End Address - rcall TFT_DataWrite_PROD + Index_out 0x52 ; Window Vertical End Address + rcall TFT_DataWrite_PROD DISP_box_noflip_H: - btfss flip_screen ; 180° rotation ? - bra TFT_box_noflip_V ; No. + btfss flip_screen ; 180° rotation ? + bra TFT_box_noflip_V ; No. - ;---- Flipped vertical window ----------------------------------------- - movff win_top,PRODH ; top --> PRODH (first byte) - movf win_height,W - addwf PRODH,W + ;---- Flipped vertical window ----------------------------------------- + movff win_top,PRODH ; top --> PRODH (first byte) + movf win_height,W + addwf PRODH,W decf WREG - movwf PRODL ; top+height-1 --> PRODL (second byte) + movwf PRODL ; top+height-1 --> PRODL (second byte) - Index_out 0x50 ; Window Horizontal Start Address + Index_out 0x50 ; Window Horizontal Start Address movf PRODH,W - rcall TFT_DataWrite ; Lower (and tick) - - Index_out 0x51 ; Window Horizontal End Address - movf PRODL,W - rcall TFT_DataWrite ; Lower (and tick) + rcall TFT_DataWrite ; Lower (and tick) - Index_out 0x20 ; Frame Memory Horizontal Address + Index_out 0x51 ; Window Horizontal End Address + movf PRODL,W + rcall TFT_DataWrite ; Lower (and tick) + + Index_out 0x20 ; Frame Memory Horizontal Address movf PRODH,W - bra TFT_DataWrite ; Lower (and tick) and return -; return - + bra TFT_DataWrite ; Lower (and tick) and return TFT_box_noflip_V: - ;---- Normal vertical window ---------------------------------------- - movff win_top,PRODL - movf win_height,W - addwf PRODL,W - sublw .240 ; 240 - top - height - movwf PRODH ; First byte + ;---- Normal vertical window ---------------------------------------- + movff win_top,PRODL + movf win_height,W + addwf PRODL,W + sublw .240 ; 240 - top - height + movwf PRODH ; First byte movf PRODL,W - sublw .239 ; 239-top - movwf PRODL ; --> second byte. + sublw .239 ; 239-top + movwf PRODL ; --> second byte. - Index_out 0x50 ; Window Horizontal Start Address + Index_out 0x50 ; Window Horizontal Start Address movf PRODH,W - rcall TFT_DataWrite ; Lower (and tick) + rcall TFT_DataWrite ; Lower (and tick) - Index_out 0x51 ; Window Horizontal End Address + Index_out 0x51 ; Window Horizontal End Address movf PRODL,W - rcall TFT_DataWrite ; Lower (and tick) + rcall TFT_DataWrite ; Lower (and tick) - Index_out 0x20 ; Frame Memory Horizontal Address + Index_out 0x20 ; Frame Memory Horizontal Address movf PRODL,W - bra TFT_DataWrite ; Lower (and tick) and return -; return + bra TFT_DataWrite ; Lower (and tick) and return + ;============================================================================= ; TFT_frame : draw a frame around current box with current color. ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 ; Outputs: (none) ; Trashed: WREG, PROD, aa_start:2, aa_end:2 - global TFT_frame -TFT_frame: - movff win_top,save_top ; Backup everything. - movff win_height,save_height - movff win_leftx2,save_left - movff win_width,save_width - ;---- TOP line ----------------------------------------------------------- - movlw 1 ; row ~ height=1 - movwf win_height - rcall TFT_box + global TFT_frame +TFT_frame: + movff win_top,save_top ; Backup everything. + movff win_height,save_height + movff win_leftx2,save_left + movff win_width,save_width - ;---- BOTTOM line -------------------------------------------------------- - movff save_top,PRODL ; Get back top, - movff save_height,WREG ; and height - addwf PRODL,W ; top+height - decf WREG ; top+height-1 - movwf win_top ; top+height-1 --> top - rcall TFT_box + ;---- TOP line ----------------------------------------------------------- + movlw .1 ; row ~ height=1 + movwf win_height + rcall TFT_box - ;---- LEFT column -------------------------------------------------------- - movff save_top,win_top ; Restore top/height. - movff save_height,win_height - movlw 1 ; column ~ width=1 - movwf win_width+0 - rcall TFT_box + ;---- BOTTOM line -------------------------------------------------------- + movff save_top,PRODL ; Get back top, + movff save_height,WREG ; and height + addwf PRODL,W ; top+height + decf WREG ; top+height-1 + movwf win_top ; top+height-1 --> top + rcall TFT_box - ;---- RIGHT column ------------------------------------------------------- - movff save_left,WREG - movff save_width,PRODL - addwf PRODL,W - decf WREG - movwf win_leftx2 - rcall TFT_box - - ;---- Restore everything ------------------------------------------------- - movff save_left,win_leftx2 - movff save_width,win_width - return + ;---- LEFT column -------------------------------------------------------- + movff save_top,win_top ; Restore top/height. + movff save_height,win_height + movlw .1 ; column ~ width=1 + movwf win_width+0 + rcall TFT_box + + ;---- RIGHT column ------------------------------------------------------- + movff save_left,WREG + movff save_width,PRODL + addwf PRODL,W + decf WREG + movwf win_leftx2 + rcall TFT_box + + ;---- Restore everything ------------------------------------------------- + movff save_left,win_leftx2 + movff save_width,win_width + return ;============================================================================= ; TFT_box : fills current box with current color. ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 ; Outputs: (none) ; Trashed: WREG, PROD - global TFT_box + global TFT_box TFT_box: - ;---- Define Window ------------------------------------------------------ - bcf STATUS,C - rlcf win_width+0,F - rlcf win_width+1,F ; x2 - rcall TFT_box_write ; Setup box + ;---- Define Window ------------------------------------------------------ + bcf STATUS,C + rlcf win_width+0,F + rlcf win_width+1,F ; x2 + rcall TFT_box_write ; Setup box - global TFT_box_16bit_win_left + global TFT_box_16bit_win_left TFT_box_16bit_win_left: - bcf STATUS,C - rrcf win_width+1,F ; width /= 2 - rrcf win_width+0,F + bcf STATUS,C + rrcf win_width+1,F ; width /= 2 + rrcf win_width+0,F - ;---- Fill Window -------------------------------------------------------- - Index_out 0x22 ; Frame Memory Data Write start + ;---- Fill Window -------------------------------------------------------- + Index_out 0x22 ; Frame Memory Data Write start - clrf PRODH ; Column counter. - RS_H ; Data + clrf PRODH ; Column counter. + RS_H ; Data -TFT_box2: ; Loop height times +TFT_box2: ; Loop height times movff win_height,PRODL -TFT_box3: ; loop width times +TFT_box3: ; loop width times bcf INTCON,GIE - movff win_color1,PORTA ; Upper - movff win_color2,PORTH ; Lower + movff win_color1,PORTA ; Upper + movff win_color2,PORTH ; Lower WR_L - WR_H ; Tick -; -; movff win_color1,PORTA ; Upper -; movff win_color2,PORTH ; Lower + WR_H ; Tick + +; movff win_color1,PORTA ; Upper +; movff win_color2,PORTH ; Lower WR_L - WR_H ; Tick - bsf INTCON,GIE - decfsz PRODL,F ; row loop finished ? - bra TFT_box3 ; No: continue. + WR_H ; Tick + bsf INTCON,GIE + decfsz PRODL,F ; row loop finished ? + bra TFT_box3 ; No: continue. - incf PRODH,F ; column count ++ + incf PRODH,F ; column count ++ - movf win_bargraph,W ; current column == bargraph ? - cpfseq PRODH - bra TFT_box4 ; No: just loop. - ; Yes: switch to black - clrf win_color1 - clrf win_color2 + movf win_bargraph,W ; current column == bargraph ? + cpfseq PRODH + bra TFT_box4 ; No: just loop. + ; Yes: switch to black + clrf win_color1 + clrf win_color2 TFT_box4: - movf win_width+0,W ; compare ? - xorwf PRODH,W - bnz TFT_box2 ; Loop not finished. + movf win_width+0,W ; compare ? + xorwf PRODH,W + bnz TFT_box2 ; Loop not finished. - movlw 0x00 ; NOP, to stop window mode - rcall TFT_CmdWrite + movlw 0x00 ; NOP, to stop window mode + rcall TFT_CmdWrite - ; Reset bargraph mode... - setf win_bargraph - return + ; Reset bargraph mode... + setf win_bargraph + return ;============================================================================= ;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB' - global TFT_set_color + global TFT_set_color TFT_set_color: movwf tft_temp1 ; Get 8Bit RGB b'RRRGGGBB' - movwf tft_temp2 ; Copy + movwf tft_temp2 ; Copy ; Mask Bit 7,6,5,4,3,2 movlw b'00000011' @@ -935,7 +923,7 @@ movlw b'11111000' movwf tft_temp3 ; Blue done. - movff tft_temp1, tft_temp2 ; Copy + movff tft_temp1,tft_temp2 ; Copy ; Mask Bit 7,6,5,1,0 movlw b'00011100' andwf tft_temp2,F @@ -957,7 +945,7 @@ movlw b'00100000' dcfsnz tft_temp2,F movlw b'00111111' - movwf tft_temp4 + movwf tft_temp4 rrcf tft_temp4,F rrcf tft_temp3,F @@ -966,10 +954,10 @@ rrcf tft_temp3,F rrcf tft_temp4,F - rrcf tft_temp3,W ; tft_temp3 (b'GGGBBBBB') done. - movwf win_color2 ; Set Color registers... + rrcf tft_temp3,W ; tft_temp3 (b'GGGBBBBB') done. + movwf win_color2 ; Set Color registers... - movff tft_temp1, tft_temp2 ; Copy + movff tft_temp1,tft_temp2 ; Copy clrf tft_temp1 rrcf tft_temp4,F @@ -979,7 +967,7 @@ rrcf tft_temp1,F rrcf tft_temp4,F - rrcf tft_temp1,F ; Green done. + rrcf tft_temp1,F ; Green done. ; Mask Bit 4,3,2,1,0 movlw b'11100000' @@ -1006,7 +994,7 @@ movlw b'00100000' dcfsnz tft_temp2,F movlw b'00111111' - movwf tft_temp4 + movwf tft_temp4 rrcf tft_temp4,F rrcf tft_temp1,F @@ -1021,88 +1009,88 @@ rrcf tft_temp1,F rrcf tft_temp4,F - rrcf tft_temp1,W ; Red done. - movwf win_color1 ; Set Color registers... + rrcf tft_temp1,W ; Red done. + movwf win_color1 ; Set Color registers... return ;============================================================================= ; Dump screen contents to the UART - global TFT_dump_screen + global TFT_dump_screen TFT_dump_screen: - bsf no_sensor_int - movlw 'l' - movwf TXREG ; Send command echo. - call rs232_wait_tx ; wait for UART - ;---- Send DISPLAY box command for the full screen window ------------------- - Index_out 0x50 ; Window Horizontal Start Address - Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x51 ; Window Horizontal End Address - Parameter_out 0x00, 0xEF ; 0-239 - Index_out 0x52 ; Window Vertical Start Address - Parameter_out 0x00, 0x00 ; 0-319 - Index_out 0x53 ; Window Vertical End Address - Parameter_out 0x01, 0x3F ; 0-319 + bsf no_sensor_int + movlw 'l' + movwf TXREG ; Send command echo. + call rs232_wait_tx ; wait for UART + ;---- Send DISPLAY box command for the full screen window ------------------- + Index_out 0x50 ; Window Horizontal Start Address + Parameter_out 0x00, 0x00 ; 0-239 + Index_out 0x51 ; Window Horizontal End Address + Parameter_out 0x00, 0xEF ; 0-239 + Index_out 0x52 ; Window Vertical Start Address + Parameter_out 0x00, 0x00 ; 0-319 + Index_out 0x53 ; Window Vertical End Address + Parameter_out 0x01, 0x3F ; 0-319 - clrf ds_column - rcall dump_screen_pixel_reset + clrf ds_column + rcall dump_screen_pixel_reset dump_screen_1: - btg LEDr ; LED activity toggle - ; Dump even column - movlw .240 ; 240 lines, once. - movwf ds_line + btg LEDr ; LED activity toggle + ; Dump even column + movlw .240 ; 240 lines, once. + movwf ds_line dump_screen_2: - Index_out 0x20 ; Frame Memory Horizontal Address - movff ds_line,WREG ; d'0' ... d'239' - mullw 1 ; Copy row to PRODH:L - rcall TFT_DataWrite_PROD + Index_out 0x20 ; Frame Memory Horizontal Address + movff ds_line,WREG ; d'0' ... d'239' + mullw .1 ; Copy row to PRODH:L + rcall TFT_DataWrite_PROD - movff ds_column,WREG ; Init X position. - mullw 2 - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + movff ds_column,WREG ; Init X position. + mullw 2 + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) - rcall TFT_DataRead_PROD ; read pixel - rcall dump_screen_pixel + rcall TFT_DataRead_PROD ; read pixel + rcall dump_screen_pixel - decfsz ds_line,F - bra dump_screen_2 - rcall dump_screen_pixel_flush + decfsz ds_line,F + bra dump_screen_2 + rcall dump_screen_pixel_flush - ; Dump odd column - movlw .240 ; 240 lines, twice. - movwf ds_line + ; Dump odd column + movlw .240 ; 240 lines, twice. + movwf ds_line dump_screen_3: - Index_out 0x20 ; Frame Memory Horizontal Address - movff ds_line,WREG ; d'0' ... d'239' - mullw 1 ; Copy row to PRODH:L - rcall TFT_DataWrite_PROD + Index_out 0x20 ; Frame Memory Horizontal Address + movff ds_line,WREG ; d'0' ... d'239' + mullw 1 ; Copy row to PRODH:L + rcall TFT_DataWrite_PROD - movff ds_column,WREG ; Init X position. - mullw 2 - movlw .1 - addwf PRODL,F - movlw 0 - addwfc PRODH,F ; +1 - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + movff ds_column,WREG ; Init X position. + mullw 2 + movlw .1 + addwf PRODL,F + movlw 0 + addwfc PRODH,F ; +1 + rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) - rcall TFT_DataRead_PROD ; read pixel - rcall dump_screen_pixel + rcall TFT_DataRead_PROD ; read pixel + rcall dump_screen_pixel - decfsz ds_line,F - bra dump_screen_3 - rcall dump_screen_pixel_flush + decfsz ds_line,F + bra dump_screen_3 + rcall dump_screen_pixel_flush - incf ds_column,F - movlw .160 - cpfseq ds_column - bra dump_screen_1 + incf ds_column,F + movlw .160 + cpfseq ds_column + bra dump_screen_1 - bcf no_sensor_int - clrf RCREG1 ; Clear receive buffer - bcf RCSTA1,CREN ; Clear receiver status - bsf RCSTA1,CREN - bsf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - return + bcf no_sensor_int + clrf RCREG1 ; Clear receive buffer + bcf RCSTA1,CREN ; Clear receiver status + bsf RCSTA1,CREN + bsf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + return ;============================================================================= @@ -1114,81 +1102,81 @@ ; 0ccccccc : BLACK pixel, repeated ccccccc+1 times (1..128). ; 11cccccc : WHITE pixel, repeated cccccc+1 times (1..64). ; 10cccccc HIGH LOW : color pixel (H:L) repeated ccccc+1 times (1..64). -; + dump_screen_pixel: - movf PRODH,W ; Compare pixel-high - xorwf ds_pixel+1,W - bnz dump_screen_pixel_1 ; Different -> dump. + movf PRODH,W ; Compare pixel-high + xorwf ds_pixel+1,W + bnz dump_screen_pixel_1 ; Different -> dump. - movf PRODL,W ; Compare pixel-low - xorwf ds_pixel+0,W - bnz dump_screen_pixel_1 ; Different -> dump. + movf PRODL,W ; Compare pixel-low + xorwf ds_pixel+0,W + bnz dump_screen_pixel_1 ; Different -> dump. - incf ds_count,F ; Same color: just increment. - return + incf ds_count,F ; Same color: just increment. + return -dump_screen_pixel_1: ; Send (pixel,count) tuple - movf ds_count,W ; Is count zero ? - bz dump_screen_pixel_2 ; Yes: skip sending. +dump_screen_pixel_1: ; Send (pixel,count) tuple + movf ds_count,W ; Is count zero ? + bz dump_screen_pixel_2 ; Yes: skip sending. - movf ds_pixel+1,W ; This is a BLACK pixel ? - iorwf ds_pixel+0,W - bz dump_screen_pix_black ; YES. + movf ds_pixel+1,W ; This is a BLACK pixel ? + iorwf ds_pixel+0,W + bz dump_screen_pix_black ; YES. - movf ds_pixel+1,W ; This is a white pixel ? - andwf ds_pixel+0,W - incf WREG - bz dump_screen_pix_white ; YES. + movf ds_pixel+1,W ; This is a white pixel ? + andwf ds_pixel+0,W + incf WREG + bz dump_screen_pix_white ; YES. - ; No: write the pixel itself... - movlw .64 ; Max color pixel on a single byte. - cpfsgt ds_count ; Skip if count > 64 - movf ds_count,W ; W <- min(64,count) - subwf ds_count,F ; ds_count <- ds_count-W - decf WREG ; Save as 0..63 - iorlw b'10000000' ; MARK as a color pixel. + ; No: write the pixel itself... + movlw .64 ; Max color pixel on a single byte. + cpfsgt ds_count ; Skip if count > 64 + movf ds_count,W ; W <- min(64,count) + subwf ds_count,F ; ds_count <- ds_count-W + decf WREG ; Save as 0..63 + iorlw b'10000000' ; MARK as a color pixel. - movwf TXREG - call rs232_wait_tx ; wait for UART - movff ds_pixel+1,TXREG - call rs232_wait_tx ; wait for UART - movff ds_pixel+0,TXREG - call rs232_wait_tx ; wait for UART - bra dump_screen_pixel_1 + movwf TXREG + call rs232_wait_tx ; wait for UART + movff ds_pixel+1,TXREG + call rs232_wait_tx ; wait for UART + movff ds_pixel+0,TXREG + call rs232_wait_tx ; wait for UART + bra dump_screen_pixel_1 dump_screen_pixel_2: - movff PRODH,ds_pixel+1 ; Save new pixel color - movff PRODL,ds_pixel+0 - movlw 1 - movwf ds_count ; And set count=1. - return + movff PRODH,ds_pixel+1 ; Save new pixel color + movff PRODL,ds_pixel+0 + movlw 1 + movwf ds_count ; And set count=1. + return dump_screen_pix_black: - movlw .128 ; Max black pixel on a single byte. - cpfsgt ds_count ; Skip if count > 128 - movf ds_count,W ; W <- min(128,count) - subwf ds_count,F ; ds_count <- ds_count-W - decf WREG ; Save as 0..127 + movlw .128 ; Max black pixel on a single byte. + cpfsgt ds_count ; Skip if count > 128 + movf ds_count,W ; W <- min(128,count) + subwf ds_count,F ; ds_count <- ds_count-W + decf WREG ; Save as 0..127 dump_screen_pix_3: - movwf TXREG - call rs232_wait_tx - bra dump_screen_pixel_1 ; More to dump ? + movwf TXREG + call rs232_wait_tx + bra dump_screen_pixel_1 ; More to dump ? dump_screen_pix_white: - movlw .64 ; Max white pixel on a single byte. - cpfsgt ds_count ; Skip if count > 64 - movf ds_count,W ; W <- min(64,count) - subwf ds_count,F ; ds_count <- ds_count-W - decf WREG ; Save as 0..63 - iorlw b'11000000' ; MARK as a compressed white. - bra dump_screen_pix_3 + movlw .64 ; Max white pixel on a single byte. + cpfsgt ds_count ; Skip if count > 64 + movf ds_count,W ; W <- min(64,count) + subwf ds_count,F ; ds_count <- ds_count-W + decf WREG ; Save as 0..63 + iorlw b'11000000' ; MARK as a compressed white. + bra dump_screen_pix_3 dump_screen_pixel_flush: - clrf PRODH - clrf PRODL - rcall dump_screen_pixel_1 ; Send it + clrf PRODH + clrf PRODL + rcall dump_screen_pixel_1 ; Send it dump_screen_pixel_reset: - clrf ds_count ; But clear count. - return + clrf ds_count ; But clear count. + return - end \ No newline at end of file + END diff -r f5de1ff88814 -r b455b31ce022 src/tft_outputs.asm --- a/src/tft_outputs.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/tft_outputs.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.asm REFACTORED VERSION V2.95a1 +; File tft_outputs.asm REFACTORED VERSION V2.98 ; ; Startup subroutines ; @@ -9,134 +9,118 @@ ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "tft.inc" -#include "start.inc" -#include "wait.inc" -#include "strings.inc" -#include "convert.inc" -#include "varargs.inc" -#include "math.inc" -#include "isr.inc" -#include "eeprom_rs232.inc" -#include "adc_lightsensor.inc" -#include "surfmode.inc" -#include "divemode.inc" -#include "external_flash.inc" -#include "ghostwriter.inc" -#include "customview.inc" -#include "i2c.inc" -#include "colorschemes.inc" -#include "calibrate.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "tft.inc" +#include "start.inc" +#include "wait.inc" +#include "strings.inc" +#include "convert.inc" +#include "varargs.inc" +#include "math.inc" +#include "isr.inc" +#include "eeprom_rs232.inc" +#include "adc_lightsensor.inc" +#include "surfmode.inc" +#include "divemode.inc" +#include "external_flash.inc" +#include "ghostwriter.inc" +#include "customview.inc" +#include "i2c.inc" +#include "colorschemes.inc" +#include "calibrate.inc" extern aa_wordprocessor ;============================================================================= -gui CODE +gui CODE + ;============================================================================= - global TFT_divemask_color + global TFT_divemask_color TFT_divemask_color: - movlw color_green - btfsc divemode ; in Divemode? - rcall TFT_divemask_color_dive + movlw color_green + btfsc divemode ; in Divemode? + rcall TFT_divemask_color_dive bra TFT_standard_color0 TFT_divemask_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 - incf WREG + movff opt_dive_color_scheme,WREG ; 0-3 + incf WREG dcfsnz WREG - retlw color_scheme_divemode_mask1 ;0 + retlw color_scheme_divemode_mask1 ;0 dcfsnz WREG - retlw color_scheme_divemode_mask2 ;1 + retlw color_scheme_divemode_mask2 ;1 dcfsnz WREG - retlw color_scheme_divemode_mask3 ;2 - retlw color_scheme_divemode_mask4 ;3 - - - global TFT_attention_color + retlw color_scheme_divemode_mask3 ;2 + retlw color_scheme_divemode_mask4 ;3 + + + global TFT_attention_color TFT_attention_color: - movlw color_yellow ; TODO + movlw color_yellow ; make this configurable? bra TFT_standard_color0 TFT_attention_color_dive: - retlw color_yellow ; TODO - - global TFT_warnings_color + retlw color_yellow ; make this configurable? + + + global TFT_warnings_color TFT_warnings_color: - movlw color_red ; TODO + movlw color_red ; make this configurable? bra TFT_standard_color0 TFT_warnings_color_dive: - retlw color_red ; TODO - - global TFT_disabled_color + retlw color_red ; make this configurable? + + + global TFT_disabled_color TFT_disabled_color: - ;movlw color_grey ; Default to OSTC grey (dark blue) - movlw color_lightblue - btfsc divemode ; in Divemode? - rcall TFT_disabled_color_dive - bra TFT_standard_color0 + ;movlw color_grey ; Default to OSTC grey (dark blue) + movlw color_lightblue + btfsc divemode ; in Divemode? + rcall TFT_disabled_color_dive ; YES + bra TFT_standard_color0 + TFT_disabled_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 - incf WREG - dcfsnz WREG - retlw color_scheme_divemode_dis1 ;0 + movff opt_dive_color_scheme,WREG ; 0-3 + incf WREG dcfsnz WREG - retlw color_scheme_divemode_dis2 ;1 + retlw color_scheme_divemode_dis1 ; 0 dcfsnz WREG - retlw color_scheme_divemode_dis3 ;2 - retlw color_scheme_divemode_dis4 ;3 - - global TFT_standard_color -TFT_standard_color: - setf WREG ; Default white - btfsc divemode ; in Divemode? - rcall TFT_standard_color_dive -TFT_standard_color0: - goto TFT_set_color ; and return... -TFT_standard_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 - incf WREG - dcfsnz WREG - retlw color_scheme_divemode_std1 ;0 + retlw color_scheme_divemode_dis2 ; 1 dcfsnz WREG - retlw color_scheme_divemode_std2 ;1 - dcfsnz WREG - retlw color_scheme_divemode_std3 ;2 - retlw color_scheme_divemode_std4 ;3 - -TFT_color_code macro color_code_temp - movlw color_code_temp - call TFT_color_code1 - endm - - global TFT_color_code1 -TFT_color_code1: ; Color-codes the output, if required - dcfsnz WREG - bra TFT_color_code_depth ; depth_warn_mbar [mbar], 16Bit - dcfsnz WREG - bra TFT_color_code_cns ; color-code CNS values (CNS in hi:lo [%]) + retlw color_scheme_divemode_dis3 ; 2 + retlw color_scheme_divemode_dis4 ; 3 + + + global TFT_standard_color +TFT_standard_color: + setf WREG ; Default white + btfsc divemode ; in Divemode? + rcall TFT_standard_color_dive + ;bra TFT_standard_color0 + +TFT_standard_color0: + goto TFT_set_color ; and return... + + +TFT_standard_color_dive: + movff opt_dive_color_scheme,WREG ; 0-3 + incf WREG dcfsnz WREG - bra TFT_color_code_gf ; color-code GF value [%] + retlw color_scheme_divemode_std1 ;0 dcfsnz WREG - bra TFT_color_code_ppo2 ; Color-code ppO2 values (ppO2 in hi:lo [cbar]) by its warning flags - dcfsnz WREG - bra TFT_color_code_ceiling ; Color-code the ceiling depth + retlw color_scheme_divemode_std2 ;1 dcfsnz WREG - bra TFT_color_code_gaslist ; Color-code current row in Gaslist (%O2 in hi) according to current amb_pressure - dcfsnz WREG - bra TFT_color_code_ppo2_hud ; Color-code ppO2 values (ppO2 in --:lo [cbar]) by its value - dcfsnz WREG - bra TFT_color_code_battery ; Color-code the battery display - dcfsnz WREG - bra TFT_color_code_stop ; Color-code the stop depth - - -TFT_color_code_gaslist: ; %O2 in hi + retlw color_scheme_divemode_std3 ;2 + retlw color_scheme_divemode_std4 ;3 + + + global TFT_color_code_gaslist +TFT_color_code_gaslist: ; Color-code current row in Gaslist (%O2 in hi) according to current amb_pressure ; Check very high ppO2 manually - SAFE_2BYTE_COPY amb_pressure,xA + SAFE_2BYTE_COPY amb_pressure,xA movlw d'10' movwf xB+0 clrf xB+1 @@ -155,54 +139,54 @@ ; Check for low ppo2 movff xC+0,sub_a+0 movff xC+1,sub_a+1 - movff char_I_ppO2_min,WREG - mullw d'100' ; char_I_ppO2_min*100 + movff char_I_ppO2_min,WREG + mullw d'100' ; char_I_ppO2_min*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 call subU16 btfsc neg_flag - bra TFT_warnings_color ; too low -> Warning Color! + bra TFT_warnings_color ; too low -> Warning Color! ; Check for high ppo2 - movff gaslist_gas_global,WREG ; Read current gas O2 ratio - lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type - movff char_I_ppO2_max_deco,xB+1 ; xB+1 used as temp here - movlw .3 - cpfseq xA+0 ; Deco? - movff char_I_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG + movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings + btfsc WREG,deco_flag ; are we in deco? + bra TFT_color_code_gaslist_deco ; YES - take deco max + movff char_I_ppO2_max,WREG ; No - take travel/bottom max + bra TFT_color_code_gaslist_com +TFT_color_code_gaslist_deco: + movff char_I_ppO2_max_deco,WREG ; ppo2 max for deco +TFT_color_code_gaslist_com: mullw d'100' ; char_I_ppO2_max*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 infsnz sub_a+0,F incf sub_a+1,F ; add 1mbar to avoid warning on equal - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - bra TFT_warnings_color ; too high -> Warning Color! + bra TFT_warnings_color ; too high -> Warning Color! return -TFT_color_code_ceiling: - btfsc hi,char_invalid_flag ; is the invalid flag set? (bit 7 here) +TFT_color_code_ceiling: ; color-code the ceiling depth + btfsc hi,char_invalid_flag ; is the invalid flag set? (bit 7 here) bra TFT_color_code_ceiling_1 ; YES SAFE_2BYTE_COPY rel_pressure,sub_a ; NO - movff lo,sub_b+0 - movff hi,sub_b+1 + movff lo,sub_b+0 + movff hi,sub_b+1 call subU16 ; sub_c = sub_a - sub_b : sub_c = rel_pressure [cm] - int_O_ceiling [mbar => cm] - btfsc neg_flag ; is ceiling > current depth? - bra TFT_warnings_color ; YES - set to warning color and return + btfsc neg_flag ; is ceiling > current depth? + bra TFT_warnings_color ; YES - set to warning color and return bra TFT_standard_color ; NO - set to standard color and return TFT_color_code_ceiling_1: bcf hi,char_invalid_flag ; clear the invalid flag (bit 7 here) bra TFT_disabled_color ; set to disabled color and return -TFT_color_code_stop: +TFT_color_code_stop: ; color-code the stop depth movff char_O_deco_gas+0,WREG ; get flag for invalid deco data btfsc WREG,char_invalid_flag ; is the invalid flag set? bra TFT_disabled_color ; set to disabled color and return - SAFE_2BYTE_COPY rel_pressure,xA ; get current pressure in mbar = cm - movlw LOW d'100' + SAFE_2BYTE_COPY rel_pressure,xA ; get current pressure in mbar = cm + movlw LOW d'100' movwf xB+0 clrf xB+1 call div16x16 ; xA/xB=xC with xA as remainder: Divide/100 => xC+0 = current depth in meters @@ -213,16 +197,15 @@ bra TFT_warnings_color ; YES - set to warning color and return - -TFT_color_code_depth: ; with depth as rel_pressure in [mbar] in hi:lo +TFT_color_code_depth: ; with actual depth as rel_pressure in [mbar] in hi:lo and threshold depth_warn_mbar [mbar], 16Bit movff lo,sub_a+0 movff hi,sub_a+1 - movlw LOW depth_warn_mbar + movlw LOW depth_warn_mbar movwf sub_b+0 movlw HIGH depth_warn_mbar movwf sub_b+1 call subU16 ; sub_c = sub_a - sub_b - TSTOSS opt_modwarning ; 0=standard, 1=blink + TSTOSS opt_modwarning ; 0=standard, 1=blink bra TFT_color_code_depth_std btfss neg_flag bra TFT_color_code_depth_warn ; set to warning color @@ -232,81 +215,90 @@ bra TFT_warnings_color ; set to warning color and return bra TFT_standard_color ; set to standard color and return... TFT_color_code_depth_ppO2: - movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR decfsz WREG,F ; are we in CCR mode? bra TFT_color_code_depth_no_ccr ; NO - continue checking for ppO2 btfsc is_bailout ; YES - check if in bailout - bra TFT_color_code_depth_no_ccr ; YES - continue checking for ppO2 -; no warning by depth for all CCR modes when not in bailout ## V2.94 - ;movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - ;decfsz WREG,F - ;bra TFT_color_code_ppo2_depth_no_ccr ; Not Sensor - bcf blinking_depth_warning ; reset warning + bra TFT_color_code_depth_no_ccr ; YES - continue checking for ppO2 + bcf blinking_depth_warning ; reset warning bra TFT_standard_color ; no color coding, return. TFT_color_code_depth_no_ccr: movff int_O_breathed_ppO2+1,WREG ; get upper byte of currently breathed ppO2 btfsc WREG,int_warning_flag ; is the warning flag set? bra TFT_color_code_depth_warn ; YES - animate in warning design - bcf blinking_depth_warning ; NO - reset warning - bra TFT_standard_color ; set standard color and return + bcf blinking_depth_warning ; NO - reset warning + bra TFT_standard_color ; set standard color and return TFT_color_code_depth_warn: - bsf blinking_depth_warning ; set warning - bra TFT_warnings_color ; set to warning color and return... - - -TFT_color_code_cns: ; with CNS% in hi:lo + bsf blinking_depth_warning ; set warning + bra TFT_warnings_color ; set to warning color and return... + + + global TFT_color_code_cns +TFT_color_code_cns: ; color-code CNS values (CNS in hi:lo [%]) btfss hi,int_invalid_flag ; is the invalid flag set? bra TFT_color_code_cns_1 ; NO - bcf hi,int_invalid_flag ; YES - clear invalid flag ## Todo: use ~bitmask and AND - bcf hi,int_warning_flag ; clear warning flag (it may be set) - bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) - bra TFT_disabled_color ; set to disabled color and return + bcf hi,int_invalid_flag ; YES - clear invalid flag + bcf hi,int_warning_flag ; clear warning flag (it may be set) + bcf hi,int_attention_flag ; clear attention flag (it may be set) + bra TFT_disabled_color ; set to disabled color and return TFT_color_code_cns_1 btfss hi,int_warning_flag ; is the warning flag set? bra TFT_color_code_cns_2 ; NO - bcf hi,int_warning_flag ; YES - clear warning ## Todo: use ~bitmask and AND - bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) - bra TFT_warnings_color ; set to warning color and return + bcf hi,int_warning_flag ; YES - clear warning flag + bcf hi,int_attention_flag ; clear attention flag (it may be set) + bra TFT_warnings_color ; set to warning color and return TFT_color_code_cns_2: - bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) - bra TFT_standard_color ; set to standard color and return + btfss hi,int_attention_flag ; is the attention flag set? + bra TFT_standard_color ; NO - set to standard color and return + bcf hi,int_attention_flag ; YES - clear attention flag + bra TFT_attention_color ; set to attention color and return TFT_color_code_gf: - btfsc hi,int_warning_flag ; is the warning flag set? - bra TFT_warnings_color ; YES - set to warning color and return - btfsc hi,int_prewarning_flag ; is the attention flag set? - bra TFT_attention_color ; YES - set to attention color and return - bra TFT_standard_color ; NO - set to normal color and return - - -TFT_color_code_ppo2: + ; with int_O_gradient_factor, the upper byte is solely used for the flags + ; and not for the value, thus there is no need to clear the flags + btfsc hi,int_invalid_flag ; is the invalid flag set? + bra TFT_disabled_color ; YES - set to disabled color and return + btfsc hi,int_warning_flag ; NO - is the warning flag set? + bra TFT_warnings_color ; YES - set to warning color and return + btfsc hi,int_attention_flag ; NO - is the attention flag set? + bra TFT_attention_color ; YES - set to attention color and return + bra TFT_standard_color ; NO - set to normal color and return + + +TFT_color_code_ppo2: ; color-code ppO2 values (ppO2 in hi:lo [cbar]) by its warning flags btfss hi,int_warning_flag ; is the warning flag set? bra TFT_color_code_ppo2_1 ; NO - bcf hi,int_warning_flag ; YES - clear warning flag ## Todo: use ~bitmask and AND - bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) - bcf hi,int_high_flag ; clear high warning flag (it may be set) - bcf hi,int_low_flag ; clear low warning flag (it may be set) - bra TFT_warnings_color ; warn in warning color + bcf hi,int_warning_flag ; YES - clear warning flag + bcf hi,int_attention_flag ; clear attention flag (it may be set) + bcf hi,int_high_flag ; clear high warning flag (it may be set) + bcf hi,int_low_flag ; clear low warning flag (it may be set) + bra TFT_warnings_color ; warn in warning color TFT_color_code_ppo2_1: - bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) ## Todo: use ~bitmask and AND - bcf hi,int_high_flag ; clear high warning flag (it may be set) - bcf hi,int_low_flag ; clear low warning flag (it may be set) + btfss hi,int_attention_flag ; is the attention flag set? + bra TFT_color_code_ppo2_2 ; NO + bcf hi,int_attention_flag ; YES - clear attention flag (it may be set) + bcf hi,int_high_flag ; clear high warning flag (it may be set) + bcf hi,int_low_flag ; clear low warning flag (it may be set) + bra TFT_attention_color ; set to standard color and return +TFT_color_code_ppo2_2: + bcf hi,int_high_flag ; clear high warning flag (it may be set) + bcf hi,int_low_flag ; clear low warning flag (it may be set) bra TFT_standard_color ; set to standard color and return -TFT_color_code_ppo2_hud: ; With ppO2 [cbar] in --:lo +TFT_color_code_ppo2_hud: ; color-code ppO2 values (ppO2 in --:lo [cbar]) by its value movff char_O_deco_warnings,WREG ; get the deco warnings vector btfss WREG,deco_flag ; are we in deco? bra TFT_color_code_ppo2_hud_a ; NO - load normal max value as threshold movff char_I_ppO2_max_deco,WREG ; YES - load deco value as threshold bra TFT_color_code_ppo2_hud_b -TFT_color_code_ppo2_hud_a: +TFT_color_code_ppo2_hud_a: movff char_I_ppO2_max,WREG ; ppO2 max while not in deco -TFT_color_code_ppo2_hud_b: - cpfsgt lo ; lo > threshold? - bra TFT_color_code_ppo2_hud1 ; NO - continue with checking for ppO2 low - bra TFT_warnings_color ; YES - set warning color and return +TFT_color_code_ppo2_hud_b: + cpfsgt lo ; lo > threshold? + bra TFT_color_code_ppo2_hud1 ; NO - continue with checking for ppO2 low + bra TFT_warnings_color ; YES - set warning color and return TFT_color_code_ppo2_hud1: movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR decfsz WREG,F ; now: 0=CC, 1=Gauge, 2=Apnea, 3=PSCR @@ -318,309 +310,329 @@ TFT_color_code_ppo2_hud_nocc: movff char_I_ppO2_min,WREG ; PPO2 min for all other modes TFT_color_code_ppo2_hud_cont: - cpfslt lo ; lo < char_I_ppO2_min? - bra TFT_standard_color ; NO - set standard color and return... - bra TFT_warnings_color ; Yes - set warning color and return - - -TFT_color_code_battery: ; With battery percent in lo - movlw color_code_battery_low ; get warning threshold - cpfsgt lo ; is battery percent < threshold? - bra TFT_warnings_color ; YES - set to warning color and return - bra TFT_standard_color ; NO - set to standard color and return + cpfslt lo ; lo < char_I_ppO2_min? + bra TFT_standard_color ; NO - set standard color and return... + bra TFT_warnings_color ; Yes - set warning color and return + + +TFT_color_code_battery: ; color-code the battery display, with battery percent in lo + movlw color_code_battery_low ; get warning threshold + cpfsgt lo ; is battery percent < threshold? + bra TFT_warnings_color ; YES - set to warning color and return + bra TFT_standard_color ; NO - set to standard color and return + + + global TFT_color_code_gas +TFT_color_code_gas: ; color-code the output according to gas number (1-6) in WREG + movwf up ; copy gas number (1-6) to up + movlw color_white ; Default color + dcfsnz up,F + movlw color_white ; Color for Gas 1 + dcfsnz up,F + movlw color_green ; Color for Gas 2 + dcfsnz up,F + movlw color_red ; Color for Gas 3 + dcfsnz up,F + movlw color_yellow ; Color for Gas 4 + dcfsnz up,F + movlw color_cyan ; Color for Gas 5 + dcfsnz up,F + movlw color_pink ; Color for Gas 6 + goto TFT_set_color ; Set Color... + ; **************************************************************************** - global TFT_show_OC_startgas_surface -TFT_show_OC_startgas_surface: ; Show first gas and "OSTC2-like" active gases - ; Show first gas - WIN_SMALL surf_decotype_column+.1,surf_decotype_row+.30 - extern get_first_gas_to_WREG,gaslist_strcat_gas - call get_first_gas_to_WREG ; Gets first gas (1-5) into WREG + global TFT_show_OC_startgas_surface +TFT_show_OC_startgas_surface: ; Show first gas and "OSTC2-like" active gases + ; Show first gas + WIN_SMALL surf_decotype_column+.1,surf_decotype_row+.30 + extern get_first_gas_to_WREG,gaslist_strcat_gas + call get_first_gas_to_WREG ; Gets first gas (1-5) into WREG decf WREG,W ; 1-5 -> 0-4 - movwf PRODL - call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: Text appended into buffer pointed by FSR2. - STRCAT_PRINT "" - ; Show boxes - WIN_TOP surf_decotype_row+.30+.25 - WIN_LEFT surf_decotype_boxes_left1+.1 - rcall TFT_disabled_color - movff opt_gas_type+0,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco - tstfsz hi - rcall TFT_standard_color - STRCPY_PRINT "1" - decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode3 ; No, skip box - WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left1, surf_decotype_boxes_left1+.8 ;top, bottom, left, right + movwf PRODL + call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: Text appended into buffer pointed by FSR2. + STRCAT_PRINT "" + ; Show boxes + WIN_TOP surf_decotype_row+.30+.25 + WIN_LEFT surf_decotype_boxes_left1+.1 + rcall TFT_disabled_color + movff opt_gas_type+0,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + tstfsz hi + rcall TFT_standard_color + STRCPY_PRINT "1" + decfsz hi,F ; Type = 1 (First)? + bra DISP_active_gas_surfmode3 ; No, skip box + WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left1, surf_decotype_boxes_left1+.8 ;top, bottom, left, right DISP_active_gas_surfmode3: - rcall TFT_disabled_color - movff opt_gas_type+1,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco - tstfsz hi - rcall TFT_standard_color - WIN_LEFT surf_decotype_boxes_left2+.1 - STRCPY_PRINT "2" - decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode4 ; No, skip box - WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left2, surf_decotype_boxes_left2+.8 ;top, bottom, left, right + rcall TFT_disabled_color + movff opt_gas_type+1,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + tstfsz hi + rcall TFT_standard_color + WIN_LEFT surf_decotype_boxes_left2+.1 + STRCPY_PRINT "2" + decfsz hi,F ; Type = 1 (First)? + bra DISP_active_gas_surfmode4 ; No, skip box + WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left2, surf_decotype_boxes_left2+.8 ;top, bottom, left, right DISP_active_gas_surfmode4: - rcall TFT_disabled_color - movff opt_gas_type+2,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco - tstfsz hi - rcall TFT_standard_color - WIN_LEFT surf_decotype_boxes_left3+.1 - STRCPY_PRINT "3" - decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode5 ; No, skip box - WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left3, surf_decotype_boxes_left3+.8 ;top, bottom, left, right + rcall TFT_disabled_color + movff opt_gas_type+2,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + tstfsz hi + rcall TFT_standard_color + WIN_LEFT surf_decotype_boxes_left3+.1 + STRCPY_PRINT "3" + decfsz hi,F ; Type = 1 (First)? + bra DISP_active_gas_surfmode5 ; No, skip box + WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left3, surf_decotype_boxes_left3+.8 ;top, bottom, left, right DISP_active_gas_surfmode5: - rcall TFT_disabled_color - movff opt_gas_type+3,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco - tstfsz hi - rcall TFT_standard_color - WIN_LEFT surf_decotype_boxes_left4+.1 - STRCPY_PRINT "4" - decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode6 ; No, skip box - WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left4, surf_decotype_boxes_left4+.8 ;top, bottom, left, right + rcall TFT_disabled_color + movff opt_gas_type+3,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + tstfsz hi + rcall TFT_standard_color + WIN_LEFT surf_decotype_boxes_left4+.1 + STRCPY_PRINT "4" + decfsz hi,F ; Type = 1 (First)? + bra DISP_active_gas_surfmode6 ; No, skip box + WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left4, surf_decotype_boxes_left4+.8 ;top, bottom, left, right DISP_active_gas_surfmode6: - rcall TFT_disabled_color - movff opt_gas_type+4,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco - tstfsz hi - rcall TFT_standard_color - WIN_LEFT surf_decotype_boxes_left5+.1 - STRCPY_PRINT "5" - rcall TFT_standard_color ; Reset color - decfsz hi,F ; Type = 1 (First)? - return ; no, Done. - WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left5, surf_decotype_boxes_left5+.8 ;top, bottom, left, right - return ; Done. - - - global TFT_show_color_schemes + rcall TFT_disabled_color + movff opt_gas_type+4,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + tstfsz hi + rcall TFT_standard_color + WIN_LEFT surf_decotype_boxes_left5+.1 + STRCPY_PRINT "5" + rcall TFT_standard_color ; Reset color + decfsz hi,F ; Type = 1 (First)? + return ; no, Done. + WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left5, surf_decotype_boxes_left5+.8 ;top, bottom, left, right + return ; Done. + + + global TFT_show_color_schemes TFT_show_color_schemes: ; update the color schemes - bsf divemode ; put in divemode - call TFT_divemask_color - WIN_TINY .12,.40 - STRCAT_TEXT_PRINT tDepth - WIN_TINY .62,.40 - STRCAT_TEXT_PRINT tMaxDepth - WIN_TINY .122,.40 - STRCAT_TEXT_PRINT tDivetime - - ; Show some demo screen - - ; Depth demo - call TFT_standard_color + bsf divemode ; put in divemode + call TFT_divemask_color + WIN_TINY .12,.40 + STRCAT_TEXT_PRINT tDepth + WIN_TINY .62,.40 + STRCAT_TEXT_PRINT tMaxDepth + WIN_TINY .122,.40 + STRCAT_TEXT_PRINT tDivetime + + ; Show some demo screen + + ; Depth demo + call TFT_standard_color WIN_MEDIUM .3,.54 - movlw LOW .5172 - movwf lo - movlw HIGH .5172 - movwf hi + movlw LOW .5172 + movwf lo + movlw HIGH .5172 + movwf hi bsf leftbind bsf ignore_digit4 output_16 ; Full meters in Big font bcf leftbind STRCAT_PRINT "" ; Display full meters - WIN_SMALL .25,.66 - movlw LOW .5172 - movwf lo - movlw HIGH .5172 - movwf hi - PUTC "." + WIN_SMALL .25,.66 + movlw LOW .5172 + movwf lo + movlw HIGH .5172 + movwf hi + PUTC "." movlw d'4' movwf ignore_digits bsf ignore_digit5 - output_16dp d'0' ; .1m in SMALL font + output_16dp d'0' ; .1m in SMALL font STRCAT_PRINT "" ; Display decimeters - WIN_FONT FT_SMALL - - ; Max. Depth demo - WIN_MEDIUM .64,.54 - bsf ignore_digit4 ; no 0.1m - bsf leftbind - movlw LOW .6349 - movwf lo - movlw HIGH .6349 - movwf hi + WIN_FONT FT_SMALL + + ; Max. Depth demo + WIN_MEDIUM .64,.54 + bsf ignore_digit4 ; no 0.1m + bsf leftbind + movlw LOW .6349 + movwf lo + movlw HIGH .6349 + movwf hi output_16 STRCAT_PRINT "" ; Display full meters - bcf leftbind + bcf leftbind ; .1m in SMALL font - WIN_SMALL .87,.66 - PUTC "." + WIN_SMALL .87,.66 + PUTC "." movlw d'4' movwf ignore_digits bsf ignore_digit5 - bsf leftbind - movlw LOW .6349 - movwf lo - movlw HIGH .6349 - movwf hi + bsf leftbind + movlw LOW .6349 + movwf lo + movlw HIGH .6349 + movwf hi output_16dp d'0' STRCAT_PRINT "" ; Display decimeters - bcf leftbind - - ; Divetime demo - movff mins,lo - clrf hi - WIN_MEDIUM .103, .54 - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_PRINT "" ; Show minutes in large font - WIN_SMALL .139, .66 ; left position for two sec figures - PUTC ':' + bcf leftbind + + ; Divetime demo + movff mins,lo + clrf hi + WIN_MEDIUM .103, .54 + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_PRINT "" ; Show minutes in large font + WIN_SMALL .139, .66 ; left position for two sec figures + PUTC ':' bsf leftbind - movff secs,lo + movff secs,lo output_99x - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - - bcf divemode ; don't stay in divemode + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font + + bcf divemode ; don't stay in divemode return global TFT_divemode_mask TFT_divemode_mask: ; Displays mask in divemode - bcf FLAG_TFT_divemode_mask - call TFT_divemask_color + bcf FLAG_TFT_divemode_mask + call TFT_divemask_color WIN_TINY dm_mask_depth_column,dm_mask_depth_row - STRCAT_TEXT_PRINT tDepth + STRCAT_TEXT_PRINT tDepth WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_TINY dm_mask_maxdepth_column_nvsi,dm_mask_maxdepth_row - STRCAT_TEXT_PRINT tMaxDepth + STRCAT_TEXT_PRINT tMaxDepth WIN_TINY dm_mask_divetime_column,dm_mask_divetime_row - STRCAT_TEXT_PRINT tDivetime - bra TFT_standard_color ; and return... - - global TFT_divemode_mask_alternative + STRCAT_TEXT_PRINT tDivetime + bra TFT_standard_color ; and return... + + global TFT_divemode_mask_alternative TFT_divemode_mask_alternative: ; Alt. mask for divemode - bcf FLAG_TFT_divemode_mask_alt - call TFT_divemask_color - WIN_TINY dm_mask_depth_column,dm_mask_depth_row - STRCAT_TEXT_PRINT tDepth - WIN_TINY dm_mask_divetime_column-.30,dm_mask_divetime_row - STRCAT_TEXT_PRINT tDivetime - bra TFT_standard_color ; and return... - - global TFT_draw_gassep_line + bcf FLAG_TFT_divemode_mask_alt + call TFT_divemask_color + WIN_TINY dm_mask_depth_column,dm_mask_depth_row + STRCAT_TEXT_PRINT tDepth + WIN_TINY dm_mask_divetime_column-.30,dm_mask_divetime_row + STRCAT_TEXT_PRINT tDivetime + bra TFT_standard_color ; and return... + + global TFT_draw_gassep_line TFT_draw_gassep_line: - btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode - return - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - bra TFT_standard_color ; and return... + btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode + return + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + bra TFT_standard_color ; and return... ;========================================================================= global TFT_display_velocity -TFT_display_velocity: ; With divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0 - bcf STATUS,C - movlw velocity_display_threshold_1 ; lowest threshold for display vertical velocity - subwf divA+0,W - btfss STATUS,C - bra TFT_velocity_clear ; lower then threshold. Clear text and graph (If active) - - ; We have something to display - bsf display_velocity ; Set flag - ; check if descending: no warning color if descending - rcall TFT_standard_color - btfsc neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_set_color ; Set color for text and set threshold for graph - - rcall TFT_velocity_disp ; Show the text - - TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar - bra TFT_display_velocity_done ; No graph - - btfsc alternative_divelayout ; Alternative layout? - bra TFT_display_velocity_done ; Yes, no graph! (no room when divetime minutes is three figures) - - btfsc neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_graph ; Show the graph - btfss neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_clear_graph ; Clear the graph for descent - -TFT_display_velocity_done: - bra TFT_standard_color ; and return! +TFT_display_velocity: ; With divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0 + bcf STATUS,C + movlw velocity_display_threshold_1; lowest threshold for display vertical velocity + subwf divA+0,W + btfss STATUS,C + bra TFT_velocity_clear ; lower then threshold. Clear text and graph (If active) + + ; We have something to display + bsf display_velocity ; Set flag + ; check if descending: no warning color if descending + rcall TFT_standard_color + btfsc neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_set_color ; Set color for text and set threshold for graph + + rcall TFT_velocity_disp ; Show the text + + TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar + bra TFT_display_velocity_done ; No graph + + btfsc alternative_divelayout ; Alternative layout? + bra TFT_display_velocity_done ; Yes, no graph! (no room when divetime minutes is three figures) + + btfsc neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_graph ; Show the graph + btfss neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_clear_graph ; Clear the graph for descent + +TFT_display_velocity_done: + bra TFT_standard_color ; and return! TFT_speed_table: - ; use a depth-dependent ascent rate warning - ; depth(ft): <20 >20 >40 >60 >75 >88 >101 >115 >128 >144 >164 - ; speed(ft/min): 23 26 29 33 36 43 49 56 59 62 66 - ; depth(m): <=6 >6 >12 >18 >23 >27 >31 >35 >39 >44 >50 - ; speed(m/min): 7 8 9 10 11 13 15 17 18 19 20 (warning) + ; use a depth-dependent ascent rate warning + ; depth(ft): <20 >20 >40 >60 >75 >88 >101 >115 >128 >144 >164 + ; speed(ft/min): 23 26 29 33 36 43 49 56 59 62 66 + ; depth(m): <=6 >6 >12 >18 >23 >27 >31 >35 >39 >44 >50 + ; speed(m/min): 7 8 9 10 11 13 15 17 18 19 20 (warning) ; speed(m/min): 5 6 7 8 8 10 12 13 14 15 15 (attention) - ; xC+0 = Depth in m - call div16x16 ; xA/xB=xC with xA as remainder - ;movf xC+0,W ; Depth in m - - ; point to speed table - movlw LOW (TFT_speed_table-.3) - movwf TBLPTRL - movlw HIGH (TFT_speed_table-.3) - movwf TBLPTRH - movlw UPPER (TFT_speed_table-.3) - movwf TBLPTRU + clrf xB+1 ; Devide/100 -> xC+0 = Depth in m + call div16x16 ; xA/xB=xC with xA as remainder + ;movf xC+0,W ; Depth in m + + ; point to speed table + movlw LOW (TFT_speed_table-.3) + movwf TBLPTRL + movlw HIGH (TFT_speed_table-.3) + movwf TBLPTRH + movlw UPPER (TFT_speed_table-.3) + movwf TBLPTRU TFT_velocity_set_color_skip: - TBLRD*+ ; 3 dummy reads - TBLRD*+ - TBLRD*+ - - TBLRD*+ ; Get speed threshold - movf xC+0,W ; Depth in m - cpfsgt TABLAT ; Threshold > current depth ? - bra TFT_velocity_set_color_skip ; No - - TBLRD*+ ; Get warning speed threshold - movf TABLAT,W - movwf divA+1 ; Copy for graph routine - cpfslt divA+0 ; smaller then actual value (in m/min)? - bra TFT_warnings_color ; Set Warning color (And return) - TBLRD*+ ; Get attention speed threshold - movf TABLAT,W - cpfslt divA+0 ; smaller then actual value (in m/min)? - bra TFT_attention_color ; Set Attention color (And return) - bra TFT_standard_color ; ...and return + TBLRD*+ ; 3 dummy reads + TBLRD*+ + TBLRD*+ + + TBLRD*+ ; Get speed threshold + movf xC+0,W ; Depth in m + cpfsgt TABLAT ; Threshold > current depth ? + bra TFT_velocity_set_color_skip ; No + + TBLRD*+ ; Get warning speed threshold + movf TABLAT,W + movwf divA+1 ; Copy for graph routine + cpfslt divA+0 ; smaller then actual value (in m/min)? + bra TFT_warnings_color ; Set Warning color (And return) + TBLRD*+ ; Get attention speed threshold + movf TABLAT,W + cpfslt divA+0 ; smaller then actual value (in m/min)? + bra TFT_attention_color ; set attention color (and return) + bra TFT_standard_color ; ...and return TFT_velocity_set_color_static: - movlw color_code_velocity_warn_high ; in m/min - movwf divA+1 ; Copy for graph routine - cpfslt divA+0 ; smaller then actual value (in m/min)? - bra TFT_warnings_color ; Set Warning color (And return) - movlw color_code_velocity_attn_high ; in m/min - cpfslt divA+0 ; smaller then actual value (in m/min)? - bra TFT_attention_color ; Set Attention color (And return) - bra TFT_standard_color ; ...and return + movlw color_code_velocity_warn_high ; in m/min + movwf divA+1 ; Copy for graph routine + cpfslt divA+0 ; smaller then actual value (in m/min)? + bra TFT_warnings_color ; Set Warning color (And return) + movlw color_code_velocity_attn_high ; in m/min + cpfslt divA+0 ; smaller then actual value (in m/min)? + bra TFT_attention_color ; set attention color (and return) + bra TFT_standard_color ; ...and return TFT_velocity_disp: - WIN_SMALL dm_velocity_text_column, dm_velocity_text_row - TSTOSS opt_units ; 0=Meters, 1=Feets + WIN_SMALL dm_velocity_text_column, dm_velocity_text_row + TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_velocity_metric ;TFT_velocity_imperial: movff divA+0,WREG ; divA+0 = m/min @@ -635,8 +647,8 @@ bsf leftbind output_16 bcf leftbind - STRCAT_TEXT_PRINT tVelImperial ; Unit switch - return + STRCAT_TEXT_PRINT tVelImperial ; Unit switch + return TFT_velocity_metric: movff divA+0,lo ; divA+0 = m/min @@ -645,37 +657,37 @@ movlw '+' movwf POSTINC2 output_99 - STRCAT_TEXT_PRINT tVelMetric ; Unit switch - return - -TFT_velocity_graph: ; divA+0 = m/min + STRCAT_TEXT_PRINT tVelMetric ; Unit switch + return + +TFT_velocity_graph: ; divA+0 = m/min ; divA+0 holding the ascend speed in m/min - movff divA+0,hi ; Copy - WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right -> outer frame - rcall TFT_divemask_color_dive ; Color -> WREG - WIN_FRAME_COLOR dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;inner frame - rcall TFT_divemask_color_dive ; Color -> WREG - WIN_FRAME_COLOR dm_velobar_top+.10, dm_velobar_bot-.10, dm_velobar_lft, dm_velobar_rgt ;inner frame - rcall TFT_divemask_color_dive ; Color -> WREG - WIN_FRAME_COLOR dm_velobar_top+.20, dm_velobar_bot-.20, dm_velobar_lft, dm_velobar_rgt ;inner frame - rcall TFT_divemask_color_dive ; Color -> WREG - WIN_FRAME_COLOR dm_velobar_top+.30, dm_velobar_bot-.30, dm_velobar_lft, dm_velobar_rgt ;inner frame + movff divA+0,hi ; Copy + WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right -> outer frame + rcall TFT_divemask_color_dive ; Color -> WREG + WIN_FRAME_COLOR dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;inner frame + rcall TFT_divemask_color_dive ; Color -> WREG + WIN_FRAME_COLOR dm_velobar_top+.10, dm_velobar_bot-.10, dm_velobar_lft, dm_velobar_rgt ;inner frame + rcall TFT_divemask_color_dive ; Color -> WREG + WIN_FRAME_COLOR dm_velobar_top+.20, dm_velobar_bot-.20, dm_velobar_lft, dm_velobar_rgt ;inner frame + rcall TFT_divemask_color_dive ; Color -> WREG + WIN_FRAME_COLOR dm_velobar_top+.30, dm_velobar_bot-.30, dm_velobar_lft, dm_velobar_rgt ;inner frame - movff divA+1,xA+0 ; m/min for warning level (upper two blocks) + movff divA+1,xA+0 ; m/min for warning level (upper two blocks) clrf xA+1 movlw .5 movwf xB+0 ; Threshold for color warning (5 color normal + 2 color warning) clrf xB+1 - call div16x16 ;xA/xB=xC with xA as remainder - ; xC+0 holds stepsize in m/min (e.g. =3 for 15m/min warning treshold) + call div16x16 ;xA/xB=xC with xA as remainder + ; xC+0 holds step size in m/min (e.g. =3 for 15m/min warning threshold) movff hi,xA+0 ; Velocity in m/min clrf xA+1 movff xC+0,xB+0 ; Step size clrf xB+1 - call div16x16 ;xA/xB=xC with xA as remainder + call div16x16 ;xA/xB=xC with xA as remainder ; xC+0 now holds amount of segments to show - movff hi,divA+0 ; Copy back for numeric output + movff hi,divA+0 ; Copy back for numeric output movlw d'7' cpfslt xC+0 bra DISP_graph_vel_7 @@ -697,31 +709,31 @@ movlw d'1' cpfslt xC+0 bra DISP_graph_vel_1 - bra DISP_graph_vel_0 ; Should not happen... + bra DISP_graph_vel_0 ; Should not happen... DISP_graph_vel_7: - rcall TFT_warnings_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.2, dm_velobar_top+.8, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_warnings_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.2, dm_velobar_top+.8, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_6: - rcall TFT_warnings_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.12, dm_velobar_top+.18, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_warnings_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.12, dm_velobar_top+.18, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_5: - rcall TFT_attention_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.22, dm_velobar_top+.28, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_attention_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.22, dm_velobar_top+.28, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_4: - rcall TFT_standard_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.32, dm_velobar_top+.38, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_standard_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.32, dm_velobar_top+.38, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_3: - rcall TFT_standard_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.42, dm_velobar_top+.48, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_standard_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.42, dm_velobar_top+.48, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_2: - rcall TFT_standard_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.52, dm_velobar_top+.58, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_standard_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.52, dm_velobar_top+.58, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_1: - rcall TFT_standard_color_dive ; Color -> WREG - WIN_BOX_COLOR dm_velobar_top+.62, dm_velobar_top+.68, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right + rcall TFT_standard_color_dive ; Color -> WREG + WIN_BOX_COLOR dm_velobar_top+.62, dm_velobar_top+.68, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_0: - return ; Done. + return ; Done. global TFT_velocity_clear TFT_velocity_clear: @@ -729,55 +741,55 @@ return bcf display_velocity ; Velocity was displayed, delete velocity now ; Clear Text - WIN_BOX_BLACK dm_velocity_text_row, dm_velocity_text_bot, dm_velocity_text_column, dm_velocity_text_rgt ; top, bottom, left, right - - TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar - return ; No graph to clear + WIN_BOX_BLACK dm_velocity_text_row, dm_velocity_text_bot, dm_velocity_text_column, dm_velocity_text_rgt ; top, bottom, left, right + + TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar + return ; No graph to clear TFT_velocity_clear_graph: - ; Clear Graph - WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right + ; Clear Graph + WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right return ;========================================================================= - global TFT_clear_decoarea + global TFT_clear_decoarea TFT_clear_decoarea: - WIN_BOX_BLACK dm_decostop_1st_stop_row, .239, dm_decostop_1st_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_decostop_1st_stop_row, .239, dm_decostop_1st_stop_column, .159 ; top, bottom, left, right return - global TFT_clear_divemode_menu + global TFT_clear_divemode_menu TFT_clear_divemode_menu: - WIN_BOX_BLACK dm_menu_row, dm_menu_lower, dm_menu_left, dm_menu_right ; top, bottom, left, right + WIN_BOX_BLACK dm_menu_row, dm_menu_lower, dm_menu_left, dm_menu_right ; top, bottom, left, right return global TFT_display_ndl_mask TFT_display_ndl_mask: - bcf FLAG_TFT_display_ndl_mask - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - call TFT_clear_decoarea ; Clear Dekostop and Dekosum - call TFT_divemask_color - WIN_STD dm_ndl_text_column, dm_ndl_text_row - STRCPY_TEXT_PRINT tNDL ; NDL - bra TFT_standard_color ; and return... + bcf FLAG_TFT_display_ndl_mask + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + call TFT_clear_decoarea ; Clear Dekostop and Dekosum + call TFT_divemask_color + WIN_STD dm_ndl_text_column, dm_ndl_text_row + STRCPY_TEXT_PRINT tNDL ; NDL + bra TFT_standard_color ; and return... global TFT_display_tts TFT_display_tts: - bcf FLAG_TFT_display_tts - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return + bcf FLAG_TFT_display_tts + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return call TFT_standard_color - movff int_O_ascenttime+0,lo ; TTS - movff int_O_ascenttime+1,hi ; on 16bits + movff int_O_ascenttime+0,lo ; TTS + movff int_O_ascenttime+1,hi ; on 16bits btfss hi,int_invalid_flag ; is the invalid flag set? bra TFT_display_tts_1 ; NO bcf hi,int_invalid_flag ; YES - clear flag - call TFT_disabled_color ; switch to disabled color + call TFT_disabled_color ; switch to disabled color TFT_display_tts_1: - WIN_MEDIUM dm_tts_value_column, dm_tts_value_row + WIN_MEDIUM dm_tts_value_column, dm_tts_value_row output_16_3 ; Displays only 0...999 STRCAT_PRINT "'" return @@ -785,110 +797,110 @@ global TFT_display_ndl TFT_display_ndl: - bcf FLAG_TFT_display_ndl - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - WIN_MEDIUM dm_ndl_value_column, dm_ndl_value_row - call TFT_standard_color - movff char_O_nullzeit,lo ; Get NDL from C-code - output_8 - STRCAT_PRINT "'" - return - - - global TFT_big_deco_alt ; The big deco + bcf FLAG_TFT_display_ndl + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + WIN_MEDIUM dm_ndl_value_column, dm_ndl_value_row + call TFT_standard_color + movff char_O_nullzeit,lo ; Get NDL from C-code + output_8 + STRCAT_PRINT "'" + return + + + global TFT_big_deco_alt ; The big deco TFT_big_deco_alt: - bcf FLAG_TFT_big_deco_alt - - btfss decostop_active ; deco? - bra TFT_big_deco_ndl_alt ; NDL - - ; Deco - bcf FLAG_TFT_display_deko - call TFT_divemask_color - WIN_STD .70,.165 - STRCPY_TEXT_PRINT tTTS ; TTS - rcall TFT_standard_color - - ; TTS - WIN_LARGE .97,.170 - movff int_O_ascenttime+0,lo ; TTS - movff int_O_ascenttime+1,hi ; on 16bits - btfss hi,int_invalid_flag ; is the invalid flag set? - bra TFT_display_tts_alt_1 ; NO - bcf hi,int_invalid_flag ; YES - clear flag - call TFT_disabled_color ; switch to disabled color + bcf FLAG_TFT_big_deco_alt + + btfss decostop_active ; deco? + bra TFT_big_deco_ndl_alt ; NDL + + ; Deco + bcf FLAG_TFT_display_deko + call TFT_divemask_color + WIN_STD .70,.165 + STRCPY_TEXT_PRINT tTTS ; TTS + rcall TFT_standard_color + + ; TTS + WIN_LARGE .97,.170 + movff int_O_ascenttime+0,lo ; TTS + movff int_O_ascenttime+1,hi ; on 16bits + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_display_tts_alt_1 ; NO + bcf hi,int_invalid_flag ; YES - clear flag + call TFT_disabled_color ; switch to disabled color TFT_display_tts_alt_1: - output_16_3 ; Displays only 0...999 - STRCAT_PRINT "" - - ; 1st Stop - call TFT_divemask_color - WIN_STD .25,dm_customview_row - STRCPY_TEXT_PRINT tDiveSafetyStop ; "Stop" - - WIN_LARGE .60,.95 - TFT_color_code warn_stop ; Color-code Output - movff char_O_first_deco_depth,lo ; stop depth in m - rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - STRCAT_PRINT "" - - ; m or ft after the stop depth - WIN_MEDIUM .100,.118 - TSTOSS opt_units ; 0=m, 1=ft - bra TFT_display_tts_alt_1_metric - STRCAT_TEXT_PRINT tFeets1 - bra TFT_display_tts_alt_1_com + output_16_3 ; Displays only 0...999 + STRCAT_PRINT "" + + ; 1st Stop + call TFT_divemask_color + WIN_STD .25,dm_customview_row + STRCPY_TEXT_PRINT tDiveSafetyStop ; "Stop" + + WIN_LARGE .60,.95 + call TFT_color_code_stop ; Color-code Output + movff char_O_first_deco_depth,lo ; stop depth in m + rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) + STRCAT_PRINT "" + + ; m or ft after the stop depth + WIN_MEDIUM .100,.118 + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_display_tts_alt_1_metric + STRCAT_TEXT_PRINT tFeets1 + bra TFT_display_tts_alt_1_com TFT_display_tts_alt_1_metric: - STRCAT_TEXT_PRINT tMeters + STRCAT_TEXT_PRINT tMeters TFT_display_tts_alt_1_com: - WIN_LARGE .117,.95 - movff char_O_first_deco_time,lo ; length of first stop in min - bcf leftbind - output_99 - STRCAT_PRINT "" - goto TFT_standard_color ; and return... - + WIN_LARGE .117,.95 + movff char_O_first_deco_time,lo ; length of first stop in min + bcf leftbind + output_99 + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + TFT_big_deco_ndl_alt: - ; NDL - bcf FLAG_TFT_display_ndl - bcf decostop_active ; clear flag (again) - call TFT_divemask_color - WIN_STD .70,.165 - STRCPY_TEXT_PRINT tNDL ; NDL - call TFT_standard_color - WIN_LARGE .97,.170 - call TFT_standard_color - movff char_O_nullzeit,lo ; Get NDL from C-code - output_8 - STRCAT_PRINT "" - - btfsc FLAG_TFT_show_safety_stop - bra TFT_show_safety_stop_alt ; Show safety stop (And return) - ; Clear any safety stop or Decostop + ; NDL + bcf FLAG_TFT_display_ndl + bcf decostop_active ; clear flag (again) + call TFT_divemask_color + WIN_STD .70,.165 + STRCPY_TEXT_PRINT tNDL ; NDL + call TFT_standard_color + WIN_LARGE .97,.170 + call TFT_standard_color + movff char_O_nullzeit,lo ; Get NDL from C-code + output_8 + STRCAT_PRINT "" + + btfsc FLAG_TFT_show_safety_stop + bra TFT_show_safety_stop_alt ; Show safety stop (And return) + ; Clear any safety stop or Decostop TFT_no_more_safety_stop_alt: - WIN_BOX_BLACK dm_customview_row, .150, .0, .159 ; top, bottom, left, right - WIN_BOX_BLACK dm_customview_row, .164, .60, .159 ; top, bottom, left, right - return + WIN_BOX_BLACK dm_customview_row, .150, .0, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_customview_row, .164, .60, .159 ; top, bottom, left, right + return TFT_show_safety_stop_alt: - bcf FLAG_TFT_show_safety_stop - tstfsz safety_stop_countdown ; Countdown at zero? - bra TFT_show_safety_stop_alt2 ; No, show stop - bcf show_safety_stop ; Clear flag - btfss safety_stop_active ; Displayed? - return ; No - bcf safety_stop_active ; Clear flag - bra TFT_no_more_safety_stop_alt ; Yes, Clear stop ; and return... + bcf FLAG_TFT_show_safety_stop + tstfsz safety_stop_countdown ; Countdown at zero? + bra TFT_show_safety_stop_alt2 ; No, show stop + bcf show_safety_stop ; Clear flag + btfss safety_stop_active ; Displayed? + return ; No + bcf safety_stop_active ; Clear flag + bra TFT_no_more_safety_stop_alt ; Yes, Clear stop ; and return... TFT_show_safety_stop_alt2: - bsf safety_stop_active ; Set flag - decf safety_stop_countdown,F ; Reduce countdown - - call TFT_divemask_color - WIN_STD .50,dm_customview_row + bsf safety_stop_active ; Set flag + decf safety_stop_countdown,F ; Reduce countdown + + call TFT_divemask_color + WIN_STD .50,dm_customview_row STRCPY_TEXT_PRINT tDiveSafetyStop - call TFT_attention_color ; show in yellow + call TFT_attention_color ; show in yellow WIN_LARGE .90,.95 movff safety_stop_countdown,lo clrf hi @@ -896,51 +908,50 @@ movf hi,W movff lo,hi movwf lo ; exchange lo and hi - bsf leftbind + bsf leftbind output_8 STRCAT_PRINT "" - WIN_MEDIUM .112,.120 + WIN_MEDIUM .112,.120 STRCAT_PRINT ":" - WIN_LARGE .117,.95 - bcf leftbind + WIN_LARGE .117,.95 + bcf leftbind movff hi,lo output_99x STRCAT_PRINT "" - WIN_FONT FT_SMALL + WIN_FONT FT_SMALL goto TFT_standard_color ; and return... global TFT_divemode_warning TFT_divemode_warning: bcf FLAG_TFT_divemode_warning - bsf dive_warning_displayed ; =1: The warning sign is shown + bsf dive_warning_displayed ; =1: The warning sign is shown WIN_TOP dm_warning_icon_row WIN_LEFT dm_warning_icon_column - TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon + TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon return global TFT_divemode_warning_clear TFT_divemode_warning_clear: bcf FLAG_TFT_divemode_warning_clear - btfss dive_warning_displayed ; =1: The warning sign is shown + btfss dive_warning_displayed ; =1: The warning sign is shown return - bcf dive_warning_displayed ; clear only once - WIN_BOX_BLACK dm_warning_icon_row, dm_warning_icon_bot, dm_warning_icon_column, dm_warning_icon_rgt ; top, bottom, left, right + bcf dive_warning_displayed ; clear only once + WIN_BOX_BLACK dm_warning_icon_row, dm_warning_icon_bot, dm_warning_icon_column, dm_warning_icon_rgt ; top, bottom, left, right return - global TFT_display_deko_mask TFT_display_deko_mask: - bcf FLAG_TFT_display_deko_mask - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - rcall TFT_clear_decoarea ; Clear Dekostop and Dekosum (and NDL in this case) - WIN_STD dm_tts_text_column, dm_tts_text_row - call TFT_divemask_color - STRCPY_TEXT_PRINT tTTS ; TTS - call TFT_standard_color - bcf show_safety_stop ; Clear safety stop flag - return + bcf FLAG_TFT_display_deko_mask + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + rcall TFT_clear_decoarea ; Clear Dekostop and Dekosum (and NDL in this case) + WIN_STD dm_tts_text_column, dm_tts_text_row + call TFT_divemask_color + STRCPY_TEXT_PRINT tTTS ; TTS + call TFT_standard_color + bcf show_safety_stop ; Clear safety stop flag + return TFT_display_deko_output_depth: ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) @@ -954,37 +965,37 @@ ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... movff lo,xA+0 movff hi,xA+1 - movlw LOW d'334' ; 334feet/100m + movlw LOW d'334' ; 334feet/100m movwf xB+0 - movlw HIGH d'334' + movlw HIGH d'334' movwf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 328) - movlw d'50' ; round up + call mult16x16 ; xA*xB=xC (lo:hi * 328) + movlw d'50' ; round up addwf xC+0,F movlw 0 addwfc xC+1,F addwfc xC+2,F addwfc xC+3,F - movlw d'100' + movlw d'100' movwf xB+0 clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value + movff xC+1,hi ; restore lo and hi with updated value bcf leftbind btfsc alternative_divelayout - bsf leftbind ; left for alternative layout mode + bsf leftbind ; left for alternative layout mode bsf ignore_digit4 ; Only full feet output_16 btfsc alternative_divelayout - return ; Not for alternative layout mode + return ; Not for alternative layout mode STRCAT_TEXT tFeets1 return TFT_display_deko_output_metric: output_99 btfsc alternative_divelayout - return ; Not for alternative layout mode + return ; Not for alternative layout mode STRCAT_TEXT tMeters PUTC ' ' return @@ -992,24 +1003,24 @@ global TFT_display_deko TFT_display_deko: - bcf FLAG_TFT_display_deko - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return + bcf FLAG_TFT_display_deko + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return WIN_MEDIUM dm_decostop_1st_stop_column, dm_decostop_1st_stop_row - TFT_color_code warn_stop ; Color-code Output - movff char_O_first_deco_depth,lo ; stop depth in m + call TFT_color_code_stop ; Color-code Output + movff char_O_first_deco_depth,lo ; stop depth in m rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_first_deco_time,lo ; length of first stop in min + movff char_O_first_deco_time,lo ; length of first stop in min output_99 STRCAT_PRINT "'" goto TFT_standard_color ; and return... - global TFT_decoplan + global TFT_decoplan TFT_decoplan: - call TFT_divemask_color - WIN_TINY dm_custom_decoplan_title_column, dm_custom_decoplan_title_row - STRCPY_TEXT_PRINT tDiveDecoplan + call TFT_divemask_color + WIN_TINY dm_custom_decoplan_title_column, dm_custom_decoplan_title_row + STRCPY_TEXT_PRINT tDiveDecoplan call TFT_standard_color movff char_O_deco_depth+1,lo tstfsz lo ; Show another stop? @@ -1018,51 +1029,51 @@ call TFT_standard_color WIN_SMALL dm_cust_dstop_4th_stop_column,dm_cust_dstop_4th_stop_row STRCPY_PRINT " --- " - WIN_BOX_BLACK dm_cust_dstop_2nd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right - WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right - WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_2nd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... - + TFT_display_deko2: movff char_O_deco_gas+0,lo ; get flag for invalid deco data btfsc lo,char_invalid_flag ; is the invalid flag set? call TFT_disabled_color ; YES - set to disabled color WIN_SMALL dm_cust_dstop_2nd_stop_column, dm_cust_dstop_2nd_stop_row - movff char_O_deco_depth+1,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+1,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+1,lo ; length of stop in min + movff char_O_deco_time+1,lo ; length of stop in min output_99 STRCAT_PRINT "'" movff char_O_deco_depth+2,lo tstfsz lo ; Show another stop? bra TFT_display_deko3 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_3rd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right - WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_3rd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... TFT_display_deko3: WIN_SMALL dm_cust_dstop_3rd_stop_column, dm_cust_dstop_3rd_stop_row - movff char_O_deco_depth+2,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+2,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+2,lo ; length of stop in min + movff char_O_deco_time+2,lo ; length of stop in min output_99 STRCAT_PRINT "'" movff char_O_deco_depth+3,lo tstfsz lo ; Show another stop? bra TFT_display_deko4 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... TFT_display_deko4: WIN_SMALL dm_cust_dstop_4th_stop_column, dm_cust_dstop_4th_stop_row - movff char_O_deco_depth+3,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+3,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+3,lo ; length of stop in min + movff char_O_deco_time+3,lo ; length of stop in min output_99 STRCAT_PRINT "'" @@ -1070,598 +1081,596 @@ tstfsz lo ; Show another stop? bra TFT_display_deko5 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right - WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... TFT_display_deko5: WIN_SMALL dm_cust_dstop_5th_stop_column, dm_cust_dstop_5th_stop_row - movff char_O_deco_depth+4,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+4,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+4,lo ; length of stop in min + movff char_O_deco_time+4,lo ; length of stop in min output_99 STRCAT_PRINT "'" movff char_O_deco_depth+5,lo tstfsz lo ; Show another stop? bra TFT_display_deko6 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... - + TFT_display_deko6: WIN_SMALL dm_cust_dstop_6th_stop_column, dm_cust_dstop_6th_stop_row - movff char_O_deco_depth+5,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+5,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+5,lo ; length of stop in min + movff char_O_deco_time+5,lo ; length of stop in min output_99 STRCAT_PRINT "'" movff char_O_deco_depth+6,lo tstfsz lo ; Show another stop? bra TFT_display_deko7 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_7th_stop_row, dm_customview_bot, dm_cust_dstop_7th_stop_column, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_7th_stop_row, dm_customview_bot, dm_cust_dstop_7th_stop_column, .159 ; top, bottom, left, right goto TFT_standard_color ; and return... - + TFT_display_deko7: WIN_SMALL dm_cust_dstop_7th_stop_column, dm_cust_dstop_7th_stop_row - movff char_O_deco_depth+6,lo ; stop in m - bcf lo,7 ; Clear GAS_SWITCH bit + movff char_O_deco_depth+6,lo ; stop in m + bcf lo,7 ; Clear GAS_SWITCH bit rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) - movff char_O_deco_time+6,lo ; length of stop in min + movff char_O_deco_time+6,lo ; length of stop in min output_99 STRCAT_PRINT "'" goto TFT_standard_color ; and return... - global TFT_clear_safety_stop + global TFT_clear_safety_stop TFT_clear_safety_stop: - bcf FLAG_TFT_clear_safety_stop ; clear flag - WIN_BOX_BLACK dm_safetystop_row, dm_safetystop_bot, dm_safetystop_text_column, .159 ; top, bottom, left, right - return - - global TFT_show_safety_stop + bcf FLAG_TFT_clear_safety_stop ; clear flag + WIN_BOX_BLACK dm_safetystop_row, dm_safetystop_bot, dm_safetystop_text_column, .159 ; top, bottom, left, right + return + + global TFT_show_safety_stop TFT_show_safety_stop: - bcf FLAG_TFT_show_safety_stop + bcf FLAG_TFT_show_safety_stop tstfsz safety_stop_countdown ; Countdown at zero? bra TFT_show_safety_stop2 ; No, show stop bcf show_safety_stop ; Clear flag btfss safety_stop_active ; Displayed? - return ; No + return ; No bcf safety_stop_active ; Clear flag - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - bra TFT_clear_safety_stop ; Yes, Clear stop ; and return... + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + bra TFT_clear_safety_stop ; Yes, Clear stop ; and return... TFT_show_safety_stop2: - bsf safety_stop_active ; Set flag - decf safety_stop_countdown,F ; Reduce countdown - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - ;btfsc menuview - ;bra TFT_show_safety_stop3 ; No room when menuview=1... - call TFT_divemask_color - WIN_STD dm_safetystop_text_column, dm_safetystop_text_row - STRCPY_TEXT_PRINT tDiveSafetyStop + bsf safety_stop_active ; Set flag + decf safety_stop_countdown,F ; Reduce countdown + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + ;btfsc menuview + ;bra TFT_show_safety_stop3 ; No room when menuview=1... + call TFT_divemask_color + WIN_STD dm_safetystop_text_column, dm_safetystop_text_row + STRCPY_TEXT_PRINT tDiveSafetyStop TFT_show_safety_stop3: - call TFT_attention_color ; show in yellow - WIN_MEDIUM dm_safetystop_column, dm_safetystop_row + call TFT_attention_color ; show in yellow + WIN_MEDIUM dm_safetystop_column, dm_safetystop_row movff safety_stop_countdown,lo clrf hi call convert_time ; converts hi:lo in seconds to mins (hi) and seconds (lo) movf hi,W movff lo,hi movwf lo ; exchange lo and hi - bsf leftbind + bsf leftbind output_8 - bcf leftbind - PUTC ':' + bcf leftbind + PUTC ':' movff hi,lo output_99x STRCAT_PRINT "" - WIN_FONT FT_SMALL + WIN_FONT FT_SMALL goto TFT_standard_color ; and return... - global TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + global TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch TFT_mask_avr_stopwatch: - ; The mask - call TFT_divemask_color - WIN_TINY dm_custom_avr_stop_title_column1,dm_custom_avr_stop_title_row - STRCPY_TEXT_PRINT tDiveTotalAvg - WIN_TINY dm_custom_avr_stop_title_column2,dm_custom_avr_stop_title_row - STRCPY_TEXT_PRINT tDiveStopwatch - WIN_TINY dm_custom_avr_stop_title_column3,dm_custom_avr_stop_title_row - STRCPY_TEXT_PRINT tDiveStopAvg - goto TFT_standard_color ; and return... - - global TFT_update_avr_stopwatch ; Update average depth and stopwatch + ; The mask + call TFT_divemask_color + WIN_TINY dm_custom_avr_stop_title_column1,dm_custom_avr_stop_title_row + STRCPY_TEXT_PRINT tDiveTotalAvg + WIN_TINY dm_custom_avr_stop_title_column2,dm_custom_avr_stop_title_row + STRCPY_TEXT_PRINT tDiveStopwatch + WIN_TINY dm_custom_avr_stop_title_column3,dm_custom_avr_stop_title_row + STRCPY_TEXT_PRINT tDiveStopAvg + goto TFT_standard_color ; and return... + + global TFT_update_avr_stopwatch ; Update average depth and stopwatch TFT_update_avr_stopwatch: - call TFT_standard_color - SAFE_2BYTE_COPY average_divesecs,lo + call TFT_standard_color + SAFE_2BYTE_COPY average_divesecs,lo call convert_time ; lo=secs, hi=mins - WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row - bsf leftbind + WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row + bsf leftbind movf hi,W movff lo,hi movwf lo ; exchange lo and hi output_8 - PUTC ':' + PUTC ':' movff hi,lo output_99x - movlw .5 - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - clrf WREG - movff WREG,buffer+.5 ; limit to 5 chars + movlw .5 + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + clrf WREG + movff WREG,buffer+.5 ; limit to 5 chars STRCAT_PRINT "" - - TSTOSS opt_units ; 0=m, 1=ft + TSTOSS opt_units ; 0=m, 1=ft bra TFT_update_avr_stopwatch_metric -;TFT_update_avr_stopwatch_imperial - movff avg_rel_pressure_total+0,lo - movff avg_rel_pressure_total+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row - bsf leftbind - output_16 ; yxz - STRCAT_PRINT " " - ; Stopped average depth - movff avg_rel_pressure+0,lo - movff avg_rel_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row - output_16 ; yxz - bcf leftbind - PUTC " " - clrf WREG - movff WREG,buffer+.3 ; limit string length to 3 - STRCAT_PRINT "" - return + ;TFT_update_avr_stopwatch_imperial + movff avg_rel_pressure_total+0,lo + movff avg_rel_pressure_total+1,hi + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row + bsf leftbind + output_16 ; yxz + STRCAT_PRINT " " + ; Stopped average depth + movff avg_rel_pressure+0,lo + movff avg_rel_pressure+1,hi + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row + output_16 ; yxz + bcf leftbind + PUTC " " + clrf WREG + movff WREG,buffer+.3 ; limit string length to 3 + STRCAT_PRINT "" + return TFT_update_avr_stopwatch_metric: - ; Non-resettable average depth - movff avg_rel_pressure_total+0,lo - movff avg_rel_pressure_total+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a - STRCAT_PRINT " " - ; Stopped average depth - movff avg_rel_pressure+0,lo - movff avg_rel_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a - bcf leftbind - bcf ignore_digit5 - clrf WREG - movff WREG,buffer+.4 ; limit string length to 4 - STRCAT_PRINT "" - return - - - global TFT_ceiling_mask ; The ceiling mask + ; Non-resettable average depth + movff avg_rel_pressure_total+0,lo + movff avg_rel_pressure_total+1,hi + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a + STRCAT_PRINT " " + ; Stopped average depth + movff avg_rel_pressure+0,lo + movff avg_rel_pressure+1,hi + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a + bcf leftbind + bcf ignore_digit5 + clrf WREG + movff WREG,buffer+.4 ; limit string length to 4 + STRCAT_PRINT "" + return + + + global TFT_ceiling_mask ; The ceiling mask TFT_ceiling_mask: - call TFT_divemask_color - WIN_TINY dm_custom_ceiling_text_column,dm_custom_ceiling_text_row - STRCPY_TEXT_PRINT tCeiling - goto TFT_standard_color ; and return... - - global TFT_ceiling ; Ceiling + call TFT_divemask_color + WIN_TINY dm_custom_ceiling_text_column,dm_custom_ceiling_text_row + STRCPY_TEXT_PRINT tCeiling + goto TFT_standard_color ; and return... + + global TFT_ceiling ; Ceiling TFT_ceiling: - WIN_MEDIUM dm_custom_ceiling_value_column,dm_custom_ceiling_value_row - movff int_O_ceiling+0,lo - movff int_O_ceiling+1,hi - TFT_color_code warn_ceiling ; color-code the output - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - bsf leftbind - TSTOSS opt_units ; 0=m, 1=ft + WIN_MEDIUM dm_custom_ceiling_value_column,dm_custom_ceiling_value_row + movff int_O_ceiling+0,lo + movff int_O_ceiling+1,hi + call TFT_color_code_ceiling ; color-code the output + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + bsf leftbind + TSTOSS opt_units ; 0=m, 1=ft bra TFT_ceiling_metric ;TFT_ceiling_imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16 ; yxz - bcf leftbind - STRCAT_PRINT " " + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16 ; yxz + bcf leftbind + STRCAT_PRINT " " goto TFT_standard_color TFT_ceiling_metric: - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a - bcf leftbind - bcf ignore_digit5 - STRCAT_PRINT " " + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a + bcf leftbind + bcf ignore_digit5 + STRCAT_PRINT " " goto TFT_standard_color global TFT_CNS_mask TFT_CNS_mask: - call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tCNSsurf - WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row + call TFT_divemask_color + WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tCNSsurf + WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row btfsc FLAG_ccr_mode ; in CCR mode? bra TFT_CNS_mask_1 ; YES - proceed with checking for bailout btfsc FLAG_pscr_mode ; NO - in pSCR mode? - bra TFT_CNS_mask_1 ; YES - proceed with checking for bailout - bra TFT_CNS_mask_2 ; NO - must be OC then + bra TFT_CNS_mask_1 ; YES - proceed with checking for bailout + bra TFT_CNS_mask_2 ; NO - must be OC then TFT_CNS_mask_1: ; in CCR or pSCR mode btfsc is_bailout ; in bailout? bra TFT_CNS_mask_2 ; YES - print fTTS label (label will be printed, but a fTTS will actually not be calculated) TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? - bra TFT_CNS_mask_2 ; NO - print fTTS label - STRCPY_TEXT_PRINT tCNSBO ; YES - print bailout label + bra TFT_CNS_mask_2 ; NO - print fTTS label + STRCPY_TEXT_PRINT tCNSBO ; YES - print bailout label bra TFT_CNS_mask_3 TFT_CNS_mask_2: ; OC or bailout STRCPY_TEXT_PRINT tCNSfTTS ; print fTTS label TFT_CNS_mask_3: - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tCNSnow - goto TFT_standard_color ; and return... - + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tCNSnow + goto TFT_standard_color ; and return... + global TFT_CNS TFT_CNS: ; CNS at end of normal dive WIN_STD dm_custom_hud_sensor1_column+.5,dm_custom_hud_data_row - movff int_O_normal_CNS_fraction+0,lo - movff int_O_normal_CNS_fraction+1,hi - TFT_color_code warn_cns - bsf leftbind - output_16_3 ; output as xxx + movff int_O_normal_CNS_fraction+0,lo + movff int_O_normal_CNS_fraction+1,hi + call TFT_color_code_cns + bsf leftbind + output_16_3 ; output as xxx bcf leftbind - STRCAT_PRINT "% " + STRCAT_PRINT "% " ; fTTS / Bailout CNS, if enabled - WIN_STD dm_custom_hud_sensor2_column+.2,dm_custom_hud_data_row + WIN_STD dm_custom_hud_sensor2_column+.2,dm_custom_hud_data_row btfsc is_bailout ; in bailout? bra TFT_CNS_3 ; YES - show "---" TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? - bra TFT_CNS_1 ; NO - continue checking fTTS extra time - btfsc FLAG_ccr_mode ; YES - in CCR mode? - bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% - btfsc FLAG_pscr_mode ; in pSCR mode? - bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% + bra TFT_CNS_1 ; NO - continue checking fTTS extra time + btfsc FLAG_ccr_mode ; YES - in CCR mode? + bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% + btfsc FLAG_pscr_mode ; in pSCR mode? + bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% TFT_CNS_1: ; not in bailout, no volume calculation TSTOSS char_I_extra_time ; fTTS extra time fTTS configured? bra TFT_CNS_3 ; NO - show "---" TFT_CNS_2: - movff int_O_alternate_CNS_fraction+0,lo ; YES - show CNS% - movff int_O_alternate_CNS_fraction+1,hi - TFT_color_code warn_cns - bsf leftbind - output_16_3 ; output as xxx + movff int_O_alternate_CNS_fraction+0,lo ; YES - show CNS% + movff int_O_alternate_CNS_fraction+1,hi + call TFT_color_code_cns + bsf leftbind + output_16_3 ; output as xxx bcf leftbind - STRCAT_PRINT "% " + STRCAT_PRINT "% " bra TFT_CNS_4 TFT_CNS_3: call TFT_standard_color - STRCPY_PRINT "--- " + STRCPY_PRINT "--- " TFT_CNS_4: ; current CNS WIN_STD dm_custom_hud_sensor3_column,dm_custom_hud_data_row - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns - bsf leftbind - output_16_3 ; output as xxx + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + call TFT_color_code_cns + bsf leftbind + output_16_3 ; output as xxx bcf leftbind - STRCAT_PRINT "%" - bcf leftbind + STRCAT_PRINT "%" goto TFT_standard_color ; and return... - - - global TFT_hud_mask ; The HUD mask + + + global TFT_hud_mask ; The HUD mask TFT_hud_mask: - call TFT_divemask_color - WIN_TINY dm_custom_hud_column1,dm_custom_hud_row - STRCPY_TEXT_PRINT tDiveHudMask1 - WIN_TINY dm_custom_hud_column2,dm_custom_hud_row - STRCPY_TEXT_PRINT tDiveHudMask2 - WIN_TINY dm_custom_hud_column3,dm_custom_hud_row - STRCPY_TEXT_PRINT tDiveHudMask3 - goto TFT_standard_color ; and return... - - - global TFT_update_ppo2_sensors ; Update Sensor data + call TFT_divemask_color + WIN_TINY dm_custom_hud_column1,dm_custom_hud_row + STRCPY_TEXT_PRINT tDiveHudMask1 + WIN_TINY dm_custom_hud_column2,dm_custom_hud_row + STRCPY_TEXT_PRINT tDiveHudMask2 + WIN_TINY dm_custom_hud_column3,dm_custom_hud_row + STRCPY_TEXT_PRINT tDiveHudMask3 + goto TFT_standard_color ; and return... + + + global TFT_update_ppo2_sensors ; Update Sensor data TFT_update_ppo2_sensors: ; ; Definition of the output: ; -; sensorX use voting o2 -; _calibrated _O2 _logic _ppo2 Output Color -; _ok _sensorX _sensorX _sensorX +; sensorX use voting o2 +; _calibrated _O2 _logic _ppo2 Output Color +; _ok _sensorX _sensorX _sensorX ;----------------------------------------------------------------------------------------------- -; 0 -/- -/- -/- "----" TFT_standard_color -; 1 0 -/- = 0 o2_ppo2_sensorX TFT_attention_color -; 1 0 -/- > 0 o2_ppo2_sensorX TFT_disabled_color -; 1 1 0 -/- o2_ppo2_sensorX TFT_color_code warn_ppo2_hud + win_invert -; 1 1 1 -/- o2_ppo2_sensorX TFT_color_code warn_ppo2_hud +; 0 -/- -/- -/- "----" TFT_standard_color +; 1 0 -/- = 0 o2_ppo2_sensorX TFT_attention_color +; 1 0 -/- > 0 o2_ppo2_sensorX TFT_disabled_color +; 1 1 0 -/- o2_ppo2_sensorX TFT_color_code_ppo2_hud + win_invert +; 1 1 1 -/- o2_ppo2_sensorX TFT_color_code_ppo2_hud ; - bsf leftbind + bsf leftbind ; sensor 1 - btfsc sensor1_calibrated_ok ; valid calibration? - bra TFT_update_hud1b ; yes + btfsc sensor1_calibrated_ok ; valid calibration? + bra TFT_update_hud1b ; yes ; no valid calibration WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_data_row+.5 call TFT_standard_color - STRCPY_PRINT "---" - bra TFT_update_hud2a ; continue with sensor 2 + STRCPY_PRINT "---" + bra TFT_update_hud2a ; continue with sensor 2 TFT_update_hud1b: ; sensor has a valid calibration WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_data_row - movff o2_ppo2_sensor1,lo ; load ppO2 value into transfer storage for output - clrf hi ; + movff o2_ppo2_sensor1,lo ; load ppO2 value into transfer storage for output + clrf hi ; btfsc use_O2_sensor1 ; in use? bra TFT_update_hud1d ; yes ; valid calibration, but not in use tstfsz o2_ppo2_sensor1 ; sensor value = 0? bra TFT_update_hud1c ; no ; valid calibration, not in use and value = 0 - call TFT_attention_color ; output in yellow + call TFT_attention_color ; output in yellow bra TFT_update_hud1e TFT_update_hud1c: ; sensor has valid calibration, is not in use and has a value > 0 - call TFT_disabled_color ; output in light blue + call TFT_disabled_color ; output in light blue bra TFT_update_hud1e TFT_update_hud1d: ; sensor has valid calibration and is in use - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo btfsc voting_logic_sensor1 ; sensor value agrees with other sensor's values? bra TFT_update_hud1e ; yes ; valid calibration, in use, but value does not agree with other sensors - bsf win_invert ; invert output -TFT_update_hud1e: + bsf win_invert ; invert output +TFT_update_hud1e: ; all coloring is set up now, let's write the value to the display! bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" - bcf win_invert + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + bcf win_invert TFT_update_hud2a: ; sensor 2 - btfsc sensor2_calibrated_ok ; valid calibration? - bra TFT_update_hud2b ; yes + btfsc sensor2_calibrated_ok ; valid calibration? + bra TFT_update_hud2b ; yes ; no valid calibration WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_data_row+.5 call TFT_standard_color - STRCPY_PRINT "---" - bra TFT_update_hud3a ; continue with sensor 3 + STRCPY_PRINT "---" + bra TFT_update_hud3a ; continue with sensor 3 TFT_update_hud2b: ; sensor has a valid calibration WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_data_row - movff o2_ppo2_sensor2,lo ; load ppO2 value into transfer storage for output - clrf hi ; + movff o2_ppo2_sensor2,lo ; load ppO2 value into transfer storage for output + clrf hi ; btfsc use_O2_sensor2 ; in use? bra TFT_update_hud2d ; yes ; valid calibration, but not in use tstfsz o2_ppo2_sensor2 ; sensor value = 0? bra TFT_update_hud2c ; no ; valid calibration, not in use and value = 0 - call TFT_attention_color ; output in yellow + call TFT_attention_color ; output in yellow bra TFT_update_hud2e TFT_update_hud2c: ; sensor has valid calibration, is not in use and has a value > 0 - call TFT_disabled_color ; output in light blue + call TFT_disabled_color ; output in light blue bra TFT_update_hud2e TFT_update_hud2d: ; sensor has valid calibration and is in use - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo btfsc voting_logic_sensor2 ; sensor value agrees with other sensor's vlaues? bra TFT_update_hud2e ; yes ; valid calibration, in use, but value does not agree with other sensors - bsf win_invert ; invert output -TFT_update_hud2e: + bsf win_invert ; invert output +TFT_update_hud2e: ; all coloring is set up now, let's write the value to the display! bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" - bcf win_invert + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + bcf win_invert TFT_update_hud3a: ; sensor 3 - btfsc sensor3_calibrated_ok ; valid calibration? - bra TFT_update_hud3b ; yes + btfsc sensor3_calibrated_ok ; valid calibration? + bra TFT_update_hud3b ; yes ; no valid calibration - WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5 + WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5 call TFT_standard_color - STRCPY_PRINT "---" - bra TFT_update_hud4 ; done + STRCPY_PRINT "---" + bra TFT_update_hud4 ; done TFT_update_hud3b: ; sensor has a valid calibration WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_data_row - movff o2_ppo2_sensor3,lo ; load ppO2 value into transfer storage for output - clrf hi ; + movff o2_ppo2_sensor3,lo ; load ppO2 value into transfer storage for output + clrf hi ; btfsc use_O2_sensor3 ; in use? bra TFT_update_hud3d ; yes ; valid calibration, but not in use tstfsz o2_ppo2_sensor3 ; sensor value = 0? bra TFT_update_hud3c ; no ; valid calibration, not in use and value = 0 - call TFT_attention_color ; output in yellow + call TFT_attention_color ; output in yellow bra TFT_update_hud3e TFT_update_hud3c: ; sensor has valid calibration, is not in use and has a value > 0 - call TFT_disabled_color ; output in light blue + call TFT_disabled_color ; output in light blue bra TFT_update_hud3e TFT_update_hud3d: ; sensor has valid calibration and is in use - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo btfsc voting_logic_sensor3 ; sensor value agrees with other sensor's vlaues? bra TFT_update_hud3e ; yes ; valid calibration, in use, but value does not agree with other sensors - bsf win_invert ; invert output -TFT_update_hud3e: + bsf win_invert ; invert output +TFT_update_hud3e: ; all coloring is set up now, let's write the value to the display! bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" - bcf win_invert - + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + bcf win_invert + TFT_update_hud4: ; closure - bcf leftbind - goto TFT_standard_color ; and return... - - - global TFT_surface_sensor ; Update Sensor data in surface mode + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_surface_sensor ; Update Sensor data in surface mode TFT_surface_sensor: - movf hardware_flag,W - sublw 0x11 ; 2 with BLE - btfsc STATUS,Z - return ; Ignore for 0x11 - ; show three sensors - bsf leftbind - WIN_SMALL surf_hud_sensor1_column,surf_hud_sensor1_row + movf hardware_flag,W + sublw 0x11 ; 2 with BLE + btfsc STATUS,Z + return ; Ignore for 0x11 + ; show three sensors + bsf leftbind + WIN_SMALL surf_hud_sensor1_column,surf_hud_sensor1_row btfsc sensor1_calibrated_ok - bra TFT_surface_sensor1 ; Yes - call TFT_standard_color - STRCPY_PRINT "--- " - bra TFT_surface_sensor2 ; Skip Sensor 1 + bra TFT_surface_sensor1 ; Yes + call TFT_standard_color + STRCPY_PRINT "--- " + bra TFT_surface_sensor2 ; Skip Sensor 1 TFT_surface_sensor1: - movff o2_ppo2_sensor1,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - clrf hi + movff o2_ppo2_sensor1,lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo + clrf hi bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" TFT_surface_sensor2: - WIN_SMALL surf_hud_sensor2_column,surf_hud_sensor2_row + WIN_SMALL surf_hud_sensor2_column,surf_hud_sensor2_row btfsc sensor2_calibrated_ok - bra TFT_surface_sensor3 ; Yes - call TFT_standard_color - STRCPY_PRINT "--- " - bra TFT_surface_sensor4 ; Skip Sensor 2 + bra TFT_surface_sensor3 ; Yes + call TFT_standard_color + STRCPY_PRINT "--- " + bra TFT_surface_sensor4 ; Skip Sensor 2 TFT_surface_sensor3: - movff o2_ppo2_sensor2,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - clrf hi + movff o2_ppo2_sensor2,lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo + clrf hi bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" TFT_surface_sensor4: - WIN_SMALL surf_hud_sensor3_column,surf_hud_sensor3_row + WIN_SMALL surf_hud_sensor3_column,surf_hud_sensor3_row btfsc sensor3_calibrated_ok - bra TFT_surface_sensor5 ; Yes - call TFT_standard_color - STRCPY_PRINT "--- " - bra TFT_surface_sensor6 ; Skip Sensor 3 + bra TFT_surface_sensor5 ; Yes + call TFT_standard_color + STRCPY_PRINT "--- " + bra TFT_surface_sensor6 ; Skip Sensor 3 TFT_surface_sensor5: - movff o2_ppo2_sensor3,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - clrf hi + movff o2_ppo2_sensor3,lo + call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo + clrf hi bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" TFT_surface_sensor6: - bcf leftbind - goto TFT_standard_color; and return... - - - global TFT_sensor_mV + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_sensor_mV TFT_sensor_mV: - call TFT_standard_color - bsf leftbind - WIN_SMALL surf_mV_sensor_column,surf_mV_sensor1_row - movff o2_mv_sensor1+0,lo ; in 0.1mV steps - movff o2_mv_sensor1+1,hi ; in 0.1mV steps - STRCAT "1: " - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - - WIN_SMALL surf_mV_sensor_column,surf_mV_sensor2_row - movff o2_mv_sensor2+0,lo ; in 0.1mV steps - movff o2_mv_sensor2+1,hi ; in 0.1mV steps - STRCAT "2: " - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - - WIN_SMALL surf_mV_sensor_column,surf_mV_sensor3_row - movff o2_mv_sensor3+0,lo ; in 0.1mV steps - movff o2_mv_sensor3+1,hi ; in 0.1mV steps - STRCAT "3: " - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - bcf leftbind - goto TFT_standard_color ; and return... - - - global TFT_sensor_surface_warning + call TFT_standard_color + bsf leftbind + WIN_SMALL surf_mV_sensor_column,surf_mV_sensor1_row + movff o2_mv_sensor1+0,lo ; in 0.1mV steps + movff o2_mv_sensor1+1,hi ; in 0.1mV steps + STRCAT "1: " + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + + WIN_SMALL surf_mV_sensor_column,surf_mV_sensor2_row + movff o2_mv_sensor2+0,lo ; in 0.1mV steps + movff o2_mv_sensor2+1,hi ; in 0.1mV steps + STRCAT "2: " + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + + WIN_SMALL surf_mV_sensor_column,surf_mV_sensor3_row + movff o2_mv_sensor3+0,lo ; in 0.1mV steps + movff o2_mv_sensor3+1,hi ; in 0.1mV steps + STRCAT "3: " + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_sensor_surface_warning TFT_sensor_surface_warning: - call TFT_warnings_color + call TFT_warnings_color btfss sensor1_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all bra TFT_sensor_mV2 - movff opt_x_s1+1,lo ; into bank1 - movf lo,W ; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV2 ; the sensor is not too bad yet for a warning - WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor1_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime + movff opt_x_s1+1,lo ; into bank1 + movf lo,W ; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV2 ; the sensor is not too bad yet for a warning + WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor1_row-.5 + STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime TFT_sensor_mV2: btfss sensor2_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all bra TFT_sensor_mV3 - movff opt_x_s2+1,lo ; into bank1 - movf lo,W ; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV3 ; the sensor is not too bad yet for a warning - WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor2_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime + movff opt_x_s2+1,lo ; into bank1 + movf lo,W ; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV3 ; the sensor is not too bad yet for a warning + WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor2_row-.5 + STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime TFT_sensor_mV3: btfss sensor3_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all bra TFT_sensor_mV4 - movff opt_x_s3+1,lo ; into bank1 - movf lo,W ; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV4 ; the sensor is not too bad yet for a warning - WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor3_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as beeing at end of lifetime + movff opt_x_s3+1,lo ; into bank1 + movf lo,W ; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV4 ; the sensor is not too bad yet for a warning + WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor3_row-.5 + STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime TFT_sensor_mV4: - goto TFT_standard_color ; ...and return - - - global TFT_menu_calibrate -TFT_menu_calibrate: ; update mV data in calibration menu - btfss s8_digital ; =1: Digital I/O - bra TFT_menu_calibrate_analog ; use analog - btfss new_s8_data_available ; New data frame recieved? - bra TFT_menu_calibrate_common ; No, use old values... - ; Yes. Update the values + goto TFT_standard_color ; ...and return + + + global TFT_menu_calibrate +TFT_menu_calibrate: ; update mV data in calibration menu + btfss s8_digital ; =1: Digital I/O + bra TFT_menu_calibrate_analog ; use analog + btfss new_s8_data_available ; new data frame received? + bra TFT_menu_calibrate_common ; NO - use old values... + ; YES - update the values call compute_mvolts_for_all_sensors - bra TFT_menu_calibrate_common + bra TFT_menu_calibrate_common TFT_menu_calibrate_analog: - call get_analog_inputs + call get_analog_inputs TFT_menu_calibrate_common: - call TFT_attention_color ; show in yellow - bsf leftbind - WIN_SMALL surf_menu_sensor1_column,surf_menu2_sensor1_row - movff o2_mv_sensor1+0,lo ; in 0.1mV steps - movff o2_mv_sensor1+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - WIN_SMALL surf_menu_sensor2_column,surf_menu2_sensor2_row - movff o2_mv_sensor2+0,lo ; in 0.1mV steps - movff o2_mv_sensor2+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - WIN_SMALL surf_menu_sensor3_column,surf_menu2_sensor3_row - movff o2_mv_sensor3+0,lo ; in 0.1mV steps - movff o2_mv_sensor3+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT_PRINT "mV " - bcf leftbind - goto TFT_standard_color ; ...and return - - - global TFT_clock + call TFT_attention_color ; show in yellow + bsf leftbind + WIN_SMALL surf_menu_sensor1_column,surf_menu2_sensor1_row + movff o2_mv_sensor1+0,lo ; in 0.1mV steps + movff o2_mv_sensor1+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + WIN_SMALL surf_menu_sensor2_column,surf_menu2_sensor2_row + movff o2_mv_sensor2+0,lo ; in 0.1mV steps + movff o2_mv_sensor2+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + WIN_SMALL surf_menu_sensor3_column,surf_menu2_sensor3_row + movff o2_mv_sensor3+0,lo ; in 0.1mV steps + movff o2_mv_sensor3+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV + STRCAT_PRINT "mV " + bcf leftbind + goto TFT_standard_color ; ...and return + + + global TFT_clock TFT_clock: - WIN_SMALL surf_clock_column,surf_clock_row -TFT_clock2: ; called from divemode clock - call TFT_standard_color + WIN_SMALL surf_clock_column,surf_clock_row +TFT_clock2: ; called from divemode clock + call TFT_standard_color movff hours,lo output_99 movlw ':' - btfss secs,0 ; blinking every second + btfss secs,0 ; blinking every second movlw ' ' movwf POSTINC2 movff mins,lo @@ -1671,9 +1680,9 @@ global TFT_show_time_date_menu TFT_show_time_date_menu: - call speed_fastest - WIN_SMALL .15,.30 - call TFT_standard_color + call speed_fastest + WIN_SMALL .15,.30 + call TFT_standard_color movff hours,lo output_99 PUTC ':' @@ -1682,178 +1691,178 @@ PUTC ':' movff secs,lo output_99x - STRCAT " - " - movff month,convert_value_temp+0 - movff day,convert_value_temp+1 - movff year,convert_value_temp+2 - call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + STRCAT " - " + movff day,lo + movff month,hi + movff year,up + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 STRCAT_PRINT " " return ;============================================================================= - global TFT_surface_decosettings ; Show all deco settings + global TFT_surface_decosettings ; Show all deco settings TFT_surface_decosettings: ; Deco Mode call TFT_standard_color WIN_SMALL surf_gaslist_column,surf_gaslist_row - STRCAT_PRINT "ZH-L16" - movff char_I_deco_model,WREG - iorwf WREG - bnz TFT_surface_decosettings1 + STRCAT_PRINT "ZH-L16" + movff char_I_deco_model,WREG + iorwf WREG + bnz TFT_surface_decosettings1 ; Display ZH-L16 sat/desat model - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) - lfsr FSR2,buffer - movff char_I_desaturation_multiplier,lo - bsf leftbind - output_8 - STRCAT "%/" - movff char_I_saturation_multiplier,lo - output_8 - STRCAT_PRINT "%" - bra TFT_surface_decosettings2 - ; Display ZH-L16-GF low/high model + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) + lfsr FSR2,buffer + movff char_I_desaturation_multiplier,lo + bsf leftbind + output_8 + STRCAT "%/" + movff char_I_saturation_multiplier,lo + output_8 + STRCAT_PRINT "%" + bra TFT_surface_decosettings2 + ; Display ZH-L16-GF low/high model TFT_surface_decosettings1: - TEXT_SMALL surf_gaslist_column+.43,surf_gaslist_row,tZHL16GF - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) - STRCPY_TEXT tGF ; GF: + TEXT_SMALL surf_gaslist_column+.43,surf_gaslist_row,tZHL16GF + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) + STRCPY_TEXT tGF ; GF: movff opt_GF_low,lo - output_99x - STRCAT "/" + output_99x + STRCAT "/" movff opt_GF_high,lo - output_99x - STRCAT_PRINT "" -TFT_surface_decosettings2: ; fTTS - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) - STRCPY_TEXT tFTTSMenu - movff char_I_extra_time,lo - bsf leftbind - output_8 - STRCAT_TEXT_PRINT tMinutes - ; Last Stop - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) - STRCPY_TEXT tLastDecostop + output_99x + STRCAT_PRINT "" +TFT_surface_decosettings2: ; fTTS + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) + STRCPY_TEXT tFTTSMenu + movff char_I_extra_time,lo + bsf leftbind + output_8 + STRCAT_TEXT_PRINT tMinutes + ; Last Stop + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) + STRCPY_TEXT tLastDecostop movff opt_last_stop,lo - output_8 - STRCAT_TEXT_PRINT tMeters - ; Salinity - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) - STRCPY_TEXT tDvSalinity - movff opt_salinity,lo - output_8 - bcf leftbind - STRCAT_TEXT_PRINT tPercent - return + output_8 + STRCAT_TEXT_PRINT tMeters + ; Salinity + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) + STRCPY_TEXT tDvSalinity + movff opt_salinity,lo + output_8 + bcf leftbind + STRCAT_TEXT_PRINT tPercent + return global TFT_debug_output TFT_debug_output: - return - WIN_TINY .80,.0 - call TFT_standard_color - lfsr FSR2,buffer - movff analog_sw1,lo - output_8 - PUTC "," - movff analog_sw2,lo - output_8 - STRCAT_PRINT "" - return - - global TFT_divetimeout ; Show timeout counter + return + WIN_TINY .80,.0 + call TFT_standard_color + lfsr FSR2,buffer + movff analog_sw1,lo + output_8 + PUTC "," + movff analog_sw2,lo + output_8 + STRCAT_PRINT "" + return + + global TFT_divetimeout ; Show timeout counter TFT_divetimeout: call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_standard_color - STRCPY 0x94 ; "End of dive" icon - movff opt_diveTimeout,WREG ; in [min] - mullw .60 - movff PRODL,sub_a+0 - movff PRODH,sub_a+1 ; in [s] - movff timeout_counter,sub_b+0 - movff timeout_counter2,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) - movff sub_c+0, lo - movff sub_c+1, hi + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_standard_color + STRCPY 0x94 ; "End of dive" icon + movff opt_diveTimeout,WREG ; in [min] + mullw .60 + movff PRODL,sub_a+0 + movff PRODH,sub_a+1 ; in [s] + movff timeout_counter1+0,sub_b+0 + movff timeout_counter1+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) + movff sub_c+0,lo + movff sub_c+1,hi call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) movf hi,W movff lo,hi movwf lo ; exchange lo and hi output_99x - PUTC ':' + PUTC ':' movff hi,lo output_99x - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" - bcf win_invert + bcf win_invert return global TFT_display_ftts TFT_display_ftts: - movff char_I_extra_time,lo - tstfsz lo - bra TFT_display_ftts_a - return ; char_I_extra_time=0, return. + movff char_I_extra_time,lo + tstfsz lo + bra TFT_display_ftts_a + return ; char_I_extra_time=0, return. TFT_display_ftts_a: - movff int_O_alternate_ascenttime+0,WREG - movff int_O_alternate_ascenttime+1,hi - iorwf hi,W ; int_O_alternate_ascenttime:2 == 0 ? - bnz TFT_display_ftts_b - return ; No deco, do nothing + movff int_O_alternate_ascenttime+0,WREG + movff int_O_alternate_ascenttime+1,hi + iorwf hi,W ; int_O_alternate_ascenttime:2 == 0 ? + bnz TFT_display_ftts_b + return ; No deco, do nothing TFT_display_ftts_b: - btfsc is_bailout ; check if we are in bailout mode - return ; YES - in bailout no fTTS will be computed, so nothing to display - incf warning_counter,F ; increase counter - call TFT_warning_set_window ; sets the row and column for the current warning - tstfsz WREG ; is there room for the warning? - return ; NO - btfsc FLAG_ccr_mode ; in CCR mode? - bra TFT_display_ftts_1 ; YES - print fTTS label - btfsc FLAG_pscr_mode ; NO - in pSCR mode? - bra TFT_display_ftts_1 ; YES - print fTTS label - bra TFT_display_ftts_2 ; NO - must be OC then -TFT_display_ftts_1: ; in CCR or pSCR mode - btfsc is_bailout ; in bailout? - bra TFT_display_ftts_2 ; YES - print fTTS label - TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? - bra TFT_display_ftts_2 ; NO - print fTTS label - STRCPY "B/O" ; YES - print bailout label + btfsc is_bailout ; check if we are in bailout mode + return ; YES - in bailout no fTTS will be computed, so nothing to display + incf warning_counter,F ; increase counter + call TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the warning? + return ; NO + btfsc FLAG_ccr_mode ; in CCR mode? + bra TFT_display_ftts_1 ; YES - print fTTS label + btfsc FLAG_pscr_mode ; NO - in pSCR mode? + bra TFT_display_ftts_1 ; YES - print fTTS label + bra TFT_display_ftts_2 ; NO - must be OC then +TFT_display_ftts_1: ; in CCR or pSCR mode + btfsc is_bailout ; in bailout? + bra TFT_display_ftts_2 ; YES - print fTTS label + TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? + bra TFT_display_ftts_2 ; NO - print fTTS label + STRCPY "B/O" ; YES - print bailout label bra TFT_display_ftts_3 -TFT_display_ftts_2: ; OC or bailout - STRCPY "@+" ; print fTTS label +TFT_display_ftts_2: ; OC or bailout + STRCPY "@+" ; print fTTS label TFT_display_ftts_3: - movff char_I_extra_time,lo - bsf leftbind - output_8 - PUTC ":" - movff int_O_alternate_ascenttime+0,lo - movff int_O_alternate_ascenttime+1,hi + movff char_I_extra_time,lo + bsf leftbind + output_8 + PUTC ":" + movff int_O_alternate_ascenttime+0,lo + movff int_O_alternate_ascenttime+1,hi btfss hi,int_invalid_flag ; is the invalid flag set? bra TFT_display_ftts1 ; NO bcf hi,int_invalid_flag ; YES - clear flag - call TFT_disabled_color ; switch to disabled color + call TFT_disabled_color ; switch to disabled color TFT_display_ftts1: - movf lo,W - iorwf hi,W ; extra_ascenttime == 0 ? - bz TFT_display_ftts2 ; YES - show dashes + movf lo,W + iorwf hi,W ; extra_ascenttime == 0 ? + bz TFT_display_ftts2 ; YES - show dashes btfsc hi,int_not_yet_computed ; is the not-computed-yet flag set? bra TFT_display_ftts2 ; YES output_16 ; NO bcf leftbind - PUTC "'" - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + PUTC "'" + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" - bcf win_invert + bcf win_invert goto TFT_standard_color ; ...and return TFT_display_ftts2: - STRCAT "---" - bcf leftbind - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf win_invert + STRCAT "---" + bcf leftbind + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + bcf win_invert goto TFT_standard_color ; ...and return @@ -1861,31 +1870,32 @@ global TFT_temp_surfmode TFT_temp_surfmode: - call TFT_divemask_color - WIN_SMALL surf_temp_column+3*8,surf_temp_row - TSTOSS opt_units ; 0=°C, 1=°F + call TFT_divemask_color + WIN_SMALL surf_temp_column+3*8,surf_temp_row + TSTOSS opt_units ; 0=°C, 1=°F bra TFT_temp_surfmode_metric - STRCAT_TEXT tLogTunitF ; °F + STRCAT_TEXT tLogTunitF ; °F bra TFT_temp_surfmode_common TFT_temp_surfmode_metric: - STRCAT_TEXT tLogTunitC ; °C + STRCAT_TEXT tLogTunitC ; °C TFT_temp_surfmode_common: STRCAT_PRINT "" - WIN_SMALL surf_temp_column,surf_temp_row + WIN_SMALL surf_temp_column,surf_temp_row bra TFT_temp_common - + + global TFT_temp_divemode TFT_temp_divemode: - bcf FLAG_TFT_temp_divemode - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, no update of temperature now + bcf FLAG_TFT_temp_divemode + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, no update of temperature now btfsc blinking_better_gas ; blinking better Gas? return ; Yes, no update of temperature now WIN_SMALL dm_temp_column,dm_temp_row TFT_temp_common: - call TFT_standard_color + call TFT_standard_color SAFE_2BYTE_COPY temperature,lo ; get current temperature - TSTOSS opt_units ; 0=°C, 1=°F + TSTOSS opt_units ; 0=°C, 1=°F bra TFT_temp_common_1 call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit TFT_temp_common_1: @@ -1893,7 +1903,7 @@ btfsc neg_flag ; is the temperature negative? bra TFT_temp_common_2 ; YES - the minus sign has already been written ; temp is positive, is it less then 10°C? - tstfsz hi + tstfsz hi bra TFT_temp_common_1a ; >25.5°C, skip here movlw .100 cpfslt lo @@ -1908,8 +1918,8 @@ bsf ignore_digit5 ; ignore decimal output_16_3 ; output 0-999 without decimal -> writes ' ' - 99 bcf ignore_digit5 - movff buffer+2,lo ; get output from unit position - movlw " " ; load code of the space character + movff buffer+2,lo ; get output from unit position + movlw " " ; load code of the space character cpfseq lo ; is there a space sign on the unit position? (happens between +1 and -1) bra TFT_temp_common_3 ; NO movff WREG,buffer+0 ; YES - replace potential minus sign with a space (temps from -0.9° to -0.1° else would appear as '- 0') @@ -1923,125 +1933,125 @@ STRCAT_TEXT tLogTunitF ; append °F bra TFT_temp_common_5 TFT_temp_common_4: - STRCAT_TEXT tLogTunitC ; append °C + STRCAT_TEXT tLogTunitC ; append °C TFT_temp_common_5: STRCAT_PRINT "" ; output to screen - return - + return + ;============================================================================= - global TFT_divemode_menu_cursor + global TFT_divemode_menu_cursor TFT_divemode_menu_cursor: - WIN_BOX_BLACK dm_menu_row+.1, dm_menu_lower-.1, dm_menu_item1_column-.8, dm_menu_item1_column-.1 - WIN_BOX_BLACK dm_menu_row+.1, dm_menu_lower-.1, dm_menu_item4_column-.8, dm_menu_item4_column-.1 - call TFT_standard_color - - movlw dm_menu_item1_column-.8 - btfsc menupos,2 ; >3? - movlw dm_menu_item4_column-.8 ; Yes - movff WREG,win_leftx2 - - movff menupos,lo ; Copy menu pos - movlw dm_menu_item6_row - dcfsnz lo,F - movlw dm_menu_item1_row - dcfsnz lo,F - movlw dm_menu_item2_row - dcfsnz lo,F - movlw dm_menu_item3_row - dcfsnz lo,F - movlw dm_menu_item4_row - dcfsnz lo,F - movlw dm_menu_item5_row - movff WREG,win_top - movlw FT_SMALL - movff WREG,win_font - STRCPY_PRINT "\xb7" ; print cursor - return + WIN_BOX_BLACK dm_menu_row+.1, dm_menu_lower-.1, dm_menu_item1_column-.8, dm_menu_item1_column-.1 + WIN_BOX_BLACK dm_menu_row+.1, dm_menu_lower-.1, dm_menu_item4_column-.8, dm_menu_item4_column-.1 + call TFT_standard_color + + movlw dm_menu_item1_column-.8 + btfsc menupos1,2 ; >3? + movlw dm_menu_item4_column-.8 ; Yes + movff WREG,win_leftx2 + + movff menupos1,lo ; Copy menu position + movlw dm_menu_item6_row + dcfsnz lo,F + movlw dm_menu_item1_row + dcfsnz lo,F + movlw dm_menu_item2_row + dcfsnz lo,F + movlw dm_menu_item3_row + dcfsnz lo,F + movlw dm_menu_item4_row + dcfsnz lo,F + movlw dm_menu_item5_row + movff WREG,win_top + movlw FT_SMALL + movff WREG,win_font + STRCPY_PRINT "\xb7" ; print cursor + return global TFT_active_gas_divemode TFT_active_gas_divemode: ; Display gas/Setpoint - bcf FLAG_TFT_active_gas_divemode - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode - return - btfsc FLAG_ccr_mode ; in CCR mode? - bra TFT_active_setpoint ; Yes, show setpoint and gas mix - btfsc FLAG_pscr_mode ; in PSCR mode? - bra TFT_active_setpoint ; Yes, show setpoint and gas mix - call TFT_standard_color - btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode + bcf FLAG_TFT_active_gas_divemode + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode + return + btfsc FLAG_ccr_mode ; in CCR mode? + bra TFT_active_setpoint ; Yes, show setpoint and gas mix + btfsc FLAG_pscr_mode ; in PSCR mode? + bra TFT_active_setpoint ; Yes, show setpoint and gas mix + call TFT_standard_color + btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode bra TFT_active_gas_divemode2 ; NO - print in normal rendering - btg blinking_better_gas ; YES - toggle blink bit - btfss blinking_better_gas ; blink now? - bra TFT_active_gas_divemode2 ; NO - print in normal rendering - call TFT_attention_color ; YES - blink in yellow - bsf win_invert ; set invert flag + btg blinking_better_gas ; YES - toggle blink bit + btfss blinking_better_gas ; blink now? + bra TFT_active_gas_divemode2 ; NO - print in normal rendering + call TFT_attention_color ; YES - blink in yellow + bsf win_invert ; set invert flag TFT_active_gas_divemode2: - WIN_STD dm_active_gas_column, dm_active_gas_row - movff char_I_O2_ratio,lo ; lo now stores O2 in % - movff char_I_He_ratio,hi ; hi now stores He in % - call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + WIN_STD dm_active_gas_column, dm_active_gas_row + movff char_I_O2_ratio,lo ; lo now stores O2 in % + movff char_I_He_ratio,hi ; hi now stores He in % + call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 STRCAT_PRINT "" - bcf win_invert ; reset invert flag + bcf win_invert ; reset invert flag goto TFT_standard_color ; ...and return -TFT_active_setpoint: ; Show setpoint - btfsc is_bailout ; are we in bailout? - bra TFT_active_setpoint_bail ; YES - show "Bailout" instead of setpoint +TFT_active_setpoint: ; Show setpoint + btfsc is_bailout ; are we in bailout? + bra TFT_active_setpoint_bail ; YES - show "Bailout" instead of setpoint movff int_O_breathed_ppO2+0,lo movff int_O_breathed_ppO2+1,hi - TFT_color_code warn_ppo2 ; with ppO2 [cbar] in hi:lo - btg blinking_setpoint ; toggle blink bit... - btfss blinking_setpoint ; blink now? - bra TFT_active_setpoint_print ; NO - print ppO2 with normal rendering - btfsc setpoint_fallback ; YES - check if we are in fallback condition - bra TFT_active_setpoint_fallb ; YES - process fallback case - movff int_O_breathed_ppO2+1,WREG ; NO - get flags again (have been cleared in hi:lo by TFT_color_code meanwhile) - btfss WREG,int_warning_flag ; warning flag set? - bra TFT_active_setpoint_print ; NO - ppO2 is ok, print ppO2 with normal rendering - bra TFT_active_setpoint_com ; YES - continue with blinking common part + call TFT_color_code_ppo2 ; with ppO2 [cbar] in hi:lo + btg blinking_setpoint ; toggle blink bit... + btfss blinking_setpoint ; blink now? + bra TFT_active_setpoint_print ; NO - print ppO2 with normal rendering + btfsc setpoint_fallback ; YES - check if we are in fallback condition + bra TFT_active_setpoint_fallb ; YES - process fallback case + movff int_O_breathed_ppO2+1,WREG ; NO - get flags again (have been cleared in hi:lo by TFT_color_code_ppo2 meanwhile) + btfss WREG,int_warning_flag ; warning flag set? + bra TFT_active_setpoint_print ; NO - ppO2 is ok, print ppO2 with normal rendering + bra TFT_active_setpoint_com ; YES - continue with blinking common part TFT_active_setpoint_fallb: ; set up fallback case - movlw color_yellow ; text in yellow - call TFT_set_color ; overwrite setting done by TFT_color_code warn_ppo2 -TFT_active_setpoint_com: ; blinking common part - bsf win_invert ; set invert flag + movlw color_yellow ; text in yellow + call TFT_set_color ; overwrite setting done by TFT_color_code_ppo2 +TFT_active_setpoint_com: ; blinking common part + bsf win_invert ; set invert flag TFT_active_setpoint_print: WIN_STD dm_active_gas_column, dm_active_gas_row bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_TEXT tbar - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz TFT_active_setpoint2_a ; NO - skip - PUTC "*" ; YES - add an astrix + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_TEXT tbar + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz TFT_active_setpoint2_a ; NO - skip + PUTC "*" ; YES - add an astrix TFT_active_setpoint2_a: STRCAT_PRINT "" - bcf win_invert ; reset invert flag + bcf win_invert ; reset invert flag call TFT_standard_color ; revert to standard color bra TFT_active_setpoint_diluent ; continue with showing diluent TFT_active_setpoint_bail: WIN_SMALL dm_active_gas_column, dm_active_gas_row+.3 ; collides with diluent in FT_MEDIUM call TFT_standard_color - STRCPY_TEXT_PRINT tDiveBailout ; Bailout + STRCPY_TEXT_PRINT tDiveBailout ; Bailout TFT_active_setpoint_diluent: - btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode + btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode bra TFT_active_setpoint_diluent_show ; NO - print in normal rendering - btg blinking_better_gas ; YES - toggle blink bit... - btfss blinking_better_gas ; blink now? + btg blinking_better_gas ; YES - toggle blink bit... + btfss blinking_better_gas ; blink now? bra TFT_active_setpoint_diluent_show ; NO - print in normal rendering - movlw color_yellow ; YES - blink in yellow - call TFT_set_color ; set text color - bsf win_invert ; set invert flag + movlw color_yellow ; YES - blink in yellow + call TFT_set_color ; set text color + bsf win_invert ; set invert flag TFT_active_setpoint_diluent_show: WIN_SMALL dm_active_dil_column, dm_active_dil_row - movff char_I_O2_ratio,lo ; lo now stores O2 in % - movff char_I_He_ratio,hi ; hi now stores He in % - call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + movff char_I_O2_ratio,lo ; lo now stores O2 in % + movff char_I_He_ratio,hi ; hi now stores He in % + call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 STRCAT_PRINT "" - bcf win_invert ; reset invert flag + bcf win_invert ; reset invert flag goto TFT_standard_color ; ...and return @@ -2063,211 +2073,210 @@ call TFT_standard_color ; set standard color STRCPY_TEXT_PRINT tDvPSCR ; print "PSCR" return - + global TFT_display_decotype_surface TFT_display_decotype_surface: - WIN_STD surf_decotype_column,surf_decotype_row - WIN_COLOR color_lightblue - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - tstfsz lo - bra TFT_display_decotype_surface2 + WIN_STD surf_decotype_column,surf_decotype_row + WIN_COLOR color_lightblue + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + tstfsz lo + bra TFT_display_decotype_surface2 TFT_display_decotype_surface0: - STRCAT_TEXT_PRINT tDvOC ; OC - bra TFT_display_decotype_exit + STRCAT_TEXT_PRINT tDvOC ; OC + bra TFT_display_decotype_exit TFT_display_decotype_surface2: - decfsz lo,F - bra TFT_display_decotype_surface3 - STRCAT_TEXT_PRINT tDvCC ; CC - call TFT_standard_color + decfsz lo,F + bra TFT_display_decotype_surface3 + STRCAT_TEXT_PRINT tDvCC ; CC + call TFT_standard_color WIN_TINY surf_decotype_column+.18,surf_decotype_row+.12 - TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP - bra TFT_display_decotype_cc_fixed - ; Sensor mode or Auto - movff opt_ccr_mode,WREG - sublw .2 - bz TFT_display_decotype_cc_auto - STRCPY_TEXT tCCRModeSensor ; Sensor - bra TFT_display_decotype_cc_common + TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP + bra TFT_display_decotype_cc_fixed + ; Sensor mode or Auto + movff opt_ccr_mode,WREG + sublw .2 + bz TFT_display_decotype_cc_auto + STRCPY_TEXT tCCRModeSensor ; Sensor + bra TFT_display_decotype_cc_common TFT_display_decotype_cc_auto: - STRCPY_TEXT tCCRModeAutoSP ; Auto SP - bra TFT_display_decotype_cc_common + STRCPY_TEXT tCCRModeAutoSP ; Auto SP + bra TFT_display_decotype_cc_common TFT_display_decotype_cc_fixed: - STRCPY_TEXT tCCRModeFixedSP ; Fixed SP + STRCPY_TEXT tCCRModeFixedSP ; Fixed SP TFT_display_decotype_cc_common: - clrf WREG - movff WREG,buffer+.8 ; limit string length to 8 - STRCAT_PRINT "" - bra TFT_display_decotype_exit + clrf WREG + movff WREG,buffer+.8 ; limit string length to 8 + STRCAT_PRINT "" + bra TFT_display_decotype_exit TFT_display_decotype_surface3: - decfsz lo,F - bra TFT_display_decotype_surface4 + decfsz lo,F + bra TFT_display_decotype_surface4 TFT_display_decotype_surface3_1: - STRCAT_TEXT_PRINT tDvGauge ; Gauge - bra TFT_display_decotype_exit + STRCAT_TEXT_PRINT tDvGauge ; Gauge + bra TFT_display_decotype_exit TFT_display_decotype_surface4: - decfsz lo,F - bra TFT_display_decotype_surface5 -TFT_display_decotype_surface4_1: - STRCAT_TEXT_PRINT tDvApnea ; Apnea - bra TFT_display_decotype_exit + decfsz lo,F + bra TFT_display_decotype_surface5 +TFT_display_decotype_surface4_1: + STRCAT_TEXT_PRINT tDvApnea ; Apnea + bra TFT_display_decotype_exit TFT_display_decotype_surface5: - STRCAT_TEXT_PRINT tDvPSCR ; PSCR + STRCAT_TEXT_PRINT tDvPSCR ; PSCR TFT_display_decotype_exit: - goto TFT_standard_color ; and return... - - - global TFT_display_decotype_surface1 ; Used from logbook! -TFT_display_decotype_surface1: ; Used from logbook! - tstfsz lo - bra TFT_display_decotype_surface1_2 - bra TFT_display_decotype_surface0 ;OC + goto TFT_standard_color ; and return... + + + global TFT_display_decotype_surface1 ; Used from logbook! +TFT_display_decotype_surface1: ; Used from logbook! + tstfsz lo + bra TFT_display_decotype_surface1_2 + bra TFT_display_decotype_surface0 ;OC TFT_display_decotype_surface1_2: - decfsz lo,F - bra TFT_display_decotype_surface1_3 - STRCAT_TEXT_PRINT tDvCC ; CC (w/o Sensor/Fixed Display) + decfsz lo,F + bra TFT_display_decotype_surface1_3 + STRCAT_TEXT_PRINT tDvCC ; CC (w/o Sensor/Fixed Display) TFT_display_decotype_surface1_3: - decfsz lo,F - bra TFT_display_decotype_surface1_4 - bra TFT_display_decotype_surface3_1 ; Gauge + decfsz lo,F + bra TFT_display_decotype_surface1_4 + bra TFT_display_decotype_surface3_1 ; Gauge TFT_display_decotype_surface1_4: - decfsz lo,F - bra TFT_display_decotype_surface4_1 ; Apnea - bra TFT_display_decotype_surface5 ; PSCR + decfsz lo,F + bra TFT_display_decotype_surface4_1 ; Apnea + bra TFT_display_decotype_surface5 ; PSCR ;============================================================================= - global TFT_splist_surfmode ; Show Setpoint list - extern gaslist_strcat_setpoint + global TFT_splist_surfmode ; Show Setpoint list + extern gaslist_strcat_setpoint TFT_splist_surfmode: - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - ;SP 1 - WIN_SMALL surf_gaslist_column,surf_gaslist_row - clrf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# - STRCAT_PRINT "" - ;SP 2 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) - movlw .1 - movwf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# - STRCAT_PRINT "" - ;SP 3 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) - movlw .2 - movwf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# - STRCAT_PRINT "" - ;SP 4 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) - movlw .3 - movwf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# - STRCAT_PRINT "" - ;SP 5 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) - movlw .4 - movwf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# - STRCAT_PRINT "" - bcf leftbind - return + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + ;SP 1 + WIN_SMALL surf_gaslist_column,surf_gaslist_row + clrf PRODL + call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# + STRCAT_PRINT "" + ;SP 2 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) + movlw .1 + movwf PRODL + call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# + STRCAT_PRINT "" + ;SP 3 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) + movlw .2 + movwf PRODL + call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# + STRCAT_PRINT "" + ;SP 4 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) + movlw .3 + movwf PRODL + call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# + STRCAT_PRINT "" + ;SP 5 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) + movlw .4 + movwf PRODL + call gaslist_strcat_setpoint ; Show SP#+1 of PRODL# + STRCAT_PRINT "" + bcf leftbind + return global TFT_gaslist_surfmode -TFT_gaslist_surfmode: ; Displays Gas List - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - extern gaslist_strcat_gas_mod - ;Gas 1 - WIN_SMALL surf_gaslist_column,surf_gaslist_row - clrf PRODL - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - STRCAT_PRINT "" - ;Gas 2 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) - movlw .1 - movwf PRODL - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - STRCAT_PRINT "" - ;Gas 3 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) - movlw .2 - movwf PRODL - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - STRCAT_PRINT "" - ;Gas 4 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) - movlw .3 - movwf PRODL - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - STRCAT_PRINT "" - ;Gas 5 - WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) - movlw .4 - movwf PRODL - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - STRCAT_PRINT "" - bcf leftbind - return +TFT_gaslist_surfmode: ; Displays Gas List + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + extern gaslist_strcat_gas_mod + ;Gas 1 + WIN_SMALL surf_gaslist_column,surf_gaslist_row + clrf PRODL + call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string + STRCAT_PRINT "" + ;Gas 2 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) + movlw .1 + movwf PRODL + call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string + STRCAT_PRINT "" + ;Gas 3 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) + movlw .2 + movwf PRODL + call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string + STRCAT_PRINT "" + ;Gas 4 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) + movlw .3 + movwf PRODL + call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string + STRCAT_PRINT "" + ;Gas 5 + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) + movlw .4 + movwf PRODL + call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string + STRCAT_PRINT "" + bcf leftbind + return global TFT_dillist_surfmode -TFT_dillist_surfmode: ; Displays Diluent List - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - bsf ccr_diluent_setup ; Use CCR Diluents... - rcall TFT_gaslist_surfmode ; Use OC/BAIL routine - bcf ccr_diluent_setup ; Clear flag - return +TFT_dillist_surfmode: ; Displays Diluent List + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bsf ccr_diluent_setup ; Use CCR Diluents... + rcall TFT_gaslist_surfmode ; Use OC/BAIL routine + bcf ccr_diluent_setup ; Clear flag + return ;================================================================== global TFT_depth TFT_depth: - bcf FLAG_TFT_depth - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - - TFT_color_code warn_depth ; Color-code the output - rcall TFT_depth_blink - WIN_LARGE dm_depth_column, dm_depth_row - - TSTOSS opt_units ; 0=m, 1=ft - bra TFT_depth_metric + bcf FLAG_TFT_depth + SAFE_2BYTE_COPY rel_pressure, lo + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call TFT_color_code_depth ; Color-code the output + rcall TFT_depth_blink + WIN_LARGE dm_depth_column, dm_depth_row + + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_depth_metric ;TFT_depth_imperial - clrf sub_a+1 ; Display 0ft if lower then 30cm + clrf sub_a+1 ; Display 0ft if lower then 30cm movlw d'30' movwf sub_a+0 movff hi,sub_b+1 movff lo,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Depth lower then 0.4m? - bra depth_less_0.3mtr_feet ; Yes, Show 0ft manually - - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Depth lower then 0.4m? + bra depth_less_0.3mtr_feet ; Yes, Show 0ft manually + + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet bsf leftbind - output_16 ; feet in Big font - bcf leftbind - movlw .3 ; limit to three chars - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" ; Display feet - bcf win_invert ; Reset invert flag - return + output_16 ; feet in Big font + bcf leftbind + movlw .3 ; limit to three chars + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" ; Display feet + bcf win_invert ; Reset invert flag + return depth_less_0.3mtr_feet: - STRCAT_PRINT "0 " ; manual zero - bcf win_invert ; Reset invert flag + STRCAT_PRINT "0 " ; manual zero + bcf win_invert ; Reset invert flag return TFT_depth_metric: movlw .039 cpfslt hi - bra depth_greater_99_84mtr - - btfsc depth_greater_100m ; Was depth>100m during last call - rcall TFT_clear_depth ; Yes, clear depth area - bcf depth_greater_100m ; Do this once only... + bra depth_greater_99_84mtr + + btfsc depth_greater_100m ; Was depth>100m during last call + rcall TFT_clear_depth ; Yes, clear depth area + bcf depth_greater_100m ; Do this once only... movlw .039 cpfslt hi - bra depth_greater_99_84mtr + bra depth_greater_99_84mtr movlw HIGH d'1000' movwf sub_a+1 @@ -2279,11 +2288,11 @@ movlw d'0' addwfc sub_b+1,F ; Add 1mbar offset call sub16 ; sub_c = sub_a - sub_b - movlw ' ' + movlw ' ' btfss neg_flag ; Depth lower then 10m? - movwf POSTINC2 ; Yes, add extra space - - clrf sub_a+1 + movwf POSTINC2 ; Yes, add extra space + + clrf sub_a+1 movlw d'99' movwf sub_a+0 movff hi,sub_b+1 @@ -2299,7 +2308,7 @@ bra tft_depth3 tft_depth2: - STRCAT "0" ; manual zero + STRCAT "0" ; manual zero tft_depth3: STRCAT_PRINT "" ; Display full meters @@ -2308,15 +2317,14 @@ WIN_MEDIUM dm_depth_dm_column, dm_depth_dm_row ; TODO - check if needed, depth should still be in hi:lo - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - - TFT_color_code warn_depth ; Color-code the output - - PUTC "." - movlw HIGH d'30' ; Display 0.0m if lower then 30cm + SAFE_2BYTE_COPY rel_pressure, lo + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call TFT_color_code_depth ; Color-code the output + + PUTC "." + movlw HIGH d'30' ; Display 0.0m if lower then 30cm movwf sub_a+1 - movlw LOW d'30' + movlw LOW d'30' movwf sub_a+0 movff hi,sub_b+1 movff lo,sub_b+0 @@ -2329,158 +2337,158 @@ bsf ignore_digit5 output_16dp d'0' STRCAT_PRINT "" ; Display decimeters - bcf win_invert ; Reset invert flag - WIN_FONT FT_SMALL + bcf win_invert ; Reset invert flag + WIN_FONT FT_SMALL return depth_less_0.3mtr: STRCAT_PRINT "0" ; Display 0.0m manually - bcf win_invert ; Reset invert flag - WIN_FONT FT_SMALL + bcf win_invert ; Reset invert flag + WIN_FONT FT_SMALL return depth_greater_99_84mtr: ; Display only in full meters btfss depth_greater_100m ; Is depth>100m already? rcall TFT_clear_depth ; No, clear depth area and set flag - TFT_color_code warn_depth + call TFT_color_code_depth ; Depth is already in hi:lo ; Show depth in Full meters ; That means ignore digit 4 and 5 - lfsr FSR2,buffer + lfsr FSR2,buffer bsf ignore_digit4 bsf leftbind output_16 bcf leftbind - STRCAT_PRINT "" ; Display full meters only - bcf win_invert ; Reset invert flag - WIN_FONT FT_SMALL + STRCAT_PRINT "" ; Display full meters only + bcf win_invert ; Reset invert flag + WIN_FONT FT_SMALL return -TFT_clear_depth: ; No, clear depth area and set flag - WIN_BOX_BLACK dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right - bsf depth_greater_100m ; Set Flag +TFT_clear_depth: ; No, clear depth area and set flag + WIN_BOX_BLACK dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right + bsf depth_greater_100m ; Set Flag return TFT_depth_blink: - TSTOSS opt_modwarning ; 0=standard, 1=blink - return - - ; check if previous cycle had the blinking warning or not - btfsc blinking_depth_prev ; did we have warning prev? - bra TFT_depth_blink_prevwarn ; Yes - - ; No; check if it's set now - btfsc blinking_depth_warning ; do we have warning set now? - bra TFT_depth_blink_warn ; Yes - so we have warning now but not prev - - ; no warning in previous cycle, no warning now, reset all flags - bcf blinking_depth_prev ; reset prev flag - bcf blinking_depth_toggle ; reset toggle - bcf win_invert - ; all done - return + TSTOSS opt_modwarning ; 0=standard, 1=blink + return + + ; check if previous cycle had the blinking warning or not + btfsc blinking_depth_prev ; did we have warning prev? + bra TFT_depth_blink_prevwarn; Yes + + ; No; check if it's set now + btfsc blinking_depth_warning ; do we have warning set now? + bra TFT_depth_blink_warn ; Yes - so we have warning now but not prev + + ; no warning in previous cycle, no warning now, reset all flags + bcf blinking_depth_prev ; reset prev flag + bcf blinking_depth_toggle ; reset toggle + bcf win_invert + ; all done + return TFT_depth_blink_prevwarn: - ; ...we had warning in previous cycle, check if we still have the warning set - btfss blinking_depth_warning ; do we still have the warning? - bra TFT_depth_blink_prevwarn_nowarn ; No, clear the depth area - - ; we still have the warning, set previous flag for next cycle... - bsf blinking_depth_prev ; set prev flag - ; and set toggle and invert if required - btfss blinking_depth_toggle ; do we have the toggle set? - bra TFT_depth_blink_set ; No: set inverse, do color_box, set flag - bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag + ; ...we had warning in previous cycle, check if we still have the warning set + btfss blinking_depth_warning ; do we still have the warning? + bra TFT_depth_blink_prevwarn_nowarn ; No, clear the depth area + + ; we still have the warning, set previous flag for next cycle... + bsf blinking_depth_prev ; set prev flag + ; and set toggle and invert if required + btfss blinking_depth_toggle ; do we have the toggle set? + bra TFT_depth_blink_set ; No: set inverse, do color_box, set flag + bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag TFT_depth_blink_prevwarn_nowarn: - ; we had warning, but not now... (e.g. ascended or switched to better gas) - ; reset the previous cycle flag for the next cycle... - bcf blinking_depth_prev ; reset prev flag - ; clear it - just in case if we had a blinked before - bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag + ; we had warning, but not now... (e.g. ascended or switched to better gas) + ; reset the previous cycle flag for the next cycle... + bcf blinking_depth_prev ; reset prev flag + ; clear it - just in case if we had a blinked before + bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag TFT_depth_blink_warn: - ; new blinking warning activated (had no warning in previous cycle) - bsf blinking_depth_prev ; set prev flag - ; set toggle and invert - bra TFT_depth_blink_set + ; new blinking warning activated (had no warning in previous cycle) + bsf blinking_depth_prev ; set prev flag + ; set toggle and invert + bra TFT_depth_blink_set TFT_depth_blink_set: - ; clear the area with color - movlw color_red ; that should not be hardcoded... - WIN_BOX_COLOR dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right - ;set the invert color - bsf win_invert - ; set the toggle - bsf blinking_depth_toggle - ; all done - return + ; clear the area with color + movlw color_red ; that should not be hardcoded... + WIN_BOX_COLOR dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right + ;set the invert color + bsf win_invert + ; set the toggle + bsf blinking_depth_toggle + ; all done + return TFT_depth_blink_reset: - ; clear the area with black - WIN_BOX_BLACK dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right - ;reset the invert color - bcf win_invert - ; reset the toggle - bcf blinking_depth_toggle - ; if it's still warning... - btfsc blinking_depth_warning - call TFT_warnings_color - ; all done - return + ; clear the area with black + WIN_BOX_BLACK dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt ;top, bottom, left, right + ;reset the invert color + bcf win_invert + ; reset the toggle + bcf blinking_depth_toggle + ; if it's still warning... + btfsc blinking_depth_warning + call TFT_warnings_color + ; all done + return ;============================================================================= - global TFT_custom_text -TFT_custom_text: ; Show the custom text - lfsr FSR0, opt_name ; Source - WIN_SMALL surf_customtext_column,surf_customtext_row1 ; First row - rcall TFT_custom_text_2 ; Show up to 12 chars and print - incfsz lo,F ; Was lo=255? - return ; No, all done. - lfsr FSR0, opt_name+.12 ; Source - WIN_SMALL surf_customtext_column,surf_customtext_row2 ; Second row - rcall TFT_custom_text_2 ; Show up to 12 chars and print - incfsz lo,F ; Was lo=255? - return ; No, all done. - lfsr FSR0, opt_name+.24 ; Source - WIN_SMALL surf_customtext_column,surf_customtext_row3 ; Third row - rcall TFT_custom_text_2 ; Show up to 12 chars and print - incfsz lo,F ; Was lo=255? - return ; No, all done. - lfsr FSR0, opt_name+.36 ; Source - WIN_SMALL surf_customtext_column,surf_customtext_row4 ; Forth row - rcall TFT_custom_text_2 ; Show up to 12 chars and print - incfsz lo,F ; Was lo=255? - return ; No, all done. - lfsr FSR0, opt_name+.48 ; Source - WIN_SMALL surf_customtext_column,surf_customtext_row5 ; Fifth row - bra TFT_custom_text_2 ; Show up to 12 chars and print ; and return... + global TFT_custom_text +TFT_custom_text: ; Show the custom text + lfsr FSR0, opt_name ; Source + WIN_SMALL surf_customtext_column,surf_customtext_row1 ; First row + rcall TFT_custom_text_2 ; Show up to 12 chars and print + incfsz lo,F ; Was lo=255? + return ; No, all done. + lfsr FSR0, opt_name+.12 ; Source + WIN_SMALL surf_customtext_column,surf_customtext_row2 ; Second row + rcall TFT_custom_text_2 ; Show up to 12 chars and print + incfsz lo,F ; Was lo=255? + return ; No, all done. + lfsr FSR0, opt_name+.24 ; Source + WIN_SMALL surf_customtext_column,surf_customtext_row3 ; Third row + rcall TFT_custom_text_2 ; Show up to 12 chars and print + incfsz lo,F ; Was lo=255? + return ; No, all done. + lfsr FSR0, opt_name+.36 ; Source + WIN_SMALL surf_customtext_column,surf_customtext_row4 ; Forth row + rcall TFT_custom_text_2 ; Show up to 12 chars and print + incfsz lo,F ; Was lo=255? + return ; No, all done. + lfsr FSR0, opt_name+.48 ; Source + WIN_SMALL surf_customtext_column,surf_customtext_row5 ; Fifth row + bra TFT_custom_text_2 ; Show up to 12 chars and print ; and return... TFT_custom_text_2: - lfsr FSR2, buffer ; destination - movlw .12 - movwf lo ; length/line + lfsr FSR2, buffer ; destination + movlw .12 + movwf lo ; length/line TFT_custom_text_3: - movf POSTINC0,W ; Get byte - bz TFT_custom_text_4 ; End if NULL - movwf POSTINC2 ; NO: copy - decfsz lo,F ; Max len reached ? - bra TFT_custom_text_3 ; NO: loop - setf lo ; lo=255 -> more to come + movf POSTINC0,W ; Get byte + bz TFT_custom_text_4 ; End if NULL + movwf POSTINC2 ; NO: copy + decfsz lo,F ; Max length reached ? + bra TFT_custom_text_3 ; NO: loop + setf lo ; lo=255 -> more to come TFT_custom_text_4: - clrf POSTINC2 ; Mark end of string - goto aa_wordprocessor ; print and return + clrf POSTINC2 ; Mark end of string + goto aa_wordprocessor ; print and return ;============================================================================= global TFT_update_surf_press TFT_update_surf_press: - WIN_SMALL surf_press_column,surf_press_row + WIN_SMALL surf_press_column,surf_press_row call TFT_standard_color - SAFE_2BYTE_COPY amb_pressure, lo + SAFE_2BYTE_COPY amb_pressure, lo movff lo,sub_a+0 movff hi,sub_a+1 movff last_surfpressure_30min+0,sub_b+0 @@ -2494,7 +2502,7 @@ subwf sub_c+0,W btfsc STATUS,C bra update_surf_press_common ; Yes, display! - SAFE_2BYTE_COPY last_surfpressure_30min, lo ; Overwrite with stable value... + SAFE_2BYTE_COPY last_surfpressure_30min, lo ; Overwrite with stable value... update_surf_press_common: movff lo,int_I_pres_surface+0 ; copy displayed value to C code to have pressure displayed movff hi,int_I_pres_surface+1 ; and pressure used for desaturation & no-fly time in sync @@ -2506,10 +2514,10 @@ movff buffer+4,buffer+3 movlw 0x00 movff WREG,buffer+4 - STRCAT_PRINT "" - call TFT_divemask_color - WIN_SMALL surf_press_column+4*8,surf_press_row - STRCPY_TEXT_PRINT tMBAR ; mbar + STRCAT_PRINT "" + call TFT_divemask_color + WIN_SMALL surf_press_column+4*8,surf_press_row + STRCPY_TEXT_PRINT tMBAR ; mbar return update_surf_press2: @@ -2523,17 +2531,17 @@ global TFT_update_batt_voltage TFT_update_batt_voltage: - movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery ; Color-code battery percent - ; Setup charge indicator - btfsc cc_active - bsf win_invert - btfsc cc_active - movlw color_yellow - btfsc cv_active - movlw color_green - btfsc cc_active - call TFT_set_color + movff batt_percent,lo ; Get battery percent + call TFT_color_code_battery ; Color-code battery percent + ; Setup charge indicator + btfsc cc_active + bsf win_invert + btfsc cc_active + movlw color_yellow + btfsc cv_active + movlw color_green + btfsc cc_active + call TFT_set_color WIN_TINY batt_percent_column,batt_percent_row bsf leftbind output_8 @@ -2541,24 +2549,24 @@ STRCAT "% " movlw 0x00 movff WREG,buffer+4 ; Only "xxx%" - STRCAT_PRINT "" - bcf win_invert + STRCAT_PRINT "" + bcf win_invert call TFT_standard_color WIN_TINY batt_voltage_column,batt_voltage_row - movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah PUTC "T" - bsf leftbind - output_8 - PUTC ":" + bsf leftbind + output_8 + PUTC ":" movff batt_voltage+0,lo movff batt_voltage+1,hi - output_16dp .2 + output_16dp .2 bcf leftbind PUTC 'V' movff buffer+8,buffer+6 movlw 0x00 movff WREG,buffer+7 ; Only "x.yV" - STRCAT_PRINT "" + STRCAT_PRINT "" return ;update_battery_debug: @@ -2576,7 +2584,7 @@ ; movwf xB+0 ; movlw HIGH .152 ; movwf xB+1 -; call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder +; call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; bsf leftbind ; movff xC+0,lo ; movff xC+1,hi @@ -2585,104 +2593,89 @@ ; WIN_FONT FT_SMALL ; bcf leftbind ; return - + ;============================================================================= global TFT_convert_signed_16bit TFT_convert_signed_16bit: - bcf neg_flag ; Positive temperature - btfss hi,7 ; Negative temperature ? - return ; No, return + bcf neg_flag ; Positive temperature + btfss hi,7 ; Negative temperature ? + return ; No, return ; Yes, negative temperature! - bsf neg_flag ; Negative temperature - PUTC '-' ; Display "-" - comf hi ; Then, 16bit sign changes. - negf lo - btfsc STATUS,C - incf hi - return ; and return + bsf neg_flag ; Negative temperature + PUTC '-' ; Display "-" + comf hi ; Then, 16bit sign changes. + negf lo + btfsc STATUS,C + incf hi + return ; and return ;============================================================================= global TFT_convert_date -TFT_convert_date: ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 - movff opt_dateformat,WREG ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD - movwf EEDATA ; used as temp here +TFT_convert_date: ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + movff opt_dateformat,WREG ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD + movwf EEDATA ; used as temp here tstfsz EEDATA - bra TFT_convert_date1 -; EEDATA was 0 -; Use MMDDYY - movff convert_value_temp+0,lo ;month + bra TFT_convert_date_1 ; opt_dateformat is 1 or 2 + ; opt_dateformat is 0 + ; use MMDDYY + movff lo,lo_temp ; incoming: lo = day, hi = month + movff hi,lo ; swap + movff lo_temp,hi ; now: lo = month, hi = day + bra TFT_convert_date_common + +TFT_convert_date_1: + decfsz EEDATA,F + bra TFT_convert_date_2 ; opt_dateformat is 2 + ; opt_dateformat is 1 + ; use DDMMYY +TFT_convert_date_common: bsf leftbind + output_99x ; with lo = month or day or year + PUTC '.' + movff hi,lo ; now lo = day or month or month output_99x - PUTC '.' - movff convert_value_temp+1,lo ;day - bra TFT_convert_date1_common ;year - -TFT_convert_date1: ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) - decfsz EEDATA,F - bra TFT_convert_date2 ; EEDATA was 2 -; EEDATA was 1 -; Use DDMMYY - movff convert_value_temp+1,lo ;day - bsf leftbind - output_99x - PUTC '.' - movff convert_value_temp+0,lo ;month - -TFT_convert_date1_common: - bsf leftbind - output_99x - PUTC '.' - movff convert_value_temp+2,lo ;year + PUTC '.' + movff up,lo ; now lo = year or year or day output_99x bcf leftbind return -TFT_convert_date2: -; Use YYMMDD - movff convert_value_temp+2,lo ;year - bsf leftbind - output_99x - PUTC '.' - movff convert_value_temp+0,lo ;month - output_99x - PUTC '.' - movff convert_value_temp+1,lo ;day - output_99x - bcf leftbind - return +TFT_convert_date_2: + ; opt_dateformat is 2 + ; use YYMMDD + movff lo,lo_temp ; incoming: lo = day, up = year + movff up,lo ; swap + movff lo_temp,up ; now : lo = year, up = day + bra TFT_convert_date_common ;============================================================================= global TFT_convert_date_short -TFT_convert_date_short: ; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2 - movff opt_dateformat,WREG ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD - movwf EEDATA ; used as temp here +TFT_convert_date_short: ; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2 + movff opt_dateformat,WREG ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD + movwf EEDATA ; used as temp here tstfsz EEDATA - bra TFT_convert_date_short1 -; EEDATA was 0 -; Use MMDDYY + bra TFT_convert_date_short_1 + ; opt_dateformat is 0 + ; Use MMDD(YY) +TFT_convert_date_short_0: + movff lo,lo_temp ; incoming: lo = day, hi = month + movff hi,lo ; swap + movff lo_temp,hi ; now: lo = month, hi = day + bra TFT_convert_date_short_common + +TFT_convert_date_short_1: + decfsz EEDATA,F + bra TFT_convert_date_short_0 ; opt_dateformat is 2 -> use (YY)MMDD + ; opt_dateformat is 1 + ; use DDMM(YY) TFT_convert_date_short_common: - movff convert_value_temp+0,lo ;month bsf leftbind - output_99x - PUTC '.' - movff convert_value_temp+1,lo ;day - output_99x - bcf leftbind - return - -TFT_convert_date_short1: - decfsz EEDATA,F - bra TFT_convert_date_short_common ; EEDATA was 2 -> Use YYMMDD -; EEDATA was 1 -; Use DDMMYY - movff convert_value_temp+1,lo ;day - bsf leftbind - output_99x - PUTC '.' - movff convert_value_temp+0,lo ;month + output_99x ; with lo = month or day + PUTC '.' + movff hi,lo ; now lo = day or month output_99x bcf leftbind return @@ -2691,11 +2684,11 @@ global TFT_date TFT_date: - WIN_SMALL surf_date_column,surf_date_row ; Init new Wordprocessor + WIN_SMALL surf_date_column,surf_date_row ; Init new Wordprocessor call TFT_standard_color - movff month,convert_value_temp+0 - movff day,convert_value_temp+1 - movff year,convert_value_temp+2 + movff day,lo + movff month,hi + movff year,up call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 STRCAT_PRINT "" return @@ -2703,55 +2696,55 @@ ;============================================================================= global TFT_max_depth_alternative -TFT_max_depth_alternative: - bcf FLAG_TFT_max_depth_alt +TFT_max_depth_alternative: + bcf FLAG_TFT_max_depth_alt ; The "mask" - call TFT_divemask_color - WIN_TINY dm_mask_depth_column, dm_max_alt_row-.14 + call TFT_divemask_color + WIN_TINY dm_mask_depth_column, dm_max_alt_row-.14 STRCPY_TEXT_PRINT tMaxDepth ; The max. depth SAFE_2BYTE_COPY max_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - call TFT_standard_color - TSTOSS opt_units ; 0=m, 1=ft - bra TFT_max_depth_alt_metric + call TFT_standard_color + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_max_depth_alt_metric ;TFT_max_depth_alt_imperial: TFT_max_depth_alt_metric: - WIN_LARGE dm_max_alt_column,dm_max_alt_row - bsf ignore_digit4 ; no 0.1m + WIN_LARGE dm_max_alt_column,dm_max_alt_row + bsf ignore_digit4 ; no 0.1m output_16 STRCAT_PRINT "" - + WIN_MEDIUM dm_max_dm_alt_column,dm_max_alt_row+.25 SAFE_2BYTE_COPY max_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - PUTC "." + PUTC "." movlw d'4' movwf ignore_digits - bsf ignore_digit5 - bsf leftbind + bsf ignore_digit5 + bsf leftbind output_16dp d'0' STRCAT_PRINT "" ; Display decimeters - bcf leftbind + bcf leftbind return - - + + global TFT_max_depth TFT_max_depth: bcf FLAG_TFT_max_depth btfsc FLAG_apnoe_mode ; different display in apnoe mode - bra TFT_max_depth_apnoe + bra TFT_max_depth_apnoe TFT_max_depth2: - SAFE_2BYTE_COPY max_pressure, lo + SAFE_2BYTE_COPY max_pressure, lo TFT_max_depth3: call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - TSTOSS opt_units ; 0=m, 1=ft + TSTOSS opt_units ; 0=m, 1=ft bra TFT_max_depth2_metric ;TFT_max_depth2_imperial: - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row call TFT_standard_color output_16_3 @@ -2759,14 +2752,14 @@ return TFT_max_depth2_metric: - WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw - WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row - call TFT_standard_color + WIN_MEDIUM dm_max_depth_column, dm_max_depth_row + TSTOSS opt_vsigraph ; 0=skip, 1=draw + WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row + call TFT_standard_color movlw .039 cpfslt hi - bra max_depth_greater_99_84mtr + bra max_depth_greater_99_84mtr btfsc max_depth_greater_100m ; Was depth>100m during last call rcall TFT_clear_max_depth ; Yes, clear depth area @@ -2774,7 +2767,7 @@ movlw .039 cpfslt hi - bra max_depth_greater_99_84mtr + bra max_depth_greater_99_84mtr movlw HIGH d'1000' movwf sub_a+1 @@ -2786,103 +2779,103 @@ movlw d'0' addwfc sub_b+1,F ; Add 1mbar offset call sub16 ; sub_c = sub_a - sub_b - movlw ' ' + movlw ' ' btfss neg_flag ; Depth lower then 10m? - movwf POSTINC2 ; Yes, add extra space - - clrf sub_a+1 + movwf POSTINC2 ; Yes, add extra space + + clrf sub_a+1 movlw d'99' movwf sub_a+0 movff hi,sub_b+1 movff lo,sub_b+0 call subU16 ; sub_c = sub_a - sub_b btfss neg_flag ; Depth lower then 1m? - bra tft_max_depth2 ; Yes, display manual Zero - - bsf ignore_digit4 ; no 0.1m - bsf leftbind + bra tft_max_depth2 ; Yes, display manual Zero + + bsf ignore_digit4 ; no 0.1m + bsf leftbind output_16 bra tft_max_depth3 tft_max_depth2: - WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw - WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row + WIN_MEDIUM dm_max_depth_column, dm_max_depth_row + TSTOSS opt_vsigraph ; 0=skip, 1=draw + WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row STRCAT "0" tft_max_depth3: call TFT_standard_color STRCAT_PRINT "" ; Display full meters - bcf leftbind + bcf leftbind ; .1m in SMALL font WIN_SMALL dm_max_depth_dm_column, dm_max_depth_dm_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_SMALL dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row - SAFE_2BYTE_COPY max_pressure, lo + SAFE_2BYTE_COPY max_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - PUTC "." + PUTC "." movlw d'4' movwf ignore_digits bsf ignore_digit5 - bsf leftbind + bsf leftbind output_16dp d'0' STRCAT_PRINT "" ; Display decimeters - bcf leftbind + bcf leftbind return -max_depth_greater_99_84mtr: ; Display only in full meters +max_depth_greater_99_84mtr: ; Display only in full meters btfss max_depth_greater_100m ; Is max depth>100m already? rcall TFT_clear_max_depth ; No, clear max depth area and set flag ; Max. Depth is already in hi:lo ; Show max. depth in Full meters ; That means ignore figure 4 and 5 - lfsr FSR2,buffer + lfsr FSR2,buffer bsf ignore_digit4 bsf leftbind output_16 bcf leftbind - STRCAT_PRINT "" ; Display full meters only - WIN_FONT FT_SMALL + STRCAT_PRINT "" ; Display full meters only + WIN_FONT FT_SMALL return -TFT_clear_max_depth: ; No, clear max. depth area and set flag - WIN_BOX_BLACK dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt ;top, bottom, left, right +TFT_clear_max_depth: ; No, clear max. depth area and set flag + WIN_BOX_BLACK dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt ;top, bottom, left, right bsf max_depth_greater_100m ; Set Flag return TFT_max_depth_apnoe: - btfss FLAG_active_descent ; Are we descending? - bra TFT_max_depth2 ; Yes, show normal max. + btfss FLAG_active_descent ; Are we descending? + bra TFT_max_depth2 ; Yes, show normal max. SAFE_2BYTE_COPY apnoe_max_pressure, lo - bra TFT_max_depth3 ; Show apnoe_max_pressure as max. depth + bra TFT_max_depth3 ; Show apnoe_max_pressure as max. depth global TFT_display_apnoe_last_max TFT_display_apnoe_last_max: - call TFT_divemask_color - WIN_TINY dm_apnoe_last_max_depth_text_col, dm_apnoe_last_max_depth_text_row - STRCPY_TEXT_PRINT tApnoeMax + call TFT_divemask_color + WIN_TINY dm_apnoe_last_max_depth_text_col, dm_apnoe_last_max_depth_text_row + STRCPY_TEXT_PRINT tApnoeMax call TFT_standard_color SAFE_2BYTE_COPY max_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - TSTOSS opt_units ; 0=m, 1=ft + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + TSTOSS opt_units ; 0=m, 1=ft bra TFT_display_apnoe_last_m_metric ;TFT_display_apnoe_last_max_imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row output_16 STRCAT_PRINT "" return TFT_display_apnoe_last_m_metric: - WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row - bsf ignore_digit5 ; do not display 1cm depth - output_16dp d'3' + WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row + bsf ignore_digit5 ; do not display 1cm depth + output_16dp d'3' STRCAT_PRINT "" return @@ -2890,87 +2883,87 @@ global TFT_divemins TFT_divemins: - bcf FLAG_TFT_divemins ; Clear flag + bcf FLAG_TFT_divemins ; Clear flag movff divemins+0,lo movff divemins+1,hi - ; Already showing divemins > 99min + ; Already showing divemins > 99min btfsc no_more_divesecs ; Ignore seconds? - bra TFT_divemins2 ; Show minutes only - - tstfsz hi ; hi = 0? + bra TFT_divemins2 ; Show minutes only + + tstfsz hi ; hi = 0? bra TFT_divemins_clr ; No, show mins only movlw .99 - cpfsgt lo ; bigger than 99? - bra TFT_divemins1 ; No show mins:secs + cpfsgt lo ; bigger than 99? + bra TFT_divemins1 ; No show mins:secs TFT_divemins_clr: ; Yes, remove second display for the rest of the dive and clear seconds - bsf no_more_divesecs ; Set flag + bsf no_more_divesecs ; Set flag ; Clear rest of seconds - WIN_BOX_BLACK dm_divetime_row, dm_divetime_bot, dm_divetime_column, dm_divetime_rgt ;top, bottom, left, right - bra TFT_divemins2 ; Show minutes only + WIN_BOX_BLACK dm_divetime_row, dm_divetime_bot, dm_divetime_column, dm_divetime_rgt ;top, bottom, left, right + bra TFT_divemins2 ; Show minutes only TFT_divemins1: - ; Print out the minutes, up to 99min, only 2chars ! + ; Print out the minutes, up to 99min, only 2chars ! call TFT_standard_color - WIN_MEDIUM dm_divetime_column, dm_divetime_row - output_99 ; displays only last two figures from a 8Bit value (0-99) - STRCAT_PRINT "" ; Show minutes in large font - - ; Print out the seconds - WIN_SMALL dm_divetime_secs_column, dm_divetime_secs_row ; left position for two sec figures - PUTC ':' + WIN_MEDIUM dm_divetime_column, dm_divetime_row + output_99 ; displays only last two figures from a 8Bit value (0-99) + STRCAT_PRINT "" ; Show minutes in large font + + ; Print out the seconds + WIN_SMALL dm_divetime_secs_column, dm_divetime_secs_row ; left position for two sec figures + PUTC ':' bsf leftbind - movff divesecs,lo + movff divesecs,lo output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font return TFT_divemins2: ; Full minutes only call TFT_standard_color WIN_MEDIUM dm_divetime_minsonly_column, dm_divetime_row - bcf leftbind - output_16_4 - STRCAT_PRINT "" ; Show minutes in large font - return - + bcf leftbind + output_16_4 + STRCAT_PRINT "" ; Show minutes in large font + return + global TFT_divemins_alternative TFT_divemins_alternative: - bcf FLAG_TFT_divemins ; Clear flag - call TFT_standard_color - ; Print out the minutes (0-999) in large - WIN_LARGE dm_divetime_alt_column, dm_divetime_alt_row - movff divemins+0,lo - movff divemins+1,hi - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_PRINT "" ; Show minutes - ; Print out the seconds in medium - WIN_MEDIUM dm_divetime_alt_column+.60, dm_divetime_alt_row+.25 - PUTC ":" - bsf leftbind - movff divesecs,lo - output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - return + bcf FLAG_TFT_divemins ; Clear flag + call TFT_standard_color + ; Print out the minutes (0-999) in large + WIN_LARGE dm_divetime_alt_column, dm_divetime_alt_row + movff divemins+0,lo + movff divemins+1,hi + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_PRINT "" ; Show minutes + ; Print out the seconds in medium + WIN_MEDIUM dm_divetime_alt_column+.60, dm_divetime_alt_row+.25 + PUTC ":" + bsf leftbind + movff divesecs,lo + output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font + return ;============================================================================= global TFT_display_apnoe_surface TFT_display_apnoe_surface: - call TFT_divemask_color - WIN_TINY dm_apnoe_surface_time_text_col, dm_apnoe_surface_time_text_row - STRCPY_TEXT_PRINT tApnoeSurface + call TFT_divemask_color + WIN_TINY dm_apnoe_surface_time_text_col, dm_apnoe_surface_time_text_row + STRCPY_TEXT_PRINT tApnoeSurface call TFT_standard_color - WIN_MEDIUM dm_apnoe_surface_time_column, dm_apnoe_surface_time_row + WIN_MEDIUM dm_apnoe_surface_time_column, dm_apnoe_surface_time_row movff apnoe_surface_mins,lo output_8 - PUTC ':' + PUTC ':' movff apnoe_surface_secs,lo output_99x STRCAT_PRINT "" @@ -2979,180 +2972,180 @@ global TFT_apnoe_clear_surface TFT_apnoe_clear_surface: ; Clear Surface timer.... - WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ;top, bottom, left, right + WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ;top, bottom, left, right return global TFT_display_apnoe_descent TFT_display_apnoe_descent: ; Descent divetime movff apnoe_mins,lo - clrf hi + clrf hi WIN_MEDIUM dm_divetime_apnoe_column, dm_divetime_apnoe_row - output_16_3 ; displays only last three figures from a 16Bit value (0-999) + output_16_3 ; displays only last three figures from a 16Bit value (0-999) call TFT_standard_color - STRCAT_PRINT "" ; Show minutes in large font - WIN_SMALL dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row ; left position for two sec figures - PUTC ':' + STRCAT_PRINT "" ; Show minutes in large font + WIN_SMALL dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row ; left position for two sec figures + PUTC ':' bsf leftbind movff apnoe_secs,lo output_99x - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - - call TFT_divemask_color - WIN_TINY dm_total_apnoe_text_column,dm_total_apnoe_text_row - STRCPY_TEXT_PRINT tApnoeTotal + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font + + call TFT_divemask_color + WIN_TINY dm_total_apnoe_text_column,dm_total_apnoe_text_row + STRCPY_TEXT_PRINT tApnoeTotal call TFT_standard_color movff divemins,lo - clrf hi - WIN_MEDIUM dm_apnoe_total_divetime_column, dm_apnoe_total_divetime_row - output_16_3 ; displays only last three figures from a 16Bit value (0-999) + clrf hi + WIN_MEDIUM dm_apnoe_total_divetime_column, dm_apnoe_total_divetime_row + output_16_3 ; displays only last three figures from a 16Bit value (0-999) call TFT_standard_color - STRCAT_PRINT "" ; Show minutes in large font - WIN_SMALL dm_apnoe_total_divetime_secs_col, dm_apnoe_total_divetime_secs_row ; left position for two sec figures - PUTC ':' + STRCAT_PRINT "" ; Show minutes in large font + WIN_SMALL dm_apnoe_total_divetime_secs_col, dm_apnoe_total_divetime_secs_row ; left position for two sec figures + PUTC ':' bsf leftbind movff divesecs,lo output_99x - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font return - + ;============================================================================= ; Writes ostc #Serial and Firmware version in splash screen global TFT_serial TFT_serial: - WIN_TINY .5,.225 - STRCPY "OSTC" ; Won't translate that... - - movlw 0x0A - cpfseq hardware_flag - bra TFT_serial2 - STRCAT "3 #" - bra TFT_serial_common + WIN_TINY .5,.225 + STRCPY "OSTC" ; Won't translate that... + + movlw 0x0A + cpfseq hardware_flag + bra TFT_serial2 + STRCAT "3 #" + bra TFT_serial_common TFT_serial2: - movlw 0x05 - cpfseq hardware_flag - bra TFT_serial3 - STRCAT " cR #" - bra TFT_serial_common + movlw 0x05 + cpfseq hardware_flag + bra TFT_serial3 + STRCAT " cR #" + bra TFT_serial_common TFT_serial3: - movlw 0x11 - cpfseq hardware_flag - bra TFT_serial4 - STRCAT "2 #" - bra TFT_serial_common + movlw 0x11 + cpfseq hardware_flag + bra TFT_serial4 + STRCAT "2 #" + bra TFT_serial_common TFT_serial4: - movlw 0x1A - cpfseq hardware_flag - bra TFT_serial5 - STRCAT "3 #" -; bra TFT_serial_common + movlw 0x1A + cpfseq hardware_flag + bra TFT_serial5 + STRCAT "3 #" +; bra TFT_serial_common TFT_serial5: TFT_serial_common: - rcall TFT_cat_serial - STRCAT " v" - WIN_COLOR color_greenish - rcall TFT_cat_firmware - - ifdef __DEBUG - movlw color_grey ; Write header in blue when - call TFT_set_color ; compiled in DEBUG mode... - STRCAT_PRINT "DEBUG" - else - STRCAT_PRINT "" - bcf win_invert ; Reset invert flag - call TFT_standard_color - - movlw softwareversion_beta ; =1: Beta, =0: Release - decfsz WREG,F - return ; Release version -> Return - - call TFT_warnings_color - WIN_LEFT .160-4*9/2 ; Right pad. - STRCPY_TEXT_PRINT tBeta - endif - call TFT_standard_color - bcf win_invert - return - + rcall TFT_cat_serial + STRCAT " v" + WIN_COLOR color_greenish + rcall TFT_cat_firmware + + ifdef __DEBUG + movlw color_grey ; Write header in blue when + call TFT_set_color ; compiled in DEBUG mode... + STRCAT_PRINT "DEBUG" + else + STRCAT_PRINT "" + bcf win_invert ; Reset invert flag + call TFT_standard_color + + movlw softwareversion_beta ; =1: Beta, =0: Release + decfsz WREG,F + return ; Release version -> Return + + call TFT_warnings_color + WIN_LEFT .160-4*9/2 ; Right pad. + STRCPY_TEXT_PRINT tBeta + endif + call TFT_standard_color + bcf win_invert + return + ;============================================================================= ; For the Information menu: append firmware x.yy version. - global info_menu_firmware - extern tFirmware + global info_menu_firmware + extern tFirmware info_menu_firmware: - lfsr FSR1,tFirmware - call strcat_text - rcall TFT_cat_firmware - ; Show language version - IFNDEF french_italian + lfsr FSR1,tFirmware + call strcat_text + rcall TFT_cat_firmware + ; Show language version + IFNDEF french_italian STRCAT "_en+de" ELSE STRCAT "_fr+it" - ENDIF - bcf win_invert ; Reset invert flag - return - - global TFT_cat_firmware + ENDIF + bcf win_invert ; Reset invert flag + return + + global TFT_cat_firmware TFT_cat_firmware: - movlw softwareversion_x - movwf lo - bsf leftbind - output_8 - PUTC '.' - movlw softwareversion_y - movwf lo - output_99x - bcf leftbind - ; Check firmware date - movlw firmware_expire_year-.1 - cpfsgt year ; > threshold? - return - movlw firmware_expire_month-.1 - cpfsgt month ; > threshold? - return - movlw firmware_expire_day-.1 - cpfsgt day ; > threshold? - return - - ; Show in "change firmware" style - movlw color_yellow - bcf win_invert - goto TFT_set_color ; and return... + movlw softwareversion_x + movwf lo + bsf leftbind + output_8 + PUTC '.' + movlw softwareversion_y + movwf lo + output_99x + bcf leftbind + ; Check firmware date + movlw firmware_expire_year-.1 + cpfsgt year ; > threshold? + return + movlw firmware_expire_month-.1 + cpfsgt month ; > threshold? + return + movlw firmware_expire_day-.1 + cpfsgt day ; > threshold? + return + + ; Show in "change firmware" style + movlw color_yellow + bcf win_invert + goto TFT_set_color ; and return... ;----------------------------------------------------------------------------- ; For the Information menu: append serial number - global info_menu_serial - extern tSerial + global info_menu_serial + extern tSerial info_menu_serial: - lfsr FSR1,tSerial - call strcat_text - global TFT_cat_serial + lfsr FSR1,tSerial + call strcat_text + global TFT_cat_serial TFT_cat_serial: - 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 - - bsf leftbind - output_16 - bcf leftbind - return + 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 + + bsf leftbind + output_16 + bcf leftbind + return ;----------------------------------------------------------------------------- ; For the Information menu: Append total dives - global info_menu_total_dives - extern tTotalDives + global info_menu_total_dives + extern tTotalDives info_menu_total_dives: - lfsr FSR1,tTotalDives - call strcat_text + lfsr FSR1,tTotalDives + call strcat_text TFT_cat_total_dives: read_int_eeprom .2 movff EEDATA,lo @@ -3160,145 +3153,108 @@ movff EEDATA,hi bsf leftbind output_16 - bcf leftbind - return + bcf leftbind + return ; For the Information menu: Append battery voltage - global info_menu_battery_volts - extern tBatteryV + global info_menu_battery_volts + extern tBatteryV info_menu_battery_volts: - lfsr FSR1,tBatteryV - call strcat_text - movff batt_voltage+1,hi - movff batt_voltage+0,lo + lfsr FSR1,tBatteryV + call strcat_text + movff batt_voltage+1,hi + movff batt_voltage+0,lo bsf leftbind - output_16dp .2 ; x.xxx - STRCAT "V(T" - movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah - output_8 - bcf leftbind - PUTC ")" - return - - ; For the Information menu: Append Uptime - global info_menu_uptime - extern tUptime + output_16dp .2 ; x.xxx + STRCAT "V(T" + movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + output_8 + bcf leftbind + PUTC ")" + return + + ; For the Information menu: Append Uptime + global info_menu_uptime + extern tUptime info_menu_uptime: - lfsr FSR1,tUptime - call strcat_text - movff uptime+0,xC+0 - movff uptime+1,xC+1 - movff uptime+2,xC+2 - movff uptime+3,xC+3 - movlw LOW .3600 - movwf xB+0 - movlw HIGH .3600 - movwf xB+1 ; One day = 3600s - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - ;xC+0:xC+1 -> Full hours - movff xC+1,xA+1 - movff xC+0,xA+0 - clrf xB+1 - movlw .24 - movwf xB+0 - call div16x16 ; xA/xB=xC with xA+0 as remainder - movff xC+0,lo - movff xC+1,hi ; Full days - bsf leftbind - output_16 - PUTC "d" - movff xA+0,lo ; Full hours - output_8 - PUTC "h" - bcf leftbind - return ; Done. - - extern tCalX,tCalY,tCalZ - global menu_cal_x -menu_cal_x: - lfsr FSR1,tCalX - call strcat_text - movff compass_CX_f+0,lo - movff compass_CX_f+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - bsf leftbind - output_16 - bcf leftbind - return - - global menu_cal_y -menu_cal_y: - lfsr FSR1,tCalY - call strcat_text - movff compass_CY_f+0,lo - movff compass_CY_f+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - bsf leftbind - output_16 - bcf leftbind - return - - global menu_cal_z -menu_cal_z: - lfsr FSR1,tCalZ - call strcat_text - movff compass_CZ_f+0,lo - movff compass_CZ_f+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - bsf leftbind - output_16 - bcf leftbind - return + lfsr FSR1,tUptime + call strcat_text + movff uptime+0,xC+0 + movff uptime+1,xC+1 + movff uptime+2,xC+2 + movff uptime+3,xC+3 + movlw LOW .3600 + movwf xB+0 + movlw HIGH .3600 + movwf xB+1 ; One day = 3600s + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + ;xC+0:xC+1 -> Full hours + movff xC+1,xA+1 + movff xC+0,xA+0 + clrf xB+1 + movlw .24 + movwf xB+0 + call div16x16 ; xA/xB=xC with xA+0 as remainder + movff xC+0,lo + movff xC+1,hi ; Full days + bsf leftbind + output_16 + PUTC "d" + movff xA+0,lo ; Full hours + output_8 + PUTC "h" + bcf leftbind + return ; Done. + + extern tCalX,tCalY,tCalZ + global menu_cal_x +menu_cal_x: + lfsr FSR1,tCalX + call strcat_text + movff compass_CX_f+0,lo + movff compass_CX_f+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + bsf leftbind + output_16 + bcf leftbind + return + + global menu_cal_y +menu_cal_y: + lfsr FSR1,tCalY + call strcat_text + movff compass_CY_f+0,lo + movff compass_CY_f+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + bsf leftbind + output_16 + bcf leftbind + return + + global menu_cal_z +menu_cal_z: + lfsr FSR1,tCalZ + call strcat_text + movff compass_CZ_f+0,lo + movff compass_CZ_f+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + bsf leftbind + output_16 + bcf leftbind + return ;----------------------------------------------------------------------------- ; ppO2 menu - global divesets_ppo2_max - extern tPPO2Max - extern tbar -divesets_ppo2_max: - lfsr FSR1,tPPO2Max - call strcat_text - movff char_I_ppO2_max,lo - movlw ppo2_warning_high - -divesets_ppo2_common: - movwf up ; Save default value - clrf hi - bsf leftbind - output_16dp d'3' - bcf leftbind - lfsr FSR1,tbar - call strcat_text - movf up,W ; Default value - cpfseq lo ; Current value - bra divesets_ppo2_common2 ; Not default, add * - return ; Default, Done. -divesets_ppo2_common2: - PUTC "*" - return ; Done. - - global divesets_ppo2_min - extern tPPO2MIN + extern tPPO2MIN divesets_ppo2_min: - lfsr FSR1,tPPO2MIN - call strcat_text + lfsr FSR1,tPPO2MIN + call strcat_text movff char_I_ppO2_min,lo - movlw ppo2_warning_low - bra divesets_ppo2_common - - - global divesets_ppo2_max_deco - extern tPPO2DECO -divesets_ppo2_max_deco: - lfsr FSR1,tPPO2DECO - call strcat_text - movff char_I_ppO2_max_deco,lo - movlw ppo2_warning_high_deco - bra divesets_ppo2_common - + movlw ppo2_warning_low_default + bra divesets_ppo2_common global divesets_ppo2_min_cc extern tPPO2MINCC @@ -3306,58 +3262,93 @@ lfsr FSR1,tPPO2MINCC call strcat_text movff char_I_ppO2_min_loop,lo - movlw ppo2_warning_low_cc + movlw ppo2_warning_loop_default + bra divesets_ppo2_common + + global divesets_ppo2_max + extern tPPO2Max + extern tbar +divesets_ppo2_max: + lfsr FSR1,tPPO2Max + call strcat_text + movff char_I_ppO2_max,lo + movlw ppo2_warning_high_default bra divesets_ppo2_common - -;============================================================================= - - global TFT_clear_warning_text -TFT_clear_warning_text: - btfss divemode ; in divemode? - bra TFT_clear_warning_text2 ; No, setup for surface mode - bcf FLAG_TFT_dive_warning_text_clear ; Clear flag - btfsc alternative_divelayout - bra TFT_clear_warning_text_2nd_row ; In Alt mode, clear only row 2 - WIN_BOX_BLACK dm_warning_row, dm_warning_bot, dm_warning_column, dm_warning_rgt ; top, bottom, left, right - return -TFT_clear_warning_text2: - WIN_BOX_BLACK surf_warning1_row, surf_warning2_row+.24, surf_warning1_column, surf_warning1_column+.76 ; top, bottom, left, right - return - - global TFT_clear_warning_text_2nd_row -TFT_clear_warning_text_2nd_row: - btfss divemode ; in divemode? - bra TFT_clear_warning_text_2nd_2 ; No, setup for surface mode - bcf FLAG_TFT_dive_warning_text_clr2 ; Clear flag - WIN_BOX_BLACK dm_warning2_row, dm_warning2_bot, dm_warning2_column, dm_warning2_rgt ; top, bottom, left, right - return -TFT_clear_warning_text_2nd_2: - WIN_BOX_BLACK surf_warning2_row, surf_warning2_row+.24, surf_warning2_column, surf_warning2_column+.76 ; top, bottom, left, right - return - - global TFT_fillup_with_spaces -TFT_fillup_with_spaces: ; Fillup FSR2 with spaces (Total string length in #WREG) - movwf lo ; save max. string length into lo - movf FSR2L,W ; Get current string length - subwf lo,F ; lo-WREG - btfsc STATUS,N ; longer then #lo already? - return ; Yes, done. - tstfsz lo ; Zero? - bra TFT_fillup_with_spaces2 ; No. - return ; Yes, done. -TFT_fillup_with_spaces2: - PUTC " " ; Add one space - decfsz lo,F ; All done? - bra TFT_fillup_with_spaces2 ; No, loop - return ; Done. + + global divesets_ppo2_max_deco + extern tPPO2DECO +divesets_ppo2_max_deco: + lfsr FSR1,tPPO2DECO + call strcat_text + movff char_I_ppO2_max_deco,lo + movlw ppo2_warning_deco_default + ;bra divesets_ppo2_common + +divesets_ppo2_common: + movwf up ; Save default value + clrf hi + bsf leftbind + output_16dp d'3' + bcf leftbind + lfsr FSR1,tbar + call strcat_text + movf up,W ; Default value + cpfseq lo ; Current value + bra divesets_ppo2_common2 ; Not default, add * + return ; Default, Done. +divesets_ppo2_common2: + PUTC "*" + return ; Done. ;============================================================================= - + + global TFT_clear_warning_text +TFT_clear_warning_text: + btfss divemode ; in divemode? + bra TFT_clear_warning_text2 ; No, setup for surface mode + bcf FLAG_TFT_dive_warning_text_clear ; Clear flag + btfsc alternative_divelayout + bra TFT_clear_warning_text_2nd_row ; In Alt mode, clear only row 2 + WIN_BOX_BLACK dm_warning_row, dm_warning_bot, dm_warning_column, dm_warning_rgt ; top, bottom, left, right + return +TFT_clear_warning_text2: + WIN_BOX_BLACK surf_warning1_row, surf_warning2_row+.24, surf_warning1_column, surf_warning1_column+.76 ; top, bottom, left, right + return + + global TFT_clear_warning_text_2nd_row +TFT_clear_warning_text_2nd_row: + btfss divemode ; in divemode? + bra TFT_clear_warning_text_2nd_2 ; No, setup for surface mode + bcf FLAG_TFT_dive_warning_text_clr2 ; Clear flag + WIN_BOX_BLACK dm_warning2_row, dm_warning2_bot, dm_warning2_column, dm_warning2_rgt ; top, bottom, left, right + return +TFT_clear_warning_text_2nd_2: + WIN_BOX_BLACK surf_warning2_row, surf_warning2_row+.24, surf_warning2_column, surf_warning2_column+.76 ; top, bottom, left, right + return + + global TFT_fillup_with_spaces +TFT_fillup_with_spaces: ; Fillup FSR2 with spaces (Total string length in #WREG) + movwf lo ; save max. string length into lo + movf FSR2L,W ; Get current string length + subwf lo,F ; lo-WREG + btfsc STATUS,N ; longer then #lo already? + return ; Yes, done. + tstfsz lo ; Zero? + bra TFT_fillup_with_spaces2 ; No. + return ; Yes, done. +TFT_fillup_with_spaces2: + PUTC " " ; Add one space + decfsz lo,F ; All done? + bra TFT_fillup_with_spaces2 ; No, loop + return ; Done. + +;============================================================================= + global TFT_desaturation_time TFT_desaturation_time: rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No STRCPY "Desat:" movff int_O_desaturation_time+0,lo movff int_O_desaturation_time+1,hi @@ -3371,20 +3362,20 @@ movff hi,lo ; Minutes output_99x bcf leftbind - movlw surf_warning_length ; Only use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - movlw .0 ; TODO - needed? - movff WREG,buffer+11 ; TODO - needed? + movlw surf_warning_length ; Only use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw .0 ; TODO - needed? + movff WREG,buffer+11 ; TODO - needed? STRCAT_PRINT "" - bcf win_invert + bcf win_invert return global TFT_nofly_time TFT_nofly_time: rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No movff char_I_altitude_wait,WREG tstfsz WREG bra TFT_nofly_time_1 @@ -3395,123 +3386,123 @@ TFT_nofly_time_2: movff int_O_nofly_time+0,lo movff int_O_nofly_time+1,hi - call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) + call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) bsf leftbind movf lo,W movff hi,lo - movwf hi ; exchange lo and hi... - output_8 ; Hours + movwf hi ; exchange lo and hi... + output_8 ; Hours PUTC ':' - movff hi,lo ; Minutes + movff hi,lo ; Minutes output_99x bcf leftbind - movlw surf_warning_length ; Only use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - movlw .0 ; TODO - needed? - movff WREG,buffer+11 ; TODO - needed? - STRCAT_PRINT "" - bcf win_invert + movlw surf_warning_length ; Only use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw .0 ; TODO - needed? + movff WREG,buffer+11 ; TODO - needed? + STRCAT_PRINT "" + bcf win_invert return ;============================================================================= - global TFT_warning_agf + global TFT_warning_agf TFT_warning_agf: rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warnings_color - STRCPY_TEXT tDiveaGF_active ; "aGF!" - movlw dm_warning_length ; Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - ;bcf win_invert - ;return + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_attention_color + STRCPY_TEXT tDiveaGF_active ; "aGF!" + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + ;bcf win_invert + ;return goto TFT_standard_color - global TFT_warning_fallback + global TFT_warning_fallback TFT_warning_fallback: ; Show fallback warning rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warnings_color + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_warnings_color STRCPY_TEXT tDiveFallback ; "Fallback!" - movlw dm_warning_length ; Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... global TFT_info_deco -TFT_info_deco ; show info when in decompression +TFT_info_deco: ; show info when in decompression rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; NO - return + tstfsz WREG ; Is there room for the warning? + return ; NO - return movlw color_green ; YES - select green text color - call TFT_set_color ; set color - STRCPY_TEXT tDecoInfo ; write "Deco Zone" - movlw dm_warning_length ; select Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" ; print buffer - goto TFT_standard_color ; and return... - - - global TFT_warning_gf -TFT_warning_gf: ; GF + call TFT_set_color ; set color + STRCPY_TEXT tDecoInfo ; write "Deco Zone" + movlw dm_warning_length ; select Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" ; print buffer + goto TFT_standard_color ; and return... + + + global TFT_warning_gf +TFT_warning_gf: ; GF rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No movff int_O_gradient_factor+0,lo ; bank-safe copy gradient factor movff int_O_gradient_factor+1,hi ; - TFT_color_code warn_gf ; Color-code Output - STRCPY "GF: " ; the two spaces are on purpose to align the output with other warnings' outputs - bsf leftbind + call TFT_color_code_gf ; Color-code Output + STRCPY "GF: " ; the two spaces are on purpose to align the output with other warnings' outputs + bsf leftbind output_8 ; print value of lo only, int_O_gradient_factor is limited to 255 - PUTC "%" - movlw dm_warning_length ; Divemode string length - btfss divemode ; In Divemode? - movlw surf_warning_length ; No, use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf leftbind - bcf win_invert - goto TFT_standard_color ; and return... + PUTC "%" + movlw dm_warning_length ; Divemode string length + btfss divemode ; In Divemode? + movlw surf_warning_length ; No, use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + bcf leftbind + bcf win_invert + goto TFT_standard_color ; and return... global TFT_warning_mbubbles TFT_warning_mbubbles: rcall TFT_warning_set_window ; sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; NO + tstfsz WREG ; Is there room for the warning? + return ; NO call TFT_attention_color ; set attention color as default movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings btfsc WREG,mbubble_warning ; are we in the microbubbles zone right now? call TFT_warnings_color ; YES - reconfigure to warning color STRCPY_TEXT tMicroBubbles - movlw dm_warning_length ; divemode string length - btfss divemode ; in Divemode? - movlw surf_warning_length ; NO - use surface string length - rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + movlw dm_warning_length ; divemode string length + btfss divemode ; in Divemode? + movlw surf_warning_length ; NO - use surface string length + rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... global TFT_warning_outside TFT_warning_outside: rcall TFT_warning_set_window ; sets the row and column for the current warning - tstfsz WREG ; is there room for the warning? - return ; NO + tstfsz WREG ; is there room for the warning? + return ; NO call TFT_attention_color movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings btfsc WREG,outside_warning ; are we outside the ZH-L16 model right now? call TFT_warnings_color ; YES - reconfigure to warning color - STRCPY "X-ZHL16-X" - movlw dm_warning_length ; divemode string length - btfss divemode ; in Divemode? - movlw surf_warning_length ; NO - use surface string length - rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + STRCPY "X-ZHL16-X" + movlw dm_warning_length ; divemode string length + btfss divemode ; in Divemode? + movlw surf_warning_length ; NO - use surface string length + rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... global TFT_warning_gas_needs_warn @@ -3519,22 +3510,22 @@ TFT_warning_gas_needs_warn: rcall TFT_warning_gas_needs_war_helper rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No call TFT_warnings_color bra TFT_warning_gas_needs_com TFT_warning_gas_needs_att: rcall TFT_warning_gas_needs_att_helper rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No call TFT_attention_color TFT_warning_gas_needs_com: STRCPY_TEXT tGasNeedsWarn ; "Gas Needs" - movlw dm_warning_length ; Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... TFT_warning_gas_needs_war_helper: incf warning_counter,F ; increase counter @@ -3551,34 +3542,34 @@ movlw .12 ; customview number one below gas needs view movwf menupos3 ; set fake current view number bsf toggle_customview ; initiate toggle of customview -> gas needs view will be shown - return + return global TFT_warning_IBCD TFT_warning_IBCD: rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No call TFT_attention_color ; select attention color as default STRCPY_TEXT tIBCD ; "IBCD N2He" - movlw dm_warning_length ; Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... - - - global TFT_warning_sensor_disagree -TFT_warning_sensor_disagree: ; Show sensor disagree warning + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_warning_sensor_disagree +TFT_warning_sensor_disagree: ; Show sensor disagree warning rcall TFT_warning_sensor_dis_helper rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warnings_color - STRCPY_TEXT tSensorDisagree ; "Sensors<>" - movlw dm_warning_length ; Divemode string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_warnings_color + STRCPY_TEXT tSensorDisagree ; "Sensors<>" + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... TFT_warning_sensor_dis_helper: btfsc sensor_warning ; is it a new warning? @@ -3587,252 +3578,252 @@ clrf menupos3 ; set fake current view number bsf toggle_customview ; initiate toggle of customview -> sensor view will be shown return - + ;============================================================================= - -TFT_warning_set_window: ; Sets the row and column for the current warning - ; ignore warning (now)? - decf warning_counter,W ; -1 - bcf STATUS,C - btfss alternative_divelayout ; In alt mode, do not divide... - rrcf WREG,W ; (warning_counter-1)/2 - cpfseq warning_page - retlw .255 ; WREG <> 0 -> Warning window not defined - call TFT_standard_color - btfss divemode ; in divemode? - bra TFT_warning_set_window3 ; No, setup for surface mode - btfss alternative_divelayout - bra TFT_warning_set_window3a ; standard layout - bra TFT_warning_set_window2a ; alternative layout (Only lower row used) -TFT_warning_set_window3a: - btfss warning_counter,0 ; Toggle with each warning - bra TFT_warning_set_window2 - WIN_SMALL dm_warning1_column, dm_warning1_row - bcf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined + +TFT_warning_set_window: ; Sets the row and column for the current warning + ; ignore warning (now)? + decf warning_counter,W ; -1 + bcf STATUS,C + btfss alternative_divelayout ; In alt mode, do not divide... + rrcf WREG,W ; (warning_counter-1)/2 + cpfseq warning_page + retlw .255 ; WREG <> 0 -> Warning window not defined + call TFT_standard_color + btfss divemode ; in divemode? + bra TFT_warning_set_window3 ; No, setup for surface mode + btfss alternative_divelayout + bra TFT_warning_set_window3a ; standard layout + bra TFT_warning_set_window2a ; alternative layout (Only lower row used) +TFT_warning_set_window3a: + btfss warning_counter,0 ; Toggle with each warning + bra TFT_warning_set_window2 + WIN_SMALL dm_warning1_column, dm_warning1_row + bcf second_row_warning ; =1: The second row contains a warning + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window2: - bsf second_row_warning ; =1: The second row contains a warning -TFT_warning_set_window2a: - WIN_SMALL dm_warning2_column, dm_warning2_row - retlw .0 ; WREG=0 -> Warning window defined + bsf second_row_warning ; =1: The second row contains a warning +TFT_warning_set_window2a: + WIN_SMALL dm_warning2_column, dm_warning2_row + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window3: - btfss warning_counter,0 ; Toggle with each warning - bra TFT_warning_set_window4 - WIN_SMALL surf_warning1_column,surf_warning1_row - bcf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined + btfss warning_counter,0 ; Toggle with each warning + bra TFT_warning_set_window4 + WIN_SMALL surf_warning1_column,surf_warning1_row + bcf second_row_warning ; =1: The second row contains a warning + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window4: - WIN_SMALL surf_warning2_column,surf_warning2_row - bsf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined + WIN_SMALL surf_warning2_column,surf_warning2_row + bsf second_row_warning ; =1: The second row contains a warning + retlw .0 ; WREG=0 -> Warning window defined global TFT_update_batt_percent_divemode TFT_update_batt_percent_divemode: rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery ; Color-code battery percent - STRCPY "Batt:" + tstfsz WREG ; Is there room for the warning? + return ; No + movff batt_percent,lo ; Get battery percent + call TFT_color_code_battery ; Color-code battery percent + STRCPY "Batt:" bsf leftbind output_8 bcf leftbind - PUTC "%" - movlw dm_warning_length ; Divemode string length - btfss divemode ; In Divemode? - movlw surf_warning_length ; No, use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf win_invert + PUTC "%" + movlw dm_warning_length ; Divemode string length + btfss divemode ; In Divemode? + movlw surf_warning_length ; No, use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + bcf win_invert goto TFT_standard_color ; and return... - global TFT_gf_mask ; Setup Mask + global TFT_gf_mask ; Setup Mask TFT_gf_mask: - ; The mask - call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tGFactors - WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row - STRCPY_TEXT_PRINT taGFactors - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tGFInfo - ; Show GF (Static) - call TFT_disabled_color - btfss use_agf - call TFT_standard_color - WIN_STD dm_custom_gf_column, dm_custom_gf_row - bsf leftbind - movff opt_GF_low,lo - output_8 - PUTC "/" - movff opt_GF_high,lo - output_8 - STRCAT_PRINT "" - ; Show aGF (Static) - call TFT_standard_color - TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater - bra TFT_gf_mask2 ; Show "---" instead - btfss use_agf - call TFT_disabled_color - WIN_STD dm_custom_agf_column, dm_custom_agf_row - movff opt_aGF_low,lo - output_8 - PUTC "/" - movff opt_aGF_high,lo - output_8 - STRCAT_PRINT "" - bcf leftbind - goto TFT_standard_color ; and return... + ; The mask + call TFT_divemask_color + WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tGFactors + WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row + STRCPY_TEXT_PRINT taGFactors + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tGFInfo + ; Show GF (Static) + call TFT_disabled_color + btfss use_agf + call TFT_standard_color + WIN_STD dm_custom_gf_column, dm_custom_gf_row + bsf leftbind + movff opt_GF_low,lo + output_8 + PUTC "/" + movff opt_GF_high,lo + output_8 + STRCAT_PRINT "" + ; Show aGF (Static) + call TFT_standard_color + TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater + bra TFT_gf_mask2 ; Show "---" instead + btfss use_agf + call TFT_disabled_color + WIN_STD dm_custom_agf_column, dm_custom_agf_row + movff opt_aGF_low,lo + output_8 + PUTC "/" + movff opt_aGF_high,lo + output_8 + STRCAT_PRINT "" + bcf leftbind + goto TFT_standard_color ; and return... TFT_gf_mask2: - WIN_STD dm_custom_agf_column+.10, dm_custom_agf_row - STRCPY_PRINT "---" - bcf leftbind - return - - - global TFT_gf_mask_cGF ; Setup Mask + WIN_STD dm_custom_agf_column+.10, dm_custom_agf_row + STRCPY_PRINT "---" + bcf leftbind + return + + + global TFT_gf_mask_cGF ; Setup Mask TFT_gf_mask_cGF: - ; The mask - call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tGFInfo - goto TFT_standard_color; and return... - - global TFT_gf_info ; Show GF informations + ; The mask + call TFT_divemask_color + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tGFInfo + goto TFT_standard_color ; and return... + + global TFT_gf_info ; Show GF informations TFT_gf_info: - WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row - movff int_O_gradient_factor+0,lo ; gradient factor absolute (Non-GF model) + WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row + movff int_O_gradient_factor+0,lo ; gradient factor absolute (Non-GF model) movff int_O_gradient_factor+1,hi - TFT_color_code warn_gf ; Color-code Output - output_8 ; print lo only, int_O_gradient_factor is limited to 255 - STRCAT_PRINT "%" - return - - - global TFT_battinfo_tissues_clock_mask ; Setup Mask + call TFT_color_code_gf ; Color-code Output + output_8 ; print lo only, int_O_gradient_factor is limited to 255 + STRCAT_PRINT "%" + return + + + global TFT_battinfo_tissues_clock_mask ; Setup Mask TFT_battinfo_tissues_clock_mask: - ; The mask - ; Put three columns at HUD positions - call TFT_divemask_color - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra TFT_battinfo_tissues_clock_mask2 ; Yes - btfsc FLAG_gauge_mode ; In Gauge mode? - bra TFT_battinfo_tissues_clock_mask2 ; Yes - WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row - STRCPY_TEXT_PRINT tDiveTissues -TFT_battinfo_tissues_clock_mask2: ; Show only clock - WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row - STRCPY_TEXT_PRINT tBatteryV ; "Battery: " - WIN_TINY dm_custom_clock_column, dm_custom_clock_title_row - STRCPY_TEXT_PRINT tDiveClock - goto TFT_standard_color ; and return... - - global TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock + ; The mask + ; Put three columns at HUD positions + call TFT_divemask_color + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra TFT_battinfo_tissues_clock_mask2 ; Yes + btfsc FLAG_gauge_mode ; In Gauge mode? + bra TFT_battinfo_tissues_clock_mask2 ; Yes + WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row + STRCPY_TEXT_PRINT tDiveTissues +TFT_battinfo_tissues_clock_mask2: ; Show only clock + WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row + STRCPY_TEXT_PRINT tBatteryV ; "Battery: " + WIN_TINY dm_custom_clock_column, dm_custom_clock_title_row + STRCPY_TEXT_PRINT tDiveClock + goto TFT_standard_color ; and return... + + global TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock TFT_battinfo_tissues_clock: - ; Update clock and date - WIN_SMALL dm_custom_clock_column, dm_custom_clock_row - call TFT_clock2 ; print clock - - ; Show Battery info - WIN_SMALL dm_custom_ead_column, dm_custom_ead_row - movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery ; Color-code battery percent - bsf leftbind - output_8 - bcf leftbind - STRCAT "% " - movlw 0x00 - movff WREG,buffer+4 ; Only "xxx%" - STRCAT_PRINT "" - bcf win_invert - call TFT_standard_color - WIN_SMALL dm_custom_end_column, dm_custom_end_row - movff batt_voltage+0,lo - movff batt_voltage+1,hi - bsf leftbind - output_16dp .2 - bcf leftbind - PUTC 'V' - movff buffer+5,buffer+4 - movlw 0x00 - movff WREG,buffer+5 ; Only "x.yzV" - STRCAT_PRINT "" - - btfsc FLAG_apnoe_mode ; In Apnoe mode? - return ; Yes, done. - btfsc FLAG_gauge_mode ; In Gauge mode? - return ; Yes, done. - - ; Show tissue diagram - call TFT_divemask_color - WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row - STRCPY_TEXT_PRINT tN2 - WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row - STRCPY_TEXT_PRINT tHe - bra DISP_tissue_saturation_graph ; Show char_O_tissue_N2_saturation and char_O_tissue_He_saturation and return... - - - global TFT_pscr_info_mask -TFT_pscr_info_mask: ; Show pSCR-ppO2, drop and lung ratio mask - rcall TFT_mask_ppo2 - call TFT_divemask_color - WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row - STRCPY_TEXT_PRINT tPSCR_O2_drop - WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row - STRCPY_TEXT_PRINT tPSCR_lungratio - goto TFT_standard_color ; and return... - - global TFT_pscr_info ; Show pSCR-ppO2, drop and lung ratio + ; Update clock and date + WIN_SMALL dm_custom_clock_column, dm_custom_clock_row + call TFT_clock2 ; print clock + + ; Show Battery info + WIN_SMALL dm_custom_ead_column, dm_custom_ead_row + movff batt_percent,lo ; Get battery percent + call TFT_color_code_battery ; Color-code battery percent + bsf leftbind + output_8 + bcf leftbind + STRCAT "% " + movlw 0x00 + movff WREG,buffer+4 ; Only "xxx%" + STRCAT_PRINT "" + bcf win_invert + call TFT_standard_color + WIN_SMALL dm_custom_end_column, dm_custom_end_row + movff batt_voltage+0,lo + movff batt_voltage+1,hi + bsf leftbind + output_16dp .2 + bcf leftbind + PUTC 'V' + movff buffer+5,buffer+4 + movlw 0x00 + movff WREG,buffer+5 ; Only "x.yzV" + STRCAT_PRINT "" + + btfsc FLAG_apnoe_mode ; In Apnoe mode? + return ; Yes, done. + btfsc FLAG_gauge_mode ; In Gauge mode? + return ; Yes, done. + + ; Show tissue diagram + call TFT_divemask_color + WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row + STRCPY_TEXT_PRINT tN2 + WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row + STRCPY_TEXT_PRINT tHe + bra DISP_tissue_saturation_graph ; Show char_O_tissue_N2_saturation and char_O_tissue_He_saturation and return... + + + global TFT_pscr_info_mask +TFT_pscr_info_mask: ; Show pSCR-ppO2, drop and lung ratio mask + rcall TFT_mask_ppo2 + call TFT_divemask_color + WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row + STRCPY_TEXT_PRINT tPSCR_O2_drop + WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row + STRCPY_TEXT_PRINT tPSCR_lungratio + goto TFT_standard_color ; and return... + + global TFT_pscr_info ; Show pSCR-ppO2, drop and lung ratio TFT_pscr_info: - ;show ppO2 - WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row + ;show ppO2 + WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row movff int_O_pSCR_ppO2+0,lo ; copy pSCR ppO2 to hi:lo movff int_O_pSCR_ppO2+1,hi - TFT_color_code warn_ppo2 ; color-code output + call TFT_color_code_ppo2 ; color-code output bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" - ; Show Drop - WIN_STD dm_custom_pscr_drop_column,dm_custom_pscr_drop_row + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + ; Show Drop + WIN_STD dm_custom_pscr_drop_column,dm_custom_pscr_drop_row call TFT_standard_color movff char_I_PSCR_drop,lo - bsf leftbind - output_8 - STRCAT_PRINT "%" - ; Show lung ratio - WIN_STD dm_custom_pscr_ratio_column,dm_custom_pscr_ratio_row - movff char_I_PSCR_lungratio,lo - bsf leftbind - STRCPY "1/" - output_8 - STRCAT_PRINT "" - bcf leftbind - return + bsf leftbind + output_8 + STRCAT_PRINT "%" + ; Show lung ratio + WIN_STD dm_custom_pscr_ratio_column,dm_custom_pscr_ratio_row + movff char_I_PSCR_lungratio,lo + bsf leftbind + STRCPY "1/" + output_8 + STRCAT_PRINT "" + bcf leftbind + return global TFT_gas_needs_mask TFT_gas_needs_mask: - call TFT_divemask_color - WIN_TINY dm_custom_dyn_gas_mask_column-.10,dm_custom_dyn_gas_mask_row - STRCPY_TEXT_PRINT tGasNeedsBar ; "Gas Needs (bar)" + call TFT_divemask_color + WIN_TINY dm_custom_dyn_gas_mask_column-.10,dm_custom_dyn_gas_mask_row + STRCPY_TEXT_PRINT tGasNeedsBar ; "Gas Needs (bar)" goto TFT_standard_color ; and return... global TFT_gas_needs -TFT_gas_needs: ; LIMITATION: there is only space for 4 gases on the screen - if 5 gases - bsf leftbind ; have a pres_need > 0, then only the first 4 will be shown! +TFT_gas_needs: ; LIMITATION: there is only space for 4 gases on the screen - if 5 gases + bsf leftbind ; have a pres_need > 0, then only the first 4 will be shown! clrf up - WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row1 + WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row1 call TFT_gas_needs_helper - WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row2 - call TFT_gas_needs_helper - WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row1 + WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row2 call TFT_gas_needs_helper - WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row2 - call TFT_gas_needs_helper + WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row1 + call TFT_gas_needs_helper + WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row2 + call TFT_gas_needs_helper bcf leftbind return @@ -3841,453 +3832,453 @@ movlw .5 ; number of gases cpfslt up ; check if all gases have been processed bra TFT_gas_needs_helper_1 ; yes -> clear display area - movf up,W ; no -> get gas number and check if need of that gas is > 0 + movf up,W ; no -> get gas number and check if need of that gas is > 0 rlncf WREG,W ; multipy by 2 - lfsr FSR1,int_O_tank_pres_need+1 ; read HIGH(int_O_tank_pres_need[up]) - movff PLUSW1,hi ; copy to temp storage hi + lfsr FSR1,int_O_tank_pres_need+1 ; read HIGH(int_O_tank_pres_need[up]) + movff PLUSW1,hi ; copy to temp storage hi btfss hi,int_is_zero ; check flag for pres_need == 0 bra TFT_gas_needs_helper_2 ; no -> print gas type and pressure needed incf up,F ; yes -> increment to next gas... bra TFT_gas_needs_helper ; ...and try the next gas TFT_gas_needs_helper_1: ; no gases to show anymore, clear display area from potential remains of last invocation - STRCAT_PRINT " ---- " ; overwrite outdated stuff if screen position is not needed + STRCAT_PRINT " ---- " ; overwrite outdated stuff if screen position is not needed return TFT_gas_needs_helper_2: ; output gas type and pressure needed - movf up,W ; get gas number (0-4) to WREG - lfsr FSR1,opt_gas_O2_ratio ; read opt_gas_O2_ratio[WREG] - movff PLUSW1,lo ; copy result to lo - movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg - lfsr FSR1,opt_gas_He_ratio ; read opt_gas_He_ratio[WREG] - movff PLUSW1,hi ; copy result to hi - call customview_show_mix ; print "Air", "O2", "21/35", etc. + movf up,W ; get gas number (0-4) to WREG + lfsr FSR1,opt_gas_O2_ratio ; read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; copy result to lo + movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg + lfsr FSR1,opt_gas_He_ratio ; read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; copy result to hi + call customview_show_mix ; print "Air", "O2", "21/35", etc. STRCAT ":" - movf up,W ; get gas number (0-4) to WREG + movf up,W ; get gas number (0-4) to WREG rlncf WREG,W ; multipy by 2 - lfsr FSR1,int_O_tank_pres_need+0 ; read lower part of integer - movff PLUSW1,lo - movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg + lfsr FSR1,int_O_tank_pres_need+0 ; read lower part of integer + movff PLUSW1,lo + movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg rlncf WREG,W ; multipy by 2 - lfsr FSR1,int_O_tank_pres_need+1 ; read upper part of integer - movff PLUSW1,hi - btfsc hi,int_prewarning_flag ; check if pre-warning flag is set (pres_need > pres_fill * threshold) + lfsr FSR1,int_O_tank_pres_need+1 ; read upper part of integer + movff PLUSW1,hi + btfsc hi,int_attention_flag ; check if attention flag is set (pres_need > pres_fill * threshold) call TFT_attention_color ; yes, print gas need in yellow - btfsc hi,int_warning_flag ; check if warning flag is set (pres_need > pres_fill) - call TFT_warnings_color ; yes, print gas need in red + btfsc hi,int_warning_flag ; check if warning flag is set (pres_need > pres_fill) + call TFT_warnings_color ; yes, print gas need in red movff int_O_tank_pres_need+1,WREG ; get HIGH(int_O_tank_pres_need[0]) which hold flag for invalid data btfsc WREG,int_invalid_flag ; check if invalid data flag is set call TFT_disabled_color ; yes, print gas need in disabled color - bcf hi,int_prewarning_flag ; clear pre-warning flag for attention color - bcf hi,int_warning_flag ; clear warning flag for warning color + bcf hi,int_attention_flag ; clear attention flag for attention color + bcf hi,int_warning_flag ; clear warning flag for warning color bcf hi,int_invalid_flag ; clear flag for invalid data (will actually only be set with 1st gas) - output_16_3 ; limit to 999 and display only (0-999) + output_16_3 ; limit to 999 and display only (0-999) STRCAT_PRINT " " ; adds a space to overwrite any potential remains of earlier outputs incf up,F ; increment to next gas - goto TFT_standard_color ; and return... - - - global TFT_mask_ppo2 ; helper function for several custom views + goto TFT_standard_color ; and return... + + + global TFT_mask_ppo2 ; helper function for several custom views TFT_mask_ppo2: - call TFT_divemask_color - btfss FLAG_ccr_mode ; in CCR mode? - bra TFT_mask_ppo2a ; NO - continue checking for pSCR and OC - btfsc is_bailout ; in bailout? - bra TFT_mask_ppo2b ; YES - WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text - STRCPY_TEXT_PRINT tppO2Dil ; print "ppO2(Dil)" - goto TFT_standard_color ; and return... + call TFT_divemask_color + btfss FLAG_ccr_mode ; in CCR mode? + bra TFT_mask_ppo2a ; NO - continue checking for pSCR and OC + btfsc is_bailout ; in bailout? + bra TFT_mask_ppo2b ; YES + WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text + STRCPY_TEXT_PRINT tppO2Dil ; print "ppO2(Dil)" + goto TFT_standard_color ; and return... TFT_mask_ppo2a: - btfss FLAG_pscr_mode ; in pSCR mode? - bra TFT_mask_ppo2b ; NO - continue with OC mode (or bailout) - btfsc is_bailout ; in bailout? - bra TFT_mask_ppo2b ; YES - WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text - STRCPY_TEXT_PRINT tppO2Mix ; print "ppO2(Mix)" - goto TFT_standard_color ; and return... + btfss FLAG_pscr_mode ; in pSCR mode? + bra TFT_mask_ppo2b ; NO - continue with OC mode (or bailout) + btfsc is_bailout ; in bailout? + bra TFT_mask_ppo2b ; YES + WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text + STRCPY_TEXT_PRINT tppO2Mix ; print "ppO2(Mix)" + goto TFT_standard_color ; and return... TFT_mask_ppo2b: ; OC mode or bailout - WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row ; normal position - STRCPY_TEXT_PRINT tppO2 ; in all other modes - goto TFT_standard_color ; and return... - + WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row ; normal position + STRCPY_TEXT_PRINT tppO2 ; in all other modes + goto TFT_standard_color ; and return... + + global TFT_display_pure_ppo2 ; show ppO2 of the pure gas - helper function for several custom views TFT_display_pure_ppo2: - WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row + WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row movff int_O_pure_ppO2+0,lo ; copy ppO2 of the pure gas to hi:lo movff int_O_pure_ppO2+1,hi - TFT_color_code warn_ppo2 ; color-code output + call TFT_color_code_ppo2 ; color-code output bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" goto TFT_standard_color ; and return... - - - global TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask + + + global TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask TFT_ppo2_ead_end_cns_mask: - rcall TFT_mask_ppo2 - call TFT_divemask_color - WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row - STRCPY_TEXT_PRINT tDiveEAD_END - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row - STRCPY_TEXT_PRINT tCNS2 - goto TFT_standard_color ; and return... - - global TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + rcall TFT_mask_ppo2 + call TFT_divemask_color + WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row + STRCPY_TEXT_PRINT tDiveEAD_END + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tCNS2 + goto TFT_standard_color ; and return... + + + global TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS TFT_ppo2_ead_end_cns: - ;show ppO2 - rcall TFT_display_pure_ppo2 ; show ppO2 of the pure gas - ; Show END/EAD - WIN_SMALL dm_custom_ead_column, dm_custom_ead_row - STRCPY_TEXT tEAD ; EAD: - movff char_O_EAD,lo - rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars - WIN_SMALL dm_custom_end_column, dm_custom_end_row - STRCPY_TEXT tEND ; END: - movff char_O_END,lo - rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars - ; Show CNS - WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; Displays only 0...999 - bcf leftbind - STRCAT_PRINT "%" - goto TFT_standard_color ; and return... - -TFT_end_ead_common: ; print "lo m" (or ft) and limit to 8 chars - bsf leftbind - TSTOSS opt_units ; 0=Meters, 1=Feets + ;show ppO2 + rcall TFT_display_pure_ppo2 ; show ppO2 of the pure gas + ; Show END/EAD + WIN_SMALL dm_custom_ead_column, dm_custom_ead_row + STRCPY_TEXT tEAD ; EAD: + movff char_O_EAD,lo + rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars + WIN_SMALL dm_custom_end_column, dm_custom_end_row + STRCPY_TEXT tEND ; END: + movff char_O_END,lo + rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars + ; Show CNS + WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; Displays only 0...999 + bcf leftbind + STRCAT_PRINT "%" + goto TFT_standard_color ; and return... + +TFT_end_ead_common: ; print "lo m" (or ft) and limit to 8 chars + bsf leftbind + TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_end_ead_common_metric ;TFT_end_ead_common_imperial: - movf lo,W ; With lo in m - mullw .100 ; PRODL:PRODH = mbar/min + movf lo,W ; With lo in m + mullw .100 ; PRODL:PRODH = mbar/min movff PRODL,lo movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16_3 - STRCAT_TEXT tFeets - clrf WREG - movff WREG,buffer+.8 ; limit string length to 8 - bra TFT_end_ead_common_exit + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16_3 + STRCAT_TEXT tFeets + clrf WREG + movff WREG,buffer+.8 ; limit string length to 8 + bra TFT_end_ead_common_exit TFT_end_ead_common_metric: - output_8 - STRCAT_TEXT tMeters + output_8 + STRCAT_TEXT tMeters TFT_end_ead_common_exit: - bcf leftbind - movlw .8 - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - return - - - global TFT_sensor_check_mask ; show ppO2 of O2 and Diluent mask + bcf leftbind + movlw .8 + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + return + + + global TFT_sensor_check_mask ; show ppO2 of O2 and Diluent mask TFT_sensor_check_mask: - call TFT_divemask_color - WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row - STRCPY_TEXT_PRINT tSensorCheck - WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row - STRCPY_TEXT_PRINT tppO2O2 - WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row - STRCPY_TEXT_PRINT tppO2Dil - goto TFT_standard_color ; and return... - - global TFT_sensor_check ; show ppO2 of O2 and Diluent + call TFT_divemask_color + WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row + STRCPY_TEXT_PRINT tSensorCheck + WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row + STRCPY_TEXT_PRINT tppO2O2 + WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row + STRCPY_TEXT_PRINT tppO2Dil + goto TFT_standard_color ; and return... + + global TFT_sensor_check ; show ppO2 of O2 and Diluent TFT_sensor_check: - ; Show ppO2 of O2 in this depth - WIN_MEDIUM dm_custom_s_check_ppo2_o2_column, dm_custom_s_check_value_row + ; Show ppO2 of O2 in this depth + WIN_MEDIUM dm_custom_s_check_ppo2_o2_column, dm_custom_s_check_value_row movff int_O_O2_ppO2+0,lo ; copy ppO2 of pure O2 to hi:lo movff int_O_O2_ppO2+1,hi - TFT_color_code warn_ppo2 ; color-code output + call TFT_color_code_ppo2 ; color-code output bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" - ; Show ppO2 of the diluent in this depth - WIN_MEDIUM dm_custom_s_check_ppo2_dil_col, dm_custom_s_check_value_row + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + ; Show ppO2 of the diluent in this depth + WIN_MEDIUM dm_custom_s_check_ppo2_dil_col, dm_custom_s_check_value_row movff int_O_pure_ppO2+0,lo ; copy ppO2 of pure gas to hi:lo movff int_O_pure_ppO2+1,hi - TFT_color_code warn_ppo2 ; color-code output + call TFT_color_code_ppo2 ; color-code output bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - STRCAT_PRINT "" + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" goto TFT_standard_color ; and return... ;============================================================================= - global TFT_surface_lastdive + global TFT_surface_lastdive TFT_surface_lastdive: - call TFT_divemask_color - WIN_TINY surf_gaslist_column,surf_gaslist_row+.5 - STRCAT_TEXT_PRINT tLastDive ; Last Dive: - WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)+.5 - STRCAT_TEXT_PRINT tDivetime ; Divetime - WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)+.5 - STRCAT_TEXT_PRINT tMaxDepth ; Max. Depth - call TFT_standard_color - WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row - + call TFT_divemask_color + WIN_TINY surf_gaslist_column,surf_gaslist_row+.5 + STRCAT_TEXT_PRINT tLastDive ; Last Dive: + WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)+.5 + STRCAT_TEXT_PRINT tDivetime ; Divetime + WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)+.5 + STRCAT_TEXT_PRINT tMaxDepth ; Max. Depth + call TFT_standard_color + WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row + movff int_O_desaturation_time+0,lo ; bank-safe copies movff int_O_desaturation_time+1,WREG iorwf lo,W ; check if desaturation time is zero - bz TFT_surface_lastdive_1 ; YES - show last dive time + bz TFT_surface_lastdive_1 ; YES - show last dive time movff surface_interval+0,lo ; NO - show dive interval movff surface_interval+1,hi - call convert_time ; lo=mins, hi=hours + call convert_time ; lo=mins, hi=hours movf hi,W movff lo,hi - movwf lo ; exchange lo and hi - bsf leftbind + movwf lo ; exchange lo and hi + bsf leftbind output_99x - PUTC 'h' + PUTC 'h' movff hi,lo output_99x STRCAT_PRINT "m " bra TFT_surface_lastdive_2 TFT_surface_lastdive_1: - movff lastdive_time+0,xC+0 - movff lastdive_time+1,xC+1 - movff lastdive_time+2,xC+2 - movff lastdive_time+3,xC+3 - movlw LOW .3600 - movwf xB+0 - movlw HIGH .3600 - movwf xB+1 ; One day = 3600s - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - ;xC+0:xC+1 -> Full hours - movff xC+1,xA+1 - movff xC+0,xA+0 - clrf xB+1 - movlw .24 - movwf xB+0 - call div16x16 ;xA/xB=xC with xA+0 as remainder - movff xC+0,lo - movff xC+1,hi ; Full days - bsf leftbind - output_16 - PUTC "d" - movff xA+0,lo ; Full hours - output_8 + movff lastdive_time+0,xC+0 + movff lastdive_time+1,xC+1 + movff lastdive_time+2,xC+2 + movff lastdive_time+3,xC+3 + movlw LOW .3600 + movwf xB+0 + movlw HIGH .3600 + movwf xB+1 ; One day = 3600s + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + ;xC+0:xC+1 -> Full hours + movff xC+1,xA+1 + movff xC+0,xA+0 + clrf xB+1 + movlw .24 + movwf xB+0 + call div16x16 ;xA/xB=xC with xA+0 as remainder + movff xC+0,lo + movff xC+1,hi ; Full days + bsf leftbind + output_16 + PUTC "d" + movff xA+0,lo ; Full hours + output_8 STRCAT_PRINT "h " TFT_surface_lastdive_2: - WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.1) - movff lastdive_duration+0,lo - movff lastdive_duration+1,hi - output_16 ; divetime minutes - PUTC ":" - movff lastdive_duration+2,lo - output_99x ; divetime seconds - STRCAT_PRINT "" - WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.2) - movff lastdive_maxdepth+0,lo - movff lastdive_maxdepth+1,hi - TSTOSS opt_units ; 0=Meters, 1=Feets - bra TFT_surface_lastdive_metric + WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.1) + movff lastdive_duration+0,lo + movff lastdive_duration+1,hi + output_16 ; divetime minutes + PUTC ":" + movff lastdive_duration+2,lo + output_99x ; divetime seconds + STRCAT_PRINT "" + WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.2) + movff lastdive_maxdepth+0,lo + movff lastdive_maxdepth+1,hi + TSTOSS opt_units ; 0=Meters, 1=Feets + bra TFT_surface_lastdive_metric ;imperial - rcall convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_TEXT tFeets1 - bra TFT_surface_lastdive2 + rcall convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_TEXT tFeets1 + bra TFT_surface_lastdive2 TFT_surface_lastdive_metric: - bsf ignore_digit5 ; no cm... - movlw d'1' ; +1 - movff WREG,ignore_digits ; no 1000m - output_16dp .3 ; xxx.y - STRCAT_TEXT tMeters + bsf ignore_digit5 ; no cm... + movlw d'1' ; +1 + movff WREG,ignore_digits ; no 1000m + output_16dp .3 ; xxx.y + STRCAT_TEXT tMeters TFT_surface_lastdive2: - STRCAT_PRINT "" - bcf leftbind - return ; Done. + STRCAT_PRINT "" + bcf leftbind + return ; Done. ;============================================================================= - - global TFT_surface_tissues -TFT_surface_tissues: ; Show Tissue diagram in surface mode - WIN_SMALL surf_tissue_N2_column,surf_tissue_N2_row - STRCPY_TEXT_PRINT tN2 - WIN_SMALL surf_tissue_He_column,surf_tissue_He_row - STRCPY_TEXT_PRINT tHe - - movlw color_deepblue - call TFT_set_color ; Make this configurable? - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.29,.29 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.37,.37 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.45,.45 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.53,.53 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.61,.61 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.69,.69 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.77,.77 - WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.85,.85 - WIN_FRAME_STD surf_tissue_diagram_top, surf_tissue_diagram_bottom, surf_tissue_diagram_left, surf_tissue_diagram_right ; outer frame + + global TFT_surface_tissues +TFT_surface_tissues: ; Show Tissue diagram in surface mode + WIN_SMALL surf_tissue_N2_column,surf_tissue_N2_row + STRCPY_TEXT_PRINT tN2 + WIN_SMALL surf_tissue_He_column,surf_tissue_He_row + STRCPY_TEXT_PRINT tHe + + movlw color_deepblue + call TFT_set_color ; Make this configurable? + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.29,.29 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.37,.37 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.45,.45 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.53,.53 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.61,.61 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.69,.69 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.77,.77 + WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.85,.85 + WIN_FRAME_STD surf_tissue_diagram_top, surf_tissue_diagram_bottom, surf_tissue_diagram_left, surf_tissue_diagram_right ; outer frame movlw .1 - movff WREG,win_height ; row bottom (0-239) - - ;---- Draw N2 Tissues ---------------------------------------------------- - - movlw surf_tissue_diagram_left+.4 ; start position for N2 bars - movff WREG,win_leftx2 ; column left (0-159) + movff WREG,win_height ; row bottom (0-239) + + ;---- Draw N2 Tissues ---------------------------------------------------- + + movlw surf_tissue_diagram_left+.4 ; start position for N2 bars + movff WREG,win_leftx2 ; column left (0-159) movlw surf_tissue_diagram_right - surf_tissue_diagram_left - .4 ; max width for N2 bars - movff WREG,win_width + movff WREG,win_width lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; row offset + movwf lo ; 16 tissues + clrf hi ; row offset surf_tissue_saturation_graph_N2: - movlw surf_tissue_diagram_top+.23 ; surface mode - addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - rcall surf_tissue_saturation_loop ; show one tissue - decfsz wait_temp,F + movlw surf_tissue_diagram_top+.23 ; surface mode + addwf hi,W + movff WREG,win_top ; row top (0-239) + rcall surf_tissue_saturation_loop ; show one tissue + decfsz lo,F bra surf_tissue_saturation_graph_N2 - ;---- Draw He Tissues ---------------------------------------------------- - + ;---- Draw He Tissues ---------------------------------------------------- + movlw surf_tissue_diagram_left + .24 ; start position for He bars (.15 without x2) - movff WREG,win_leftx2 ; column left (0-159) + movff WREG,win_leftx2 ; column left (0-159) movlw surf_tissue_diagram_right - surf_tissue_diagram_left - .24 ; max width for He bars - movff WREG,win_width - + movff WREG,win_width + lfsr FSR2, char_O_tissue_He_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; row offset + movwf lo ; 16 tissues + clrf hi ; row offset surf_tissue_saturation_graph_He: - movlw surf_tissue_diagram_top+.23+.57 ; surface mode - addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - rcall surf_tissue_saturation_loop ; show one tissue - decfsz wait_temp,F + movlw surf_tissue_diagram_top+.23+.57 ; surface mode + addwf hi,W + movff WREG,win_top ; row top (0-239) + rcall surf_tissue_saturation_loop ; show one tissue + decfsz lo,F bra surf_tissue_saturation_graph_He - - WIN_SMALL surf_tissue_He_column+.22,surf_tissue_He_row ; position in-between tissue bars + + WIN_SMALL surf_tissue_He_column+.22,surf_tissue_He_row ; position in-between tissue bars movff int_O_CNS_fraction+0,lo movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns - STRCPY_TEXT tCNS2 ; CNS: + call TFT_color_code_cns + STRCPY_TEXT tCNS2 ; CNS: bsf leftbind - output_16_3 ; Displays only 0...999 + output_16_3 ; Displays only 0...999 bcf leftbind STRCAT_PRINT "%" - goto TFT_standard_color ; and return... + goto TFT_standard_color ; and return... surf_tissue_saturation_loop: - call TFT_standard_color - movlw .2 ; row spacing - addwf waitms_temp,F - movf POSTINC2,W ; get tissue load + call TFT_standard_color + movlw .2 ; row spacing + addwf hi,F + movf POSTINC2,W ; get tissue load bcf WREG,7 ; clear flag bit for sat/desat info (not used in surface mode) rlncf WREG,W ; multiply with 2 (previously cleared bit 7 will be rotated to bit 0) incf WREG,W ; add 1 for a minimum visible bar (He-bars could be invisible else-wise) - movwf temp1 - movff win_width+0,WREG ; get max window width (win_width) - cpfslt temp1 ; skip if WREG < win_width - movwf temp1 ; crop length to win_width + movwf up + movff win_width+0,WREG ; get max window width (win_width) + cpfslt up ; skip if WREG < win_width + movwf up ; crop length to win_width ; no need to be able to draw longer bars – ; we are at the surface and if bars would ; even touch the max length possible here, ; the diver would be in severe decompression ; issues if not dead already... - movff temp1,win_bargraph - clrf win_width+1 - goto TFT_box ; and return... + movff up,win_bargraph + clrf win_width+1 + goto TFT_box ; and return... ;============================================================================= ; Draw saturation graph in dive mode. DISP_tissue_saturation_graph: - ;---- Draw Frame - call TFT_standard_color - WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159 ; outer frame + ;---- Draw Frame + call TFT_standard_color + WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159 ; outer frame movlw .1 - movff WREG,win_height ; row bottom (0-239) - - ;---- Draw N2 Tissues ---------------------------------------------------- - - movlw dm_custom_tissue_diagram_left+.3 ; divemode - movff WREG,win_leftx2 ; column left (0-159) - movlw .159-dm_custom_tissue_diagram_left-.4 ; width - movff WREG,win_width + movff WREG,win_height ; row bottom (0-239) + + ;---- Draw N2 Tissues ---------------------------------------------------- + + movlw dm_custom_tissue_diagram_left+.3 ; divemode + movff WREG,win_leftx2 ; column left (0-159) + movlw .159-dm_custom_tissue_diagram_left-.4 ; width + movff WREG,win_width lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; row offset + movwf lo ; 16 tissues + clrf hi ; row offset tissue_saturation_graph_N2: - movlw dm_custom_tissue_diagram_top+.3 ; divemode - rcall tissue_saturation_graph_loop ; show one tissue - decfsz wait_temp,F + movlw dm_custom_tissue_diagram_top+.3 ; divemode + rcall tissue_saturation_graph_loop ; show one tissue + decfsz lo,F bra tissue_saturation_graph_N2 - ;---- Draw He Tissues ---------------------------------------------------- - + ;---- Draw He Tissues ---------------------------------------------------- + movlw dm_custom_tissue_diagram_left + .8 ; divemode movff WREG,win_leftx2 ; column left (0-159) movlw .159 - dm_custom_tissue_diagram_left - .14 ; width movff WREG,win_width - + lfsr FSR2, char_O_tissue_He_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; row offset + movwf lo ; 16 tissues + clrf hi ; row offset tissue_saturation_graph_He: - movlw dm_custom_tissue_diagram_top+.3+.22 ; divemode - rcall tissue_saturation_graph_loop ; show one tissue - decfsz wait_temp,F + movlw dm_custom_tissue_diagram_top+.3+.22 ; divemode + rcall tissue_saturation_graph_loop ; show one tissue + decfsz lo,F bra tissue_saturation_graph_He goto TFT_standard_color ; and return... tissue_saturation_graph_loop: - addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - movlw color_cyan ; preset color for tissues with decreasing pressure - call TFT_set_color - incf waitms_temp,F + addwf hi,W + movff WREG,win_top ; row top (0-239) + movlw color_cyan ; preset color for tissues with decreasing pressure + call TFT_set_color + incf hi,F movf POSTINC2,W btfss WREG,7 ; check fs flag for increasing tissue pressure set bra tissue_saturation_graph_loop_1 ; NO - keep color - movwf temp1 ; YES - buffer WREG - movlw color_orange ; select color for tissues with increasing pressure - call TFT_set_color ; change color - movf temp1,W ; restore WREG + movwf up ; YES - buffer WREG + movlw color_orange ; select color for tissues with increasing pressure + call TFT_set_color ; change color + movf up,W ; restore WREG tissue_saturation_graph_loop_1: bcf WREG,7 ; clear flag bit - bcf STATUS,C - rrcf WREG ; divide by 2 + bcf STATUS,C + rrcf WREG ; divide by 2 incf WREG,W ; add a bit for a minimum visible bar - movwf temp1 - ;movlw .1 - ;addwf temp1,F ; add a bit for a minimum visible bar (old version) - movf win_width,W ; get max window width (win_width) - cpfslt temp1 ; skip if WREG < win_width - movwf temp1 - movff temp1,win_bargraph - clrf win_width+1 - goto TFT_box ; and return... + movwf up + movf win_width,W ; get max window width (win_width) + cpfslt up ; skip if WREG < win_width + movwf up + movff up,win_bargraph + clrf win_width+1 + goto TFT_box ; and return... ;============================================================================= global TFT_display_cns TFT_display_cns: call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - STRCPY_TEXT tCNS ; CNS: - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; Displays only 0...999 - bcf leftbind - PUTC "%" - movlw dm_warning_length ; Divemode string length - btfss divemode ; In Divemode? - movlw surf_warning_length ; No, use surface string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + tstfsz WREG ; Is there room for the warning? + return ; No + STRCPY_TEXT tCNS ; CNS: + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; Displays only 0...999 + bcf leftbind + PUTC "%" + movlw dm_warning_length ; Divemode string length + btfss divemode ; In Divemode? + movlw surf_warning_length ; No, use surface string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" bcf win_invert goto TFT_standard_color ; and return... @@ -4296,50 +4287,50 @@ global TFT_display_eod_cns TFT_display_eod_cns: call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No call TFT_warnings_color ; switch to warnings (red) text color STRCPY_TEXT tCNSeod ; end-of-dive CNS warning text - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" goto TFT_standard_color ; and return... - global TFT_display_ppo2 + global TFT_display_ppo2 TFT_display_ppo2: call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No + tstfsz WREG ; Is there room for the warning? + return ; No movff int_O_pure_ppO2+0,lo ; copy ppO2 of the pure gas (OC: = breathed gas, loop: = diluent/premix) to hi:lo movff int_O_pure_ppO2+1,hi - TFT_color_code warn_ppo2 ; Color-code output - btfss FLAG_ccr_mode ; in CCR mode? - bra TFT_display_diluent_1 ; NO - continue with pSCR or OC - btfsc is_bailout ; YES - in bailout? - bra TFT_display_diluent_2 ; YES - continue with OC - STRCPY_TEXT tdil ; NO - print "Dil:" - bra TFT_display_diluent_3 + call TFT_color_code_ppo2 ; Color-code output + btfss FLAG_ccr_mode ; in CCR mode? + bra TFT_display_diluent_1 ; NO - continue with pSCR or OC + btfsc is_bailout ; YES - in bailout? + bra TFT_display_diluent_2 ; YES - continue with OC + STRCPY_TEXT tdil ; NO - print "Dil:" + bra TFT_display_diluent_3 TFT_display_diluent_1: - btfss FLAG_pscr_mode ; in pSCR mode? - bra TFT_display_diluent_2 ; NO - continue with pSCR or OC - btfsc is_bailout ; YES - in bailout? - bra TFT_display_diluent_2 ; YES - continue with OC - STRCPY_TEXT tmix ; NO - print "Mix:" - bra TFT_display_diluent_3 + btfss FLAG_pscr_mode ; in pSCR mode? + bra TFT_display_diluent_2 ; NO - continue with pSCR or OC + btfsc is_bailout ; YES - in bailout? + bra TFT_display_diluent_2 ; YES - continue with OC + STRCPY_TEXT tmix ; NO - print "Mix:" + bra TFT_display_diluent_3 TFT_display_diluent_2: - STRCPY_TEXT tppO2 ; OC mode or bailout, print "ppO2:" + STRCPY_TEXT tppO2 ; OC mode or bailout, print "ppO2:" TFT_display_diluent_3: bsf leftbind - output_16dp .3 ; x.xx bar - bcf leftbind - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + output_16dp .3 ; x.xx bar + bcf leftbind + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" goto TFT_standard_color ; and return... - + ;============================================================================= - + global TFT_LogOffset_Logtitle TFT_LogOffset_Logtitle: STRCPY_TEXT tLogOffset @@ -4349,25 +4340,25 @@ output_16_4 bcf leftbind PUTC " " - return ; No "_PRINT" here... - + return ; No "_PRINT" here... + ;============================================================================= - + global adjust_depth_with_salinity - global adjust_depth_with_salinity_log + global adjust_depth_with_salinity_log adjust_depth_with_salinity: ; computes salinity setting into lo:hi [mbar] - btfsc simulatormode_active ; Do not apply salinity in Simulatormode + btfsc simulatormode_active ; Do not apply salinity in simulator mode return - movff opt_salinity,WREG ; 0-5% + movff opt_salinity,WREG ; 0-5% adjust_depth_with_salinity_log: ; computes salinity setting (FROM WREG!) into lo:hi [mbar] - addlw d'100' ; 1.00kg/l - movwf wait_temp - + addlw d'100' ; 1.00kg/l + movwf up + movlw d'105' ; 105% ? - cpfslt wait_temp ; Salinity higher limit + cpfslt up ; Salinity higher limit return ; Out of limit, do not adjust lo:hi movlw d'99' ; 99% ? - cpfsgt wait_temp ; Salinity lower limit + cpfsgt up ; Salinity lower limit return ; Out of limit, do not adjust lo:hi movff lo,xA+0 @@ -4377,77 +4368,77 @@ movwf xB+0 clrf xB+1 call mult16x16 ; xA*xB=xC (lo:hi * 100) - movff wait_temp,xB+0 ; Salinity + movff up,xB+0 ; Salinity clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo movff xC+1,hi ; restore lo and hi with updated value return ;============================================================================= - - global convert_mbar_to_feet ; convert value in lo:hi from mbar to feet -convert_mbar_to_feet: ; convert value in lo:hi from mbar to feet + + global convert_mbar_to_feet ; convert value in lo:hi from mbar to feet +convert_mbar_to_feet: ; convert value in lo:hi from mbar to feet movff lo,xA+0 movff hi,xA+1 - movlw LOW d'328' ; 328feet/100m + movlw LOW d'328' ; 328feet/100m movwf xB+0 - movlw HIGH d'328' + movlw HIGH d'328' movwf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 328) - - movlw d'50' ; round up + call mult16x16 ; xA*xB=xC (lo:hi * 328) + + movlw d'50' ; round up addwf xC+0,F movlw 0 addwfc xC+1,F addwfc xC+2,F addwfc xC+3,F - movlw LOW .10000 - movwf xB+0 - movlw HIGH .10000 - movwf xB+1 - - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movlw LOW .10000 + movwf xB+0 + movlw HIGH .10000 + movwf xB+1 + + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value + movff xC+1,hi ; restore lo and hi with updated value return ;============================================================================= - global convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit -convert_celsius_to_fahrenheit: ; convert value in lo:hi from celsius to fahrenheit - movff lo,xA+0 ; temperature in 1/10 of °C - movff hi,xA+1 - - movlw LOW d'1000' ; offset °C value by 1000 to get out of any negative numbers - addwf xA+0,F - movlw HIGH d'1000' - addwfc xA+1,F - - movlw d'18' ; adjust scaling: 1°C = 1.8°F - movwf xB+0 - clrf xB+1 - - call mult16x16 ; xA*xB=xC (lo:hi * 18) - - movlw d'10' - movwf xB+0 - clrf xB+1 - - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - - movlw LOW d'1480' ; adjust offset: subtract above offset of 1000 * 1.8 = 1800 now and add 320 => subtract 1480 - subwf xC+0,F - movlw HIGH d'1480' - subwfb xC+1,F - - movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value - return + global convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit +convert_celsius_to_fahrenheit: ; convert value in lo:hi from celsius to fahrenheit + movff lo,xA+0 ; temperature in 1/10 of °C + movff hi,xA+1 + + movlw LOW d'1000' ; offset °C value by 1000 to get out of any negative numbers + addwf xA+0,F + movlw HIGH d'1000' + addwfc xA+1,F + + movlw d'18' ; adjust scaling: 1°C = 1.8°F + movwf xB+0 + clrf xB+1 + + call mult16x16 ; xA*xB=xC (lo:hi * 18) + + movlw d'10' + movwf xB+0 + clrf xB+1 + + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + + movlw LOW d'1480' ; adjust offset: subtract above offset of 1000 * 1.8 = 1800 now and add 320 => subtract 1480 + subwf xC+0,F + movlw HIGH d'1480' + subwfb xC+1,F + + movff xC+0,lo + movff xC+1,hi ; restore lo and hi with updated value + return ;============================================================================= diff -r f5de1ff88814 -r b455b31ce022 src/tft_outputs.inc --- a/src/tft_outputs.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/tft_outputs.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.inc REFACTORED VERSION V2.94 +; File tft_outputs.inc REFACTORED VERSION V2.97 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,41 +8,34 @@ ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code -; Macros - extern TFT_color_code1 -TFT_color_code macro color_code_temp - movlw color_code_temp - call TFT_color_code1 - endm - ; Surface mode extern TFT_surface_lastdive - extern TFT_show_OC_startgas_surface ; Show first gas and "OSTC2-like" active gases + extern TFT_show_OC_startgas_surface ; Show first gas and "OSTC2-like" active gases extern TFT_serial extern TFT_clock extern TFT_date extern TFT_desaturation_time extern TFT_nofly_time extern TFT_gaslist_surfmode - extern TFT_dillist_surfmode - extern TFT_splist_surfmode ; Show Setpoint list + extern TFT_dillist_surfmode + extern TFT_splist_surfmode ; Show Setpoint list extern TFT_temp_surfmode extern TFT_update_batt_voltage extern TFT_display_decotype_surface - extern TFT_display_decotype_surface1 ; Used from logbook! + extern TFT_display_decotype_surface1 ; Used from logbook! extern TFT_update_surf_press - extern TFT_surface_sensor ; Update HUD data in surface mode - extern TFT_sensor_surface_warning - extern TFT_menu_calibrate ; Update mV data in menu - extern TFT_custom_text ; The custom text - extern TFT_surface_tissues ; Show Tissue diagram in surface mode - extern TFT_surface_decosettings ; Show all deco settings - extern TFT_cat_serial ; Add serial to current string - extern TFT_cat_firmware ; Add firmware version to current string + extern TFT_surface_sensor ; Update HUD data in surface mode + extern TFT_sensor_surface_warning + extern TFT_menu_calibrate ; Update mV data in menu + extern TFT_custom_text ; The custom text + extern TFT_surface_tissues ; Show Tissue diagram in surface mode + extern TFT_surface_decosettings ; Show all deco settings + extern TFT_cat_serial ; Add serial to current string + extern TFT_cat_firmware ; Add firmware version to current string ; Menu extern TFT_LogOffset_Logtitle - extern TFT_show_color_schemes ; Yes, update the color schemes + extern TFT_show_color_schemes ; Yes, update the color schemes ; Dive mode extern TFT_display_cns @@ -69,36 +62,36 @@ extern TFT_display_apnoe_surface extern TFT_display_apnoe_last_max extern TFT_display_ftts - extern TFT_clear_warning_text - extern TFT_clear_warning_text_2nd_row - extern TFT_warning_gf - extern TFT_update_ppo2_sensors ; Update Sensor data - extern TFT_hud_mask ; The HUD mask - extern TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch - extern TFT_update_avr_stopwatch ; Update average depth and stopwatch - extern TFT_decoplan ; Decoplan - extern TFT_clear_divemode_menu ; Clear the divemode menu - extern TFT_draw_gassep_line ; Draw the gas separator grid line in spec mode only - extern TFT_divemode_menu_cursor ; the divemode cursor - extern TFT_battinfo_tissues_clock_mask ; Setup Mask - extern TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock - extern TFT_gf_mask ; Setup Mask - extern TFT_gf_mask_cGF ; Setup Mask - current GF only - extern TFT_gf_info ; Show GF informations - extern TFT_warning_agf ; Show a warning if aGF is selected - extern TFT_divetimeout ; Show timeout counter - extern TFT_show_safety_stop ; Show the safety stop - extern TFT_clear_decoarea ; Cleanup deco area on screen - extern TFT_ceiling_mask ; The ceiling mask - extern TFT_ceiling ; Ceiling - extern TFT_clear_safety_stop ; Clear safety stop - extern TFT_warning_fallback ; Show fallback warning - extern TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask - extern TFT_sensor_check ; Show ppO2 of O2 and Diluent - extern TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask - extern TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS - extern TFT_pscr_info_mask ; Show ppO2, drop and lung ratio mask - extern TFT_pscr_info ; Show ppO2, drop and lung ratio + extern TFT_clear_warning_text + extern TFT_clear_warning_text_2nd_row + extern TFT_warning_gf + extern TFT_update_ppo2_sensors ; Update Sensor data + extern TFT_hud_mask ; The HUD mask + extern TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + extern TFT_update_avr_stopwatch ; Update average depth and stopwatch + extern TFT_decoplan ; Decoplan + extern TFT_clear_divemode_menu ; Clear the divemode menu + extern TFT_draw_gassep_line ; Draw the gas separator grid line in spec mode only + extern TFT_divemode_menu_cursor ; the divemode cursor + extern TFT_battinfo_tissues_clock_mask ; Setup Mask + extern TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock + extern TFT_gf_mask ; Setup Mask + extern TFT_gf_mask_cGF ; Setup Mask - current GF only + extern TFT_gf_info ; Show GF informations + extern TFT_warning_agf ; Show a warning if aGF is selected + extern TFT_divetimeout ; Show timeout counter + extern TFT_show_safety_stop ; Show the safety stop + extern TFT_clear_decoarea ; Cleanup deco area on screen + extern TFT_ceiling_mask ; The ceiling mask + extern TFT_ceiling ; Ceiling + extern TFT_clear_safety_stop ; Clear safety stop + extern TFT_warning_fallback ; Show fallback warning + extern TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask + extern TFT_sensor_check ; Show ppO2 of O2 and Diluent + extern TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask + extern TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + extern TFT_pscr_info_mask ; Show ppO2, drop and lung ratio mask + extern TFT_pscr_info ; Show ppO2, drop and lung ratio extern TFT_gas_needs_mask extern TFT_gas_needs extern TFT_warning_gas_needs_warn @@ -115,23 +108,26 @@ extern TFT_show_mode_divemode ; Misc - extern TFT_standard_color - extern TFT_disabled_color - extern TFT_attention_color - extern TFT_warnings_color - extern TFT_divemask_color - extern adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - extern adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] - extern TFT_convert_date_short - extern TFT_convert_signed_16bit - extern TFT_convert_date - extern TFT_debug_output - extern TFT_show_time_date_menu - extern convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - extern convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit - + extern TFT_standard_color + extern TFT_disabled_color + extern TFT_attention_color + extern TFT_warnings_color + extern TFT_divemask_color + extern adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + extern adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] + extern TFT_convert_date_short + extern TFT_convert_signed_16bit + extern TFT_convert_date + extern TFT_debug_output + extern TFT_show_time_date_menu + extern convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + extern convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit + extern TFT_color_code_gas + extern TFT_color_code_gaslist + extern TFT_color_code_cns + ; Alt dive mode (aka Blind mode) - extern TFT_divemins_alternative - extern TFT_divemode_mask_alternative - extern TFT_max_depth_alternative - extern TFT_big_deco_alt ; The big deco \ No newline at end of file + extern TFT_divemins_alternative + extern TFT_divemode_mask_alternative + extern TFT_max_depth_alternative + extern TFT_big_deco_alt ; The big deco diff -r f5de1ff88814 -r b455b31ce022 src/wait.asm --- a/src/wait.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/wait.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,8 +1,8 @@ ;============================================================================= ; -; File wait.asm +; File wait.asm V2.98 ; -; Wait routines +; Wait routines ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= @@ -10,28 +10,30 @@ ; 2004-01-31 : [chsw] Initial version. ; 2007-05-11 : Updated (OSTC code). ; 2011-10-18 : [mH] Timings tested with oscilloscope - + #include "hwos.inc" -basic CODE +basic CODE -; ========================================================== -; WAIT 1 MILLISECOND (Not exact: 1,008ms +/- 30,5µs + worst case ISR latency) -; ========================================================== +; ============================================================================= +; WAIT 1 MILLISECOND (Not exact: 1,008ms +/- 30,5µs + worst case ISR latency) +; ============================================================================= - global WAITMSX -WAITMSX movwf waitms_temp - -WAITMSX2 setf TMR5H - movlw .255-.32 ;32 x 31,5µs = 1,008ms - movwf TMR5L - bcf PIR5,TMR5IF ; Clear flag -WAITMSX3 btfss PIR5,TMR5IF - bra WAITMSX3 ; Wait loop - decfsz waitms_temp,F - bra WAITMSX2 - return + global WAITMSX +WAITMSX: + movwf wait_counter +WAITMSX2: + setf TMR5H + movlw .255-.32 ;32 x 31,5µs = 1,008ms + movwf TMR5L + bcf PIR5,TMR5IF ; Clear flag +WAITMSX3: + btfss PIR5,TMR5IF + bra WAITMSX3 ; Wait loop + decfsz wait_counter,F + bra WAITMSX2 + return ;============================================================================= - END \ No newline at end of file + END \ No newline at end of file diff -r f5de1ff88814 -r b455b31ce022 src/wait.inc --- a/src/wait.inc Sun Feb 25 18:25:38 2018 +0100 +++ b/src/wait.inc Mon Feb 26 16:40:28 2018 +0100 @@ -1,8 +1,8 @@ ;============================================================================= ; -; File wait.asm +; File wait.asm V2.98 ; -; Wait routines +; Wait routines ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= @@ -10,14 +10,15 @@ ; 2004-01-31 : [chsw] Initial version. ; 2007-05-11 : Updated (OSTC code). ; 2011-06-24 : [MH] Added clock speeds. - + ;============================================================================= -WAITMS macro waitms_temp - movlw waitms_temp - call WAITMSX - endm - extern WAITMSX +WAITMS macro ms_to_wait + movlw ms_to_wait + extern WAITMSX + call WAITMSX + endm + ; asm routines in hwos.asm extern speed_eco ; SPEED_ECO: 4MHz diff -r f5de1ff88814 -r b455b31ce022 tools/dev_ostc3_firmware.hex --- a/tools/dev_ostc3_firmware.hex Sun Feb 25 18:25:38 2018 +0100 +++ b/tools/dev_ostc3_firmware.hex Mon Feb 26 16:40:28 2018 +0100 @@ -1,7682 +1,7682 @@ -:00000062010c9e4ef660df4437252402045235 -:000010419b7942f47a8642b72fda4f5c26f255 -:000020c9fac14114f5dc9a03ecdd04eb85e6f1 -:000030bb0c5bef0b968a173939fc317d9c3bdc -:000040d7ba6f3c9874a4cab6946df4c998374b -:00005019e8232df02d2af9e1a53bf6288af588 -:0000608848e7260c7a4f0df40197b4b47ee04d -:00007079f5867c3dfdd3bd439e33ef4d7790f2 -:000080658355b300f9e395a0f457d684412153 -:0000904a968660145089d7f2f0f4c5fa53b371 -:0000a0a50a62cb0ddca611b08e740865d33478 -:0000b01b9827a605250b702adfcd1b355ca5e4 -:0000c0ffb76b1b5c0cc3fc72e8be5b33841c7e -:0000d0acbc542fa087c80de564292b2d4dd493 -:0000e07ddb3fa705d2e855eaf0fba50c4f2eb6 -:0000f001112e6b3fb11af85cdfc677da158f5c -:000100fcdb60941ccdd2654ea6f9cf8e51fc21 -:00011063cd6babda18dd075838be285cbcdfe2 -:00012015f8038c8782ea20c83f8718fd67713a -:0001301ab36abb30eddede7d5d9ef35aefebc2 -:0001407e4ce26263426dbabe64134b69abea10 -:000150ad32e3d7963edacf123921d66ac48f51 -:000160e7d351978a6cc48973e81e7646ccf3ef -:00017031df28fa94d5a43438591fdd4b1483b8 -:00018031bef074a41a25f272825df4bb48a415 -:0001904fc80a617faf7f0834d1d67537e2c93c -:0001a0903320757a92e3311dee1ef0f3995801 -:0001b0ace8f65a51f958e192858a957bdba87f -:0001c0d65e8425a3d6ebdcc7131928a1451561 -:0001d041f77e2bd08825ffcab397417b5dcb8c -:0001e0257227ea0a1bbe3a3056bca396fda458 -:0001f0fb225002b7a141ffd6a9504ecbe5544c -:000200a73752fdaf24e624e40b1ee6788c0d4c -:00021053ced0930cfd42c902f75f1752f042fe -:00022053760bc41abdbe20699747a5739daa87 -:00023096c790846639a631368f057d2352b458 -:000240a5f29ed1c0208649b1d44e5ae83de345 -:000250de0e02d5ba21b3ca4292cb3e8d52afc6 -:000260ed99efd75e0f0601c7d7e15d77c6c179 -:0002706a1eb76f058ad3939fd15a0a5c319ca8 -:000280d73d48161faa922d73c327a69f586046 -:000290c7450abe0e593fcf6bcb5748306b971c -:0002a0e11a81879abbf225364ea2aacdd26837 -:0002b08e00c556052b1700402ddde4856d7516 -:0002c0e3f0796f751b3535130b860141f9b246 -:0002d06db94ce0b379d0cc928ef812c73ef49e -:0002e0eb74b6f11cd1844b0a0282d8088485a3 -:0002f0e4cab8cb05ae1bad9639efb0462eb39d -:0003002904b5149d644f42f319127c2d20dd9b -:000310b7043c79e7f68e3506993ca3e247f0af -:00032009b92c189565591a883be0709c28b16a -:000330a6b03612a0f1b04e3fceebbca6f6d426 -:0003403f618976e8587fc7e0d24a0ed1c5d06b -:00035016aa1e4d75fb1384422dfd96e08d81db -:000360cb6505083188a9d73995a466a30aedbe -:000370a71eafc47d564de582f24d6d6df1d9bc -:0003807ccd6bfa7e7406fe5ea6b3a3df335833 -:000390733d6d8996734eddee8b70a4dee6f621 -:0003a09a721a89f330500c6f1298eb78694d4d -:0003b091d9e6f108ccdf2ecbdd80fcbc304e8d -:0003c099d75fc38c8fa39664805d2469a8f8ce -:0003d0fbd2f943b80b1ce9ad67b09a51f3d3af -:0003e0751da4cf0092e758f21706ab6a7fbb44 -:0003f04797f272df23c2628bdaa54e59fa54df -:0004002adc3f42dece98baeb4703f496284478 -:0004109f407d528c0ba3dfbdafd7c617516fd7 -:000420c5308d7f00f8b1f685d7c3068c20cee9 -:000430fd622bef007722f56f312f253a41aa45 -:00044089c5d0405fb5286b66f1c69eaac71f60 -:000450585aed887bb03151d62d5f239aef95b3 -:0004605afc0d5b6c85980fdf112706fb2edc49 -:000470adf2c3a3a107b2da3ef272155fa0c9a4 -:0004809455bf1252b0f46c1b58104d99516d72 -:000490d04d6dfc3eff9bdb12d5a461a723ad6f -:0004a01307ff35f3a568dba9982c63eef3751e -:0004b067487e902ce144b8de0b0ba5fee7c0ed -:0004c081ca30b4d2317da167ec406ecd5ab554 -:0004d0094657b09a08623031bc64991505d8a7 -:0004e0b53c7580aacb2ee4cd7b49d2b3f70030 -:0004f09d5ace41f1423bb7ceb03c8f53d17164 -:000500bb5054e72196c2a0c6393b678fd8fdcd -:000510292a570461d2deeb8641370a1e6bee5a -:0005204a5a502185dc34ad3377c1a3ea9e47cf -:000530735c2edc1053bc89536d9882f4685063 -:00054080f37c417716cacc5ed8cbb1da7b25a4 -:00055066d13c8e526346a81f4b5d5f24c02880 -:000560e958cff789d4c17aa0204c00bbe100e7 -:000570d36acb7773f18e3cfb12f1a83788f3e1 -:00058066cef2d284cddde666b74bbdcd3b6472 -:0005908ac0aca5c6a169b84d361b72d5ea1cf7 -:0005a0c77c4ca19c8896d5270a9e6d49fb8883 -:0005b0b577764cff9e4853976fa2613ba7d53e -:0005c044439b78884330586c1bbfafe88b5da7 -:0005d0b167c6efb43b03c3b95648f5731f4396 -:0005e00c632165d598e33395818cd25ebe0f3d -:0005f02367b5971f15ad21f97cfcceed02045f -:0006002071f3f914895d5d25343b56ee23c958 -:0006100d48f228751dbeb923e0de3148bc3651 -:0006205920af3495750b8d38974c13923df936 -:0006305aa2c068ee6d3bfb1c7eac872a036aeb -:0006404075aef80fc913f7acfcf08b755cd806 -:000650330614ad0d5c4c240cacb068bc14817b -:000660fa7f989f6f4db57edf38c26deb81e877 -:00067099d9914eb23d5757ecc62ad70d34be76 -:000680f290e334cba6480c9e2f0b1f1f9a7959 -:000690f91e9d11491c7c553fbf0e3b5cce14ea -:0006a0be140ec9fbb2e7fab6682cc07685bc22 -:0006b073133f56bbd065bb9c8d1b96eb80e7ac -:0006c007be851137711bdcb3a631483c84b910 -:0006d089c8684ad48c5122160f4794514ce621 -:0006e0ca8d7a8ff9b872afbc589941f08d4785 -:0006f0f6a3b3c04fc10888c0a39597f2f7cdb9 -:000700cf1d61e808af8ff809dd50ce3a71d4dc -:0007104a047f122253286354da947c25c84861 -:000720bc37640a3493879e4d7af2492564cc72 -:0007304657a4f7c3a108baef68b8594fc3977f -:000740a6329469b6c5741ea13dc8357ebc20d3 -:0007505777ea0a4ca69c6d94a6bce6480c9754 -:000760a7d6a92f96ee0459d38bf310e37bcc06 -:0007706083203a47f2fd426614787921461e0f -:000780a1e06796b76192d2ab22a8f45d97aff4 -:00079028b6619d06302fe314f457c8b9dfe242 -:0007a0a329c0cc534c19ea24e13928e452ea91 -:0007b0f1132bdb6ea0f9906c36d7b136811b21 -:0007c06b25ea98e0fed0b823227dc45b25adb7 -:0007d088ffe4007420f8608116841617328d7f -:0007e0c8df14c60073db7a8b6111fe9a4c6514 -:0007f0115ad5ec3b7f09ea259bcac0e81f187c -:000800cbe4c16ec5938fbccb272afbed17046e -:0008107dd0156c5d3abc1fd022ac1412f6bb2e -:0008203dfdb8e071364eedad0d7243a6798aea -:0008302c80a46534860ae20fe0f72d123b3cc3 -:000840af412d972638f9555b3e0bb200e5ec90 -:000850201597d872e16131c7beb69b334cf227 -:0008607b8ef12b5477be376f68163ff60b0961 -:00087027965bddd025c2d47eb65e5186b8a3ae -:00088080f830805d1cef4ba5bb5c99cb00fe5c -:0008901cc770d4818f24c71fb43d299ea85cc3 -:0008a05136032668d66bf41695a42022f9efbb -:0008b05a9103f0afc8e1171fbe648bbb4c9c63 -:0008c0365f1217112f3d0be81b9b981373a0ad -:0008d0a3c7127b711f49bfa14f131718a4e15e -:0008e095cf9ede9e53a5af99a06ce47986a290 -:0008f0d4aa334ec1922814cab004868a97187d -:000900edc2c0b1e8955aa002a8be7b7c44406e -:000910cf6a247d59bd8b56380372e24f663572 -:000920d2b7637f3e44c5a3637a5dd90e5b0708 -:000930e02834470d47ba5218f5d08c32307ac4 -:000940192fd52b34452104c5fe6c40eaf388e9 -:000950eb8ff0e5bad965c3e5ad4cc32db0400d -:000960f24ffe0640a0d1be4a2c37f20c00a957 -:000970f9ae982d0c5c2865e7ba8a629d804158 -:000980c7da7bbe7947d5f38b122e4d06ad2930 -:0009907a2233eb0a9a50f63bde83a122967349 -:0009a0e08259f9be09b5e927fbf879baea8e9d -:0009b00459fb6b2473906a82e53a77dff3d258 -:0009c0a84ea2007ddbc9104036dc92cb0885fa -:0009d02853de4f4dacafa77619152058b0f927 -:0009e0631cab0dfbad4d5b6a2f409bb3651273 -:0009f0b7b2478388f432377a1fac9e017642ea -:000a00b29b38c96521e3eaa979b24bbbe8465e -:000a10b008e42d5bd39581dd6aa60d564f35ea -:000a20563f902ad0058084127e1ed01cf62b2c -:000a3062c6e4347036628cdafac95bca4044f9 -:000a40e47cc58d313946e7f601bcd5b9d5ec92 -:000a508a9bda32a58f500953e67511bd601939 -:000a606df6c609c9626ef3d07483f68ef616e8 -:000a709ecfc2034e932a7e0fea95204dda97b3 -:000a8055c00fbd5e2d0dc2894aa752eaf36a4d -:000a90e45017337d6e26fdcf02de7f3327aac9 -:000aa038703805eeeb2333ad451aabd1458773 -:000ab0b22db7f631fa0b25d1bbe9e40a77a721 -:000ac0b580dbc43c1643cf0e61e594d9f6b688 -:000ad0f9adb7638b84d34e201b26fe75786ece -:000ae062bead7de811678dd6f792c66f75595d -:000af0dd466e6380da156e0c9e7b9de533fe13 -:000b0065f5ecbca5bc3285940fae8298e0bbe5 -:000b109fd84af951ebcd295ed6f361287a9c57 -:000b208133cf126014af33ede7e85b5bc3a187 -:000b3028dbe45ea8c76271636bf3168e335490 -:000b40067aa6eec68f87b0d02e096e5b8ae975 -:000b50c517c22aee90a7f714b227a841e03236 -:000b609e82cd8fc972082ff06c8524b72d6f1a -:000b70ea32745b63d0580be0c5dca34917af22 -:000b803c76da1f2e9a527052d27c6329a31259 -:000b9062f84a6b0f5b1950941cb51cf1f628d9 -:000ba0e313137f0d1e3f2eef8103bac2ab9be2 -:000bb0ade1ccf2559ebda31ff4fa0764d58ff0 -:000bc09be0143a68c9f2e681490cecbd20bbf7 -:000bd0543d10d3d55eb21db44030cf06f929e8 -:000be0e25c498a769f8bbd13c6c24108dc0be2 -:000bf0bdbb07c3abc93bf203c88ed111c0fe32 -:000c00cb4139796c66a8eee70c3d9f36767db0 -:000c1029911b59e4bb5eb6c9bee34b0638d2b4 -:000c203b62ad7052b988f78fd45ee9e3bc1caf -:000c305024281b12a5865038da509e85b03d50 -:000c40e304eda996d2dfd9eae2ada20e43eb02 -:000c50f41c68a9eb774ef354d2b4fa44700127 -:000c60b1dfbc3404085dea47a72c8e206217d7 -:000c70932d7df4daccdd55a5bca22ab106c7b9 -:000c8040c32be69bc0e46c92c5836ee9281305 -:000c901a660d67e97d179706d0ae6639c8d437 -:000ca00926a629e4ee48aebc3ac02785b25d32 -:000cb0772f2ae71df4af48460c45367ecd00f0 -:000cc06176ef1d663c8416afae1e48c85e4430 -:000cd0a86fe60fe80a62c743ab93eb33cb7484 -:000ce0f1f47f485951ac4d08a8363350c9130d -:000cf0052ecc5d3d24f827d5b5c8749f551ccf -:000d00e4821f316c533001a23b0faf113dd2d4 -:000d1004b59cafb99123e13bc56d28d68ee5bb -:000d20cafe97bd925e5dc340c3ece80cabb935 -:000d30031b54d3ee5a50421b24fbc7c9df3ddf -:000d40cd04fc2d6ddfbe258ba34df02c6cd8ca -:000d50853ee5ebae58c4c6b49a64246da2aa9a -:000d600cfb35f90b25e20645cec43daecc3b70 -:000d7051c1cd2744b6d678a46647a430861270 -:000d8002cd93ddc8d5c6d4cf096af1c2fa5199 -:000d90817590aee82151fe3a4212e164b041ff -:000da07d87614840ddfa7ff69aeb5ed928c9a7 -:000db0af91a53df55dc232febbda11ac9a5ef1 -:000dc0c76a5f7ab45929d4168bd750416d7aba -:000dd040c9e262c910a3d17e418e96e40146f9 -:000de00c2af8f9f11eaf1acedd1b875209bdcf -:000df0779831eb990cd6b4c8910a8f21ad5be8 -:000e009db01f56e8372e6b472c19cc83b70432 -:000e10f3661ab9a15d003db2df9ab2e0846dac -:000e20ca8a977d354cf26bc4e6f6371740c5a3 -:000e30f2962b10974e73cfb327e07630893bc3 -:000e40ee26b234edb8dcd6ca046f0989223e01 -:000e506098416186348da7d59e8e5241d19241 -:000e60485bfc8d1c98a8960b866f72c08d167e -:000e70352e2100af68862dc90166f1e5827900 -:000e80134d2ff806ed4679a120f22eec3c9fb7 -:000e902eac21c41c63919d0adcb89e708d52e9 -:000ea029aa3a24cb4833f4eb1227d3d4292452 -:000eb03e564d2d3cf3c16e0ff14f3081a787ed -:000ec089343f7ba9e7315835512f92c2148ae7 -:000ed03166497f699c8bfb41bab073d896039d -:000ee02c6c8b1d28090fea800af947103028a4 -:000ef04131e51e83d0a74565ef3ce3bed3c0d2 -:000f00e8d62ae90b13197df2cc927161498458 -:000f1019f9bb17fdd02855bbec15067bb8e55f -:000f2085e29b8ac0fad9cf155544732f5f4b92 -:000f307fd2265fe78425cd0b4beb7e9bc4f4d0 -:000f401077470ddb69a80dc33e979586c30a11 -:000f50551162a775513ff25eacd227689c6a8f -:000f606cd62eb971b4e9e3ad1c1fee90a60a12 -:000f702b48046ca603cf0fb773913ceadaeace -:000f804baebe1bcf54d930babb4af60f7ce538 -:000f90f6cbd079905969f477fe961ef3e8481f -:000fa0f4b796556945d2123ce4396eacac84e1 -:000fb0aa905a83dd92f0443f9a803f49cbb47d -:000fc035342306c123e5b1c9291e79da3e98bf -:000fd05bc657082a623dd4ef2b4a0b6b8524f5 -:000fe09716d1c3e5122f29d81a233c7364c77f -:000ff0dd58207603819072ae5718da94a5223d -:0010005434994a78cbc825b9c348bfecb75bed -:001010c487b4c57923c9c17b78ab0e9614d589 -:001020b30308ede848ea231175feed171568cd -:001030f7a00ea36731a494041123b645e1c491 -:00104007c9350591a64791e6a9bc0ae7e48586 -:001050d06d7c364a03b823eaa1cb50c835b041 -:001060e237c84d02b97b419cb872128efa887d -:001070d6fcf9453aac2da3b76479bee2d6efb9 -:00108031706dbd81c324edbfe9c77df6619bcc -:00109072b6141c0f53f196e319eb5e28beb6b7 -:0010a09e577216953d01f090be4c132e230bfc -:0010b0dad0f215152d8ceb205fe5fb3e3b6ec7 -:0010c0f8c1e4dc6109f886610a568c2b657901 -:0010d074b3fd72419fac3ee8d4b2ecd004609b -:0010e0962e4acbd8fe20a131291ee690863a86 -:0010f07f36c017a5320f61cd2f743554d8fb94 -:001100eeabe2fc78dbc91193740476f68a2be6 -:001110c6eeff89087c7ce98ade6090f9238a36 -:001120c6e9719481186fb910ffb3a8c40dde68 -:001130f3a8270a263ec4c0789b4c3f703f3de0 -:0011407a3e6e37d0bcc7af6fb073fb7ca49c03 -:00115093e74dcfed9fb53b657e8190b2451b5f -:001160f1e47ea21f8ab9237a07ef0439e28a4a -:0011706ea71b2e39a2296594f455eafb17a8f1 -:001180e7e7b3f7cb6af863e72a6d4428cafe1a -:001190f5c2290d2ff72271d46d8c92181e3014 -:0011a05e2710bbe04b89d979a791858b16f9ba -:0011b093621a4faa1ee698fb5c87e49f39fc58 -:0011c060bc445c7ee3a7f7570b40ff80d746c7 -:0011d0c52c27c15711ec6f4e74c73ff529ed93 -:0011e0d36c89e49007d9feb9929ae37f753f42 -:0011f09f4c724ec9c63d7a944aa9a66b477380 -:0012008a4b4e430018a5204e77e6f8a011f4c5 -:0012101d2c52fc565bb6a8b405b3291632f7d7 -:0012207967d68596ff435c26d8f9cc4c185921 -:0012302300b644cee20217528c42c939f9bc13 -:001240ec91316ba0f2299fa2247628b4355145 -:001250c981e686e192e3092c0e570a7c2f21bf -:00126051db0c70714366335793a25a6c428643 -:00127025be6896353178db165c077b760da75d -:0012800181c367e91da944b9882a3a3863da57 -:0012909997b04317cfc7c6d84c9cec2c3e07c6 -:0012a0cfc811df4d536e0dd24d53b42e6463bc -:0012b00608933ecf7aeb11a32b43b77a313bc5 -:0012c04460a687282ef2e817d6afd162ca22bb -:0012d0c9581a6b4f72d7c93aba392ec2ac7141 -:0012e0f2db11eb8999521aa5f14fe62605b604 -:0012f04593eb607d2c2eeb61c03d0141489ff7 -:001300c5202053faf6c971de5bbcc4f1254d1d -:00131067b6333798236fe497e432bb4ac57531 -:001320001e4792dcec321733e52ad4c5bc3812 -:00133013c6c120b4a030a77cca90e2af228468 -:0013403a0910ae844ecd976c971a69a9ac314b -:0013502ea247c511d9814d4e5bb74063bb82da -:001360f2f57207cb48d89a1924f568b5c689bf -:0013705252925cab5c31faf3de8f6177022984 -:001380d950aac0b02d4aac329b0bff96f213d4 -:001390c242e195849e133576955c969da5f68d -:0013a072bd7561ec4dd403ac4770971f2c4fd1 -:0013b08cb8adfcd027d16850416a3364973276 -:0013c0843501524aaaf0aecd160113d3591ddb -:0013d0679558f2a6f6197b566fbb07ffb6122c -:0013e0c5988a560a5684d7e77bfc4db36db8e3 -:0013f022a55c3235c6ecb2a883ed435ebd835c -:001400c7f632c32f7edc8bdf2f461774816149 -:001410cfcc7c348109d82901632195173633ed -:001420496422f5ea881e73e7914b9021eeb8b9 -:00143082be945955dd59d4b23a759a7ba227df -:0014403a62a88f29f8e821f763956d55c6f40f -:001450eb7e2c41b49f9b26b63baa14e3d7584b -:001460444c587b27298b0e1412da5773ec8b08 -:001470eb24590596802ccb743851410b659a4c -:001480f2988a066aa1f8efcb9294d4f97ee7e7 -:00149029b867083c01cc482c58653195a7d15b -:0014a06dade3042738bc1fc07d171ac5cc07d4 -:0014b0ffbc256c4877b5ded8c1a279de57cfe3 -:0014c02894661935272745384c206f15e86704 -:0014d0ffbc3ade20deb5eeb74dcc9621cf0ae5 -:0014e0f0f5d8714b7f99267de127a7e66a7a45 -:0014f0f5ab2c0e9b031e7606545b4e6c54ab73 -:0015007f6fcd30504e4b12c4080b7ac21ae648 -:001510020cac4d25ce84430ec9be595ba36545 -:0015203757603223aafb168a47dc6bfb8da735 -:0015309bbe97805e6990fd90820f01f0e25481 -:001540fc168bdf4058a90a4f37a40ccccad529 -:001550af88e49420d7ee9c183cc7852a438097 -:0015607089bd5380197596754ce3aa850b21a3 -:001570d00ec871fcbe87359cb0dec630ed2e9f -:0015809c1c3416263b8b9a4f47073771fc53d2 -:00159005f56eeb064312aa4ec72c5e29b6aed8 -:0015a04fdd8bb3cf6dbbb83a800b01aeea7e22 -:0015b0ff337d06d95ee6c83bf96417350b1d63 -:0015c0e79d6ca79df58fa5fce785e2f11a01a0 -:0015d020cf77270eacb81ffcf6efcb0745bfc9 -:0015e0c5082040e16c8039818e5a9e786330cb -:0015f06d99ffa84994cdb2082ed195fedeafff -:0016008bcfecef65078d9b8f92253742263cdd -:001610bf19ecd80f1472b79be4e2debdac1621 -:0016202d1fa8962ee34463a0990fa9a92ff921 -:00163013828f8deae09836f358e71f6870a835 -:0016406e7228932549c498ecb8732b02fd6008 -:0016509b6aab6fd7259bf84628adb478048efd -:0016601ccbcc9f05484667605d3d32dcc1c6be -:001670f7854055823dad7aef08d752654f7dac -:0016807d8e897214fabb5a467ef67af30b26b2 -:001690065cc120b96fa655fa07b4e10ea9266b -:0016a0c3a8315985bdc24cc5f4e5cfdf4a94aa -:0016b08581aa953ccdbb9bfcaab76f68595963 -:0016c0a7704eaf14f8569c5f4860ca39bd56d7 -:0016d005360fa85bfb34d3163926502eedb8c9 -:0016e0bd6e5999880eb2714aad23b87cb9115d -:0016f01d56ee0cfe5d5496b38ab27a35af66ba -:00170099c215f5e8c9dd85f7d568278e965dc3 -:001710ab5dbaf957c9a40cf3ca68b5f12a2dbf -:00172090fcbc11d83d11ff3c54062b0376ea21 -:0017302fe1f580b58283902adb3144001d1383 -:001740843649f344d0f04e875cff3da21c7fbd -:0017506fcd0012cb5e61540366381a4e8bc603 -:00176037e70ff20f623a0b32b129afbead9cd8 -:001770e2a56228a5bb177c9c06380a1fe03220 -:0017802b408778811833851671712867a21928 -:001790a773ee6d75f37b2a2eb9ddd98ded87d9 -:0017a0a08afe01d3ba09a52733cebd2b1c0d42 -:0017b019bd5c74020335ea72c8154c1c82f764 -:0017c0f69183aa51e4258e1c912048258052f9 -:0017d0b99243fd37974adb453cc9a3c8a4f9c7 -:0017e089268317eeaab9cfbee5a4f5df202bd8 -:0017f03287ccf776d165ec67a6f2a9ee741a21 -:001800226f1627d091f33130157fded6693c06 -:00181084c9ff930718841a7c93e947026afc6c -:001820209e36e37b629d320a8f2e6906d20987 -:001830e48bd9172262a9a6f40a97518887f12f -:001840a281be04db2e3a6951dd89756fe40e4e -:001850d122d1622e584218d30f7e16711f2e3f -:001860de8d24e1176c2cdca9ce71b825e5f8f2 -:001870f6c6e6eb1acdd3b66d02eff7c96a210f -:0018809b285d0ff73bbb27607fbe25fb98d1d9 -:001890b746b3d7853564cb61e2107799bbbe13 -:0018a08ea761863e73cffaf0a52f1feb666879 -:0018b013ad42511bdb5eb457b527734af7f0e2 -:0018c068e587600cf67f70e75a789245a60862 -:0018d0a11cf2924f96df168091e7820bc67fa0 -:0018e0035bca07fe97da1351cf0bab2cdc97b7 -:0018f05c3a6607c0f85249be9fb4885820ec54 -:00190080109bf67ab4233c6338e2f6b716f226 -:001910732dc3c441e8f5648dbf132814c3db30 -:001920f25a8f02e68ac60aa9fea825ec3c4cfb -:00193058911b8480294aee325d100e0bfa8132 -:001940f1b7845dbcc2bb02f9367a0050f8f261 -:001950f66cbf058706223cba75d573b23a0040 -:0019607b0bafee98d941990275e404397860e0 -:001970b12d40e590ba477299767912ac6b9f44 -:001980c9dfa5d04d7b2deaf5edb0ee66ee1793 -:001990cd781e185a7773351db8167e50036d39 -:0019a0ea2c32c2214c52ebadfc9094b65cb038 -:0019b08d1c2e82d3d445d35d3df691420f22af -:0019c0f54c6a1c56c12619def131917fca0f91 -:0019d0aeb02b1d4671af60fe0d4543819a1efa -:0019e02d9b93f305026ffc75c8a9b5238ece1d -:0019f0df96b3254dce53a76cab7008ae4dd94a -:001a008fe7ed93c4916ebb848c20d8e342c3a7 -:001a10f777821b3a2643fa48992d9001e6a554 -:001a20fec53cd19c30c2bb89a1576ed1e000d7 -:001a3098ab86214fab6d576f817a07ebc0a5f8 -:001a40a105659a7565cf2fc2e9a358a28d8f2c -:001a502e4df8b9b4fd15c12fb2ea32d4e7fb12 -:001a6015debdf5f40f2f8598f21f4a8ef0e57b -:001a70a356ed89c4cb89a77abb8d00073be4a0 -:001a80bbd4fcc657f0f4d60e89548c5c024e3f -:001a90b2ea3d5d3da012429851afa5add14491 -:001aa035397b38e7e65708883f0d0803dfc6b4 -:001ab0d5450821d5043c8eee69d9019ba404ed -:001ac09090b1324a5b8d9e0bbf59703a7647f7 -:001ad0194ac3f5e1c1e665da9c517211ac9743 -:001ae07df7f3c596a831584a475f9f8cd2032b -:001af005ee5bb6f955e2c0ed60eee292a87c94 -:001b0057e516dab2f0177480673e58528ba486 -:001b104a9a56260c2f577c0cf744ca978069df -:001b20a7791a2cf63013ccd0dbfcff4c46f3d4 -:001b30238e18b6870e594bae017177e83afe4f -:001b407e7ca92722f01fc9d34f50369ea85a80 -:001b50e1dca4472ec5aacf2ea83c94fde9cef1 -:001b608c3f6e63d962e43ea602004c700f28d9 -:001b708960afc46fc46aa6ac192f80c8f014eb -:001b807bc6a38890969cc3427724b1079b97ba -:001b90e29749024ce195fd87d52be71e73e485 -:001ba0ea88f3578d5dd09787dcffdcfe3d11e4 -:001bb0e8a3ba2db5770b82e4d6f52028ddaf8b -:001bc0fc74162920c50f906a3cffac4a88a74e -:001bd0c55a78b8097029c946393c3d5734e11f -:001be090235b1a44b56985b0365a723e9f4619 -:001bf0430c15a2766d4bf01966ba475983be51 -:001c00549e7e1787da497247d6ed5c457ad3dc -:001c101cf0b0e899077302ee54317121048190 -:001c202503df54b51cf9bd132ca29bff6f4eed -:001c305703f639b871af6a18b9e93f04fd6252 -:001c40b0c3bf875a0908ca7a9c6f86b281c770 -:001c50fa09cd3b452f0acf622385330f9867f3 -:001c6015a48277b5f20875a7692d29b31935d9 -:001c7091c783f6a3ead80e4c5ea5457e4575f3 -:001c8027030914c16c189954e6ebf81afbd72a -:001c9016eabdd2c4e2b2d0c39da28656d1324f -:001ca04290d179327e9472e7fb80e527369a44 -:001cb01556f6dd71e3a269adb0ac9de04ae601 -:001cc0fd8504ce4a2d5f66930ac77078345fcc -:001cd030299b3648ecf618765bfbe0398c37d2 -:001ce0f101f4ad4e73013b3237549bd73b8df6 -:001cf0752ac45ea38e95bf4893ff78950562fc -:001d008d46c082ed8826ced75f54167f3c00df -:001d1017f0fa17e72e4f49279c568beb8af466 -:001d20cd704dde4aa594ffa330087daa8d4b1e -:001d30652490ee8ce9c0a9d7c15d8115a1dfed -:001d402b13c6d6cac9cb9a557677e11d3a4dfe -:001d5060e25c6a31ffd3ceea3b9c3ed060ed90 -:001d60fe0a9b0dc2e20023a7f24adee857e0ab -:001d7008a97b04ba49cfcc58ce8103dc0a5afd -:001d80a34ba747513a72ef919b1bad6a4c5d43 -:001d902a2c46b51c8e8ba9bd19b2a876054e46 -:001da0651f3d63672148a5cbfceb743c5ae319 -:001db0e7a1e83be197a99907cf20125bd16a47 -:001dc0b767af9e22ad1e7792ea87419abbd8a7 -:001dd067e6013b95e52d4b794be6edfa497560 -:001de0088bb78dbdb9da1584b0180fb36f5f0d -:001df0c8376d38a2ebdcd92f6be088fa55eb20 -:001e00cc11cef8d8adbeb6fed9767e1172718e -:001e10a02238fd721f3516d22ca38d7f200af9 -:001e20d739644b6742eaf047cb0ec851639e90 -:001e3038c13cb4a2138f0ec5d73cc7d41f3694 -:001e407ef5a6c7f14c6e810026bb3226265814 -:001e509e0e7a7e2e8b015f084d89a7f2584a57 -:001e601fdb30e19064a1ada7d4d616fd9e9aad -:001e7044e0b1938d9f0247bc1b4d3e47534c82 -:001e801c2c813fa6cd4210cacc539483f1152b -:001e90f8aee5a955da1097808b15103be7a8d0 -:001ea09504c2c1d30127a0c6f1d269a705d396 -:001eb04ae03fb2663e1e56e1dbd29db48c74ad -:001ec0a18f83a4bb126204e98d9b9f6de9e684 -:001ed05145b386a51d4ba4d16e9da07e76ee80 -:001ee050042c74906d9f29b93d509ad5762bed -:001ef049be88a43fe04b6a5fa0a5540c8f0636 -:001f003c9a762294281207127c48fe90191c62 -:001f1067039d690d9d00487ece670910fee838 -:001f20e8d77b39918a16d3c3016d02f6f5d56b -:001f300ed70b12b68f60ac3c7ec9ae2c9a6b9e -:001f409f8eaa4573dc0ec86625a8709659cbf8 -:001f50a5ed66d8e7256f64bb846b6175f7ef2a -:001f6076e785b1839c4cb0bb7f4b57012e0edc -:001f7044f773cdbd24e7ff99c343f771c97b25 -:001f8017242d3de4dab5d60c3fe591f3db4fd9 -:001f900d942b86963e19d5349d0f34618edada -:001fa044041ced7df3255afae18690d61a8ef9 -:001fb0567713551a00a058fe1d21dbd5b92218 -:001fc0be989fc9d87d199142aba7326b38f8de -:001fd00a68527259bfbbedd3e0a144dc3aa2f7 -:001fe09cb75eeb09f17f0d60f9db1c2bbf8535 -:001ff01ad4032a10636ce135e8338945b5ddfa -:002000b73470c629bb0002f15326d9af3b245c -:002010f6d28335f5bad5cf44c68964b32c3b73 -:00202081361fb2fde4f429c6b207321e18f639 -:002030d9a8bc0f6d4ca9861189c1a8afbd997e -:002040917fd2d69d2badd460f428d789691ee3 -:0020508b2cd86f1814176db5b5099fe7d7bb01 -:00206027a114f53527b7fd1477cfb630fa4b04 -:0020707b4db35ffef8933e6a3f371a7cefb730 -:002080424e4bbddc8450d36e6b2f5d34847ba0 -:00209068b16d1fac4faa209547340ca69a687f -:0020a0d4ab99a8bf57f878b36d5bb0c3503542 -:0020b0f213922d2132790b75d85802bf5b37cf -:0020c02572230fd22151e5ee1f30a7ea484cb8 -:0020d07b644ee2a856b69c6004f2a81c1430e1 -:0020e0a7d6e5c7468f8832c58022733492ed57 -:0020f0b8e7ff1a85a53bc156b1b2ed07655150 -:0021007b060b6e5ad0289545ed9168fc7c8a7b -:002110ae2067cb06119b25fa3b4708046343e3 -:00212022153d09973ed50dd2f992fb940f3c10 -:002130f5a69eb66c10a7e12b9135dd4e89860f -:00214055e1a8331dcdca097ec6b31d0d7b55be -:0021500b033633b71cb2b571ff57de03c830fa -:002160aa41bedbe55c30e5614ba221ff1cef3d -:002170c38dfea95cb2d08ca52f51e264b5ec3d -:0021803cfccba31ee65d76177a484b337cae24 -:0021909d860792b1d9520a0748aa9f3da69602 -:0021a0de1964ccf7cd2338fa91ddbf9c6aaf96 -:0021b08f1429ac20cebc8ffdc68b37c89b76c4 -:0021c0fe423138b885a4cc34508a1558c964b8 -:0021d0da4592a86ea238174cdc35a61a5e43fb -:0021e02037bfca4565814ded64420ff16bc811 -:0021f0e350f9f80111d96a05937f75621034f4 -:00220073d594e1f8536fb91ad19480004403e2 -:002210e3ecbac78ccba895468dce00a953037e -:0022206fa71b119761ddfe690fab072575dc00 -:002230b0ac7db8e1efbb36fbf9bdc20b5de05c -:0022401dc65233ad585fc881b48acaae8cefd0 -:002250b16461cd4a76c800d628df2f5ebf0a9a -:00226034b950c6cfe4aba44505ab5851daafff -:002270f53a3778b0b2f291deff1d6917ea0efc -:00228047ada29687d1ac00f3d4f45de74770cd -:002290420de6db6470ae4360740aece5732527 -:0022a01f7669d53ba2a20531e8390059323e0a -:0022b05fefee17c4bcd10fe316dd8a01d7db7b -:0022c0439f2dcbfc7d1f15e905674d9781bf13 -:0022d036f36646afef1a581b878280eb0b47f9 -:0022e08e10a584b2adfd858e5fc1086c99cfce -:0022f077313487a28fa91a37605c52a8ab95ef -:0023002b0b435ea019aa16e31e3e09978c7025 -:0023106c76217bd746a91a5a772d872e986a66 -:0023200e60b36fe07c355e49fa715109c0733e -:002330dd255924a1108bab151b1faddf4b9180 -:002340c34e61848d51e56f499a47080b45766a -:00235086830ce5c3f5993d384c05a664777402 -:002360e436b9b355d125c58941f58ecbcecfc2 -:0023706560b027f83c666d3694302e741301d2 -:00238066572024c09b4ccccc021d0a1f1650ef -:002390c76ad6ce7d87c815f7187e4d2b656a74 -:0023a099688a9d62971e303f042b40c2843c32 -:0023b0425492162ce628240d6acdbef60e1a81 -:0023c020ea7577cc88c4c3ca8712e7fa6bb36c -:0023d01effe09bb804cbe7f92764dfe15fc3d8 -:0023e0e1b869ba71a0bb08d8c1a30b2da6cff3 -:0023f0ee9b081d886a02a61b4f608f9f01ad6c -:002400af238facea6f1bd6e8cadd3f8364a5a9 -:002410f64583d6752ffec9a141ded117bee4ee -:002420bde601f1b09e6a68ddfa462dc77400a2 -:002430a2c94b14455d4edf90390c16dedeb579 -:00244035cf52587825713caf0121cd0ebdd88d -:00245018d7dabab942449726148a6703ccd699 -:002460bdfde8953725351668abf72a14afbbba -:002470c722a22c7850e5e4335c3554b7c8d00f -:002480ea5fbfce8908effb54c5cbc84b65f5da -:00249015ff6fcdeaebc4667912a787bd3508fb -:0024a05de7e92471c8d4f0bde66b32031d9c1a -:0024b00b2988644fe8bb50977f9dd41e1acee1 -:0024c06274f9307fc81a726928a8dee45a0e56 -:0024d07cbc4d1fa78276323f3301a232471871 -:0024e0a916fd9663ba0d80d2d4de603ae71307 -:0024f08a6894ab56db449a08a78fbf0913f66e -:0025006937fac7814903d95979c52604dfc29e -:002510243e91cc4e6f5232f46381a9d0c89c29 -:002520842747b6f252605338b35014e549ff81 -:00253092a42b91a46bed56ae20a7d6970ecb36 -:002540d85f8283639e5cb000c81690aae05e55 -:002550baaba66c2b53468509c5ec99ad6b09d2 -:00256086ecebd69a43d930c82def26225f8b0b -:002570470f91c7b08c1e075e0506d67c002562 -:002580fde2ffab866a0e502118ada9403a958c -:002590bd0e3771ef1387692351b54c1030626a -:0025a06b15ef9d097960bd895ead8b7b4eb70b -:0025b001cf1c9f459d60faea4b87051560d800 -:0025c0b97698de59e52a54ef7e53fd50baefb7 -:0025d0da79260cf71e5f7a5a487c9e4515d03a -:0025e05832a7d2d6c69254bdef7cdcaddf32eb -:0025f057353347a273de71208f6a4b16895b0b -:0026004f1b78f687abf355fa820b864511aab0 -:002610a08ac867fefd2884a2ce4272a09fc41b -:002620f08c1722edae50d09d81a46621c71bd1 -:0026306219911e187574a19fc4cc08d76b8a3b -:0026406f5d7ff1dd7a52087bf97ced5ea0dfbc -:002650caba1e8d55db4b5d9f755d8273760ee3 -:002660716e0c71062166085b33b1d45e322cd7 -:002670a35900119d3a2fa3a0952b50833e52fc -:0026804a7e16ca37cdc4bb852beca178d8a54f -:00269048793d236a28348d42db703dbe50c328 -:0026a048dcfbf000f5b687b2d288a442a318f5 -:0026b0de028bba4b27cc1b471b56e8e4620ba9 -:0026c0cd10d7c35729220865c74c95e4d4e81e -:0026d0547ae099898b307f63af95a93191d651 -:0026e0a6eed3fb0b75c5c7dc27809e48377bd1 -:0026f07725f8eab532c90602fde8bf9d8984ae -:0027009cf13773503a4df33637537bc91649a2 -:0027109ffa80d77d86394f0bf8f09bdd960553 -:002720ef6fb588775a26dfab5bcfd0661c5b21 -:0027305073cf51a7ad89e5b36bea3980964297 -:0027407260e4dcdd8b3c8d7edea21002679ebf -:002750604713d9411435a14a325b8e7a53dd15 -:0027602277e12585dea6d8d65ee770faf4573f -:0027700076f7ce327d8b4c075f7eab99ce9134 -:0027805fcb32eed774c511355576f5cb000bf3 -:0027908b97ecbc6d36340b41438c7feccd2db2 -:0027a083fe694b4cdc494426f373fc4261c399 -:0027b025ae15412b75ad34b7d1e001d2ee7ea6 -:0027c0821ee96d61d91cd33c0206da60431bc8 -:0027d086ad92147c4991e703c857f54d570d47 -:0027e034f5921562484136bb15ad7fbf471de6 -:0027f0264caa8409c06b754b1d159828c8d6bf -:002800dc5bf1e914661bb9972232fe1855c94b -:002810905a0b0ed8e9965c5e61039a09716b35 -:002820ca362003f0b9aaa1ad3fb7ac44273de9 -:002830cfdff77b507a67119163e3d2f25354f6 -:002840f3f0358d0253aa8c376542ef0e24610e -:002850f4e0de8c0b2c4863f10df4e34708ae8f -:0028609c75b42a81d74b6673d4b81d53fd41cc -:002870f603bda6d38f0602e96a4ebf45f8bf57 -:002880829affecbb00ee0aa161307af6964fa7 -:0028907a1381553254a08422335a47b38f8e06 -:0028a0f0e18e82e0e308e746e555ad4dfd07a6 -:0028b0b025467617481ef67cc814e58c6bb308 -:0028c08f84be9dd26e76462f3214e626a6cc67 -:0028d02df6e0b66d896e4e21bce67334e23ea9 -:0028e0aaf62848de48a65e2c0efcff28c8403f -:0028f017e109215ca7465544debcfc153475ae -:00290075c63a43fce6ada688bd58079c813d14 -:00291032b81a2e16491153986b2a21f200b8c8 -:0029209c240a17b86dc7bee8822a340045e87a -:00293045e850e5c8a92a3812bf9b364bafd2b2 -:002940e0b5efb2474f98ab475e272108ec1286 -:002950b8e8e69d09d04c5bfb200b7a7a99cc27 -:002960f25b4aa50884544786a7994eae18b9e6 -:002970cc38c7e16d8dde79d5a90e95373eae39 -:002980de2bba43f1fe142ff0e767e52a87ed09 -:002990d197c1121236213668401f2fb2834dbe -:0029a0c17a539ff6da1a33faca6f30bfdcfc86 -:0029b07cde3e6c91b80c3429a7743d220c8512 -:0029c0c3dc2934103c2cd17666860085c6af90 -:0029d0be018748b209382a4afd3d01054b8e17 -:0029e0b224e26ba6a0cab520a612bddc3cb17c -:0029f0d5c707745538af7c37335b049b562b8d -:002a00ab8a58e3b7bd03c97b63e9437178fe92 -:002a10d08a5a4ddb059144ad14159b9edee408 -:002a2031ea3ccd97659b9e9b5afb559ac8d22d -:002a30fbeab4643920c4fd60d6e1b360fb6ee5 -:002a4003ed3634f309495ce60abee0f37de6c0 -:002a5024968772a1feb2589cb1c8afa2f77d4b -:002a60aff883f226bb4dbcdc6c51ea053e42b9 -:002a709a7d6086c64ea830b4d74faf7dde0f4b -:002a80fa92a8e774e87e9a6777d331dc1888e5 -:002a90b5392f08eb722c3a1cef155747f5cbaa -:002aa04012cbda54cd015b991096ddeccb582d -:002ab07d923c4c687f70dd77e953b7978328c1 -:002ac0503512bda28d8d284a64ef6b5fa09989 -:002ad009c7d2191ebd0fccd6c950ce7d818985 -:002ae000192134121db9bc7d3483162a11c7e1 -:002af068fdb40ea131a70aa0d97abca80f7145 -:002b009e3f5b263e279d26d2064bddff780803 -:002b1050c5280c84c44b2cc1eeca60dbf2f64d -:002b20afce04990a6dbf4c2512ce151ad29a2e -:002b3076cfd3239c5fc1e0738f565c11ab759c -:002b40535edd20b55bc6b525a952ed430662a3 -:002b503860853999a56c5f4ca29a4344e6e38a -:002b6015a329c99dbcaf8f2c9f245032363b02 -:002b707e8a07302b1a9b3d561d9d5b9f20869c -:002b80ea8846afdcffeea6dbee69801b02e723 -:002b903e0e77e407a6da1d0c7af238b4513404 -:002ba08b6398be5a913be20cc8407561cd6909 -:002bb03e56b0f6ec372a7904aff23a60f6dc68 -:002bc05ae76d5e34d0e386a05e198292f4e4e8 -:002bd07d8e0141b61270e82ad0b0e9390689dc -:002be07e34354b5eacc6c624fa0d9a1e9f8ba2 -:002bf034e9059294e78bd011f77d8777841e70 -:002c0047faf09e2b4fe1fcafe7829ef3b2fef5 -:002c101d302c393053b66c8b20a28261a4eba9 -:002c20204f7228518b1698db3db349b5b40f0a -:002c3093cbc59c9dfb66019045f5099b5dca69 -:002c40b62976f7b2857f8e8c09c82bd439c8b4 -:002c501029f376a6acf487ec342a13b6786eaa -:002c60efab0a3fa9f31f280a80da8588cf1f37 -:002c7034c3d2d24ea08c9f3699d52831ef4dda -:002c802507824337a58e4949bf1dc2ba83a102 -:002c90b14a42d99ea029496a5f9ad143b9b7db -:002ca0a0202e4b94d9089ccefbcb747d6efbe3 -:002cb0378445f8f643e7e78f932de5a0ed28b0 -:002cc0a12663c6d6ee1dda1151aabefb56a96a -:002cd08e9e85c418ee1d840dfdb91580170f06 -:002ce07d82cc1eaa5ddbdd3058fc22e68dd243 -:002cf07dea9f7628f601b4b61b7fb092ba2c6b -:002d002be98bd5c7a34c50f32ebf64f9bea550 -:002d10556abe2919f9563bdee2829772d9bed4 -:002d20709f3a22a15e51240ca5887d3433a0bb -:002d303dccf998cc61e7b8467d467f85788289 -:002d40b924fd28186d7463a31e59b05acc277b -:002d506766943daed6afc06f46d909462032d9 -:002d600493d24aedee3e4350e98146fb0442e8 -:002d70679870b4d423613ff29b3842a613e698 -:002d80a4dd02aebbe71a150a43a01a905ee9be -:002d90e828aa687b7b950a53a18cb0b78e1de1 -:002da08d689d47f4e7de8bf0148c7a2e89491c -:002db064601c3b1eb9fb2dc8885577361d3d17 -:002dc06463bd5ca8beaa0a95ceffd587132aed -:002dd0babc4dcaa36ff3829d719895a277e4cd -:002de0b77d4ee7a670d35abec1b6a39547ede7 -:002df0ce2e423cba50f8e8054114dc507c4601 -:002e0020f207b3d84bec31bd08a8215ed40a24 -:002e10f009abd1266bc16b87beced51d57b2cf -:002e20ac482813469e8ddad0d8b13b13ae5aaa -:002e30355932333a79b929f8566b9ba4d1d9f7 -:002e4059d9e4bd9c572c078049f187457f5725 -:002e50e6dae8dde43486beb352f6de808a98df -:002e60a1256e44b9f1cbdff9e5de08fd13360c -:002e70d769d72d4b7cbd3889169d8898fc8fe5 -:002e801119e0976d217700b4191903a9f84b4e -:002e904b29262cc764e5d0d7b86cbb9f11e5ea -:002ea03182f757a9f328dcbbb18f29b2e3bf4b -:002eb0ef1419d2ea1a18017d6b8482b8b3545b -:002ec0c94524334db785b31eb269a1ad2e4fdc -:002ed0903fc182d0ce01af225e2b36d9842056 -:002ee00b70db22a9369d5de18b59cc4843a25e -:002ef034f6662a0825fc88452d869a76a98425 -:002f00ce8ab3e68f85baf51875a63c4f00e219 -:002f10fcc5ab4be08dbbd35becf7c92238941f -:002f2026467411e96b3322cd25ef65c7956a3d -:002f306f15a4d96d2aaba14108a49824e5a86c -:002f40163bbb17ffa542c8ad7ddd2c86e8ad83 -:002f501de731e9b409fdf9d43f44b14a2804b0 -:002f60b5054265209af7931fcfd3f7dc236ae7 -:002f705b58f7e567afb9ab86b842dcff4e624f -:002f80499ae3399a6d12de74ecdb471f7a7109 -:002f9009e983914942cec48db19fa6a5c21b6d -:002fa0e11fab7f254e34187cf7c7909f87a8b7 -:002fb0ce1111943e7e181802b5d863a7327190 -:002fc037acdd9c85f22dac81c840b68fae5525 -:002fd0c1006b40d7e2896543ff9e95fb5cd6af -:002fe061513f8205af35b01ef1fa6794b5346f -:002ff0409b0d0533f89536d0f351309cd84cd6 -:003000ea39da35467f69720b49b4b862b5d321 -:00301037764e8a0a55311687877e95d0216a86 -:003020cdb8ca8a2ecf0c6aa1d6f360958d7516 -:003030e54ea10437e52ba8e727fea05aa02593 -:00304069a6be3103b2c877f9e1fa97a7d48aaa -:0030506e16646381cbd36e10cf528b5c32bd7f -:003060125b911fd06f761669713d6d4324a917 -:003070699aaee810c2933affb4cd75e3cb74f2 -:00308077c07c08ab79cf63df157eb372d32ea3 -:00309083ece5352dae27ae76d6b299241598ce -:0030a04e6981f67e548de064682c0e76dc17f2 -:0030b01e96f2a9e80297273907c57b706db856 -:0030c015aabd2b336db9e1f10cd18618cf0bbf -:0030d0d80721b39d22edd3466751799088e53c -:0030e0eb0ed9ce2ccca55a22df3cb0b50be15e -:0030f0ec3be394adcd9a28f8e3a91c4105181c -:003100dc548190e5f25868e0f3421807b2f167 -:003110c8e5fc2711a1f7803f02eef3cca155d2 -:0031200a0cef32fd55845bb7c43edc22529ea0 -:003130d21b361c1882948c146657d9438dad00 -:00314053f9e6f0f6f797a36026de9288680e32 -:0031507800d273cea3d0787ef87eb8b6affbbd -:0031605f009f1c1fc53f1da37ef81f3e114f12 -:003170d9f085edd1ce59b2e0fefbbfae4e11e7 -:0031807435a3b9db4b19e7dc0373b06e2ec182 -:003190c7548b81e5cd36203d7168df1c8d6107 -:0031a0c809759ae45b29e1d376b99803593b16 -:0031b09cfbf4de8a4efd1ec7f4cef3390c1ec4 -:0031c009087207348ff70e59125d4ee3b601a6 -:0031d023ea90be7194e21b3d50bdaa6138702a -:0031e077c122e8d2e4b7870d78e55f5367ba38 -:0031f0af337c98367b1524aeca7ae43a5d253f -:00320093c7130faafd7f586145cfa4d30d1457 -:0032100e2996bab598a18457a523309174dc63 -:00322066354c478263c346f8b994df6360beeb -:003230c96321eff58baa0e05a6bccb292877b3 -:003240fa0e07beba3762af7f7635036f9a1940 -:003250243a06a0af0d20ed4fd9ac107cce391f -:003260ce4084bcaa6cade55642866b4e0f7627 -:0032708aab262bfa8ab08a79cb054ec86f524a -:00328021d10f0b52174b8a0237058d8cd6753b -:0032908e3c9a2a0512536dc4fcca91b3a159ff -:0032a0175f4f819166b382246fa4c592a0ad2c -:0032b012a1918e4d64fd0776f3f5765da1cfa6 -:0032c0dbf726e1e02143b2b8b9c54f0680ac4d -:0032d0f33375ed1b1111e2fb7b4b8be9e7e176 -:0032e0acd2fbc86bd13009d321a5c5f3932a2d -:0032f0d58041efe906fb71eab613dbcbeb0a0b -:003300b589115541cedb016b4685cadd11cf15 -:003310e450809db6e1fab99bf05064d7232b60 -:003320b69724f5f7f31c20eac922063fbf0b09 -:003330d915c87726385dc8e11af726ff6c7a65 -:003340873ed9344e65f81e5fde3d9de4b7188a -:0033504d798f4d21f358a82d3d456bf7735072 -:0033603cc5ab9cee5c1018394e5ad65cd76781 -:003370c1f88799556b50af7a00e7d2b3019b7a -:003380d3611c51d3f3e1c1be0cb8099dacbf31 -:0033905f35e37d18d6da0382048c529305946e -:0033a01709f1d1a8f9881ab56f01b7732fd8fd -:0033b02aa9de09a6ba91a0db9eacd5c4c6f85c -:0033c09a7c2a1e18431bd5bd768478a7110fd7 -:0033d0cf6d53523ad3a129f97f652a139afa90 -:0033e0288f83f4756de49d39c9121dc3ed71a8 -:0033f0401932be63869a9bffb6ae409db12483 -:0034000fb1daca90491351c531d2cd15b505a9 -:003410fea89782c4bba236323b2e34d380f505 -:00342039be64649b912eb467352e38df476270 -:003430d01d23eee643ad49889ac6a909050f25 -:00344044a2d80723afb59fb9d14acfe0e2fce3 -:00345066ca7323ce2baa9882f49b0a56865d38 -:003460f01035c26f8e3187b300ee357919ba5b -:003470f4f16f34f7e8817a9939a0092def6f08 -:00348086d4aac58e2069c8ce8be9dade42ac59 -:00349097c63a936d1fba12194291773bf52294 -:0034a0304523deee53ed0d921a385baf54e4f8 -:0034b0932ad47fae708a9f7d2ae89d728dbd1e -:0034c0c1d3be14d677f6343b3b9e92c446d129 -:0034d0ef7c0aa128f1c5528455b1da84da715f -:0034e03db58fe8dae405d37aae2c60ac3c1b86 -:0034f096286b843bd5c0860007e6004fe568f5 -:0035003acf56fde6a9b28a046d4506a882529c -:0035100dabd31a5b60f1acb951f06ae97ff41c -:003520b32242d3933535c5aeb428ae12a6b448 -:003530d96940580cba97caaf7ed54025763c3c -:003540cad734a78364a074d48160a1adc8a96a -:003550c021154daaf170151c75232d3cebb3ee -:003560797730103879ae463dfc954f8e416f9a -:003570d781ae4dcc0d72b83b6487346b09190d -:003580ae426e324b3e6704be714e1a8f1e0efd -:00359026a3182ea2e4e4b070e41e97cc76a951 -:0035a0b0ec041d02650c5580ace127e7028492 -:0035b009a855e9dae8e5efc3534f8a59a9b994 -:0035c00b48dd4ed170746cdc19ca2c4b9f3dd3 -:0035d01ea00324dd3f604ee2eb0994c5f55e13 -:0035e0cfea897ccebcaeaa144ab221200eabfd -:0035f0a9aaef05bb424becf00d8d2d9452ea5b -:00360064d140be730ccdb6fb6e52a258236c46 -:00361055b224b945df77f2acb70053dc615178 -:003620af480e28d8c67bc4c8ee5948aefc32e9 -:003630f230eb54d2bd758aeee8859ec27053d9 -:00364060e8585d44e290785e730ed09cd0595e -:003650c62a9e798b4ff838cda94a933c3e3352 -:0036602951f28e6f1c9061c823a5e117de12d7 -:0036702482e4e2e05a0a1a4038814209cc0329 -:00368024bb5399a416653cbe59c34459004772 -:003690acfb0b8c7cd9262dbe84deb799e2f9a2 -:0036a01e2bc0fc70bc9754d03f83732e6a26e3 -:0036b02895209aba209101d63a9a9b82e7e8d9 -:0036c08aba151de8a52d947f7adb91b641a4dd -:0036d04cd359da356edad4c71a00af7a291e97 -:0036e03eef6f7ff5daabbf105b670b5eecf343 -:0036f0fe574c2027243717e3f067b8ba5d7fb7 -:00370069739480b0570237502dadf7d41a033f -:0037109c8f38ad43153100993a22e9a1a4b60f -:0037200f6db2a9ff32d19b13c6c7162622cdb3 -:0037304515b898d406d02fcd6306fd8d10146c -:0037402059efffe5903e70d720c76ae8a05111 -:003750d2b3035583ad7b4021f98526878134d8 -:00376039322b21b4f7c80470aa57b25839369c -:00377061385b975fdf4ccf5b6098f852c030ec -:003780c9047aae2f6a2c132ef479a1304e7486 -:003790cd2bd912333b042eddab76f2f960b98d -:0037a0e7c7d5f80874e13d14df05b23d4fcfa5 -:0037b05089da5d640b545cde2b95b420ab22c7 -:0037c0932949e65ea9c185ff006175fc8f765e -:0037d0416a12fa84d3dfef3f025ff02747adce -:0037e041a7dcbf3935eeb092bc938cf341212f -:0037f0cdd8818407fbd28095cd1f1d40c0e5d2 -:00380060db24a8322c22cc798e9221bd5c71f6 -:003810005fee824dc7793c4552554fa6c1282e -:003820b1722a25ddcb6afa09ef50447aefac5e -:003830305f52d77031e7472590c1d2d417b8f6 -:003840cf3256a55a69112e29e9b8c6dbadcfd2 -:0038503025181c1212970c57db1e2e21ef0d20 -:003860789e32dc70bf441335f90b3e7a038788 -:0038702e3e59910dfb1e93856b5acb29c6a395 -:003880d31de725b4ea81a4490ecc5b523d0504 -:003890d939333650d2215d2070fd0705ff9451 -:0038a0a62312eb3ff1abb51e819d5dbd6937c5 -:0038b02d44294ab3c917aff2c49ce62dd027d1 -:0038c080dfab250570283dd69c61d7c47094ff -:0038d0c26603b0f807bc0d0b8cfc8103391653 -:0038e0d85777c41eb6b3ff7349d35b21cd2ad7 -:0038f0f43fcfa89bbdfe63d79fb35e7cfb0bee -:00390057d9dd8406d0ef6fdae4b4834c411fd6 -:003910ca5956ed0ef7347322ab30bf10331bdc -:003920797f4856326bfc7b796fe4ca9bbfc590 -:0039306bb678dcb33e24a28136ec852459a9e1 -:0039409eac6453942279e69263c0b0836430b6 -:0039505d614ab5158ea2f2c25bf157944e432e -:0039600bc1a9ff08182e287cd5f0be4e0ee428 -:003970d07d22254fb1715304d43843c93687c9 -:00398012ad2fe9d687626294baf4d53573a0d3 -:00399013ba46ada6528a92527b1d332e306b1c -:0039a0f57dc607715d2dc414bc68581e027280 -:0039b0d12723877b2c7ab574ac1e62f60d5871 -:0039c03aa0e9896b796301c949d69acc7b2f85 -:0039d0e8600e7d82d033120b0b797b64a30205 -:0039e02de67239c5379fd218d46d3f423f752a -:0039f09fcd6608022572522b4f02f430cab22a -:003a001ba0503422ea20019062825f0ec16848 -:003a1011f63bbdf930d12c58c6f9232c590d52 -:003a20080152eba69f7a96c70b66d53498e245 -:003a30be3782e5984b3eb615853e795ab4fb5a -:003a402d8bd00bd25ade6b1f7bb93d472b4284 -:003a50859b2ba7f13d994dd8f403c292541107 -:003a60aeddd7ff7dd155fdfe8e5d50afd869e5 -:003a70d0b2483c60eb8490f942541d52bdf8bc -:003a804ceb35e75d9c23e6b17d4da1628dde93 -:003a90d42952b50d80fb1121378603e8b61db9 -:003aa087f3625a9f1956b5ea2198d894bb4028 -:003ab0020c9d55a54d8714356e316ec371be50 -:003ac06c4d8b95ebadc440d9741d112ddda0b4 -:003ad05c47ffe0ed100a917d6a358d63f1b0fe -:003ae06d5a94c42896ec1813d0fbbc3cf85475 -:003af0796aa1a9f79fbe2f198a8721d6aca22f -:003b00f5d0499551c50957db2eb25550d01846 -:003b102c076d04dc553ac57bfe635b65e068a2 -:003b20ab088646d8852b685f0e27ab231c15f7 -:003b3003c650ccb55c080434e4049afa40ba9c -:003b407bb49fb0bbe6ab8fb5aa2ab87a8a5c76 -:003b50524ffb6ed3e84401781c1261f3f87a7f -:003b609100c0e9920f1b2b352b23f6187985d8 -:003b706e207aed56a08c5293d0acd47b6aa462 -:003b80463938e5b528f15f231556ec5511759b -:003b90cd0f74cdafb18f9ac48c0f535a42df71 -:003ba09762cdde8f89abf53738a8e347b54976 -:003bb0304b3c4fb9d76914811f049b242deed7 -:003bc03d4fd8a223014caa22ea082ee0346519 -:003bd0b34773671b6755a4838b64288020d3a1 -:003be0474252d5659e4504a7de30ccea42d63e -:003bf060d61a926ed17e2414cdb2c565937ea2 -:003c00f69449351caef8fef85ba8891b8eba60 -:003c1069426f8c450e9016455e691f123ad78d -:003c2042f4fdbb53162d3349a9014a228dae7d -:003c308496f109ddf112103f9282b1b2dae71e -:003c40942efa0ad88317dfd88b8d7997a01112 -:003c508184b1ec077f56ee0670651858b44aed -:003c60a2e460050e78a01bf7295671a4f44d6a -:003c7007e7fec0bf6a9af674d669c877f222c6 -:003c80dab12c3de5c715b33b0c52f5f6b03252 -:003c90990f81a18f8b98c4cfa043c2a29d69f6 -:003ca0c86817457f8b55b6086668e8121b3759 -:003cb020b21c6a2c86ba0716f6d8ba89d3816a -:003cc00ddc7b45b2f13ad2eb4a93bbb77b8304 -:003cd00c7d7918024c9729e85b6e0376886d42 -:003ce03a852a720b532dd4abba749ea73a3a5a -:003cf0356bab62eff3b00716163f2ef8fcac9f -:003d00aef36b7d3c69e8c06983fe8c81e4dd87 -:003d1067dcc415693cb0d4debfb3e61c677a1d -:003d208f9359d1d78a7a5459cc7aacc111a1b3 -:003d304a7b7b4218ca4c866631c17a44034cff -:003d40174ed24af7d95008afc9336b3672c4d6 -:003d50a965e76cb7c33d02c87b53a74970b745 -:003d60937879982cf10140f041548a1a633f83 -:003d70f7c0766a1fa8965c0b90e748142174b8 -:003d8077b43cb979688b2c528adf1426e976ac -:003d90c4e81fe62faabb097abcbef76c2ca5ca -:003da06f35bc873be497b092d62c3be6e5faa0 -:003db007c0eeaab925c39de6d6de01384d099d -:003dc0747a615309ed42b651ea80e4198c8793 -:003dd09d477b70403fcb4fcf3575dca791d1b6 -:003de0a849a4ede88d67fe6f926645c9a41bc3 -:003df0454e2e1a7ca597e43f9dd15406fe81db -:003e003a08a332f4be66faa0015f095fbe07f3 -:003e101c9f644db22ec411b86dda09d3f00fb0 -:003e20dcd28535142fd5cf3e2d4e7979fffbcd -:003e306b1eb446dcd6d3fafbb6b134f36cc9ec -:003e408c7d3a5a62d28046c599b90d82c5e4c3 -:003e50c994d76fafb4a61f1f0dfd7f33d278a7 -:003e6066152cd40acf08de27e26afd2439bf91 -:003e707390f0f78f4c60909c4c56176eb841e2 -:003e80cd8aec2558db3a1ba34e9132ceba3407 -:003e90568315977cd092b7666ab508c7632be9 -:003ea069d122612bffd402f2d8576eea6ae287 -:003eb0991450ae56f62d710a0b66fef49c234a -:003ec0bd090f40101e4d7083c8c47eb4f2b8fa -:003ed0d48164135e917436985c95a4fce2d067 -:003ee07cf8ddf3ab0cd250753cbfa0c3fbecbf -:003ef0fef8902290d50516fc26da1f8e630197 -:003f00abd7db47b50f84346a0c175563eb6a14 -:003f1075a13d38594f2adc1d5296a598b48cd3 -:003f20564a39936c2c4514721f1aaee59e8912 -:003f304b897032387bd2782e7f1f0f685d9a04 -:003f4036e40e077e743628df1dea800b6d3b18 -:003f5081f63997a24751f479ce5388a53f6319 -:003f6061568cf314b37e2250e9a26a71b3f821 -:003f7012fe79239cbc1556ca96a5a5a816e758 -:003f80569dda4327670f30335bca38401317e3 -:003f90d47e2f28b01e6db38f34fd8fe0c4733e -:003fa011f4af388a82b5e58bc231b285a29f92 -:003fb0de5dd7860f7111d71cd90b36e1b777e9 -:003fc0dc03236c281b0dc10e710872e224c7ec -:003fd0d615e16d87d827ffec661b76c757bd5e -:003fe08b5783964745c49be5633a920b393d7d -:003ff02fb86232cf7bd64d75deb0515592ccbb -:004000a405a76c06b345538f1cd85abad0015c -:004010c69ca4780ae8e4aa2ebc4e438d62f320 -:0040201c04c3faa8d6b227cba8cb3242406d77 -:00403037ec86616afc909fc56b11e8f27c086f -:0040406f4cf6fd76e87810fa310c2fb483f733 -:0040505e06f6b4a7c1b4ab1617fe9dd734acc6 -:004060573eed0f28f442379e7a6bae41d1fa20 -:0040702475d151ac96f44b1e2795ae72795d37 -:00408045c1eeba9f52692a61cc8cbdadcec03b -:004090193b34bdfd625e39f59900cc290c508c -:0040a0840813e0c5df56950658e9ff44b387bd -:0040b0f938689231fb2d46b706077ea40da37c -:0040c0eebd7ce10c96c2feb013277c0c70d728 -:0040d00f674bdbadbf498a286288a4db4f2cb2 -:0040e0f3bc9b99a089907cf9021fdeced83474 -:0040f0db29cf0409bcfc839d56df50ebcef64f -:004100f5b1debcc4e51b37702c3fe473671ae2 -:0041105d7dd450b675a2a884d2bdbe510fb438 -:0041205aee3806c3c2deea0fe4059de8f0795e -:00413090168e25edb75099284472849612bcf9 -:00414043cc1c06d9ab7ccd04cac0df30347548 -:004150aa8cfbfc7b3f54a75eeea1c4c421ece8 -:004160c54803b3903c593cb33872754139caae -:0041703cb266772c16575d1e58dcc9bfee59c2 -:00418019fe50cf8887ed6fd5f3c010b6f638db -:0041907edf566818a39bd543f5dcff6c1e3f4d -:0041a0554304097415f4d00f7c76d49859f8d8 -:0041b0f304feea41a6afb7e34fa558152fd5a8 -:0041c09d087fca6b2c1b43cd40e3f2ec486ab6 -:0041d0d4883cb86b922aa22d08846fcf4a17e9 -:0041e00010800d8749d415127c6c4635ca7326 -:0041f03ca746113c4d8518cf55262d1d80e594 -:004200cd1333ea14ced69a6ac6c6258de2816b -:004210cecfdac416d17c94806eb9a067270efb -:0042203a9b192914e1d2087cfac27367776a20 -:0042300c19a2b8aba5d822014dcab8d18d461e -:004240e83f8f718e8b6a16c4cd1ce1c555db64 -:0042505bd2137b244286e0b5c451277e9364b0 -:00426050b73f570940d8d6ac709fc03cc20bc3 -:0042708a6bdaba61ee6856c9b7ef34ad113670 -:00428008f457bebfab531f2352fbb9ad9415cd -:004290e647002261023867e65b37d757f8261a -:0042a0a59de4430496312a81e2caebe923a20e -:0042b0cfb53163e01cdf5bd5bb8faaadfccafc -:0042c0b55d6604f3ae5ec0b180a6a316246821 -:0042d06dcfbc6c5eb1b8b4e5e104692e82c654 -:0042e0f39dda2ec814322a8de50589ec912365 -:0042f0ee2dec12300feabb719f3af3a83ee28a -:004300a6d431f4d551cfd3307afd325d6294a4 -:00431085779f0abd63e39979409a2864d1d79a -:00432060cd7200706473bc687bfac8777348dd -:0043302ac5bccadcda2bc5f2bebeb45db2b28e -:00434005a34ba4b8c12f511f095fe22832f147 -:004350a16aaf0c0a0d6cede91ee9a3fa626a5a -:00436056adfc02020f39dc6e3dee172ac44371 -:00437061b886c4a793e4706945c447923f1588 -:004380a8a7cce7199c4c48b28a46c52abc660f -:004390bb93cbb76f71bdb8d48c014fe496a2d8 -:0043a0d9e76c72610a18934245509255ec4ce0 -:0043b051e63a1ccbc4b16077324e5921bac46c -:0043c0d32fb3f4cb39199d125c5354106db3c4 -:0043d0d2ceebae4d87c18d7debb7d7dd400178 -:0043e0ded153a83318a07524f2c6978d4caebe -:0043f097efd788b35faf546094d81eab7b3c99 -:004400bb1d9b979635b289b9c7243516428e46 -:0044105477aa6a19fe174ef6e38e3dede68f58 -:0044204b490de63578e854e4ee270f7fc22c91 -:00443025e0662556c63272d79cd2450f84f694 -:0044407e1ece6ffe57cd8e363accd0448f6acd -:00445089a26408c329371127a33eb34a35260e -:004460e2ba5b16d991df79b40acee7b6227b74 -:004470047f31f734a1969ebb8b27cee2799244 -:0044803a469d6728d3c7f4b2e12c236740ca59 -:0044905d278b80c72299de316efbe49a974644 -:0044a05b890310c6bbf61d726dd11541cef09b -:0044b0e67fdc0931c49a0bc02c31f767105889 -:0044c04b7d7caea41738d3cf3b8c844e16642e -:0044d0f20e970bb0e85acd60dd4fdb28e9849c -:0044e02f905b577b0cf244ea45980f94271269 -:0044f051bce166e92a995004bc19520b09b94d -:004500c1b3eb4e07fec3eb663cc16b3c5a2395 -:0045102103c8c2b521643c7f5ed89ca2d1fed8 -:004520e9d1e513670c0db4b70f0dc28cfce23d -:004530c292242b287583023e86437ea0d8a526 -:0045406ee244531505c248e86dc17c16eb9a6f -:004550d61063bf377cfd253ada9b1ed5c212c3 -:004560519a6c1d92615b33b6320644304b26b2 -:00457007e4d902ffc801fdee74f474d412eb3c -:004580bea390134f3afff05fd189a6a0aac6e8 -:004590a38694847d3a26947df86d8e7891c79e -:0045a02817bc30f2e040e2363f86c27f383e8b -:0045b0df9bc388ba94a1d525d93768f93138b9 -:0045c0e95d006fcc5ec86db0535fbd5c458e95 -:0045d0fdd52ca8fc753971079afa62af8fe1a7 -:0045e0f9157d4d49fbfe69d21a92f97b6d6d43 -:0045f077aa8c8afcb3577b0ed2bf1468860b24 -:0046009fbfad7695c943e95aa8b748ad9829b7 -:004610b4d1fb8b86a143d220865aae3dddd311 -:004620ee19fafc70ed8fe5f0ee77c9e0448c5a -:0046300fb0688fde67218a977719e7b5d82852 -:004640c511bdc1d936a19fddf6348fd354d1c6 -:004650f7e7c0a268dc4d5067e5c4b9c4b2e936 -:004660887543dedaf8c51f2b9049297dec7f6a -:004670bf3179ccfd6367c54d88b910c4792f5e -:00468046da6b0882d9924b6ce9fbb5f25e4bf3 -:00469022fd9ecb0c02bba8a400c1c06d9dbc51 -:0046a0f319cdfff60a48c23053cfdd932c04ba -:0046b04d632aa0cf28628346c6e4b6832b436a -:0046c06cd42650416e7823a2911d0a0f8f9207 -:0046d08ca83f524c6659bcc3c3e9029a44399c -:0046e01b4feafae1ca539cfc5b8e2fe0933f06 -:0046f04e6a9e9a14b7866eed3c403fe82fd580 -:004700cb59b33888a53edd6a258bbf70357bfb -:004710a2dab5790d243a3bbd394ac546648ecf -:004720a08c974e70cf40a686d863c83b234149 -:004730240098b9a54942531ea380342a0d1002 -:0047400ded80df6eadbc0f5a591a3a632fe8e9 -:004750c088de76f46cbb8950cef70a82862ec6 -:0047608aa3db905abe83b6076070cf6195c6b3 -:004770cb304d532374f77c468f71b2ea116113 -:00478048baa33fa4a86dc11af377465daaae8d -:0047900a45ac8b6bcf380fd9f49f666498df28 -:0047a0491e68bb8e74c07ee92cff711f51ad97 -:0047b082f5847bc1ef72d62cf436731d323577 -:0047c061cb7ca2857aa620b74543fee12933fe -:0047d084895a014baaff2d9260c44960eca84d -:0047e0d1cf7646ca548113ca832d2d16a6dd55 -:0047f0a3b0dc89c8c700ff157b8f7cdb460b44 -:0048004322a11645a020c03c0fb549d89681d6 -:004810d6071181225da0a7b1ec9449fcb0bfa9 -:004820e5d2653569cccd5b797afd6c60c165f6 -:0048305571cbe212a8fc4735a13253d8bdd143 -:00484017aa53174f5cdd93da98930f776b4126 -:0048507986699c7d7b684bd70b318e1516f267 -:00486082c303a449376b4c5553cd5c38b90f6e -:0048701baef54728c37ef51f1a482b57426c36 -:0048801917500ccf20acb80c59171dcda9ef4f -:00489008e304a1743440e528214492ccbc1ed2 -:0048a0f50a9fcca64f92d674ed7a4f53187367 -:0048b02c3c874a27068fc8993df09d65cc51a7 -:0048c0c61137d7f4a098bcbe59f73617437b97 -:0048d0e4f28096d50e94e494b30cc69eeb66c8 -:0048e0e0f8d8dc8ec177a6312ac646e7b095fe -:0048f0ac1c74e0140912775bffcfc04b4e4dab -:004900e1d34929bc2589a2218cef54a8e7b94b -:00491021fb626289ba91fa30d1a0fba5cab613 -:00492074f738e17da5cb5b9e8766771f8c0232 -:004930a4590fe4cc3b4350571f1f53916bb89a -:0049404a55cd49b1343874e8a78162b28a3f83 -:0049501638869cd58d193ad09d71fe1321f895 -:00496070cc97f14a781638d943b5a3260a56bb -:004970303ce7e946f52d4740c41f506880ec4a -:0049804abfb47fa49384f0bd940514b01ec567 -:0049906f7d8795d4289d4c04493bd33a343b6b -:0049a00d07e2d1ce9557d95e3d2586df8e1c17 -:0049b054670a2679d57593192b75614ea93f45 -:0049c015e8f580e8015ebc8fe94552afe2a3ef -:0049d0a0c63e27f780f69b41054dd543c4e73c -:0049e0228fb9dd7e6c563ea0501add032cf739 -:0049f0bc68887a283a08a383b0a5a7d299b35f -:004a006d8fac3aada9aadb5e53f120a81f576e -:004a105139d703d451a199fb2be8044ae12004 -:004a2028ce18fb3aa6935b6719bd18c8e3667a -:004a304ec13cd8cc5c48958667b98a7514c1d8 -:004a4049ef563313a88cb2804dc61192755b67 -:004a500482c24412124e97d1630bd92c70f4f2 -:004a6062b9cf47e093752166138b164965c029 -:004a707fc0b4318da6fdb88379650b2ab10540 -:004a80e34a946bceee1493aea084e1d64504fc -:004a90f8e13bf16dda42f30c30126e1e7641b0 -:004aa05f44169f89ae216fd496f18835d71980 -:004ab043499297d2ddc91a2d78517ef874661a -:004ac0fa734e29f015deac778a54c51b103847 -:004ad080a70f6cfefc179179704150c84e2f58 -:004ae0bd19d6ddd700dc1d60013af92f04c5ce -:004af01dc7de6059d88f6be694da3754798614 -:004b00b609f805500f126df16487375c5013d2 -:004b10de5002ecdce89be69e9d5322fda78c30 -:004b208e3e4ec0e798a0e8351b58e29fe3e288 -:004b30d2e58c86f2d08bc4b3806ed0d427d4d3 -:004b405f5bd581e2a8aeefcf81fddfc9f76675 -:004b5026a30f1f6c77d9907a484bbbefe8fabe -:004b606e0b27d132cb20c49af310fcbb716b9c -:004b70ec2dcfc3cd34fb10fc4d370d3c86f4fe -:004b8067433be1a0825afaeb411db0e71d9a13 -:004b90c83c6078bbde21f33e3fed5dd75ac074 -:004ba0a225e9161762bc27a27998bf4336185e -:004bb0ada02ff1041305ce7a9d84c48cfe7f05 -:004bc00e4ea47ea4d042093157b578d1a1800a -:004bd01992cbf43ee1a14862b15e8692e02aa1 -:004be0d0bbd75c9c7c765d5706d12066a29589 -:004bf0450d45a3299b3a9bbaffb3ceaae0ab72 -:004c000862d083194d8d0cda5adc9f985677a3 -:004c102efbbda4832c53319431ad4db42bbf5b -:004c20c22a0af88ef30fdfc6a7913e7854b9a1 -:004c30d2745f2427bc61b97429bd8a924dadcc -:004c40c6c16eb79c16dfdcf388ac548a7d71b7 -:004c500012fb39b97a8d881dd61b72e2fdc584 -:004c60389eadb9fae52e0dd697e661b891c609 -:004c70e02c4a1e3a0956cd121a2de8cf49db29 -:004c805348227c78f3d9271c2d80093e38093a -:004c90b98055fac44952714e91bf923213e480 -:004ca08e138553a4a714621aec74e8a9986853 -:004cb03af6e246b488232fd3279f27d7ecde3c -:004cc07e8f9d33b215478379f29bd3bdec3ff9 -:004cd03ef452b3c2d70f66c9296a3a50736004 -:004ce01c31b1dc45e12f4246561d30cb86d357 -:004cf007fd3d54b409db3e98ee7d5a12d8bef3 -:004d003ce01c6daeb8bb076b3591405376faab -:004d108c33a666e333f190dd3f4f0dee67b387 -:004d2089a245fdf5cb319fe9b5b88ad0b78461 -:004d305c0f7905240069d7f094c126869eed8c -:004d40245c344a3f0a58e5e942402b7be30f32 -:004d50dfb54ec0d54f5a2cb9312b68cb43bb24 -:004d60266198887d35f6d01ea1688fe0fcaa5a -:004d7064def2e8df2f608ac6c5446f0463ce21 -:004d806eea1a4c9b4b82692c45993a76e5a18d -:004d90f362a29388c0b5cf6f0d90ff9052b71e -:004da0fca0a9ea0eadc92021218e0780aaa6b6 -:004db00625e19c84beb39d535c2b422d1ef9d9 -:004dc010726476550028148ad804cb3c61486c -:004dd04532c9b0f7f670bd7778fd3f2075c7ae -:004de005d4a8987da4a3bf0817b9a8efb52ee0 -:004df0c35ddaf4f883c9343378b6d127645d95 -:004e000ba0a1b2b252ce6cf868e98e5fcf930c -:004e10d8b3605c5b49beb8e3fc5500e3a939c0 -:004e20f760c46e32157c3ba1815e265388f1f9 -:004e306381ec9271bda86085068fed21f21fd2 -:004e402946faee68ce0704255798892e55f059 -:004e50fc7306370258a9659e7693baee9499d6 -:004e601d943920d4a0f4af98dd0696ad8ec9a8 -:004e70e90b1faef2b7594b936d4164ea018f67 -:004e8022ed98c941971715a29d6d6190e2c475 -:004e908230b6c46abedb421c66f2263b91e5c6 -:004ea0096a676b4e4f5bfb1fbe99d8f215dbeb -:004eb06f1f26449f6e98232905b69b7c9e25aa -:004ec0be8091daabf7ffdef7305ce1d2a51c5b -:004ed0b16012c051881800c2df4f3bcb38d308 -:004ee060d26083ab322ade5c602df54023ed31 -:004ef099a84f657df6c0b142a63d80c8cbaf38 -:004f0009aa00dd68ec9d86541ae5aa2fa19c9f -:004f10ce1030977feb416939822c855da691ff -:004f20490a80eeb923a34a161c866844635dd7 -:004f3099305f3d953b0429840f92bee4b6fcdb -:004f4013233a61b950aab1c9f1ced1964bd48d -:004f502fca56d79976344ac804558729b9fd6f -:004f6032e39bd23dc2db01e115674991fa9e8e -:004f70e7b83e823bce5f2938bc541f89f8a743 -:004f80e80d783ae08cd3e9cce33fd06db92ba3 -:004f90f399ab21c55fead96daee5c45015a622 -:004fa0faef26909f4299cb8cbd652db1bf5cb1 -:004fb01b0678fff3d6409bab66d4c92a477a05 -:004fc01c9649f512b4a7656b64a2f67553bfaf -:004fd0303536c6026a462a6dc4a46cf0304b35 -:004fe03d88ca415c8f561b31fc1c1ea1990a8b -:004ff05b0287d7af6aa446a4b48b48a51fb5f8 -:005000962e528b3a22f65f77cf7ec5894af973 -:0050106b9ab06be96cda19e888668d20bb927a -:0050206af7f8d28d1fff0ab071f86792d7d4ad -:00503057ccdcf1a6201274250a22835caec8dd -:005040500caf936df8048292be6e2ed1f94db5 -:00505024bf2173c104658249a01675f9776113 -:00506003d4b6bd0839947cc39025a03ba098a2 -:00507002607d278cc34ad2afbfb0bdff9cbe80 -:005080d37ea385bf82401b85444091f2c6fa45 -:0050907e1c4a0a4e93d29da29ecb37c137da2c -:0050a01a4a92d550dedabbd49a9a99444161a5 -:0050b0c65631b20dbaa5cfcad35ae503c323b9 -:0050c00bb1339d176b764753922b73d3bab979 -:0050d0458f0d333785ee06f6fe0aabd16d37b6 -:0050e0a7d194937d37aebb877f91f1aefd3134 -:0050f0b6579544674afd360ebcc413ccc18476 -:005100c4eef1b4a630796ece86e679ef603969 -:00511039dbd42c27d086cb13648a3d5d95691d -:005120f3e23f506bd099cd31fa1abb19bab32c -:005130fa6f67878ee9da7b4fc8b7a262b3fe69 -:005140934864e230e7db2ac36f3de19e5d81fa -:005150c3e0f66f92efda030434c32f7d17755d -:0051607ca52fbaaa3556db2917fcc5601e6e08 -:0051700ca7b16cdb74a3a285fdb7652be1962b -:005180a66e3bf44f64c10450802c0045060135 -:00519056985c393424b2b7fb6d557417693033 -:0051a023cccb5817555d291fbc53a69f107211 -:0051b0e4335ead815ffd093d3d72406118b7d2 -:0051c08cf6dcdf54fcbe94e9dba38adaddc060 -:0051d0d6b616206c0c03f5da8c6ca51961a1d0 -:0051e0be9506c95abefd33da5411dd5707a247 -:0051f05b6d53cc91a346d2d7687f52abbb7552 -:005200ef009f662794f768025a685c79563ed8 -:005210157f74193c86341e894cd38fdae2c89d -:005220ba419acb35ec158a21b041724ac2cc45 -:00523070386e9f8b54e897938db572210e4781 -:005240e4aff425afbeef28f06e5ec62f23a896 -:005250817ae0b372cd13f469bd1a9bee54e0e9 -:0052603c197900b0cc9472473d6d7a32f8aca0 -:005270fd622ea252e3a957a561019158ab4507 -:00528066e0562a923c38658b60246e0fdc4174 -:0052904bebb89967cda1ca54a209dc902c369d -:0052a0e14f36e102ebe2e3239a08a44b4728c4 -:0052b0675e4d0491cf328a3187dd3c7e4d11f2 -:0052c0e4d7331669fa50d06e4383956b7c5b4c -:0052d05c8abed513b45b01f74293c9edc8b2b8 -:0052e06e3ea59eb735703dac85ddde4580c1a2 -:0052f07f6794fc8cf3641952ad270520903d9d -:0053003f33917adbaf8ace1761448947efff7c -:005310969ec1c89e14f8e400c6046b4400ba07 -:005320c82ea9b669ff849837a9905c17259bc5 -:005330b1fb9d967fb7320043d3eab3b9795bc0 -:00534020b8a9b32c236633ecd7daee879bd2da -:0053504be4d132df05b0348f7da4d610007117 -:0053602562cfd3aff5e6701767b9d2558dc362 -:005370556eec0dd5f99b309ea3169c82c9899e -:00538087173ee36413641074494286234673fb -:005390215c5b07acabcb85b5bf2222dcd414cf -:0053a07d73c9470e8eb549c2d7604fcb61c1db -:0053b09ca42dac86e13be137580bd3e11329b9 -:0053c02bff8f9234db8c4c5c1dc8d45dd5ad06 -:0053d05b78566a1b0f64141b63684ac41a37c1 -:0053e0f16d7cea08bc53c3cc663b3e6fa53f1a -:0053f00c189aa3894c820e9b186a3cd979555c -:005400e2f09a69450b44f39c4db19d66c3a19f -:005410455831d5b8b326a9a441ed1e1e46f584 -:005420f7308610643dc1a48c3acf9243f8465d -:0054307146817f88401b4c6a9e6155efbb79a7 -:0054404c057fa779fc92692c41e95d2ea453a2 -:00545060779e9549b39b9ebd5aeae06e580cb8 -:005460b6733d290fcc2691eff8b23b3bebdf75 -:0054704e6768be5a48f5f5dacf5429962bf30b -:0054805b168ec5de9b36713a4f26e9b8b5fbfb -:0054900116daaee535c6e8361753062503922b -:0054a0d203d8ab1cb4017c5a3d720e1fae85c6 -:0054b080bf8135cd408cd27389947d3c28a521 -:0054c0938dd8416b372aa9504da3b4e4ef610a -:0054d0bf73df694792f8c7edf9875ab83da7ff -:0054e0d2afaa6bdd03eae77104760e90cfeb36 -:0054f056f013f50bf2e7aa6a2280b8fef84dd5 -:005500f0f2ba8ae0cd9ce5e3c74fa5de92b49e -:0055100fe1e01289a6df47bdeb5264258462e5 -:005520836f9aad8e363d889538e4fe07040b22 -:005530cb1ecab889b89c1502aeb9e8a9c92128 -:0055402c1f8b6e7055bcfe66d1750641ce6dc7 -:0055509884d19197d6c0d06951a89ec349594d -:00556076321a32cd7aa94fc1f62f880a906fe7 -:00557086d4747a12ea521e86e9319b8474ea8a -:00558042f1f6b0ae90997b70323ed85a698feb -:0055906897da62b38c908d4ce09f18f09f8c2b -:0055a03c29b559738fe55dbb1b359acc8613ca -:0055b09eb10976b2490f3d6bc4dceee7267f68 -:0055c02336654ff96c903220fa0376b1949e0a -:0055d05ea6e8e1dc04d365f4d18619e94e78fc -:0055e05680d110f4cc1a3cea95e5e7a5544d4d -:0055f07783db943721af23732b4debc20a167a -:005600503591d892cceccb263585c1a0fcaf5c -:005610da367d52412c5142f4afd0e626b465d1 -:005620c3c2c339aa104482fd661a7a935b763e -:005630dbeda7054c8ce38e9ebc5a4865a33757 -:00564094ca9b3f4201a575937624e31c89a228 -:0056504a6f2a3c45a3a7c5e075609fcd609390 -:0056608e9c41e3f7565004f7f641bb2d612d37 -:005670c07535b235c236150a4f86e5c2e20029 -:0056800a0811f7f922b82eab63077920012aed -:005690428c40046307a85346f4cb5f2aa77e27 -:0056a0066bf07471af9b931763036c956a7bfe -:0056b0ccf6ece897813320491aa12321fd64d1 -:0056c0892b69f728dfa2141baa861fa86a6a70 -:0056d04ab74fb1a79c7b087c4bf7e7f754786b -:0056e08731f255942ce4a33c0d86f6c7636f92 -:0056f05cf31b2a67f3d2a58d496ee7551e08a0 -:005700890236636541fdbc72456395827eb49f -:0057106528d5859e33d870d37a801fd1dfe1f1 -:00572075d1adcb67a2cf70e45f26b9cb500f30 -:005730168a961885ceac3ccc74b24ea94227dc -:005740de35d6200aed9224f411ce7e3c9e9f4c -:005750c5811bb94eb3b2d1c61509ef86311645 -:0057608dfcc1de0e6a2b8a8d8e3ae0b9608f92 -:00577042aff7c175f3c56cb4561b01eb832fdf -:005780250195cff532ac46a35104f59ec9f86d -:00579014a4257d84ad84d305c8712a38324e5f -:0057a0b061aef0bfefcc68225d965083d26de6 -:0057b0a36184b1568768b79514cf0da4423da6 -:0057c00a0c6aaa2753641345038aff11e59d0b -:0057d0805c911b4587d201e4d594c2ce0ee5e8 -:0057e041598dde6a53b08b8f9a23fba1e219d2 -:0057f01398d821464a8e75aff8aebc9e4c3e7b -:005800d1948d05d739645c23bf516f72df0ae0 -:005810276826d5dc8df67b1c4db92f2a01b59c -:00582055e205f25246c5408bcdf890c28e09ed -:005830420b0bff2e3283770bdc63554fbc89b3 -:0058402f1b01cd0e864d87b1f893660b802b6b -:0058501fc2b012b6f5dcbadb60a9a5fef59c96 -:0058601b1906d262870c42e8f26da56ba7e56b -:005870677b2934c7b11a88eb1dfdd664fea612 -:005880f975b2a0951de15155f4be2b3cce3e2f -:0058903ac3e4f5958d461d7f059128ca031f27 -:0058a001ffcd631b7433923dbaf2e438553dea -:0058b0eb43c7442ac8948afba64ad88f33c5a6 -:0058c0271756989b9a26f7cab5dc29f63acb55 -:0058d07dee7484f8d9eebc455db75850873270 -:0058e06a50c2ff1f259988b1496ea66bec74fe -:0058f029bde3d6e72e524cb9007f5073c5093c -:005900bd4f2eb7348b16af7e6e6137db26e5e1 -:0059109743cfe329aea7bb6b8732fc250872bd -:0059203d9b7ee679bae9127cc5ffe6a7dfd845 -:0059305ae2d16f212c9ddde084debdeb5adfb6 -:005940eb3b21df7e21087f8176367025d2c792 -:00595050164a4ac8a20815108149ea08d1484b -:00596047b278376678dc5cad13508344320b62 -:005970a1ade899e7b6dd8e72ee1b605a58b4bd -:005980de40d0f85172042c9123d9b9f622f63d -:0059905a109b95fd6577107df28288e73e5ecd -:0059a03dc63ee3967f9147a50c3d278a32973c -:0059b0a58de11eeb84f48dd3fad767b6a511c8 -:0059c098574a13aec088af8bd56ddfe0d1834e -:0059d01148e57e83ca6d218110689a1788b48a -:0059e0403c24739016fa20b7557e4222ffd77e -:0059f034664bd35c6adcf2f3727d675d5b8de3 -:005a00ec96e3d7b4920f138888f9362d381749 -:005a10972ebd25dfd0235ba98efdc3235b5050 -:005a20e941be5751673618d1f44b7439f3568e -:005a302f0d2e6df96158152c5c8c4f83c5ad34 -:005a405e1711c9cf5c5fdb06daf7c6b43c0e0c -:005a5085169b876de2c3dbea6e5f05a83fb8e3 -:005a605f2040ace9999dd8d50168ca9a6dc709 -:005a709d8a18c19083efb8fbb394950a1a0618 -:005a80aefc6d89d00940a12a461e0489a713ee -:005a9041188eb7a14c7ff511249fd1212bcf65 -:005aa0f70c1349a1a4c0ea41ecae11db34d9c1 -:005ab0edc7b7a237d7ad62013a86f56979799c -:005ac0e4010e1a06a91a971a6f1d16f55dbb46 -:005ad03469e96665e698fc7f9d0b0e60c67f24 -:005ae0cf89e8f9bd76cab6de0de884a4ea9e91 -:005af07a0348c79bfe6d598978f13640f063b4 -:005b0058346430e7fe5bf37f3385932944d361 -:005b104244d3f261fab7803f14de96f0ff0682 -:005b202bf1714f24385373683cafe6da724d87 -:005b3045da2b99cd8da5c829bf5422eddf169c -:005b4021bc96723eb7f361f8b15be5ec92f142 -:005b50fae411689d7790fa4c9cc4ed7a18bcc3 -:005b60507d7a0ab7a06c4963a8adc8efd1b121 -:005b70f33a432a6834d30dee30ee5aeebd88b5 -:005b8019e0a439c74816b88febc318691b9105 -:005b900bb9b51635b7d792abe5ff512af9b45d -:005ba0126f57c2f144d43ea9b21e9dd50b0ebe -:005bb0f7414fe837b11d07c3543c10be87a32a -:005bc083bd2b6135e0650473522c52a2da8ce5 -:005bd0f7ba74bf9aba1e4ad394d4762d98ad10 -:005be00f7416d838f22f4d6a502133f4c3f9b4 -:005bf05c6a88c40b03bbeef43f772e5ea0112b -:005c0008500a72262ea42d2801f6de28c7dac8 -:005c106fcaa27c52c9758d0d35aa36269c0995 -:005c2063d9a4abe6b18ce712d62f45bca10e21 -:005c303d2a8897975679581b81808b3e21ebae -:005c40e0c4ef145d54b7939943d3d325873bf7 -:005c50eaaeb9bed9db34c40ee4467890d3497a -:005c6022585e01d98b062dbc46d434e99f7e76 -:005c703ef19249470f5aad82858e4d4485e095 -:005c80ab48e5f1bbeb436eafabb869deac920b -:005c909f5097acec6c09a6a4c2835426dd7161 -:005ca045c8eb652cb78c5ef0c9cf7b10f73f13 -:005cb0265acae440573a61448b1c0cc89a6f6e -:005cc068832b1359736daf2c4da0529034ca2a -:005cd0e24089fc42446702fecf7e5acce9641f -:005ce04358214be1aab7769a2163f1d946e8f2 -:005cf0d7e6de5a56adf5797c9036f5b2760dce -:005d004d9ace979382962721624a8763b30314 -:005d105a093b00dd65dbbac47d4266164a76e3 -:005d20377b6e916f011bc35885299c714505b3 -:005d30ff82664e2213a242d1dbcb5927b5cb82 -:005d40b31caad1240fd56debd037f9e676da44 -:005d502786c9e06a1af761ebc08ca591a966de -:005d60b0b28653c7dfcb2bceb01a4129a66cb2 -:005d702b742c6420040b9bf50c2b70f977ecda -:005d80d67c72567107088b347748aecb8e4ebd -:005d908846e611251c3e3dc680ad108d73903b -:005da0ef58bdb0c002a2012d28126ab5ac4463 -:005db070e2925bce5c466f1a168e38c67088af -:005dc05092db274282029a7c1f46e423dbc501 -:005dd0cbf752878d4ac08d401f918baeede47e -:005de0819c9555330cd5aabe85f142ce2bd500 -:005df06258447b535002d35631210189ffee34 -:005e00ece692df31717c383ee0a04ec78db75c -:005e10085598b6c1cd513511c4430c85ec0e0b -:005e206d3c864a542b0caace8a37876152b4f8 -:005e30bde499790826fbbe7e33f7103455f3bb -:005e40080c64799a65b5b241d57fe824ba6eea -:005e503c342dcc11d72f49d9e3c0e1966d1062 -:005e60d886782d10d9075e59edac52dbdefdbf -:005e704a290b4c59ac43c2ca278a8ff16576de -:005e807c462e685d926a6a41ea2863f5c10d5a -:005e9097e0a8a4f6c52d6acb4033c2c1c6764f -:005ea04691baf92924bbe556f2e357be9943f9 -:005eb09e2034eae8c99483fe2098647487107c -:005ec01f8842e21214ae99823d3f792766a6b9 -:005ed08885046583630106f9bc7be03f0dcec7 -:005ee06cd3341afc156f03be38452a3af750ef -:005ef01588620919059657822b1b5caa875b96 -:005f001e8802b67b89c345f37b23d5859cc920 -:005f101faa21d76b083ff643a42d279b4cb0ed -:005f203e5e46a6e24f44b29825aa46cbbeb555 -:005f3071dafa683e84cd64490a321fc8b24835 -:005f402d3d61992e36413df92232cea3fc15db -:005f50cc493f178038a9b069dbc575adf21bcb -:005f60b90b7d07b5020f9304abb6c80a0a417d -:005f702569cf727f37354c872a35bb0439bee3 -:005f80dde2dbc60e83255e82bdb370d6f10231 -:005f901413157bfa4534a69ee954ca475e8be1 -:005fa0abaa3db4bbeb40057a9676fa5ded00e1 -:005fb0e51c50fa7e8f87f3f116ee97d93a69da -:005fc0b4585364d4715a3d778132bc56ca478c -:005fd05c32506f86712e6d18d34c6419d10d88 -:005fe09957ceec9d3a5b7d0335b84b38e8703d -:005ff0b28420faac76d262f8dd96857784d0ea -:006000297a33d01ea1bbde2caa8791366bd3c0 -:006010b39ace6904ee988234a4ffed0ccb65a0 -:00602094c2a60944dbc8a7a7a4ef250e2cf4d5 -:006030e3a7a326b1c55013ae233194e849f403 -:0060405f90632117ab23b91c2618b88afa4993 -:006050a69a1afbcc4bbce3951e296c207a8cfb -:0060606f599d699dbf2c998907680c6c230862 -:006070315c34ef962552fd9b2f654f71116c49 -:006080683255f799d7437700e728be02fdfcb8 -:0060904fd28430d893c50af31b08f7300951c4 -:0060a027c6aee8f9db388f404efea55377c225 -:0060b008b0d80156f1b4902c0d85965c97a4e9 -:0060c09ab5ba3ffe7bf6722c04bfbc9834f39a -:0060d0d0c1f4635e219b564ce5bb923ebcdb50 -:0060e0b588c37e81a1670af5feb402a9af8009 -:0060f061721a18eedc04b92cbec3f3e809552f -:006100a94546f73541c680c701c1e0f49c4028 -:0061105007204751b57a8cb8cfc98c1bbba45e -:006120e03c80659d600e2e88852fb43106c580 -:00613062665658d81c4bfc2636e40f7f19c3d1 -:006140578eb9c5f6f90d65bc3dcffd9f9173f2 -:00615069a458c679d0ec2528f1f717dca6a148 -:00616009e1831773d06e5bb6bc5ac29133b12b -:00617056cfb3f30b95572a277b1d87b2f60902 -:006180c79d4bbf0d72f3d7841c1ca1f5f5be59 -:00619048d316704929d7d8e69f441beeb70fbe -:0061a037405a199d5b884eb4932bf676ccdeb5 -:0061b03dee67946d1268d9aa6acb2d8c1124ef -:0061c04cc542cc768f3fddb026ee6daa2a1e2d -:0061d0576ee56bb5ffde47f4982939ad4d4114 -:0061e06f765c59a432aa35a061d5a89bfb037a -:0061f04bff6f23745b9a4be57688e52718079d -:0062008b8474b5009b1828c4f4a36820cca44d -:006210099ca11c3f5a7b019dfa7c7503f689b1 -:0062200bf6657c15c4e5d9ee31a035a80baa83 -:0062304163384b7c6c31417753ed08f254326f -:00624003389553e6a77d1892939ae834778c7c -:006250119504c556f83576d305cb3852d1dffb -:006260cf7f9562035447b6118419ebd07395a1 -:00627027a4259578a654fc419085375bf0f8df -:0062804c7e798af59773c5786edc0904865501 -:006290eaae17ac922d1fe2d33a889c28298f70 -:0062a0c931da8f05653bec879d08d14cc2c271 -:0062b0382a9505936ca256d4ddeb9fa310c002 -:0062c0b74695f11e4dd51a1c52523de5c39726 -:0062d0b2bb29e4b336ec32d4b21c8608a89d94 -:0062e04822e4c74b3eae7e72ab248a254267b5 -:0062f0e8594850c9a461210100f20a793ca4b6 -:00630018ab1303026dad41e7356aab1b04bfa6 -:006310d53f62ddcb057947a7471e71d1cd1a67 -:00632070a345601dd58dfa26e7a3af6be9a2c6 -:006330cbdd608df1f7f77acf11a5bb556573b4 -:00634077e93a9182b234cb09779acded016dc3 -:006350abcd89bb81fbaa9934992e30999a19bf -:00636002b62f6d5376d2bc71082e24e19599d1 -:00637067b8c6c3a95de6c07cfad38e4e5e7508 -:006380a753e64db9392e7098655404d482697e -:006390d540bcb9b04a8e540a1fe788b5651bc9 -:0063a0f3bb1220dd856719962cd337bd6f583d -:0063b0af370439e277e297e9d07a0d389810e1 -:0063c0b92777ec79594c2f657a3db912c660f8 -:0063d0709e878de90e1da54f6311362e024f92 -:0063e0a336ce05004d20d26ba4ba32e2dd5d50 -:0063f09451f04574e8a97d809911da1088c7eb -:0064006ef19231ded6cb0f3744b137158025a4 -:0064101a44d127cc0472d49c8b29ccccdfbe1a -:006420d1ff4edee6197f1bc8cb81dee02f7348 -:00643074735d7397423a010c144e13700a71f2 -:0064404e866904e4a2aa0d45477ae68b6ee5d3 -:0064500bd8c888b798a5067c96cde270ba5906 -:006460682a7911d9078a48b2e73aa445a0b4f0 -:006470815ead848d9072af6522d62ab9431500 -:00648012fd87aaa85aeebb39b1b6b1a8c3e717 -:006490412771dce679daa75c82b0b730e293fd -:0064a01b17f938e915a70a9eb2009f4ea6d176 -:0064b0f211d262da1fece285b4782ce0caaea2 -:0064c01cd666d14a01a91dbb4ae1eb685e8263 -:0064d0ce5b9c3883d4c13b46061f1647ea8de4 -:0064e0b8fcf7f563570014dfed02b6232875a1 -:0064f0f1fe995a6c349ce845ff69dfa0bf2ec7 -:0065006c0ccba92a2f56269d029a8b78bcaa15 -:00651069405b327ce739f22e0430a23a375f89 -:0065200a1e774bfd0b414d83e6fc68419a6b76 -:006530a0a857a72d3b6a09d4d693ccea1cdf14 -:0065400209aa8f160474d8c60cae105da2360d -:006550f1b9963645ef695d0806173efa7e3fca -:0065604035ea53462bb2d8968d356be2858eba -:006570a365f42654f2636db2715bf746e50fec -:00658076c25cf0a4c1e9decb70d998ea1595b1 -:0065908543886cf1dee0f8ce6a91f08984b3dd -:0065a0a590b7105a456f1df31c233b14cc2fd6 -:0065b0695a64872e8cce624ead1285c5f7d60f -:0065c03cb4111eb337a773c1af8be8042e7427 -:0065d0f2cd728eb2d62f5805825ce18c05c3ea -:0065e00b001fd558eca401e591234dc179ed39 -:0065f0fd0fb3344a26da0ed1983e6834736f32 -:006600c66a56857d2f6493b1d996166e2e9317 -:00661082b91364ae23142383775d51eca69655 -:00662070a2c28c3d8737e16603df541b008e0d -:0066303ebb21968cab95c7998b23019d5d0afa -:0066400b17e45d4e4a531e2124c30dd386f397 -:0066509750c00281b7b88669548a5c7312fa45 -:00666009545edfc5997e0fedcaffdad286e435 -:0066704a72f8a1e6fcdc49a3cf88794580fc8c -:006680718bf069837cbb7ad46c7825f5abdcb3 -:006690824797c257e16382f7f6d38930165b73 -:0066a0eeb74b56ab6f2a75687647eb503308e2 -:0066b0de06dfa00c131c6abd5ffd3bb7e45554 -:0066c070cb61b005f71cb0cc207853ba9386cc -:0066d0b28b8f50ae0d87de57e102525c6fba5f -:0066e008c42ebf8c27e40980f49e4dc9524814 -:0066f0973d211c2fc948c7f15439408c70b5b1 -:0067008dc7d5c7d0a43eacf2b969575db1e291 -:006710f3deb911c91893cd1cf2ef7d56098848 -:006720971065cd052b34cba3901d570a663112 -:006730ba198c64d68a59aac97ddead96652949 -:006740bfffd99f35d78b177da48ae8fd97ce35 -:006750ad1d012fa1c6325fe2001994bb4bd29a -:006760ca7b74baae679fd35205e8c50782e714 -:00677005d25d2da26b75da230d049aeec9dc3d -:006780a5e56a8d1c8c195fa571b2af7cbee8c5 -:006790b083aae889435822b9a6c037040e4eed -:0067a06beb3fd8a9c5eaa9e75e528232acb964 -:0067b09033018a3a535fac62845826c1dd95f5 -:0067c06c4e310583fc4cdc86135982d9463169 -:0067d021c83309c98ac21a6317e10813a9d2b6 -:0067e0b83f13391d91440dff039a7e86cf5633 -:0067f0b7501483bae54af4b85b9c00a8999431 -:00680015a8015c026ab4c35db9b51396b179ef -:0068106ef431e6ada746ba72c4ac010a257e47 -:006820590369f0d329cde2efbfbca25a542010 -:00683048b6afef7f037e0c830070ebb825df9f -:006840fa57b0f5155b45ceeca4bd0aaa9561c2 -:006850429b9547ae851b0b43d638951a0ef0cb -:006860871d6cb9f6ce0a7563d07371b507379d -:00687027e99b78440aeb2ef5aae8d4679c6169 -:006880bf29b4e9f61313fa68607048200ed663 -:006890979a398a546be407790cb29b1465ee8a -:0068a0e7c3f42b03ade1744a80ada7a1fcef68 -:0068b0e3208f8b198b5b6db93e82f9065bd12c -:0068c0f667dac99915c33a378957d9c038d7bd -:0068d0a60c26dafa5162a165704ac38d763fd7 -:0068e0a4f180fd75ac3fe7787c47b9c07c002e -:0068f05d940c45b3bb1cd912289c314bffb356 -:0069009dde2066a7931e06bedc1b4a231bfd82 -:0069104871cbbc2db88ec4ac2eab89ac5a28cc -:0069208e4b7c6cdeb2905ed622fd336ef8b100 -:0069309d17c611430ad76692b13a56a1f6bff5 -:0069408d63a4204fc62e273557fab716d3db1c -:0069501ec2efa8ddf4a15ae7024c62adc94293 -:0069601dd1aee66ac72e275592051c12517635 -:006970eb26a2a33fa3cab7e3073eedbffab4b2 -:0069805b54e0bd093c46e16ce8cdc545dc1ca3 -:006990a6f549adee272b363af9b9710d91d52c -:0069a05ec59c2a8d9421f5636a9ee048e604d4 -:0069b0ccc8504d73ef68da45d48d9e52d59727 -:0069c0229d9f0ec946f77693604eab8abeb63f -:0069d0d430aab856e82ffa6491f2497253cdd8 -:0069e0dfea02cde6495ec3078234f876214d7b -:0069f0b8b19447ddebd5862ff49fb6822da6f5 -:006a00de93a06aa88f2ebfc6d0c1a134f76e96 -:006a1095d9ca3e9231036caf8af1217825b6d3 -:006a207aca52e19b8509bf35bf5040bf5a848b -:006a30c22e1f60663061f7f7af59d5ea4bdbb4 -:006a404ab28862a657abda85708c0046df09bc -:006a50e32020943704bafbed5c0103b24379c0 -:006a606a62e71edcd4af94c6635c9a41e96290 -:006a70c3c5063dfed3c71784e3aecaad4d0c29 -:006a803bb0787a8fc9ab3382dc8f4844432e17 -:006a9055e6b5e1d2ec53478ede17c8d7efbbb0 -:006aa065882aca3c3970faf7841bada7a57bde -:006ab0a84302b07450a4bdd75e588d599dacde -:006ac020d7e99488b8e623775af8b635d74aff -:006ad0c58e3929b8d37eab7791f9c58a7f1984 -:006ae006b84e7cee699345bdec07690befe5d4 -:006af09323b856b242feff1f0387bbd5f5a038 -:006b000582ba2e0a4640b83b025bf672818862 -:006b10f876b721e6eb49ee531eda82bda218a7 -:006b20d746721dac028f73e0f15eee1b97fec5 -:006b30c071f20fc71b833bbd0013171d1d1b2f -:006b400796733ba66e76548c40e6db08a20fa2 -:006b50b6b21cd5fd960a8b1aebe56d5e58119c -:006b608243f2ba80801864dcc2af784971b8ac -:006b70691a9671f33a5f4ee202ee85aecc0d87 -:006b80d82b770cd1b63a5e200fc09628b671fb -:006b90221fee795bb641de85bd5f9d0481c319 -:006ba09161950e878a5e659ceeb6a6e66e7245 -:006bb0d932c605e723a88bb2ed7c235ee44977 -:006bc02a2a8716a395cf35c62d47c36cf09ff1 -:006bd01fe92fabe67a33bf79b49b6031bada07 -:006be0f67a1968d879b4664896b4f01d2e7f17 -:006bf0e7569f3f3fe054713aa0a608e4de756d -:006c00430f2510c2bf7a1188c2fcaa72ea20c2 -:006c102786b3b03b92d702af8fc08daa52ec09 -:006c206a052e94ddf8198e2789ba93da62d290 -:006c307cbaa4bda88278bb59956e7881cef9fe -:006c40c611e3dfb31c15c992b5699882549ea3 -:006c5070e4291c3e540ea242dd612b7e8aac21 -:006c6010b0dd39421e7606298f113cb6713f49 -:006c709a51f529bcb1e191c7b7d3cc44c95990 -:006c8092f923d3d9ddffe4f739a927b359551e -:006c90225a9b498fe21c117aae361b6138bac2 -:006ca0a4e59b22bb4d89895a2ea839cb201c89 -:006cb001a7e2afc5dc992df6753078eb4631c3 -:006cc063419e8e1bc14d253396b73f214f58ab -:006cd0a673bf672b936c5c2ed3a0d960a1c0ff -:006ce07d6b9a0d242a0c1378713fe95d1631ab -:006cf099ee472f119f56c5deec2f291636bd1a -:006d00a0f6d6da225ab9a48fda10b59bd1dacb -:006d109cb7c311c8b6b2dd70c33de36209c648 -:006d20bb694b6640960cdf6bb5e9d2b9ff9d94 -:006d305c14ac30bbb5de293992a0d883ac9110 -:006d40febe5eb2a5a03bb18fdb194dec21e41b -:006d50930fbb59c1a193f41d0457a8a556f99c -:006d60d9b79e3331093e7f4ee7e64a03fbac19 -:006d7031b78659b092f15bda06311e7a30ae3c -:006d80ef45dafc5b29ce141556f621571e8a30 -:006d909dca3da60fb3bc0f326b8b608596b72a -:006da047960fa46cab56f1453b79aacc915d6a -:006db03282885a1429e22d63bb4a286ca66939 -:006dc087c0750df54b5ecb816ebccd3a7075f6 -:006dd0da7a43a756ec4f8b3e174fcb33b91090 -:006de0eb0fd9ad4b751eb4ce87052b7ff7f83f -:006df04866a7ec8aafbb863b4981b0fcd5c442 -:006e00f7329a3fcedc1f8e60ff94c2a53cdb14 -:006e10dff63f45a67cd6e7b13d0d490c68a175 -:006e206b22366f30d42256dd4b91b6405f3a1a -:006e30731a4c91e25a3efe3bf70d0d1466859b -:006e40afefcc699f54db38702b787f23b7ceb6 -:006e50c7c5b7535752f0bfbe8c6aee94334cd0 -:006e604d570c33dafaa67aa4e72a81bf3088f7 -:006e7079481f68d713f7c7a1613113efd381d8 -:006e80886958365e9cebb04cd4384cd94bee60 -:006e902b5a1894dec3db662e9e2d07be4233c4 -:006ea08507c4b90ba1de2ac5b6a03bc8d77774 -:006eb02a793a71c076a615d6afb4d09930e34e -:006ec04866fde06f9ffc681ba2ddd3ede3d35c -:006ed0d0da8911d25251779485218910dc245d -:006ee043649bdbdc0c1d309ead73d2a3cff30f -:006ef0da770d709b01e8fc4af35d8aa1d37461 -:006f00e8a4e956649e831cc64ea6ef79e67c1a -:006f1083fba4407be41dcf0ed363a11b659c73 -:006f202ab6a92c4ef65b5ac44961d94f5590c5 -:006f3077a74f6ee059af8a3226d1cdfcda04e9 -:006f40d421c9f1fe6f0f7ef52e2000ae0a15db -:006f50b80ccbe2071c3a52133fa96d8cce5180 -:006f60dd0829ffe176aba8b5421814f5f525c2 -:006f707b687991c490d97126f663a727f7acc3 -:006f80e5745eedef400a634a56d173355efde3 -:006f90d0e5b8e643f80caa8b7b5cc8c0ee88a2 -:006fa028516e3991175fd107efb2c9b7499354 -:006fb0ac8ea63397bfd416d78f5cd0aa1beda4 -:006fc0e0f88e1b75aaaaab45431bec2e4ba891 -:006fd0be39972250ecb29660368d9aa3a52f84 -:006fe0e2243df4ae132b7c4d5de7bcb1e01a58 -:006ff0b0080b10e4d0c292dc8916b099de515d -:0070001c436b3be39957173cc5658a24e76958 -:0070100f1048bd0ba7372125dfdd645a3c9ad2 -:007020f29619d91185c83d88c1ffe8fdf7db4b -:007030e2722ef9070ed303e21dcfb59ecf7541 -:007040c54fb2baf4a546d109f321f3c5c8361d -:00705022f454a371403fc2ed3b8dc26694f305 -:0070607aa4289a4ed56580ebd913b41a0a90e2 -:0070703bf614318adbcf8fb5b10473b1129740 -:0070800c84eed16786fad24a20ecd1471b295c -:007090cee5b2da5416b7145935199839503e9e -:0070a03a915c3419793a79daf7e33b56c40203 -:0070b0723f721f653a3bb0dd5682f251c64b91 -:0070c0fb018c8643500c4a1f24571ce446ea07 -:0070d0eb6fff89af21b045e29cb6317ee9ed16 -:0070e0a073fc94f7cd55c3bc8ca79201e11110 -:0070f0fa01b02ae6f7a0cefa8a0d863c7480f9 -:0071002534ba77ffa5879919ac406ad6af1d57 -:00711007f9049602fed182e8a001a5674e2bcc -:007120dcdb05c39e1cbf97019f959f16c57937 -:007130118faf39cf4b443d3fdc48eca26e7707 -:007140f59bf1b22c2aefc38591c058b1ad2d27 -:0071501b741b09c568d4ea27a97a952bc348e2 -:00716015dc110225850c18cc579d1c462d2d0d -:007170ed37f2b4ee542887df7a09524a8e6c46 -:0071806deab8810ade70085126c38641ba861b -:0071906950f0a606a6f12072ccd5f19380c16e -:0071a099d347ee05c5f756f8c8b6538250d48b -:0071b0305c42544677fbe82db2e22285cf7d00 -:0071c02df908f1977a1b4cfe4f6a706b47f5be -:0071d0c5d6ea0d6b6e69b675685c8e9967cb2c -:0071e02bb4f0eb480a52e5f9d2c3cd1ef5bc52 -:0071f0abacda53b25fb64803bd9ce5bd1518c1 -:007200b4bd4c68534132c25e277ece8a46e6b6 -:007210bfb4f38e3d3919eca833a5aa55ef3359 -:0072204d31c3827d42d9135e8a8a4e2db7c85a -:00723052f18f290d276cb1e6f18b5af77276d9 -:0072402216bc0d36b9162c8b2827a19152ca08 -:007250aeee271efff17dff2d086dfab766ca2f -:0072609ece7543cd74f33f4e660aa0955b896f -:0072704b25092eeaee4133b62d55c1edf6c2d7 -:007280d115e938e485c12c30ebd1a6fe2b8151 -:007290d4821b6776e45fd4c1bfb8336aaf3cab -:0072a08079555f23b917dc1714668e7e849db0 -:0072b04d3e9abbb37413526c4229a076482e1e -:0072c06dee6ac708151136d2be894f8727338a -:0072d00f6ade09a098aeb2c23e1b8a42698441 -:0072e07fa88c130265c55f3f30ccf667ab2ba0 -:0072f0ed9f7b2a884edeb16020c8641f416ad1 -:00730013f54419a388e8599ec918429a946e1b -:007310de2f62077681dbfab495c2d9e3c2d339 -:007320b09711927075ca93ae969b27cfbcbfdf -:007330ca2798780013805da94b6eecfb7026c5 -:00734071b6cbbf7beb48c7a3c4efbc8f849f5c -:007350be1488667fd3189eedee77eacb3463e1 -:0073608645b6d5e3e9c83637a9ac6f93b31152 -:0073700d7d37de20461936f0c85cadf6cdc210 -:0073808645bcb964cae5e1aa1d5dd34a934dac -:0073906909d5e8b9aaa9e2bf8423922e6b421b -:0073a0a2ff72bb33255a8e148863123ade05df -:0073b00d4b0af1e16bd6faa3aacfab6768e6b5 -:0073c0b225408ab5fcb18505eca6712c20c99a -:0073d0ccac64942e5d0951e92eaf0117c848ff -:0073e027bde4c7c849fb1841abc0506d831010 -:0073f07092c932350da3ddf190ca2a2b6c328b -:007400fc3aa58e5bbcaa3fc8f4bd4b0fea24b8 -:0074101c1e53b07d54e8271af0bef83faf03e3 -:007420ad0a9b81797f90a17f14211d2179f196 -:007430705e243e7b354345b5e593ae78a10c14 -:0074400117913b3f1913f32152c5538b1a5df3 -:00745029da0eb9d7b6f31bbc6b492d79be181d -:0074606dad615b5f18d0bd2629ff4b2574e004 -:0074701341cee61dfcc41c3a306f0993c3b44a -:0074802861dcb9a3bd47ceffc0a5699777ae88 -:0074908e71f7bb1955821c89101af946b72846 -:0074a05a27760369f320e85df36537c89e014e -:0074b0f7ab38ad837e8a24cbc55ac000ea38b2 -:0074c07c7507ab9f25c9189162a3f5b2fba74d -:0074d026357914d910313baa1b781b2bb32d1e -:0074e0cf1542d3ee772cc93dcddd67e5035f7c -:0074f0d4da5f796f4fad55c5cddf43ebb08cee -:0075009a8d81e43c6b0174e0ec21e5cbf16e24 -:00751037977c988862f6adeabe57474199308d -:00752094002c15cd6d3783c2e2b76da7a0da94 -:0075306357650e3d896f4dd8acd8795b8db8ec -:007540d02e33c16d752e4e90578372e208acdd -:00755026754b7082d11aa10f7293daf7eb5216 -:007560a75049608e519bca8a99ca7337d95a9f -:007570bc887ef464f3888161f70ea27f60ae0e -:0075805d899119ae0e33b5d406de838a9bf9d9 -:007590f28f4b9d85fc2d7ab8d42c68f5fc2779 -:0075a06eab26df0c6f94fb4496f386d254c360 -:0075b026ad5b2e988fe91f2f46a0a788c25454 -:0075c083b33ea360f78d41107b4e02c62f9db4 -:0075d0812f9ee5a1f0d869528482458ea1ab3d -:0075e089e25812f515fc262e20e154aee276c3 -:0075f0007dc8d91fb14f570c847d2c38989393 -:00760043f23bb05500be681362c9d954b78450 -:0076108c93e7578ce3a36739285bc966f720e6 -:007620eda4ef6c90be325d326f817882e4085a -:007630a8db1ca3ac0db0d6c785972a530ed491 -:0076405180bc61c84de99bc010845b4ad964fd -:00765063bebe1d0c90f34b1dc4b9a34f1f28a4 -:0076603ff0c93722f77640a7dc18be968adc57 -:0076702d3e794cc0223ebc78cfc83f3d494eb7 -:00768076c3da69b86bf0428e29de6866d2666a -:007690e907eec0cd79170d37920d69cf0f0f9b -:0076a0825c5ff5943717ad6c656d9883726d61 -:0076b0beaa274eae6f398c838e72dca905ef95 -:0076c09708fa66b9a9f9d21eafc781a92fbd30 -:0076d0e1d5c8cd4cac40cb67e78824846d910a -:0076e0664f00b766181ece2bddd47295dd92d4 -:0076f028aa1d0363fc7b0166c15effc94faa14 -:0077003960c6a14e9b96fc336e97a4dad49032 -:0077101a70cc7160026339760d8bc8d13187d2 -:0077204f2cef530d43de52c6a617577ce5d4a3 -:0077304965d0fd23a9f53c0b61383aea37f277 -:00774036cb1ff8e60df83e83cd794cfafac65e -:00775069b8e89ef1296bcca7794aa864f3e430 -:0077607c56a2ddb20b5e9743aaa9dee4a38d19 -:0077701c05a846bc4423883ae903ccf97d3caf -:00778069b94a67e4823d290ff7aed2c034c990 -:007790b6e26a97c17e176bd56e343ce76e9be6 -:0077a068b8d02d5c79d8fcb1337b0a4e75e553 -:0077b03b8fd70b0acb3fd4af80d295b163d494 -:0077c09b916b50f84fdf3754c95a09a4f8d803 -:0077d030ee0a1b5120ad0799d0c2892f0156e1 -:0077e0e991720185e9b14f98e7d6b13caf8aec -:0077f079759a2bbf28d7d0eb31fdfe99dddbbc -:00780083f21112fa6d9dc205021ef2f300e4f3 -:007810c5653b39a25dd7ab533981b182fc52c0 -:00782025776378739106d39d84665cbce50b10 -:007830265b86d633bc1132442eac990cd5501e -:00784005e739bf4896d9165c680ffb6a1d2093 -:0078506673c0bc175302937cfd850cbe035714 -:007860336ee49bcf604c755c1c481b07685bc2 -:0078701b934e5902dc43cacbfb3a4fdb477763 -:007880672498185cd493a3669ad6fddb6da788 -:00789089483729a98dd19811310fc78a8e233b -:0078a05c59750ceb2ea3ebb46c50303ecb7da2 -:0078b0a66c5145d1d15a2f29435438463286ef -:0078c070303d4054a513b3256d5058753e218e -:0078d00631ff35fc7e59430cc9aed5835ddf02 -:0078e071561146af65d8e9b16d01209483fb15 -:0078f0f131025dc86476c3cc8713f3e7c9b772 -:007900c67702bec49fbae12454986575f885b9 -:007910a89953917b5c3539267f7d6059ce847e -:00792085667d91d50125c74d71bac24cd2b343 -:0079307c47fd1e21b76ce37636ec80455fc310 -:0079405f30f662d9c34770b4c16777b9d74e8e -:00795062cf3b7e1555b8845de3d29c087200cc -:007960da59530157a1af83c395b25aa9fbc4f0 -:007970e6836683f04f545b525b93841254cec6 -:00798092faa7a4fdd3dd74f310f563a0a81f88 -:007990833a8954846aeca65cb5854407368347 -:0079a0752057609d1f0a54144453ce1e2cbf4c -:0079b0483ad9d25aae01d2a2e4a250b1311dc9 -:0079c0516791701ff181fcc550cd48d29f28ef -:0079d0579272c1a53af00449e1c4b4109634cd -:0079e01acd4682cbc291935354c1eacdf38d32 -:0079f05178047ac0aadf00c2dafd2cb582aa0b -:007a00a22cfd7f42c3abd0594c5d0e8b07bb11 -:007a10fcce126f99a4dd9c1ff69f7782e36ea5 -:007a20489ade6ddecbbee79838338e433edf9e -:007a302cbba958776dc6a2b386361f67f00b3b -:007a4036b16c88d9e19322ee7ea66bc0228d99 -:007a501ad2575da40437ae09949b9b083803fc -:007a60dcf520fdb8018dd348a38067140d68b6 -:007a70f2bb392c55147f4b49c7b52ffaf8a717 -:007a80c5c8c6a89d4df02288ebba44d28fa63a -:007a90d2e1d150267acc8af47347a62bdba7d3 -:007aa0534ba877c1d342fd792a83085dd2aa79 -:007ab063a0aaa5758cdfbfe76a9749bb1659f0 -:007ac0edb6584bed0f6058599c9d186c2a3c29 -:007ad02f53da5b1e74c645963f0ece0321c084 -:007ae09fadf975c8a53e8aacc86067d57c4fbd -:007af02abee498afe7f1254e0607ce9ea999a6 -:007b00db2f73551e7242b208af3374861881cc -:007b1082f5fe57f87af704525d570538969de8 -:007b202163dc6ebe6e6a4aaddae9fad3cd34cb -:007b3064edbba6e8ccfee4b849ad563eb2db30 -:007b40a7f83ad8dbb6f52628d8d9c29edb99d5 -:007b503f15e10c018b72ca35d448e05dd15fb2 -:007b60423700604bdf1fecc1a275b4d2b4ed79 -:007b7030efb169e076ecdc1d4e010a7f295541 -:007b80493edfe94a3223e11d6239215024ec3f -:007b90d1698446d1a3b93cd2c51025f28fc65a -:007ba0dcfda7df0b9d47a634e07d08d10f2e83 -:007bb05378b98f9d4c6b3ebfd3b9b5f3bd6ec1 -:007bc074e27400915ef74518e8b5fb254c0356 -:007bd0c059159e18c92ae8acbfce9ab074fe13 -:007be08fe33f449cfef6af02e9e613ffbe87a4 -:007bf0462f19af8ecf81eb4f1fdab0eb00b861 -:007c001b78460d9993a8ec081ffada50d78d65 -:007c100a727aca70664f7833ec2aed1256cf60 -:007c203f65367bfe1f6708bcbbe265c5d5fe46 -:007c308de69dd602d44cd6dc30d0c390cfe259 -:007c403d340079e035e4a441e5e5c47520fdb8 -:007c5008ffcf3af522f94e103843d7b5d4ac64 -:007c60a34c0a78a13311c4b95974a19b3c85c9 -:007c7044f065591d279ba4c67b33eea4cb5698 -:007c80000733e26a03e2429ff84296a0a3ef90 -:007c90f5a96c73286efcf39509774b947dc9a4 -:007ca0e735022107f31fc93629a4a5c2714e60 -:007cb01614e4fd0cda12d762d06d7ade5b5206 -:007cc0eeac99b56ed6507cc3399d531d363957 -:007cd0f79b9f1e7b778fad9eed64d89a8ef009 -:007ce0f1e6d7da97f0ef60df6c327c7779c657 -:007cf0f2323ebe30417f5894d8476d20ca9bec -:007d001c84338d9868e0ffe66fab3d4f493fdf -:007d100bf4c6302682f5af91e752755cfb896f -:007d2008efbd61e886fc5c8b3c6f2aab777580 -:007d308ebeb259d24fe30e0d5fd7a9db18197b -:007d40d58dfe518c724fa55f3b213e6269df76 -:007d50e23e2e4d0e8c09cc91098fee00b91291 -:007d607726370e24aa4b8ee411d0fe112e772c -:007d70bacab0996a5c3172efc5baebd3672729 -:007d805917cdeb20e27f9b3c564877aa9accaf -:007d90e7635c77655d3a9ba829a8046972b6b6 -:007da055e09011997093ffa763217b2b34e2b0 -:007db0e4188bc7d545464da86bf3b87095bb4d -:007dc06be590b24e18a6a422ca3734b6eabdb9 -:007dd05d9dc2a992edfce3cb3128eb65a35841 -:007de0b8a9296e4c47f1607f69e269615036b0 -:007df0e6a5379f3f64c8dc8869c8108b4af184 -:007e001ade4d69bb8c8b3b7f05c42f67ceb687 -:007e102d8caedce0ccc625d7fad1ea42d05afb -:007e20ea61679e3dd2bd896776f0b893a521b4 -:007e305cd5dcff18f1ba5e1c8df00a79b987af -:007e40371caba60485c7de0d7d484ebdde2a7b -:007e50372977bd35873652962dcf06aced3a81 -:007e60ad797fa3f0f77a3d1e533ea6a0fc4206 -:007e70c007c6efe01531753ca29c3334147a9b -:007e802da789157d0b3d238cf21d26e323836b -:007e904b36150051082dde0c5cb81002f7ebc2 -:007ea049338d5b6a4704248397ef032def4da7 -:007eb01372670f36b262abd8680f8a50ee5d94 -:007ec0b2d0a6872e070f4bd3bd64262451efc8 -:007ed0a45d4423f451836d2ba0b7fbc837bc2c -:007ee06e4062cd9db2e52717231a0cb70bdfd7 -:007ef045ade3fed1f839b43d9ef39e13525937 -:007f00bed293f6393d4530ff39df820598229c -:007f10d6d6b8578eeb18d698006b7ae4d5f1a6 -:007f20b9f88665a938614030dfb85c57aee265 -:007f30ffe15093be9db785b8976e7752c2a234 -:007f4011f6f7f431702264bb5f52ffe7c2fce2 -:007f509a11af61853c18ce8c6bd3ea22d5c8aa -:007f6075b7e76d1fe94c5c56f7ee4cfc45856c -:007f70df2c33889a6e54ae788f8aaae258b662 -:007f80d1f907c1760d11c0d6cf57023e63de43 -:007f90a5b235c97c5ff6a89b4927deb74211e8 -:007fa0dd85dbc6407b5ba6829e55cdb38b14d9 -:007fb070c12d1a83ed01d65c97b9c2f4a513e0 -:007fc0e18828613056bcd09d156b7d635704a7 -:007fd0ee3fd5f35354e9d0ee008901d9523266 -:007fe0b2dda57ae49b3ff5eff4c64fc64f9663 -:007ff029a697168c63173aaf802eb76fba42ce -:00800019d09225694b34a57e158eb9b8670f7a -:008010ca2102587fef76a65a7a28bc90140f65 -:008020c33f930479e64df77d979e148a006d3d -:008030e902638aab284fa7b975db41713c23c1 -:0080408fc20b3c9b5ba05699b6b162c6b7c484 -:008050fc069ce1b4688465077400e1a41888f8 -:008060c156bf4c837767bbee744e84fc799851 -:008070c513f4d13cb2969e56bbd37425cb79fa -:00808094472b3beb307bfa338ee4576dd7153f -:008090914495c28e4c269c56c5488d1e73051f -:0080a0529996585e1aa44af74d887143590f98 -:0080b0e4b1a60a9eaf5a95bfd054c8e27657e6 -:0080c0a76f1aec1fd528d70abaccca8367d8d8 -:0080d040304c217d829c15a7b8c7973f0f2993 -:0080e0d6c6a2c61349d708d4b3ef604ff281c3 -:0080f012ca6b0d9b18993d5d74a8ac1050a103 -:008100f57e807ce6b9e90793b4d952c837d166 -:0081106edb680b0cea820fd2180f2b16d85a75 -:008120144f975b248c717d358104d2424fbf1a -:0081304993fcf8593f63a29beecacc17974e08 -:00814027275ba6a72646b3ca7e9d0775dbecf7 -:008150c80055dc66ca104be4a295e6a75369cc -:0081607e4367c3067e4e2596174941f56ef3ca -:008170d0761329b658739e87dea167498843fa -:008180c808a553f79bdcdac3d66dac9d251ae4 -:008190cfec8bc9d8b3239dffff5f207f5f1d87 -:0081a0d66f68e2709e68db22e49e3daf0a63e8 -:0081b0e4397b07ee6afee5efc2484d7ceff47b -:0081c0fe43761832705a4f24e2d73073165b98 -:0081d0cce396e4bf45c4eb32f50150ccf83415 -:0081e07a8d237a0285ae9255a4a38975767323 -:0081f0363e7788c5ad1e29a482af408ac30dc2 -:008200d660eb26507c31a72323e2227a4d8304 -:008210b49825845cf77429ef0aa02fa204d885 -:0082201afbfce0aa7ee967af1ef7b15e7005c3 -:00823030b10710f9fb2c4e1f9f826c6bcb09fb -:008240052617740ca1d3964322e328c911115f -:008250a52e0e27c4aeeac07f82d6db5e67c14f -:008260471384b1b1c4c062b00bc859e5bf95ba -:008270f0396f147ba49d4316668b9a6cff573f -:0082805c828594cd6a26fd41ded878c3d05134 -:0082903c3450f9d9a2d99ed2d91a5185f91f13 -:0082a0b1e23adde39f8e91cb00fd31fb821af4 -:0082b00c1a9af83fffb1a209547c3ab13d6ac0 -:0082c0815c37e38f1e9822ddb60af45c391e5f -:0082d0d123a23b1547df7f817c5666132f08e5 -:0082e0991902d04cc35ee549a120c086dfe482 -:0082f03087e0282642879174e31753fe4df21b -:0083003da6ecd84c0cc77ea23450743deef354 -:0083102cd810e4269fab9d0ef99f477380db9c -:0083203255d83692d423db9100b66fd8a092f9 -:0083306160c67909be9093998fba284fda73ca -:0083404d996e1fdf4525cc49f4d9f090a59058 -:00835090c93181c04ba95da10761413ad0897f -:00836087685014296bdda70f154442a11d9146 -:008370ad41d368a216d341283eb755f0182127 -:008380bf6c40bb19ed1ca61ebe209a1bb4d350 -:008390007c874a72f3e87152bbca0298ea3727 -:0083a05b2b66cec9df227f69a4cbbfd92cf4c5 -:0083b0dc318cf1be43fe3d47190d84edd4898d -:0083c029c4dac2c77151f54dd6674bba20831a -:0083d0410cb37f912a8f23aa5b47fd549b2f5c -:0083e099f4b12ffb438795c740d8fae25043ce -:0083f072b82bde07344013718e921ccf29c2e6 -:008400b9862b61f4b942a316c4bced54019ff4 -:00841083cc51f3655d7ff14d326dbeb93689e3 -:008420b14d4098d2d08936faf277b1df68aea7 -:00843070bda8677bcbb3a324562e125fdc3c35 -:008440dbeb2515b05874d288e5886453625575 -:0084509f391fae7b5bb64793acc315cce3a26b -:0084608a2b5f6d005ec170a1c27c69d8bb3227 -:008470165960ad75947fc74ee05ee5b0e1f281 -:008480aafe874f1a09816cb86f19040ced3717 -:008490db8ccf359da4d3f6a48a33c9aec816c7 -:0084a09cf5ef43fc020ff8532c1ec2e04d69ad -:0084b0ca43189f9f6d944f84f721aa0d5208ee -:0084c0ee3fde443dcce62a27b88d585c7a7a13 -:0084d0d9604939c57cd210ec39fab7de1726d6 -:0084e0e050af28c0a6e24fd149fa77d1b9b1dd -:0084f04e0fe28fcf37dd2ec662e346626f1dd8 -:0085009f63daa00e4d731a795df93e294f9059 -:008510711a54ad3583711071319327c9ea500e -:008520d2c22ac5bcb3a88fef001d90b53d67bd -:008530d9bde552522d05fcc88be42c2c6917b2 -:008540fc7543639815e75c7ee69845d241d95f -:008550cb3a7a19708cd8b576e0d3f0b2488c5f -:0085601353b652ec415d4e1f2e2ec3e87be762 -:0085702dda9f13c69b29843fe6b179e8be67f4 -:0085805f009e380cdf31fe628f3fc951af792e -:0085907882a6eb63bbec2d049984c67570c262 -:0085a035f30973ff0413ffea6257f3cfee73e4 -:0085b047e1d3cf8ba1b59b00987b613b519b52 -:0085c0ca7cbe9828cef5e99c17f4e44a0c547c -:0085d02987171ba871ebc8b860517ad088014c -:0085e05709b44e16b1109a058e8c24843b1201 -:0085f0609b2942c10451ee45ba3bd7523260d9 -:00860086b0f043f9673139aae817623c3f24d6 -:008610bbf46cf0f4578e160786deca22b88320 -:008620a76efb2fec54ec59b8eab99aae205fad -:0086309b60fcb8897a3721382e986774c8e5c9 -:0086406ef3d4296f3083aca16a11a10fb041b3 -:00865054cc01339706a50dfe564f255f4e5685 -:00866038b5437f06a4747da2914058f2bec01d -:008670eb570967a045dfc5e72badfe7f95ffc2 -:00868029112184c88082f6036c0daf026879b0 -:008690520e715eee10e71b44cc8b94f7e6d36f -:0086a014ba2836f286e8c15ea22b64d154fdcc -:0086b051696a1a2daf8e7fba6eda17e51ca203 -:0086c08eb1e524aff227db5c04852b703fd1a6 -:0086d07c76be21d4c494c502e7eda1158da741 -:0086e0ed2c666496969e5d997c99823b450ee0 -:0086f09c76545354de824b346cab72dcb303bd -:0087008f664b85fc53da3a0d32f8a8c6bb9205 -:008710d23e64b7fcfd6b05cc536cf873962c28 -:008720ff449ebf62642452f56271af98b1917f -:0087308af6f9f3c0005649e35db6c3c3b79bcb -:008740d246fbcd50c247ec4b3f309531779ae7 -:0087502ad56987a52ac3824aea424a49512256 -:008760f7b9f4fc505b8286c8814af970628071 -:00877010e6b96825b4cc8eb890756d1adf7423 -:008780838c30520097ce981596d4228ff0edda -:00879094457b8d65b0d1596c67ee33fcd5357b -:0087a035ccd36664434a6efb490f59efbf9e14 -:0087b0adea77074b7688b855ea25be54a47713 -:0087c0e1fc331494414ffe36069dc0859bd832 -:0087d01833f2dda3c37817d86c107fff35f9a6 -:0087e0b2119c5c243ee42007c57fbfed40ad87 -:0087f0966daaec273b152a34f5dc72497067be -:0088005174e6444c574529058ae1064a8b281a -:008810eb148ed71f3dc8280d92d282922b7c90 -:008820cf5d2b809e6b66c4c90d8f721e622f39 -:0088301b9170ecb51d2f6a0003027a2bab774b -:0088406a461a8ba60253faeecfe325547a1632 -:008850fdc73c421599e75d2f5a6802dc200dbe -:008860216916d3d37a9bb68f43fad7e128ac30 -:0088706d19e472d284b553dfd8f435b7a9a745 -:008880f2e07b83b28b009c22c1886198a1caae -:0088904522a748cbc546364144212cdd17f22c -:0088a05a3e96ff53ecf25cee732648493475dd -:0088b0774ce9c4c8f3dc7c47c16d4d42589b11 -:0088c0f91902913db1cc712dc7119a9da7ac43 -:0088d0f66c321b7275e9713e678ccbb6129f68 -:0088e0f8486e8fb913d329277e373f8b6f2e7f -:0088f0842c99b3fe7552da3bf569a7969287ac -:008900bef2561fd2a1e3138552461744131d19 -:008910439b55f3a7d28ffe3c537ead2e6296ce -:0089201391a7e3516d5d9695acc339e47e3e0e -:008930bf9dcec2e878ab77b1ed68bec32f4ef6 -:008940df9fa5394add2b19fa70265a3904d199 -:008950ca2c2de8a22598cbdc6e81de655fc185 -:0089603c78af0f2e94feb2fbc1484c63cded1f -:00897044ec7267104bfdd9d7ccdeacabd18ec3 -:0089804a5187d3c49aca10bad62f99d3712643 -:00899067a21a070fe171cad877f0fa8bc44e8b -:0089a0888fa10dd2f3a9de627d2ac841b1f2e1 -:0089b06223be7c32880318d402e1a48fbd570c -:0089c0997fed0a27cf03e81ca3a74aa1b43cfa -:0089d0c2ae62c15298748b2865df9e5a9ccdee -:0089e0bdd0f34a257ee54634ee93839c93eca9 -:0089f0647626ef4c2189ab9e1cccd0d328545c -:008a0089d5eca02b374a0e72341a369a57f690 -:008a105397e0df0f502ff7c84a718232b73f0c -:008a20d5bdc0bf9d911fc0270fec391b51548d -:008a30bf879be9a36f74db8b9ab51f5443c833 -:008a4012c90fc1eb50f0828986c999d3de2261 -:008a5003f40600ea46ecf81277613c4abd9719 -:008a60e031d9f4efaba42e68a6be41164db47b -:008a70afb6c168aa32c35a46c6a453a035c5ec -:008a800e651cacc0ec1616a7db171dcaf2d18e -:008a9019afc7747b9e9c1cf692e8c362c4a54e -:008aa0d6c61ffeac475fe72ae20ce41030595f -:008ab0ea6ef7f4279ccd47e3c01390acbccd7c -:008ac055161cd73917959af064bdfe340e9608 -:008ad0c979ede668a02974b64ee205ca1e3ae1 -:008ae04df02520a4ec10e0238fb150eff8bb53 -:008af0f3f344e8318c79f14f451da432822cea -:008b00a199aa5239dc4628505fdd790300cf70 -:008b109afab9b3f033350ed7d5000decfede2e -:008b204bd9e5d451e80fbfacd8618988f76849 -:008b30b8271aa7bbecfd7406fe1363851793bd -:008b40d75c033f6a95e57e997b070d86ecd995 -:008b50b69f6ec78615996b551d2f91bdf2160a -:008b60b60a05fa71f507538b7dbf3dc1130826 -:008b70c7756f81e7d54091a158a791fa6578f3 -:008b80a91c3c2d76be6112f20c4ea333a47665 -:008b90eb51db7f08cef69263b8d08a93c1b932 -:008ba0a7dfdc3cb88d6f05d02a936a348a7dd3 -:008bb02afa8a109be00cbab20514544ef88309 -:008bc0e486c4cdab2a6d7ed2573f19fc57647a -:008bd0f10d615de6ecc5c8b49b850ea53c97b8 -:008be026c44261b654a224127031cc05c49d84 -:008bf0c25e61cd7cee7cca3807473106cd5303 -:008c0070cddf9202ac0ad844a19717f6ddc8a8 -:008c10408e34c12d2089f3a692b5498a46f43d -:008c20cb73740f5835537436e52eeeb76f2bae -:008c30a4539d100d5146d0791bd0947beea68b -:008c40bdff5184c2bc09786f2fb446d44c8a98 -:008c5094eee530f54a24a0a87a7b0db622d407 -:008c600e0b1dd0f5ec9a790b3e828ab85265db -:008c70e18976957f7c22775b13383a6ef3fafb -:008c809b0edf54dd8228e361fe442f623fd1b7 -:008c907488cd026b5b227e7bd260c87b892a39 -:008ca06a9f8e3b8e8fcc89c259ca33cf006607 -:008cb0222e409944d85b874d97fca0ed52c550 -:008cc008e89f267404b38be484abf1287d8395 -:008cd0d84db3a1d91a17ba4cdeaeb0aae6f3ad -:008ce04e893df46e582b6bc861498dedf58dc6 -:008cf06ce3711672b8e9455c160b06a6e4761c -:008d00052dce79b34a3e8ccfd94df0229ce269 -:008d1043f39079a5f1b578b3495f1c342852f9 -:008d204162538343db033788faffb3203686a6 -:008d307918be3bc311ecb124ab01f8fc74a0f2 -:008d406872d0975282cdcf720067fb9cd2e398 -:008d5052033d8d65724bf30fb5dde6fb5039ee -:008d60b43fe23f261fffd86c0dc0f93f0db12c -:008d702f1fb9824c9c2a82670062a0babd7156 -:008d80f133a46a3c1b84fd1d3aa63ecfe0992f -:008d902d0e7af3e6aa50fce3b6374060442b96 -:008da038243411e7960d6712bae0f09267e483 -:008db038284c82d2396561eebb8ff2c51d6d77 -:008dc0d9d165c42a5dbbe2ff30e5cebc825086 -:008dd0b0cf5325e74cce8c71d42171da5eb0a5 -:008de023075963702c9b829fc34342a8adb5ab -:008df0b88f16fed725a66eea71e41236bfce6f -:008e000b0b46fbf9803e45c07b1c34b05eb8c0 -:008e10b19480809cdcfa591f37b9fa6755776a -:008e2045ea761aeca7c98083e2e585da31bf09 -:008e3022a8efc0545739b46655934df72a1033 -:008e40207179d2e17fd75bac8c28e54e390c8e -:008e50e20d0d75aab0ff331a4a120d845eb4a2 -:008e602ca371aa6afd65d672e70c58150f0bb1 -:008e70e3ee7097b812782baacbe72b3a2a61fc -:008e80eaf4798c901f703fe0295094cb90254c -:008e90b2cbfc57597173c2d3b993d1947ca990 -:008ea05c06a0f8165a7a23ae45f5787565160e -:008eb085479db890cef8a99f234456313d1c81 -:008ec029f45a4923eb8dbca4aeb8e0349b33b8 -:008ed0dbfb112e0b907d48d9c1c4f6891ba785 -:008ee0fff6cbcde8692a9a020432b2e2b46c7b -:008ef035773a720174b4b4ca1528e83f1e7f86 -:008f00aa1c70b7b5dc332b2f9d7c52b0aa2282 -:008f10871404b9890972cb9df0287b49acca12 -:008f2012615eee4db9cad49a63de765f5c365e -:008f3089f0b72c5742e2f88234a780c1b983fb -:008f409be1161e81426da195bbb885747bc364 -:008f502865d69d39d4ecb74cb65404d8bf9812 -:008f600e8ecf92c7607adcc8782d485b7f084e -:008f70d1829e73d2baceec30117058ff5d424f -:008f808b41e599f6acb3903e9265fcf6bf7a89 -:008f909d06efc035c0743f2b5f1c756a738448 -:008fa05dfe0ed1b3120c68cd21b9f0c51ed7be -:008fb07cd688ed5ab9a831ecf251dc5e900138 -:008fc057f29e953f084c9208af128e9b85641e -:008fd03cbc4532b67fd1bb9b379a258d4ee3ce -:008fe0a8eb589cace9f51a361bbcf10e4ef3a1 -:008ff025d4b3410d53124cb9c6cc82172b4b33 -:0090009f1940255b19680a0d03867cb5b94ee9 -:0090108ff917cc08a49b11051725fce64e13bf -:0090201bd6ab4225c0b0a18e530fd39b59f7bf -:009030bfe7a40b7a9e3fcef22f6e37797ecd2d -:0090402875a8863c9aca4afc6bb80cbd4973ae -:009050218e84d821a107864b4d28763c4ba13e -:0090606e2aea150db54e6c4bc5e7c323524a88 -:00907074758d045110c169a369e685d6db18a1 -:0090804aa815929bf7ece815129957fbf5e894 -:0090906bc6b9eb07bc167367a79ce10a2f4990 -:0090a0ce506e83d383f27c2b6978fd89aceca5 -:0090b0061d845b582c060d156ca16ca91bfc09 -:0090c0bd7de55291eedb2b339174985f77189a -:0090d0322309bed2d8f02de7dfe05677b305a4 -:0090e0166f7d5923c01775b777c53e0a4e96e5 -:0090f0453860fe4c2379be874dbde23aa5f6b5 -:009100ed2ce3f0292c050e0eb2fc9ea5780147 -:009110879d596c2d8e96f898098b056da24c4f -:0091204c1680aad06c852a07db03ee88bb2d31 -:009130045fd5f188544f88c0f3b84d1d1f0422 -:0091405a1704a29a15f66f277089be9c139eac -:0091501987fd3f5474c415e203c3a432042c62 -:0091601972f7c878299ea25adf0eace2377e92 -:009170cbea943d8ad3fd5e4a75ef477db1fe6e -:009180b43222f0b17b016626305d40f91b12cc -:009190c3b6a1bab3acede919da4f236a5cd836 -:0091a01990a88f9a92d15ae83a92b0d0f10e23 -:0091b0c7eb9995534966c468a71db4907964e1 -:0091c0fe87f3042068c05272c5633038a0e4b3 -:0091d03fae25ef12c1f365ea088fbde6ffd56d -:0091e0d9cec146adbda4ba2c7588ad85fbaa77 -:0091f0147c6d5bb0fc1d1ee604cc0bf555f6d9 -:0092006d24f153d2c9b7b7f1aefeb929d338db -:0092103a50a31872806990f17c89a6417f99c7 -:0092202b0b70b59850a6085e7bef82ae2e8a1c -:00923050baf871ed872e2ec70824b2253dac73 -:009240336da784e5db6c0c20a0887dd29ac7b5 -:009250dc7b6f4ce6fd8349f12a6b5a212f8a3d -:009260a647328713cca4628a8797c8275ecd9e -:009270fcfe9c1b350730c43ee007c3c41b2e40 -:00928039bb72cf5225a00b8bc247e3b1f7e86d -:0092900de173b5d1cd84b11a6cc93dabdd1744 -:0092a0a631afeed677cd9ff66f2965015abf9c -:0092b0ff2ae2ca8fd26eddc3fef1125514fe79 -:0092c025b60999507ec89dfd79c671097834dd -:0092d03a2bf2eb951e9f3e7dbd404ca6689b85 -:0092e01b3f07b71f185c20b27cf749ac65cafc -:0092f02aa59376f769c8185fed0fdcde795c2c -:00930009821ee921958080d7145d6e77d503fe -:0093103cb73f59b1c4842f8b76c16f705ac00e -:009320ea2aa223384fe690e87a46a5336b1280 -:009330e19c764f1c5ddc71ac7d28566488477d -:009340a74148f8efd03c4318b4daba7c89fe25 -:0093507e5c92146c5845c0531f409bd3ff675e -:009360a104d8f21008bf7a2a6893804f3691e1 -:009370b6e0fe21d5dabaaf2ce13809cd085867 -:0093805c52b8ffc64d592dec296ae0c6b97400 -:009390370fdd81585ab955259c9136072cba7f -:0093a0411f9cdb6cdb6a29137d8f0301dbc2db -:0093b059561da4e06e656532c5f305353f94ff -:0093c0cd1772c3b70d1ae9e9fde73e4ad2865f -:0093d05ffdfb73f962ffaf630075203706ffcd -:0093e08228dce176671afc455eb7d3b6cc4c2d -:0093f04e9afd3762d5e3baade9f9cc10e6b6c8 -:009400bca8e1a614eac47d96eb5448fe548eb0 -:00941048ae7ca59af7a9480fa7a371f1901880 -:0094204ea1c71c168ee2c10332083343bf5fa3 -:0094306de2ed8834b95e746c3d39bb48c6d0ff -:0094403ffd9fefbebd18d153a67f7ecbbadc98 -:009450bd3742c77259e8234a542e80041bba9b -:00946072936bc4e7ae32c462f0b001e896718d -:009470174b9dab2500f0142dc3f5ef02257e3a -:0094808c509902d755a5b6cc70d37baca415e8 -:00949053bf51aabbbb05f2e56449bb808d4d8f -:0094a0eeb53e1c4fddff606118910c353caea0 -:0094b08e620451369f2f69069c069076259285 -:0094c0bbd39da78b30e344dad050ee6df34341 -:0094d07fd8baf5294570530ff5b896bf60e573 -:0094e06d9db7b336f698cae586e7fa92bc6158 -:0094f0d75649a1284026e780768b8ae404cb39 -:0095000b1c5b6012827f71412513cc9937d28f -:0095102b8ef83707d8f912cd3ccbd9f2accfa3 -:009520f5d733731e11513f3020cddd4f77e9b4 -:009530bbfe77558c8841c4589e2a35e77c3ee4 -:009540720af6d3265bf11e110b6fb228790710 -:00955087a4b82ede2dac96d9b432fef09a0e3c -:009560c077abef3203166040cd91d7885c3c50 -:0095703cf9a08d1b9632c0cf80c07ae20ea6d2 -:009580d9d0d0ca8d4229eb8b7409abdba0984f -:009590fb5abb3f5d941c5fcd091b3120dbbbaf -:0095a0bfe644e91b7bc1809068475d03d0a5b4 -:0095b050f948724cc98a5e95d7b9f08aa5c287 -:0095c0ac8460187a01a9783486756b0ae83fbe -:0095d0e510f56c24cd079bf8f588c9dcd5af1f -:0095e0a67d949f84109b263016a4001e13310b -:0095f0fa412b54223ef4458b915b29ae848ddd -:009600a562b0836250606a10075395341cdbed -:00961055ffd2f96b64fb42198f821e82d0c9a7 -:00962043d52d0cbadccf3c972633052335c284 -:00963068dfa63de275dcfc451491710e216023 -:009640642d47d562418974e45b3b35d7961155 -:00965023a77467b9242a3a781840719e0784dd -:009660995afea5b69590f25c44005c090363a7 -:00967037d2be922d6ee0c49479675fb5a87fe7 -:009680b0592056a62210ec3b3726a318394b3c -:0096900d0cb94cafb6e32cfb1a199882c9df14 -:0096a0f851bdf9a8bdda918a1ed2762f231f67 -:0096b014ccb68e636ca1037b5b0a8a6107588b -:0096c0e6867cdabb99b288486f36fb44e4a948 -:0096d0f879000461c350eb1d8c5deb437b535d -:0096e0bb0727f54a64474fb9187c8ffdb51759 -:0096f06efd77139c592f2bc25418d7ddfe1358 -:0097004fd4ea819a23f845515e708ba1f7d484 -:00971003776ca605cb6a015f2cc6a9f13de464 -:00972066bbbd83ebaf59312491857607a35fa3 -:0097300a7219f104a0d4fae16407f665f1b130 -:009740285be6aec61684edf345b7780e43f7d7 -:00975079eaff4b8906d93b7fb2a3604f871366 -:009760ade62d13f4ed28ad97fe186b0e4eb6fc -:0097708f17f366e538e92d967291e7c1a26774 -:009780b0caf397a64618acaf0556ae328e6722 -:00979047b70ee7d4c64e3f85bc0f25a9629b05 -:0097a04f2ffdc56cae761442132782b815a889 -:0097b0ffc46bf00b6a42fee19157cc1ffeb2e5 -:0097c036b980596420450a7da7916f6c9ee82a -:0097d0e7ff313a51e4a6a90af257562fb27d9f -:0097e0b9df9a7f9ec2b1c3c121d84b49040e8f -:0097f049683ed89aba4910f9369906d8251c3c -:0098004d61d5a70460912c849ecfddf91abd11 -:0098107219b7b8ba40ce8b7a931a7a5b978e16 -:009820aa416cfe288a18b0da17ddb4bd03f4e6 -:009830a6ad614d99351eb28044a976fe2349e4 -:0098400162b2276876696fc2e6bc5aaefc3755 -:00985079334275d2918b33e64bce941713ae34 -:009860c8aabda434cc0e4d31dddd7b22725d7f -:00987051440b4eb3a356767d409b80693d7662 -:009880a9d5ac176bf4ab37c217f814a7521c1e -:009890b45b6a852e8727636aa7b790be25dd49 -:0098a0e0059e1839c7baab9b5ba6a48fcc4db2 -:0098b076052cb4e6e474ee0a9a7148ff29bf87 -:0098c0a6eb35820f99de8755dec1ad1dd64361 -:0098d0337a6201416316c776cb7d1ef1eea901 -:0098e0d6fe2535dc7cc0323331e62924e2b1a4 -:0098f036ef51e4b1acbc414f7cf73f0ca703a4 -:0099000f3b53cb984d6847bc4c3b93db9483e6 -:0099106dd13ac3a199dc1445c16686b2feaa52 -:009920005e25cfa9d464e95ccc944cca87c61d -:0099309c7dbb3a558a7c2e679ef9bd29370108 -:009940d36e9cc7802fbfded49dbcc94b2b3208 -:0099506347147010aff59a7d569f56319ff04b -:00996072337a56cfd6dfd4dabb22d82605d537 -:00997097f28c5d2a73b56280e8863c5a214a91 -:009980c13d006cb92d663ef04b308b54b99fc6 -:009990c2114c461b19fa99c0b7adf50c0118be -:0099a0e66aadf1ea8f26bea89d4c01fc80b7b1 -:0099b02fbcdcaf51293922b53c59c9234e4b36 -:0099c0bcbc9207bc9df917ac133a4e1901a8ba -:0099d0a0d9b7f8dad05eb78f7b077a5327b9f9 -:0099e09a7f109b5a376938590c570bcc27840c -:0099f06d24c686c27381ae8360150c4e961464 -:009a00ccac73a10476ccdcbf8e0b9211541e2f -:009a10a7629e7902bd9ad35d58fb52031e6697 -:009a20552ca8c9cdc263b4913a0aad1633b749 -:009a30184f5e85b843aa1ade9f24cf24537c7b -:009a405751324e1b8c229d02b72132484a90b6 -:009a503e6789e753e7d1ec3c9d13bdbde5fcc3 -:009a60e711ab34457482172a1a7dad8d8ee686 -:009a708862b458e911ecb4eec3971c73a5b1ee -:009a80b8ef4e9d02edd9a7dba94825d74749bc -:009a90ee04571ece2406d25ea2179fe68be9ca -:009aa0e9c94168a83cf0786d948e650c00b7bb -:009ab0d4cf421be542fd9f0e8f90d8beb17efb -:009ac00b456c3f2f83407a6a12e9d38d3c0211 -:009ad0fa78cedd3368ed5225043d6a8e840917 -:009ae0d43d7cda2a14f0a400de4389a63eb75d -:009af0f0f275b95dc7619bfb4cb0ed7fcb2fac -:009b006340179cbe031e37917efbdff8d57bf8 -:009b101a8e0c7e30a466281e72d9e69a9471bf -:009b20d20fef8b51186fe46006acd42bfc5b2f -:009b3043bfb6094cfa3f41e879b8eb5b746101 -:009b403f15346c2f06f1292a4981ee2642fe68 -:009b50a30e30d837f0feae554a5c7d41a468fe -:009b603a923c52b36a9575ad7f99d1235d2011 -:009b708220a681da1b88a2a0b71bdadf1445b4 -:009b800a8ddec53e3375cfc6f33baf9912959a -:009b90e56c683d4ea886dbfba8c4529cbbf31c -:009ba04fc4a6e0c15a9c8e653bd7bf331d64d0 -:009bb0c4bca14a0aa41ff035e24e201db0ad1b -:009bc0897091e91411ac0c2d9d296544ab9dbf -:009bd0d429b298ecef06d10477bbc4beba6d1d -:009be073b745f78f3abbf76f2d3216b43fd74a -:009bf01b369e1e38f8087347a3cdc99aae3658 -:009c00f594aac0f5905389605005f85f583c7c -:009c1059cb69e4b47d9e432a25899819a93d98 -:009c208fb3b5b1b5a7114d995518f0099a68c3 -:009c30e9795e8dcb9a3fee9ed19283317f13fd -:009c40b97c9792e39768fdce8af39f0380431d -:009c502d4c0225b81a1ee74d5eeed0b6d6ba65 -:009c603936d6bc7ba39b51c43b75935b680862 -:009c70e57e382ef645149685a6b0122549e5fb -:009c80d1f3d907af09c2090aec36619aaa117a -:009c90eabfd2c1f9694cef8d23bc72bc2633f5 -:009ca0ca417dd1e33477c7c711fa466995965d -:009cb0b337f2287f57d7b8ebbd250c8fd6bf55 -:009cc087a91c75e81a9e8a4fcf8a8f868ba041 -:009cd0f52d1a46b1f8b53f93685e7d6bda0d98 -:009ce05c34b66a96f91de4c84607a498868693 -:009cf0da006f78d1a1df3b7dfddf4f757c5422 -:009d00262d872051fedfc6ea3454abf621addb -:009d1071bbfaac2830faee24d7b21423d2ba07 -:009d20f5031d525f09c79f9682b6db1d976251 -:009d3095c7414b2916238ab14850f5db50b537 -:009d40fdda602b598843a977f68cda1279bbe5 -:009d50c4f79ac65984fc634f77e9b3c0312b2b -:009d6036ef4c9688dd5bcb0cac0ad97929d1c5 -:009d70c6437b2023041d198eb9a4e3b8474380 -:009d80fbc647b0f1f1c653ec90bc2ec45d79ac -:009d90af5e507d0ead1bbe9335a73c0e11d8aa -:009da06b39395e755d63ccdc7d6f6688cb53fe -:009db0527681212fedae4b265633bd6afc80d0 -:009dc0c8c630d67ddbc1d4fc7b6e082743019b -:009dd0ba8a968c0e8887165336eeb3765dc283 -:009de09e94a93317e3525ef6ace1d361bfdd48 -:009df0ca8abec1edf11d5b71ac5f64dedb6b64 -:009e0062cb20aef09b2741420d7c43c280fbad -:009e104c8d5e1fbafb47e6636a2bfa4dbb3378 -:009e208871c842de06b2b0c07fc60bbd3c52a3 -:009e3065985a90d99c162abb26f8b808334942 -:009e40b8ef204ac73c4c77a11471151b6bbfb3 -:009e5053a013f8a763c1b437e22f45f44a478d -:009e60a07f3256931140657cdd400f5c5eba2f -:009e701c3458f95896efe81864e71a884ac05b -:009e802a36c399623fbb4b57b1ef6840193efe -:009e9089ef3863059170854e777b697649a5ab -:009ea0579cb6bb981ab10cf2fba7203a0b6482 -:009eb0ae5b53d92fb30bceadafe99596ab23ac -:009ec0e6145ac641976d6d104f769dcdf3b9ed -:009ed06771e723bbc01b6e8898e496c640940f -:009ee0fc20e37afe800027e25a91e9fd9e163c -:009ef04f383eebed0b29077d95112c4db1321d -:009f0056ced0f6812398a1c6c648f2abb84bb9 -:009f103bf16a9ad2dbe8190537d6d7817d8823 -:009f20494b22e1a0dfb6d0c945c257bfa297c1 -:009f306835f6458adc4304fb612f8c007698de -:009f4036c19b53fbbef7bf4ce74bef7d2a56a8 -:009f5092feed9ae6a42a974a29033d392992af -:009f605fc9e60ff3d462ac501eaad0e1e4b434 -:009f70884db3cb1302e361002509be7779a7d8 -:009f80e798d756c0870f650a8f8290fbceee51 -:009f907bde080ec07cff975dd6568f942bc6c4 -:009fa0cb1639960797700343f530d11d3d3d99 -:009fb0becacf6f628fb45a44c8234f8f3c38ec -:009fc0a240ecfb1dce1b116df0fe7e26bc7d16 -:009fd0c8e33d4e82409e994dfd6b9e71747c09 -:009fe074206d6a24456e0f2a74bc8c643ee0cb -:009ff09848cad6d2e68bbe9743182334636c66 -:00a00051c5bfca23412ba43856e15161e8eb41 -:00a010d228fe5a05601294ac0f9df12b941f9a -:00a020e92a98ae5bd6b27821b7a4636702a67b -:00a0308d1b8a532c54b03c93d64568b3e74dab -:00a040b4497b8260d20638efb943e7c37d2df5 -:00a05087d140bf3fa2fd468941a2e2ebb38ff6 -:00a0608ec6db1a2fb3fae417ff2c3bde0be701 -:00a070056ce3cc09f1988a0b05826ed14cbeeb -:00a0806df6a998c98a1c547478f0dc05b57dfe -:00a09028c46a6387cca3f451c794c8d6e009d7 -:00a0a081bca1e3372456f68c86568b19edc256 -:00a0b015b8067fa0e5f8eed7f25486057ee3c6 -:00a0c0e82ba8cc4127a79005dbab524da6c627 -:00a0d00da09cae84fce883e61f762769c58348 -:00a0e00e7fb10287b604cd8470393584afdecb -:00a0f087132d953f7cd279de3332233e0c5ca6 -:00a100fa81db0a4aaa9213d062a55f69736592 -:00a110e374bdd8cda790b0ab4a1160020b2ce8 -:00a1209e0f4cb48f0cb4988d436d5da2e2aa19 -:00a1307ab2f0ab4e989cd2646525ab7e9b9f31 -:00a14003687c34f392e97c3bcd6976eee771ea -:00a150b9c8d4d2d4c9c1272be28548d6d33f86 -:00a160e65fb10a1d1b35f9b8e66fc8030a1b8b -:00a170ffbb681b397021e8711e37db1153d114 -:00a180d7a56f227e853ab4c5981066c3f98841 -:00a190a588f5a6975ee84fe61bcf57e523d4ba -:00a1a001e6735aaa05eba9fbf8fb98c61591d4 -:00a1b0d13b5371004a105d7fe07ae142e97929 -:00a1c0ef54159c19e846b8fc2409d44c52f9c8 -:00a1d0fd66d71bfdadca6e6c9785443a489168 -:00a1e07a001fcb1b1eeb2abf9338e3f99a9a4e -:00a1f0313894a219529077823e7920a7c814ab -:00a2001b8254a21d9284154f4ef2b0e80983e7 -:00a210173f60be4f4a96f3dbfd283cfe438caf -:00a220da98ea201da3e093bb33820c66dec6ed -:00a230ecfcff48bde7418f1f60e6353d88101c -:00a2404d7ae803019ff890ebe5cfc68591b9e2 -:00a25038f1925a179b0ed82e7020fcc03cb6cb -:00a260aefcac3d7214b8145378f1ab3cdc56e2 -:00a2709c16a7d76a37e97a0cb263d3d5dea9b4 -:00a280c77e569c7ab925915f36dd84c63ffa94 -:00a290a95d9693503b6182a5f95132f9523169 -:00a2a0e76652d719bf3b8f83261c26363fadbd -:00a2b093f6b40e80fac1546e356698ae5eab2e -:00a2c04b2445f5453da3e8289b8f5ee9773592 -:00a2d0f97abaab5e59d5838340c1696b1ba760 -:00a2e01998b3174e839c1a6323523b3f8f7d93 -:00a2f0afc56fa53079d828ebac4234ff9797a1 -:00a30012cc2cf1e5a12e0e88cd58d69cd83b56 -:00a3109bb96aed31ef73a4521993c320fa7aac -:00a3208785c415ba302d1d637742acd70f774e -:00a33069503076fc823c6936c2412526f81c80 -:00a3406ce4782c4af4e317619ab6ea8aebd69f -:00a350d36c8168778eb123d10b9c6f61198240 -:00a36090ba416e2f699a58854a95eee8ad509d -:00a37024cbfed89ff438b2acb38824e82dc2b3 -:00a38032e4320526860f08885636a63e9dbfc4 -:00a39042d9a016aacb97af15e94fd701ef471c -:00a3a080edc3d64037b164ca655dd675ff9fc1 -:00a3b0a7e1e313a7df88554683f55812cb63c5 -:00a3c052aaabd5eceb6a5f995a8674a866a11b -:00a3d096e395dcf3d08cc2bcec9d52e2d7be7c -:00a3e0150f74612d3c7a33891e777b6de83b42 -:00a3f0dbd97edfe1a7bd28679eebb62d19c2b5 -:00a40000466f9fa1b05d889987a67b7d093508 -:00a41026c5ba7d68bb7bd746e6cc2a181eb25a -:00a420e6817bd1a999d8900f7e9ec5317b7768 -:00a430659db1f2b1e94ca00222dd3c167fd72a -:00a440cfb4c624916aa21dfae42e840dafebb4 -:00a450415acbb07fa3874c5ef4ab3cfd4d78c1 -:00a460470cd978747e105bfdb5016d9436b886 -:00a470f2421afc746fe5d523ef9a3a699b7bc3 -:00a480e21c7b25d0ad1a7353a0095b7778b4a8 -:00a4909f34209e1ba269bbb944558f28d86c00 -:00a4a0ed8a4e44fcbeadd7ab564b5f5a413fea -:00a4b07d0f8295dc201622b7cfb4a1c8c93bf1 -:00a4c047a860829c8150cdcc210fc274096a19 -:00a4d0b8f188b04b196deb104bb6f3e20dd543 -:00a4e0dd775d66fe896b98c9c562a5969ae28c -:00a4f0a6f79175b712ce63655d68b615c2740f -:00a5004e91f789f4f4b933770127f8541f2970 -:00a5106f21ed97c718a71e664fbb546662c0f2 -:00a52074080283b3bf1837946c23a25b849b73 -:00a530b971d97b868352d5a06327a2bed0d0b0 -:00a540784e7c5029c3b8d3928a00c6cd2bd743 -:00a5500d018f52c70ade6312d0846a805c8ad1 -:00a560142d0522d9f007d1c49ce17d70c1f0bb -:00a570fe6974fbcf81e902abb63298ce406121 -:00a580e68b1b037aafc0a21c7b0af8a4d4a07b -:00a590455696f50ff932a8b6f682817a17abe1 -:00a5a005a22872ca65fd10d0a9f911123be3d6 -:00a5b0f8849ca85476aa08ba4f344a1f77f639 -:00a5c0cd5cfe2c2ae7d22c6ea8bf8b393df566 -:00a5d06670e781ffd1fb0bdc9bd6423b69df53 -:00a5e082fd5d4077815a6ffc639c213ced86e4 -:00a5f070f7574cf6f82018732fddf0dbdfa82e -:00a600cab99464f7c7bcce29cf15f3da1072de -:00a610f9439a4f509b5eb123a04cf6f357d080 -:00a6207ae9661d038997a731d9cd5959d68ff8 -:00a630a464bc93a9f8b2536db8ac7e615eeea2 -:00a640ae5afbd26ff37ca195ce159b20efeddb -:00a650dc1b2a4f3f109aaf6f79f4bc99661b53 -:00a6607da42cb1e517594183f621caaa4d7c09 -:00a6704e204940b0ad5460b62341bdba055bf5 -:00a680f0e943e4d3f0f1055c43c615d8df9461 -:00a690755fbd40b3ead094157ea000755a6e27 -:00a6a02d2e7907e5127d44747dd7865fe33bee -:00a6b09bb92f86e115c3005b4675c7d062026c -:00a6c053710776cb17c949e861f13c0c4f71db -:00a6d0f2184e4514ae44c6f345f07aafab2c27 -:00a6e00d7319821857633baf69ec210287b0e2 -:00a6f032d0305e1fdac43e6a64805ea10e40af -:00a7006dcd6c252b4fcf9f13f3a0dba5c7bebb -:00a7101cb34a1e46e1faedeedf7b528f7a326c -:00a720ec5ae9fe55c47a94925b71089449ff0b -:00a730f4143bcd490161ab5b6d231d5f6730c4 -:00a740d6f68ef150eba6869201615b89bd2613 -:00a7504432ad0fdc5c3a4a580d846bb15ac881 -:00a76079806050df7ec7bc30180fc0ec3446e6 -:00a770a624ea3c900fdb86f2b46b46db151d5f -:00a7805d6be31da5c2473a5ae0596cd6d9d7aa -:00a7908532881ac0716754dc197ef8c2ee0f4f -:00a7a08bf46caab2d612cdf33345a3d6eae171 -:00a7b0034ccdcb3488ef4837403368afdfee61 -:00a7c087be830804e5a15e7eb4c793aa5f4d8b -:00a7d01e5bf65f84fe398e9c2423206bc8c71c -:00a7e069f4ab03923fa528aa94e4205f7d45a1 -:00a7f0fdb2f60f6e0ae311a57dd506c6ee674e -:00a800517637d16ac3763a0e9037e918d5101f -:00a8106c419a183b6273dc56dadc889d95d6f4 -:00a8205a7a0705500f181f1f351a642ab0ed96 -:00a8306c40bdf3265f6978f73fdbfe66b6168d -:00a84040c30d107264cabb2c9c7f09d90eeac3 -:00a85034b39ba0ed3df5602d4a0ccaabffc12a -:00a860b2ad350543c956143eb9b6f997efaaf2 -:00a87068f7fb9967b509bf5344770f64b66c8a -:00a88069967444a7784f7d056de0d84521edbf -:00a8904e3603409e8da5e019c712eeb751ae71 -:00a8a07576f326efecfdcc82baf539fbac4268 -:00a8b0e3944ce48736d985a876e398b10edda1 -:00a8c09710d97452b7e432083c259f0909be6f -:00a8d0455c5d09053a34889ce2cff31643e3f0 -:00a8e0f3be12676e0eaddf038be47791cde264 -:00a8f0adbb0cec2d9866ce23ef0f9f5cb57493 -:00a9002cc7a19b68bc1c90e11011e8f407872e -:00a9106212fbcf50c16ce971e28e503cf77980 -:00a9207b49a9ca075601f99d5e7142196fc79a -:00a93012c61c944860b4c16e696e8f16a0ea3e -:00a940174b64dbdc878e6c6f2fe8351e90c616 -:00a950a55b89f6d488eaa5710b54c83e78717b -:00a960148419409ae1aeb2ea00e51cc88a83d2 -:00a970b1424376b628bc63efb4e091fe974fc6 -:00a980d0924f23630f11692b6f5642e26d51a1 -:00a9903be0f18ca2e7468a13dd75b73a78bb3c -:00a9a069313b243a36c4ba55b2cc300cff03d0 -:00a9b0fbdfc0c67e95057b0772587416e3d803 -:00a9c0a87edd5941f5a1b7de357a610442f3e0 -:00a9d01839342c3d52aaaa012105009535501a -:00a9e08e443ea11c69baccd0c61dc48285c537 -:00a9f0d08364c1f6a461344d5d0864b2e39fdc -:00aa0097927970fd6488a3e9b4c0bf87b5617d -:00aa10070d96314e778ac0d86d2e96a2f7f2b0 -:00aa203e610c7b9ef6bef7fc946996bfb53c9b -:00aa30dd7fcdcc915cec630c3513e30863f310 -:00aa403a9d9ff9fa038877b0fcde6466559913 -:00aa505b95be182499032f8b4443bf709b1016 -:00aa605544e2327500aedfda2ee889be3682f6 -:00aa70e6e8709daa4acbe541177b96d82a227c -:00aa8042639b355fff21b8cf5d9be47ae601dc -:00aa90741d959fd9fc2f934f2649d43ddda43d -:00aaa070396a6acc650ab85e21e761dd3d288e -:00aab095fcef753c75c518c63d7bd319dc7a5f -:00aac0d46c6ba7c9e0f0fa325d107900151a23 -:00aad06d395d23d5cb87647ab829ef1ffc4ae8 -:00aae01d68a4baec41651cbfeb023b89478225 -:00aaf0e4244e4e535f23b11106d7c230e39534 -:00ab00bc3bab0c55a81fda4a3b76d2579eda9f -:00ab1065a257e43c43ec2510ec6e82eb6f34f2 -:00ab204b4287fdfc591debdd388ce09ac8c158 -:00ab307f22229ff0f57b4c6866c7431bf7a778 -:00ab40cdb642b78fef67a6942d476b6a80bfd1 -:00ab509efde6111f76a362f965c9d591ef01c7 -:00ab6040ad6e5d1f3586de17c6effe47b38a55 -:00ab7045b3c97fb7697f798ee18666cbc2e445 -:00ab80656366f479618b5e6b01a5df70f22bfe -:00ab90dca9369666b3443a8f88f78b89da25ac -:00aba059d8f7dbe6e90010338b375ecc6dbb84 -:00abb0eb50a81c33b186622eed1c063660fa96 -:00abc03d4793295dc6998d6e1347122d4017db -:00abd0d30680f69bc029be6570d3e57dd020d0 -:00abe028efeb08a4918bfff4fa0b8ed5a42168 -:00abf0341a678040633d3b5c77b21da86a2965 -:00ac00f2515b2fcd4e01856011a0660d6c8b52 -:00ac10a36f9f5721744b4e9d87d7de3d39059a -:00ac20830af0d961ff8f40995557d11a55d6b9 -:00ac3051f344c420b2a7be0059c040c7c6dda3 -:00ac40c974d6ef4135bbabfc441d613eeca819 -:00ac50289ede0adfe75cf0e2474147b39a18f0 -:00ac606f50a4166aa3520dfc2de8bc34eca372 -:00ac70fae354ef913d8fe82eb1c66494c8a089 -:00ac80fff483647edf990dbfe7374fe4231b3e -:00ac9088a0dc745bb70d7be67ae77eb5a4e58c -:00aca0953d8c1c2e02505c515c717df486650e -:00acb0700a0145680132ed3904cafa564036af -:00acc08590634aa32e07ecf1ea7f60e2efe3bb -:00acd071803edb5bcf928d0561e13b47067206 -:00ace0df0c21d6f3ceadbebbec12f7128dd8a8 -:00acf09a30ce5256f2e700933fa8f64a04b649 -:00ad0068c8ff0afb9d8337759d60e791e6b716 -:00ad10c982eaa61f260d3de6f5e0a7f7b50ed8 -:00ad20ca2273a4a7be2416e9335126a571915f -:00ad30f4501413e506ef5c48467b11ec54aebb -:00ad407238b726bb93dcc21c7a02bca418ebc0 -:00ad5087421c08e5f49fdfc92d5625201da1ba -:00ad60ae9dd9f20ce419f75e3e27a690683b59 -:00ad7066b90293b3cc1b101c5df3690fbd0b95 -:00ad8031f0a485410a58f005adc95664425e24 -:00ad90c86c7d2d2fa5be64226dc46a5eccad1b -:00ada0b548a406fc19503ed837ca6ef4835c21 -:00adb05fdad3991cfdef6554c00c2c53ab738a -:00adc025e6099b44ae157575cdb67fd98eea18 -:00add0cf77f0bf2d8cdf5dff703b01da961ac8 -:00ade0bb07a12eb9cd79cd892380ef68e934db -:00adf0e59f093c5aa525e891e920bca5ecdabd -:00ae0004bfcb0d8f6a877acfc121081bdcb181 -:00ae1011e3df0028b78fbe743bee7a4aee84df -:00ae203fcb5b892d6c9dc1d2eabdbcded6837c -:00ae307db313b53a17a39af1420a996ea5e6bf -:00ae404b49bb727a9141079a4a3497f603c5c9 -:00ae50bcb272e4253e78c7f612772eaab94a12 -:00ae605d2979b9e1fcc1186d07fbce1e900f24 -:00ae70d2aca3edc8ef0686c9fa794d4fe06d92 -:00ae80c371a7e79b48288be3c730aff6a168a5 -:00ae90f552d2912e58af456475a81f314478a1 -:00aea0a73e6d79a6044f400f9c6b36737d45ab -:00aeb0ac998a15c94ded163ddd7e0d164ff0c2 -:00aec08a99c83a923da4d5f5cbe49885e375ce -:00aed0a9fbb87970e505a0b584c7ae8ddeb69a -:00aee02323ae10083cdd4919efcd5c27ab80e4 -:00aef008571da74106a8de58bb298ab35a27b3 -:00af00ae974e7240acad78885bcaa55edfd046 -:00af10ef4c17ad92c21dd34da89651baa4b905 -:00af209e8492f274706e33e59331b2066383c8 -:00af301c797fbfc453603933b83ec02e0d8743 -:00af401b3942db82e0ad82ea11b030d6ac1761 -:00af50ab696923b8db0974624b06f0d2c8ab14 -:00af601829f0d986e7216e1ea9c3511a6e1ff0 -:00af70f48310bedbc2cae5d27b421b2c94d53f -:00af80a3c2437e510b80cb4f2fb16e64fee8eb -:00af904a84f39a98915f5125c9f68159d44546 -:00afa087d12d3a5c33900b7a25e7e6832edd4c -:00afb009149b1754842476b5721883f32120a6 -:00afc0d8be51e862d5486d4a87f74ed07f4f43 -:00afd04888e751f633348fa2ba84640ecee055 -:00afe007947226894fa1fed726ad9aa1cfdc1c -:00aff05d464e07093d0fb15e3a44033c35f051 -:00b000ecf5c5cf4a46418b2485a34b127e052a -:00b01086c2b6362add949a3af847932711c5ea -:00b02022eba4bcd1d196061331e1518be9ecf3 -:00b0304cb6e83471fb61421700408950dd505a -:00b040509921006b981deb160411a53ab66218 -:00b050e079714badae82ac93d14f980cad273f -:00b0600694fcf2bcc73d3b8f6ab04b2e5b0c99 -:00b070a8d7713fa43fd99a978d757b702f90cc -:00b080a0241e5588c25f77b30e6a8d8f02fd41 -:00b090e909f70faa70c4f61bd5f76e41a19970 -:00b0a0758db4f1c8eba0d20304a544a995d76e -:00b0b08a469dca347ad1ade2725aed4b236495 -:00b0c0439da901ac1e3737cfbe19ed9bda7531 -:00b0d01d982180d6122fd47b4e2eb38bbf6981 -:00b0e080d3c82fe414e039bfaa7ab045220cdf -:00b0f011431fefda6ae9dcb4d91b1e6f4807f1 -:00b1006e8ddea5ac5c5942b8faaf6bbd37dfd8 -:00b110283cb2c66b92c17e0becd2b31b8cc7f4 -:00b1202b2d919c5029fda41edb67da09277e55 -:00b13066c101631a5f52b5ca1535ea14b04562 -:00b140c32c7deef5575ea2d602b75475a5ec53 -:00b1504abd93c20478d571735f9129c0a17673 -:00b1604efb0527518bc49cde343cc46bb55a87 -:00b170a9031cdaad328861afd33c1d3749bff4 -:00b180480a515c05714b50ffd8c6d597e9f920 -:00b1908b1e9c4b8c7c16f68226f0e0c5693b74 -:00b1a02f23b7cbe8d6fa9b3c33295567148ff8 -:00b1b03a3e9cffedc1f6049f2b9a54bc68af82 -:00b1c086fab81cdbf48ea3d531618b1fcf2825 -:00b1d02c08eef1ffd0f98299de5551d7a4370e -:00b1e04956d13f8065a0f4b5c5eea356061df9 -:00b1f0a073e8aab5215abb9e4cfa1d9e679a8e -:00b200ee5a611b5ceecd68a545f30ab8d97136 -:00b21021891ffffa5294f3fc116e1f3e6fc338 -:00b220c3685f549d5752a3c034d702a2413d8a -:00b230343ab523090948c1bac0d8817e824f8d -:00b240d267f145815cda811bf2b766369cab95 -:00b2501bdd6197001405c02ce740fab92126a2 -:00b260f51314123906526a12dd34e72f21977a -:00b270698e91f5d2542cb58903a2bae8ebf6ec -:00b2802896bb5701a743361293d5f90226a85c -:00b290f5095d2b0b1e4f0df9d191d819f7c266 -:00b2a045b1b7cdebddc1fe16b4d1031f85e8f0 -:00b2b0154b483770d36e45bddef3b63000c4c6 -:00b2c0bf1e8f493029393192cce16714a85289 -:00b2d042c6f83062b81e0e4f5ba60740df0c24 -:00b2e04c3ff976b94227f1a608db6a9d5491d9 -:00b2f076c77a512e1b7bea6aa6311b7d161ece -:00b30007f1b60df74b0fbc2eb51131f0d21b89 -:00b3102c6e04663a3b2be511860ebffbd667af -:00b320fac5788ba7443b93567fedfa25c34dd1 -:00b3303ba53478c64ceaa07df03bccba64f381 -:00b3401e49de70ed42ce415fa8a0907a33f5f8 -:00b3505ac82045bf414be71ab2d6620a602d82 -:00b360b4b5b5bbd566adc1e67f38d67576dad9 -:00b37033ea8fdc164dd491e1e78869d06e2681 -:00b38077de5ce98f121e134e3803e282062402 -:00b3903a3f84e73576b0faa1fd5c703fb35dde -:00b3a06907a4d7f75f3d8f99d0171356f85bab -:00b3b03d8518e43a0f6903cf0a4394afec8304 -:00b3c012fcce7acc3ca8dced714397bdda47c7 -:00b3d0c505cf3074112c5ad4818a37871c3f04 -:00b3e05915b62f69807773125fe2d454ed6449 -:00b3f04a57c6ddb919347561db7ce2175c3bd6 -:00b40029b0684cb4752a1597560952e2fa6622 -:00b410c7e783b0e775378bd154051998df1405 -:00b420389cea81c5dc21a6493c1c4899852f58 -:00b430323b9123b64a4476c2953e608455ae69 -:00b440abca7293087d044e062a7919d0d0f3b1 -:00b450c938d7012086ab46445f0bceac328ebe -:00b4601a72335d13ca7eb34d2d56e0d92a2632 -:00b470bcd042d9f16cea5ef8283bc9f6c49ea6 -:00b480d1393645389c4e4daaa8d0658a950cbf -:00b490565e575233202eb36408b65fc97d7a97 -:00b4a096abf016dbcc9c76429fc7e5a512cbb1 -:00b4b06c0493cadddf38f0aee217339324adcd -:00b4c0e31d8284bd8e292a5b1bc028d08fd245 -:00b4d08167c29110d7c60ffaa4a297dc7a2f86 -:00b4e0a988c3d2cb3115d3ace61171a7f847e7 -:00b4f0ecee15ea549016a28fd819513aba83ef -:00b5002f5d0d61c4a1578e27e72d68abf77e95 -:00b51084b2b53a310b5cfe4a08b7ff4bbad4b3 -:00b520abd4b4ef603a650eb0794a5f74a402cc -:00b5303b7c84b851d5782968f33eb21af334a5 -:00b5405b5fce1f1119cbda11552d42f61a88cf -:00b5502c54e6c5ad2ecfbda21e2802028fc77f -:00b5608e3274e66efd7225f1bf988d402bfeea -:00b570d04b8967e9a74ced410c3fc9da0a1992 -:00b5802459bc01ac15177a84177a044d1ee525 -:00b5906cb0e601fe9a72a718df1b24f4333da6 -:00b5a0cff237f2a6f554da56094f4b8fb8eea5 -:00b5b03685c2a0cb7a9264e35b652122b0353e -:00b5c0076b4c6e8c5ea65d3acf359f6f8fd9c7 -:00b5d069442b5b5ef506bc467918b841eeb824 -:00b5e0670067842854c7a4cbceaa19ce8b6b40 -:00b5f026ba99fe778b22ffaee00614ee6b586a -:00b6005e67fa98cdc25f0053db9c6b40f58bd2 -:00b610e0b13dad917453645c20b9dfbf1f57ee -:00b6204f7441a9ff5042800985b96d0f5c46c1 -:00b630d3278b9feea4ced490d623e94ffe92c1 -:00b640cd00c5f6e2c206d58148c234722972ea -:00b65044b8111d5433d9e2cc7ad6e951fa4394 -:00b6608a1975a422e00b7a5c8d85c63ab9c175 -:00b6700249939aaa59f68b60eb7b447e0b01c7 -:00b6802f08a4ecf69c8cddbdca426177e68d24 -:00b6903fb34e6c703de835e57d917a7ba54ec6 -:00b6a0cf7ea712f305278d7fdef7173707fe4d -:00b6b020497547c079ab1c0a1389c3f345ba13 -:00b6c0e929ece5934f5940d925d3b748f2bd37 -:00b6d01aef4f7ef4560d12d8d12714d12c46ce -:00b6e0372c1345980fc61b7b39be86b954a5d9 -:00b6f0be83a9ca691290065de0ba7cfee03fc3 -:00b700765707988641f44971adebda7fcefe04 -:00b7103302c34f7a3abb6b659a59c364936202 -:00b7209cadf019c5f4dbf31c881bee6434f0b0 -:00b730d392f2594a09517fc83bc9b96c6928e2 -:00b7407ba570a0f470f5b4c97423cfb9ff1a07 -:00b7500a87ca68349e7d6463ee61281b9a2fc8 -:00b760fc70a752db4531688744cffded53c6fb -:00b7700f340ecffb0059be8c5883d7e85b04d1 -:00b78046d6b2428ddf42e9948d6cdf4cbc6c97 -:00b790ea04b8af95efcbc5c44d432794252107 -:00b7a069a61f4e835ff1468a39db50c0623931 -:00b7b034309f6b13f3a1131146b2210b875bb8 -:00b7c038c29ab16840c60cb8bc79496ab38de7 -:00b7d02944adb43a81c729f9c3ab6060d3bcda -:00b7e096035245bd3554ca230b5c15a6f8e685 -:00b7f0a5984c7c5c8c3ce66a1ad88cd0cb5105 -:00b8000faa50a09f670bf037ea7ac48334be14 -:00b810cda647bc2cb9ab5776a4cc2a83dd7d3c -:00b8204a29965696f2819975ba78e714a7c79e -:00b830743fdb27ad3cbf54d7d92342fe57288f -:00b84029776061ca5d2fd6693655b87fe9dd25 -:00b850d2442edb89b92b54748e77e777fea404 -:00b86055bd4a966f257ba2a91925d1097fb7b7 -:00b870a957704d1ba8cfa7db174bab79fa1371 -:00b8806e4baf5c5e6d06c4c06bdd36ac71b3b7 -:00b8909de850d1df53789128dd3f8cc97c12e1 -:00b8a0b77bdd77d3b165437b2de9ddb82496fd -:00b8b017cec6e1702757b1f12cbc60c8e3cde1 -:00b8c0345a4d5700ff1637a03c39a5ac98286c -:00b8d0d7bed9f40f6ab4b1ce24c75d0ad209b4 -:00b8e0e9d85d3369641e94df1c7a2957371183 -:00b8f0b4bc4b6733adb92da4f586fe5cd78b0c -:00b900e8bf34a583da1169b5812ed4e6195a27 -:00b910fff2402c68510cf92a7d8d072d82b6dc -:00b92095debfc1415ee540ceb177ce044203d7 -:00b9302f1612e97e12041905f6c8a7de26fcbe -:00b94053089148ee19056f1be9cb99555f0db6 -:00b950be8b4228a3e382d7b34b3c9bb5b3c4ce -:00b9609359887f23890d5bf295bc73c276480d -:00b9706e7edc3469614b28d652151a90eb61e1 -:00b9808e137fdda286dbab2c9fce8cfbb7a5fb -:00b990dc0199a3de9a124e14ec17d8a56c32cb -:00b9a00e5463c5dd3f653f3c150c35f0c4547b -:00b9b0bca602b2e37df77ff6a0f1e0d5f3507c -:00b9c0d5bd97c2709752de1a9efd51388ee767 -:00b9d0d2e7a0081f4d810dabbc1bb821966df5 -:00b9e01ed947f76a1a9936fdbd83e62b7ada9f -:00b9f0b8e362ee8efcd087bc6d05c00c159f58 -:00ba00c35392bb9a4388d19ee3973fa34061d8 -:00ba107e9e9627884e15dc971964a2990b771d -:00ba207927a57ed2fbe223d697bee92c033927 -:00ba30c463d71ca529ec1dc4473e5b5f63bc36 -:00ba4002e58aad248e893e127003ebae7c1d0e -:00ba506376a8324f5b623196ca085d8c1c95e6 -:00ba6003b8421922ae42c585b84378aaae7ce0 -:00ba707dd8eeb2acb427f1973353dde2d41640 -:00ba80c9bf927a2eb4442df63094293fdf8d70 -:00ba90f2bc18fb2b426e300d255b9bbbcda313 -:00baa0cbce5fe877e742675d761885bd6727db -:00bab04d0a30eb2b0cb39dd0ae63f2fe76516a -:00bac0e405c8b0fcfc5effa8be4462cc7acc3b -:00bad0a69338f4a5c7c61bfcd90b24518ca485 -:00bae027a5192e00577cba3c914012373bffbc -:00baf01ff1d8757c72845e911ddf1caf6ae705 -:00bb007c039248b452060f9a874164f2d914d5 -:00bb105a78042330400635736dfb240eb921ba -:00bb209dcdf2cb19902471c4c69e1cdf48f46f -:00bb30d877d2f4d2fd9d2011e5ca8edf90d203 -:00bb40b8b9ec150b98e23d03a4edd9d0ff7f13 -:00bb5084effc49f1e46b77cad840090cd8eec9 -:00bb60086d7104f39e19cd7c73e7ec01c46e91 -:00bb709d982a55042f911a7dbb2d4b7a8bb561 -:00bb80f8bfd0a6fd88617f3ee39160f849bce3 -:00bb90fff6eb382de0cb728bf9da56ec0c7717 -:00bba05e1de809947bc9b511dc64fa36a20732 -:00bbb0c8dadb1ae7047f44b7db942d5f89bbd8 -:00bbc042bed15749c2efd22b9d59b9277c3e33 -:00bbd0b88647ed54cc84bdef9086cb179dcb84 -:00bbe03a1c49d7241883c003d5b46b4bff020d -:00bbf0daa7861a95b8cd24c602b62d8e5736a0 -:00bc00e266b4d18c81312e6c162a6b1df3eaaa -:00bc109bd621cf00693d21a6f8b02bce79f804 -:00bc20ebcb162b1ea0997ec010301fd4f24977 -:00bc3014a9ab15a9924b20eeefe80cb3f1ef2d -:00bc404ed975185405eec6f6f59f20c499e72d -:00bc50dafdd020c510ad28871e2466c9e3395d -:00bc60c308f97ec7b4017604ce69a2ebcbb6a9 -:00bc7000158d5abd4d4088fcbec702b146f5b7 -:00bc8017db620a196b1c2c766304673ea89f8c -:00bc90616c833ed79d029ee52b070e38412e3f -:00bca092a75a827fa438df097be90c876982ab -:00bcb0ad7456266d75677b2aeee31e9f6af397 -:00bcc05bbdd6b9013786890ccb9540950442de -:00bcd016b4877766178562ac444fdbd253cb18 -:00bce0b102f883e6983bb2028db09c24f973d3 -:00bcf0aaf59c85102a2a5b0fa1042fc4263a7c -:00bd0085e199caadd78f73b751e9daf9ce45ae -:00bd1023a3577201d4ed0cc07e746d7719e944 -:00bd206833e7f8107e69a9ad7bf4b76dbf6352 -:00bd302d89c4b04761818743ec0100d1bb7bd4 -:00bd40e4f9d0b7df3fa3bce4c7789640848b2b -:00bd505d32d69d067575d8457d422ef1b5f485 -:00bd60a8a811c3e671de1fa0c93dcc7dbbc811 -:00bd70e34f4851526a82dccc4b47ee12d680a3 -:00bd803abef9b243eda577744ead621129e10f -:00bd90a4ce4ac192d9643d53f072b30270951f -:00bda04bac2f37d17e9146e7bd6c7e189f950d -:00bdb072a3b4b0658c83c057fb3f6455cb0f8a -:00bdc0dca9675b44a9d1f91b66257267aae549 -:00bdd069ee137f00e744d78681f2e82ca98f2e -:00bde0b7b6b457403002db50239c31a4493fb1 -:00bdf05600ed8edfd01ff0433e982490f0befe -:00be0007cf2d5eba3a7831905cd128f894043d -:00be10d5df9e4627eb7abf6cdf2a03edaa974f -:00be2048d92fa418e4d0d66688e56c5d351211 -:00be30bf53f3cfc8e3f371d454c8456d969b02 -:00be403a6cfab7f61578e609b153caf9508c4e -:00be50e2fd27a88313f428d971f0f5d5e121f0 -:00be60d8d5ea6fd1b6b1d26a9c1f7a7e4dcf90 -:00be70c1789e7af5295734183fa09b70080312 -:00be8022c6eea6c7c51052daaa8d9e1e2b361c -:00be90d0a78e87dc1bba3e515dd4c61f0a1aa8 -:00bea05b940b412ed4cf779d208099dd43aaf6 -:00beb00b4ffadf04dcc67c9a16db74d9db73ad -:00bec06ef1432f7f882b268c3a031cb1bd7bc5 -:00bed0ff15cddc0752c68394d466124209beb5 -:00bee0997ebd997573f0f18dd100fe4d8a5316 -:00bef09e7557e448e8941feb60d05e0e1b7401 -:00bf00799c9cafb33ca68c177e50d323d5cfdd -:00bf1011e51d75cde42acae8a8136cec4abbf3 -:00bf20c113194f7310b06aadb77d497ce6ef67 -:00bf3016a4b54ceccf35752b8a01a56930bfb6 -:00bf4041f183f26c27d43cf67e466f93bd392f -:00bf504850c600b2ccae11eb4c04e7de099fa4 -:00bf60cf71788ae37c0932bbe165e4de3b03b9 -:00bf70f38f1b1bec4239f0e0a5a44a79ece61e -:00bf807418711b17a754b58dc0f8b9445afbfa -:00bf90076ba0eef8efb2df34b235d76bdbe625 -:00bfa08b2279ae1a3f91cec9da1af43de3bc09 -:00bfb0e1cb49afe0dcb9e6048d8133cf8ff793 -:00bfc00dcafc1f42adeb87ee5b467ad2609e42 -:00bfd0cfbbdf0def5ded77d7901bae38108223 -:00bfe0226cc8a2bc74d070a84ae9e206bdb22a -:00bff05953ed26fa8bdf959b9b8cdabb93e6ac -:00c000a50eb5352ebee0f2e75573b939a4ede7 -:00c010afa819bf833e994ddaf00dabfef7f721 -:00c0202073c183a5ea428eb0d56614059c412e -:00c0300e473e2ee578bcc3be8745378c8eedcb -:00c040b65b8e2ea50050aba4bf541e73745faf -:00c050986ef45371d33c86c9ea28a17ae726d2 -:00c060f9603455d7b8b4c6561799fd15d06b63 -:00c070b63180ee24925342ce46553ec37c49d1 -:00c0807006519f9beb245a3bb3ede383422a80 -:00c090858d4aa85df71b6a9b65ea5a7bbc10ff -:00c0a0b6d24d94ef1fdc864b1c5a3befa30172 -:00c0b0b18dcd760e448c29cea8646be3b0a4c9 -:00c0c034f8c14773da13af5c5d640b87271c5d -:00c0d0e5587103105cfb0a5ff1ac4572c148d6 -:00c0e0cef3a0f740476568f1ddcc9f8bc607e3 -:00c0f0bd5650bf2e5f8f7b68d42842bc85f30f -:00c1003e40a3eb0f832e5c9d4600917079b119 -:00c11088455392ddefc9098be4b167f9a3a22b -:00c12011d4b20be6708a94cddbddc8e5ee87cd -:00c130c16936bac0c8914d3da6571102be6967 -:00c140bf4567368b5bcbbd00f952cef8fdd1c7 -:00c15009684cce11f4d235a1edc9ba0e451679 -:00c160086835516e65991484f2130d920668d4 -:00c170cb95a0c38d0e4bf3824f18efca6dc810 -:00c180f498d93e8737750db83b8dcf2ca039a0 -:00c1906595c3bbfd15e88c663d2c176c35c2c7 -:00c1a066569f27a74bada3d901a0c7c46071c2 -:00c1b0bc5b963c28ae7baea25c13da1ebd3149 -:00c1c0c3a393a8d4a003f2a00a22f3f3fcb54b -:00c1d00fdd7dbe48554e5dfd6eaa545df489c7 -:00c1e02dc9f50ac4e593a3bb4103f4d80af624 -:00c1f03903a9142032a89a5992d082050eba3c -:00c2006cf85073e2b7a79ec3605238c4bec131 -:00c210e20e87a7b0adfed506fa5551b6848ca1 -:00c2203beece166fdb4a43e46e536b7afde731 -:00c2302e907521790ef116036d8767e8735f02 -:00c240e3dce4b2d6bcc42b240e4e4d8f158ebc -:00c250df946c08cfd295642042aacf655a2ad1 -:00c260cc608be2a84a540d69bc80c8775a5e84 -:00c27017c9e645558dc93b69114193684eeb9d -:00c2803ca7ef756953a341e29c52b267b6e0e7 -:00c290fcfaf185d463029b775b3ddca78bdb4a -:00c2a010498d2c4daf24f0f92f9a338585fa4b -:00c2b03b60862bb2cccbf7f47972b55921042e -:00c2c0efdab37fe90149f34bd56563304872b5 -:00c2d032d9b69fe1d221a41f03a4ec3da233dc -:00c2e03ef9d38bcc59bab0224b100461a4b9d9 -:00c2f0b6359e6c6140eac5c0412b5082234625 -:00c3007cef67e12485e37b1b4f03c8f45faa85 -:00c310f1235a2b64ad11f7b53f7394b9c20161 -:00c320c6520ba4b751c0b9e81a5b97904930b2 -:00c3308b640c3164374f7f93d9b5875174df5b -:00c3409e9f99eb8e711afe61ebed4ec1fe5e9f -:00c3502f936649d71a63c3e221ec8043da48b7 -:00c36097dc0fbde69ce57256910f4a863e5185 -:00c3700bc898e8d8ebe0b1e29a569fdf423799 -:00c38081d0783a44bd190c5615073122f53189 -:00c3901cc7ffdea6ffa98ec01b9ad7f0d2c94d -:00c3a06da90ac9434c66d023bf36a14c6919fc -:00c3b00bf82344f3c507b2668610d260286192 -:00c3c0a3b8a8a1d5ed3f2c111263914f5463b6 -:00c3d0c3252ef6d4eaba17ecc41564c66c5a9c -:00c3e003512c89bbb0b56529e700de5a62f484 -:00c3f055f40ce7e7a0d0c395aa78f61c56c4bf -:00c40085c755eac12c9915486773477fa56cce -:00c410dbfacccef94d3244a26e6d15ebebaec4 -:00c4204425eabe97f449059fc4f58c32d36c03 -:00c430b02f4408268f0b82cf9ab3dafe98a999 -:00c44021e015257cb70fad7709e2b4002bf55c -:00c4502064907d3c71ce931309ec9d4af89ee9 -:00c46004400a9442bf8d9a125eea45ab1e9d3b -:00c4700d20c718adb16129044bc80316e83bf3 -:00c480504500fa9afa9868bcad7b5a58a29350 -:00c490a187666876eca7f7f73916418923c214 -:00c4a038f22b363fca51eae71befb4c168a37b -:00c4b0a795fe29408ee16a3a127dbbc61651b6 -:00c4c0b8e312e87a7f9755253eef0b05a45c64 -:00c4d058d878354729456b3d8ef9455e7ad7e4 -:00c4e0fcf34da9f17512ee9c1a694076573769 -:00c4f060d6e6a3ef57c375bc57843943acf2ee -:00c50093d42d7797db3c6e536fb2c867eaadb0 -:00c51050fce94b53b5202af0b7bf5d166e6cc9 -:00c520b4db410fb44234d95b25e1106bbbede7 -:00c5305b3d546bbc772e381b431922886e8842 -:00c540ee178e8cd982db2451f87dbd7c961ef1 -:00c55015e6ae3fcff654d8cbc789bcf49882c3 -:00c5600d41ab3b375c74ca1b89ebc8329f090d -:00c570fb0bb7be9ae1469d4a4f86c15d25ebff -:00c580731983caa70ccd30832343bd4c771947 -:00c5901e65560299db7e81f68fddcc64f50b1c -:00c5a0cba346a34e6e026171d733b298006b46 -:00c5b09a764977d13889cb49600b9e65f45aa7 -:00c5c083177119787bbea26db44bab1b8c4563 -:00c5d0348cecc74dddcbc3f6448454deb7d9c1 -:00c5e0e69b49f5422df049aa44597660f94fd7 -:00c5f062c8e09917984bebe2dc219cc3fc1159 -:00c600b9760c56c41e01304100eeb626c77914 -:00c61031d9d5c736854a4dcb9d7777b4694e1a -:00c620c9bb2ff9430593b737ce139332cf8a5c -:00c63092f702fe174758e1a545765cc57e7c0a -:00c640cc79559e4978e541e2654219064ac089 -:00c65066ff413f7b99d1955aab3b79c443c398 -:00c6604472a6e6279ce450e17053d9373003bd -:00c670bc170cc1995e4ad18a3f3dd09f543658 -:00c68044bd7bc1923a48cdf7be135f0261368e -:00c69090ad87f4fbd7801db5347945ff68db4b -:00c6a0cf3b4f4fefd5d80e4cf22b5c868e16e0 -:00c6b02796b14cdc6652bc93f0f02628e96fc4 -:00c6c0e6678f9099969e11e3990412e6fe3eee -:00c6d04551e9be3874f78b2ad97900cc1d10b4 -:00c6e0a216b4832f65d928c17e5577ca162d8e -:00c6f0ac32dc0c81149c85524ae42a5fb0709e -:00c7003b507434c781b1b740fffe2858ec0e67 -:00c710884e4ec072c1b9761f491d0f568e6030 -:00c72060c188b476dc4c65c71a50986299d26d -:00c7301f7c193f3846a192368f7229be8b6100 -:00c740c7d59f46019258f94e881db892c8e9e5 -:00c750e5517939a310d3ee95e1180e0f40f0c2 -:00c7602936c20b319fd0818d12f347a793449f -:00c770a7146b9a54169305f62e3bf2a7a40175 -:00c780365d6159cab58af88f9f3a218f5ac3d0 -:00c7902ee5438a6d7e9864a69fc49f7d967684 -:00c7a05f86d6d11adb44a037c15855f99a881a -:00c7b0c3641239fd39648cb11abc55e3a0b956 -:00c7c009d13c91fc670fc3329275d6424e42b3 -:00c7d0188c3cc46eced42262cdb2e8b27f2aa3 -:00c7e07b2237a1e686a092a2d6845a448e7fa5 -:00c7f0992fbd8be092a29ccca7454c1e439897 -:00c8002b0ccda339ca813a2b804160916c7e58 -:00c8108a230b994a8b30517aa4cccae439a0a5 -:00c820c137ccc1b472a2b1d5dc916e6a58bdc3 -:00c830d0075598052f88f5f7f6e180c4a8d6eb -:00c840b41f1430d82afed7bde5dd5f9b1d2f73 -:00c850d0280b7e9cc663e92c2eeca4df4566c4 -:00c860374d2c9ae06a6908b74580485f3dd397 -:00c870190ed524ff5ca3533cb4d49ff46bae5a -:00c880ef105f58590b9c3317bce7a524067dec -:00c890b354460aa3c1c90125250062e8ed77ec -:00c8a0715b315aa68c498d0adc7e3cf55c52fb -:00c8b05839fe2e3b538955a1b32eacd01b6c68 -:00c8c087480f76277f38671669f8cd8cc01c1c -:00c8d003e44bfb7f573e1d723abeba3614722d -:00c8e073d4b61e1022187e57d6f0227651255f -:00c8f0caf4036989d26cf2428fbaaccab76662 -:00c900e251c95832c0dcac3240ed2f8b18fb6c -:00c910d83a34f7ed15a105f0beca36358c2797 -:00c920cc059c50d5ff5d59f853dd3eff56f0cd -:00c9307156d9bd987566a8f4f7a0658572dc26 -:00c9404451f454c83d4c725406fe1754931d8b -:00c950d76e2bb8f6cefb1a8ec76b9dc541ebf6 -:00c96099c33dafb9de5e5c3daf3be2fbd5f4b0 -:00c970ff838da4c6a638aab7f002fca6ddf762 -:00c980d045a38e6f52c6837ca1ef66cd2e2273 -:00c990bee706e6621da36ba8e60e960d24a6c9 -:00c9a0ff1e14d2c86e1728c3aff50faf097b42 -:00c9b03af6af06b8ac571a6ff6d9371abf980d -:00c9c01119d8716b9ecf38ab98581ab14fbb94 -:00c9d0774ba9ddb5a04201bb4ea7c233b96c79 -:00c9e0ea5d8e2b172395a33a9f6a151c6881db -:00c9f0e5ed0c88e59147d191c39d4654c74f0a -:00ca0051264f2bf83ff68f1991927e1d7b4c93 -:00ca106bba6bf83d5ddad6b5a602f72001eaca -:00ca20ead22d5755d861dbfa05effbc5bfbd5e -:00ca30269ef94d2c7e0dbeda0497acdfa7c497 -:00ca400603b2da1f5b98735c25b15f1ca91d2d -:00ca503ea98d9434eb7ee264cdeb757d974a80 -:00ca601b9b304613fa37183d87d1897567dbc6 -:00ca70e6e3231c68e22a7bd7a1c96df1c657a3 -:00ca809d49ed68ef4bf95480bccfd3120ee5af -:00ca907557b0012d64247ef441af48c595af57 -:00caa08edd34569f19e4d218541dacc63c500c -:00cab02d1654cdcd86f4ebc4ab56a993c1fbd7 -:00cac033a4ff1886b6fb449c534c8a468db5d4 -:00cad093869b9e8504bd53bc335eed4c3e25d6 -:00cae05c7e58d6a812a21292bfc6d304f6dc2c -:00caf000c1ce6b8befd0932dc111528701f48a -:00cb00dc7dd6c34ba741694d9ac728c5928f2f -:00cb10ca56a03bf467194ea8e2a628c9978eab -:00cb2058cd33ff377e4617fa8a363dc4be13c9 -:00cb30b89da5411dd3de27c3eee4a6e226d324 -:00cb4082065d58062c3d370fcdfba13b4184df -:00cb5098a88c8c1b07c20f2bbdb59292142484 -:00cb60ca1bb3601e24431387d9e57a2de42b93 -:00cb70603ad90b79412a033123d7edbeb2cbd9 -:00cb80505f440e10f72026e4eea429e0fe7fdd -:00cb9076efb3bf96dc05957c761d4aac6eb0bc -:00cba0e2fa54428ddc1b88dee9ef7597857a15 -:00cbb0f8ffe2812756b2e5ebe7cde7c1fec015 -:00cbc05306feb2e2ab9a524e66fd49313b8e36 -:00cbd03901f2ef89d98f68876642c299ea442c -:00cbe0aca82564372a77ff9f14a548dcdc011d -:00cbf0f91f63462dbac318b33a6833c1469928 -:00cc00fb89a7e781d2f6d568c60755be326e54 -:00cc10a3e98facfb29d2d5423ae81b3cbed1ed -:00cc20bfa21be6ff5c0f88f94f75936fc41ace -:00cc307af4777f0711ee124a579a37a0fb68e1 -:00cc4005bb26204d13bf51e40f69148f53e888 -:00cc505b4886425dd19f30a5c69df9af307556 -:00cc601d1634de6731ec7f2f953039e1058caf -:00cc707c509ef86b1e5811f562bb548132082d -:00cc8075673a7664e3f6a360862cfdb0c6854f -:00cc900f2389b6986e103a5a2b54e236373bf8 -:00cca0257948acf6a725995196a369ab6f58a9 -:00ccb0e006991f96dd4fcb01b149c584abf033 -:00ccc0cde5c1651e8f0dbe411a72a7da589c78 -:00ccd0418b78e15f22fbbf08cae15f23a9874d -:00cce03322605eb0353ba6d1732137fdf4e87a -:00ccf018103d06f60e99c763fc455824c80e77 -:00cd0012b5fb3137c349820507e8082cdff54a -:00cd109012e56466084c42067ba6c9a382203c -:00cd20afca99ad6bc2a52aee4b5995e8fc11d6 -:00cd309ccd8c718b096a9c490b31cb3a6472ad -:00cd40c94e95b3070be5ae1bf9fceb923db052 -:00cd502731cdfa2026295d0d21269f367f6ba6 -:00cd6061485839d57744474d0cbeb3603da591 -:00cd70e2bfceb24a49c53dacfed87e602048a0 -:00cd80da062816c2ef455effdb1c525872b8bf -:00cd90525edd6ab8cc8de60af99957be16cb34 -:00cda0a11386f993256c905a9e2202769c2abb -:00cdb038d03dded179e765a2438c27353d4c8f -:00cdc0b23a5f847db5b7176821cbd97d72dc1a -:00cdd0bfab0ed820c4a9db65eb9700dc15e74c -:00cde0dc5fd97ce4008caff096c3f84800b4ae -:00cdf0c6545f9b6426364e324b6f1a3e17b112 -:00ce008a7e2e5c4f60d3fa331b0d5c9f54528d -:00ce10507dcaefb3817216c4ba7fd4e56ecd47 -:00ce2020ce3252b38027a2ab942494c3eec427 -:00ce302f174adf4bacf02588cb8ebea141c04d -:00ce40e768d76e4c5c330ee1cd5f4f656937ab -:00ce50181da4c5f8606adba878a90d18cae9e2 -:00ce60250e9409dd03cd291d8bab569bbba6be -:00ce7099cbe16cc374c03c41fbe0aa1771ffd9 -:00ce800c4c5f2bd235dcb246746cd9400908b0 -:00ce9035f20d2e56dd860c10e6726130a88db8 -:00cea01587f4927fa8d9af7037c2a905172610 -:00ceb0c2baf99b2bcf1a4c15a43c688e46ecdb -:00cec0f34bf1cf4ab5b39b9f3c1abd711aed4d -:00ced0a2cf683babed034a1111e8a2d3cf3cd8 -:00cee0a0d954baf90e7dad087d6a89aa4f4b5d -:00cef0dd44eaf61d6f22d1e414a70dd5e6ea0d -:00cf008a2eae77690cd19ca6b17322474f1c1a -:00cf105ec86c1b728f394c9d09c2f8190b22b3 -:00cf2023172b20044275ecae0c99ce00bc0682 -:00cf305556840b58920b687eaa5c224359913b -:00cf40411c965ba8b51d31ad3fb977cf76025c -:00cf50ea6230be37290c64fa1fc66012dce662 -:00cf6017a02a30290b1a9b8694a4a3ed9a6637 -:00cf70c6601f2b57e4e8cf445469eb7f8047b0 -:00cf80228683183c7f71504846bdd8d003b4ef -:00cf90a27cf96c6cf3e1c81dbf8a0d45e545fa -:00cfa017f35647b00c8190d145bb9e5ae7073d -:00cfb086fa68008d0be9d0c2221cdae615b4a3 -:00cfc0ae8582fce04ef6424300899a77dabf01 -:00cfd01f65ca13f27169dc34de8232f5b5b5a2 -:00cfe07617aeb4ae2a7b330db889ecf5a89aae -:00cff0cd32385b5632b2461a5c5d813d10b884 -:00d0007cfcfa01be346a199611babf71dfcedb -:00d01097a0cc4417e6fe1ec3da82b634eb4d07 -:00d020683da1bf87ccf64f72f329b020985249 -:00d030c2c6dbea3b1d59a454e3ed300a9e0198 -:00d040af999f7ebc7867f6e65ad7ee05648b42 -:00d050ff05da71c45ea231c5129aaa6ba4fa49 -:00d0606d17b6a50ddebd57195deed6481e8d15 -:00d070ed7b8634eef7c8746e620b2e4138c518 -:00d0805847efc5212cf69421efe2600ad66239 -:00d090c4e7af8caf1ae4636086858622a8041f -:00d0a0deb641e5be37e4a73e4ff12127996591 -:00d0b00f426a995a30d4fe16b03d04b9e0fc20 -:00d0c0bee792f65e5e03584be167c0c55f84ba -:00d0d08a0af9739c42489b7585da3e65a56d55 -:00d0e0a829a9ebc66afb256fd3a356b845111e -:00d0f0888d25d35e64f9e1539c80e71192cfa6 -:00d1009cb3e451e8848aed9ea38a6a0adadc5c -:00d11037e5a4486a25654b6cf3111b48c6f98d -:00d12035dfb5fb8f9e1e2c980b363a3124e62e -:00d13066ae431b6e15516dd56ca354ed4c4888 -:00d140d01c17a4338a51e162a290636dbfb672 -:00d1504f031e9386a3cf34cbb9390b1c15590a -:00d160a0604a98c1a4ff9ce03c2ef764418c8c -:00d170aa12ab6c3e3f773783616a2924c8ed7d -:00d1809c31fd29f3658bab2f00364779117216 -:00d190d2d57fa58b09a47594b7f431d6040284 -:00d1a0e031a757b2c5869ab77901dba2fcf0bc -:00d1b03a257aa88c0855440f731edd5ce9640a -:00d1c01a02915e826fc7c84cab7e4f30aa3306 -:00d1d08d12eb5b0b108ed6e9f32fc274c00edf -:00d1e09b23080c50d9240f402f624acb4215ee -:00d1f0fd221e7aca085f8232f62e0b8d974535 -:00d200da7abfa43eeb2fa813dd70fe977a6e14 -:00d2102caa84c513d50dcc4ea5e0c8af1177e6 -:00d220f8d5d82e636e1b33c757573450ac0708 -:00d230de09f8e6c5ed1295e4fb367f9e80f8b9 -:00d2408be14c63b1a3666350d1dfd1ce463c87 -:00d2503be647f118389a61fbc5bcd3c9d4e139 -:00d26034d0f226c801c5d912f1d18383abf459 -:00d270f5c9a5311bff6187f71766f04a229185 -:00d280d4bd09b47550772e7e32455e3e1e4f19 -:00d29052d84885d812b75d1f5a4900b8d4c517 -:00d2a05f34bb485cfdaa8e083b9b5410ea4654 -:00d2b0061162473cf29e2a482dddd97bb1bd3d -:00d2c0d33338c7b0d3c466766835fb8caab9f4 -:00d2d062cb01124be7aea2fba81045d4cebbc2 -:00d2e026d37791eb713333d6ca22cb2e31a4b0 -:00d2f065c9a3ecc7fdaababe6633157d8b9e3a -:00d300ffd2400da817fd1ba00bc797305a7583 -:00d310f9cf865a032c94bae21a809eff55703d -:00d3205702c83b0fb31fe8c29a6e2162ac08d9 -:00d3308c753a093780d2794faa77efbfbd8e3b -:00d340ffa2523eb644298610beadc8301b656a -:00d35064ae481721d72137ef3a1e387f23f467 -:00d360e188239ee0a2f19d2ee9daafae28f5b4 -:00d370cbf4ca2a645d4496d7d1072377c8d75d -:00d380b36696a571e20b2ffb525392a0c7c4bd -:00d390bc8873f9a306126da883e6b73e85ea2c -:00d3a0fb9ede3e93748f30ead7839b1a3fc5c0 -:00d3b0208e8413cbb7336692278a1a8321391a -:00d3c09db1ea0b70f986448af8c5b6602aae2c -:00d3d0056e4eade1d0b2bdfb2ba9822d48129a -:00d3e04bc1ceb139e17a1b64332a3a2fe87d83 -:00d3f0a19453f1a2e1f6e8ed3aeecaeb0cce46 -:00d4003c5f1a0fc2b603dcb68b90cd81b0a95d -:00d410087f506be1220e00e96ad570da523d34 -:00d4205e59f44e0c4ea61bb936b18532e1ad98 -:00d43066e8e4afe95f2ab8c2e3106afdaf2b26 -:00d440e66a5a9b867f9b06c35a238928327bf0 -:00d4506bed5931c4abe3815c8dbf59c818b3c7 -:00d4604b88af45bdeae1cf4a555fdb6605b4f9 -:00d470ea75ba49105bdec198bd94b8c8f8a889 -:00d48000a6af80aa1e46013861e4a07143012d -:00d49025e613fc16cd674842f768a2f53a44f1 -:00d4a03173c6faf65e091ca412f40ca4798c4c -:00d4b0d76306499b906d746961f10764bb4618 -:00d4c03bacf8e060857772526002d9e9cac68d -:00d4d0a9a7e9a17a4eb9b50fd24000010b501c -:00d4e0bdc7934478a83fde245f7d34ae2bd9a3 -:00d4f0f39c47f893e266092acfb62fb9c31f58 -:00d500e5190547d4ab0ce2b1ca2b0d66e7de1a -:00d510268f70733fff368a69ea87efb92057ec -:00d5202ed0bb8acc57ec8c1e956e540f789655 -:00d530b7ba24bac38af7f596a21fb289494b20 -:00d5405a23c6f6aa415fb4641fd4eb54267565 -:00d55054ae084cf32b5953713845df72334bfa -:00d560624cf0f1315e97b149c59289ec407033 -:00d5706adf771ba8694d35114c5ac38b9066b5 -:00d580a9c6ae1b13d878dffe0652d51bd55b7b -:00d590ac5ea52df88f801f94fac9f3dd7cfdf8 -:00d5a038566a11604f62847adb85dc51d20cdb -:00d5b0407c619ca262e82169ea91e40e45d551 -:00d5c07ae87f1f5f789f421a1d3c82e9119421 -:00d5d0b26da97848d0f5cf50278f2c9ea8b127 -:00d5e041cb1d05f9c4cda5b4a798bfae1f1c3b -:00d5f0ad4e28e36af96dbe8f5624db22d2bf83 -:00d60081886f4eb00ae9c5176c0c4e9bc11e74 -:00d6106b975685425f0d3d52b526ec321f82b5 -:00d6207082b9b9d1a6b445045cee2479baa328 -:00d63062cd2832d6af74dd41e6806224ff4d6d -:00d6407c7e626a7b232149e99fb29608e6e178 -:00d650378b5746d34913f0053ff6eab761da00 -:00d660bdbc9e579ce445419cdae69b7a9c2f9f -:00d67076635831358efcc4665850b13774daac -:00d680a76aa9b0ec0dd3b1832414b981437fcd -:00d6900f9c45a1a877b01664328659cc4b3dcc -:00d6a0169e4fa838df50961d58d490a642d1c8 -:00d6b00f00964f4c632682637c527a5ef12c30 -:00d6c0b1c694e5ea21accda7baf7ad7d3881e8 -:00d6d0745ca50d799f2f3b65459adf67479127 -:00d6e031e14f9ad868a3b0cc2066b162c4ae4c -:00d6f087141101f8d145c63717b46abe181117 -:00d700e7c42224056f4a14db8bbd790b39a123 -:00d710a734af63ba4fcd781376b88e3793e231 -:00d72002db373c47d89dd425642a52a9ed2f45 -:00d7307e98cfd7288d258f1e3ce365dc186e04 -:00d7401fe885de06a3d56e3abc9ed7445bbfb4 -:00d750be30f9b1aa4faadc2a7ae7852285c308 -:00d76031b6c3be394fca6f2b1a374165971ee7 -:00d7705409fc581bbb4368fd2aee42971d81e8 -:00d780485bf2808b6ba06c3e0de944b49864e3 -:00d7906f2f281b3b53af62fe0b782a8de652fb -:00d7a03fe1484f9aeaf2de29202f0ef135e7c6 -:00d7b09482e47f3bd9e88e8c2be99e90293e6b -:00d7c0e0a49ccfdd41e167dc22f1fc306ea3bd -:00d7d09ed6372565d45807b1599bd911b2449e -:00d7e044209e2742f50e971a1eb7e6f84653bb -:00d7f0c890ef1f9a10496c4dfe940bced51e8a -:00d8005e38b726ad971d7e2637c75ff3e636ce -:00d810d067836211eae7da1d562f95442c03fc -:00d820f50eb69174775dc3c2a802175ce9870c -:00d830506735b7a0078c0658927cdc5c001a36 -:00d840801b9e086188ae98fbd830c699be683f -:00d850622c439ea6f763b18eab4068f9ec1193 -:00d860aa65697311f5c20a70b9f36d043decd3 -:00d8705940e2e610e3f6b22e0527058d512085 -:00d8804f85cdd57396b65a26414c1ea018a302 -:00d8902ffde05fe17fe0090e38da88801d31e6 -:00d8a07661a2b1f9bc63afd087aa89b613ada0 -:00d8b024119236095a37ad71c9d9ecff24c2a3 -:00d8c0eaa3d9f70dede9541ef4b52db25c2d54 -:00d8d03bb258bbc7e071f89f055266fad51393 -:00d8e076420f03f565bc5749a0d00393a1ef96 -:00d8f0fbb691b0fc8918b3645126637295d970 -:00d900f951ddb362bb35c0cfd5da263a48aa7a -:00d910e2f0d2c176e12edd9e4543679ba4ccc5 -:00d920bccbfaaf13ce89b9ffbe03f787fce1c2 -:00d930dd9f7c64998d9c401546fba11374e325 -:00d940a30b32752d7c6b47c84f682ae2f3445c -:00d9506c474b73169fa704cfa96afdcd94ad4d -:00d96057c8218363978cb98c1abd74f1555934 -:00d970a8f7309c70eae48e9f30cd6884176035 -:00d980ed680853946c38d774f60439b4a848d7 -:00d990e5a4bfaa45655e4f5f9656a2143ef2f4 -:00d9a0cf395c01291a9d7b717ae014c4b0012d -:00d9b0058a9cb582bcbdf8b40ab428dbde85fb -:00d9c0d0fe5615242bb8f3cea12f0a0cfe5437 -:00d9d0ebe75bf50451454cb8f827c36258c473 -:00d9e017cfd8ad7fa578b2b8f9626b215c0e58 -:00d9f0dd664e3c77a5e6f7927a6ca902c07191 -:00da001de118c066d277b9b85a3d774312b6ec -:00da10c6e7c4d0a5f0b7944660048fbbf0079c -:00da2001db0ac775bf9012734411a13e444ef3 -:00da307f14251df9622bdea585205f61a07fcf -:00da400f81815fbfc9913924d3481ef662a8c0 -:00da50444aae01a03d4e55fe4b79d0d81d7362 -:00da60a0b5dff59acdc2b5adc4854e4e172e5a -:00da7006da96e50855d92dc62382742c2da445 -:00da80cfd394237210ccb61e7860a146187784 -:00da901be95d88159c9a19c15aa456533c527f -:00daa0bdadbcef5f25fb18a9de790b6f5c5dc3 -:00dab0230c161927dc3394b3693dfcfc91925b -:00dac07acac853d51f8a7454a23a3ae279f406 -:00dad0c06799a523da787017565aaf9ea8aff1 -:00dae06cf7a849255f24ff6b47877bc1481e5d -:00daf0d6b845d603911309ad02aa7ad459da06 -:00db0053ecd4fdebbde1ed6029ee215a7271cc -:00db10ba226faefcc80c69ddd5aed368488e90 -:00db20ab8163fef58d47baf69e429ab76ad5c4 -:00db3040103d0899e842c01247147f5b6783dc -:00db408f377fb7eeff002b86c8c52b4bfe606e -:00db5097d9d37e12fc68bf65059ac9ca3c4166 -:00db609e1ea95333ed5448e4be5919b645ff6c -:00db70271ee3cbbf6b5afffa9298e8d6060682 -:00db806a3811c52c4ba28d7e88079668974e9b -:00db902306424e07dd2e66c4cdc335924a2cc2 -:00dba0e97fb9ed3e5ffbf4b836d207eb90f89a -:00dbb04fe14a8663cda6458f22ed444a151f2d -:00dbc047fcbc0a0099508ae86f7363998359a7 -:00dbd062e70a53b94a4f70535c116ecbd0d207 -:00dbe003486adbc319b7f58a589e6072705a30 -:00dbf0a718fda8eba0d6b4f8c5c274a6ec0993 -:00dc00d505a31be297ab5570f825b8bff3f53d -:00dc10578ce522906776580ee04ec29a9f39a4 -:00dc206552b339140dc7dd1226acc0edf616ed -:00dc30199562e4d5acff821adad731aee91360 -:00dc4007adeb4bf244c48e807b79be59b1c072 -:00dc50412c65027b16169e5b8af86921c547ff -:00dc60a2c2e14295e2431d9e97e14d26f228b7 -:00dc70f80f17dc4a01b1f1fa49e59f6b70d12e -:00dc801bba5e461aa1e4ff60db9620846e78ff -:00dc90cad7cae3073c184c82ccdf956e8ba366 -:00dca0502f691b1541fdcd240a2c72841c51e3 -:00dcb02781558344b796f6a24418cc68f2027c -:00dcc0b1c5778b3c686e6161fe79f807261489 -:00dcd02619b4f5f5cc42b0a1970c0745566bca -:00dce07531d8233348c192ba75251b5ddb5ecd -:00dcf06d326281dd577e6c0acd871e33cbe56d -:00dd004be15f0f2c3c563a18878436b54cd3f3 -:00dd10784648193a81cec55c8b9b439f03e7e2 -:00dd20f49927a92e6353bf57a071b367c7e9e9 -:00dd30a84950c2214e666fee8ec9279a24fa19 -:00dd40272d51a1d77ed4dab93dcb114b70641b -:00dd5040c93cc7a7a670f01c4b8e660b759247 -:00dd60996a9f13a6d3eff6a8ac0b9068421178 -:00dd70ab34727cba8a5d3ede94a4ee9b4d6412 -:00dd807fe57cdca89740a85d0446cf1ee6364c -:00dd90072289a2823ed06a7f198b1dc6d23042 -:00dda0d3d62abafe7ad82492c4fff801cb077b -:00ddb09c3ddc7744188534daeada283f62a06d -:00ddc03fdd84089d55c6ba312041d2c561ddc2 -:00ddd0376bef256edae0f66ff0485658058952 -:00dde0f178516e0afc375b950b415f45368694 -:00ddf0355401bc014a82886e85dcd2508ccf09 -:00de009869426d384ce2caf84d52b77fb79f5b -:00de107ffd7ba8ab259986641c54b3a98315d9 -:00de2016100e97bd81bcdac4a6b84f9daece54 -:00de30cf873ebf549f36f480e7e17f0a66f7bb -:00de40b6adcfd01a536365f61ccb276100ba36 -:00de50e32bc2a8851b2fd21113a4b45ffda908 -:00de603e27b84ce582a56a0f896ff5cba6e86e -:00de70593ca2a67d1e38edac22e80613662d45 -:00de8020bc34da5a17bf175e1729d1382100f0 -:00de908e816b0267043d7cbd3bdaa46d0c4be5 -:00dea01452763759d72af91c556ee4ce22830f -:00deb03d160856f08d5a9502054dd6480e8624 -:00dec0bcc5b8576a00fecd5dcdc95a88a82fdd -:00ded0771d8483cadcd23368eba59425bda45e -:00dee0bf0dc3fb3c825ef241d043292bb9dfef -:00def0353d85743698cb5375b8c7c8e2baa2bb -:00df00a9a512ea433a02249eb3a467c7d40d1d -:00df107728ea658419f27dc396486fe4f58b66 -:00df200bb45b8a6a888e9e97e2b106d6704146 -:00df302665205445f7625c6d475e244f44e7a1 -:00df406c43f8a327488488577d499145f22d57 -:00df5023cfd2fbf1223f7ee8d04c3f0c507896 -:00df604ee75a2b4f2028e18cd399dd1046fafa -:00df7083d5165b150a4a89c7ca8aaeeeb136b2 -:00df80e304d7dc3f6da020708524a00b86ce29 -:00df90562da6e9aa28e1742bf22ae3315b907d -:00dfa00436ee38dce368dcb42124401a3f708a -:00dfb02c32328aa61437177e60d9232bfa8215 -:00dfc0c9f92d36b08273baa874e4aa73aabbac -:00dfd07def32cb0e128528a1a93d73e30f1a54 -:00dfe0de650f627335aa37640368abe669d5cd -:00dff0bf179fe5c6fe7a90cb7ae4f08c4bffcd -:00e000ce4cda32a92430c7245319aedb60dd4c -:00e01044d2843d0e1ba85101ea07cf48d94681 -:00e02014b577d2642158f98d007d06513a0667 -:00e030e65360b4b9fff89405afb3a844563b24 -:00e0402bd05e2a9fe1da48c5937e9eee833d78 -:00e050f70a34ca8ee25dc79fead6a25f6a4818 -:00e06025254d0039df5e7ed53464bbf496f22b -:00e070a7512af9126dacce4143a45246f65831 -:00e080927f8d62116da0e2046a97e8da5af7e5 -:00e09091043cc308a2a6437d1c7753cf5fda82 -:00e0a0cdf1d69fdc7986b0cbc14cc265c649a7 -:00e0b0e56f2fe3bdee2efa6a99a632ddd59de7 -:00e0c0e73ead61ecc014d5b451b63fc3b4e687 -:00e0d0ebefae353a7176a5b13c005f85e06d63 -:00e0e05c331d60b6a326c17cd3c34879c515b0 -:00e0f04a597733a510c09675d00f2dbde2c7ea -:00e100e3759c17bc2878a54b641285e37d9399 -:00e110a8d3c4f103ae0df318b35840d83eaaea -:00e120d67d237837967f6609c0044d384f2fb6 -:00e130642ca14e7b6fcd97bdaa6d513841061b -:00e140ac15a4f1b69c378f048e6ee3dc257020 -:00e150dbd5141302b38e1b2d96709b1834d0ae -:00e160927b6115e5ade3042924f0b86fdd55a7 -:00e170f5667db54b9faced10e014a5e81de380 -:00e180ba2a41a2c5452a6e0c7eaf15f849f807 -:00e190036872e8833915d4da1892017a4b943f -:00e1a0596b7d6a891bc4af61ce7a60988c2484 -:00e1b01019a787217b52b488c5184c2c2734be -:00e1c0dccc41fbee3e45303168b02c09ba18bd -:00e1d0cdc932a5e68628143e17859e202e7b93 -:00e1e04918f2ede62feb4537223766a01d6837 -:00e1f013e848130c5bc149cb846cb5a46476ea -:00e2000733e8b28470b246bbaf2d7eef9b2450 -:00e210fcf1bb565dff4e1ae96aabf204e8d8d3 -:00e2202b3cda015c7235581e6d446aa003c22c -:00e230227154bbb944b105e85d1008880d8216 -:00e240c2a7cbc5d0b5db4f13849370c226b31b -:00e250585455d7c5a2da6e41759b20ea2296c6 -:00e260c58fa286dfe82050100e2b550fd1969b -:00e270e3f366fab3a54cb3702d349554a21e6b -:00e28043ce522cd35de06be927d026bcfba455 -:00e2907a12a74092d577e0919a9113e2bdd55a -:00e2a071102a80a64e89aef14b4254edf567c9 -:00e2b03ba2f341e908771b293ff4c6ab4e2f3e -:00e2c0babb1f71844cd921f4ce3abc7398a889 -:00e2d0e78c5d9b6ffa866634abf866d980ccc1 -:00e2e0d7fbbf0e93d215a0e0ace6b1c80729f5 -:00e2f05ffca14a851111452c56add5dcc3ce21 -:00e300d208c8c672a48b170cd1a32565679419 -:00e3100f192f1d156bbc738120fc2765317871 -:00e3207a4a00098c1990a79c8ab96c1e361378 -:00e330d7e5f00267ac6023f9fdcec26da5862a -:00e340084fcdd9a934647e4f6bb25af23d2a97 -:00e350ddfb7d33a5a2a1c852d04df0cfedfb46 -:00e3608c265129cef4383d7f7d9605304fec29 -:00e37075ade26888d981c7848b9450d87c40f6 -:00e380a4ed0fde8d2a8a3cb66ff40eb473d938 -:00e390ca563c1e5a0595a0f986a6de2a54d32b -:00e3a040fb44910e4a47683c41dd50a16edeff -:00e3b0e4b2a8a8be6d797bb33ff558f7c1509d -:00e3c02fbefb9ce550c13b0613cfd533452bac -:00e3d07dcdacae362e4110c2ed0facff72ca11 -:00e3e0ebea7e619cf4ad1a6ef2b6d790682ce4 -:00e3f03b346ce31a81f5336c09672af4c491d2 -:00e400d22841acb634e88cf663356388816c94 -:00e4101e4ef4bbd3d3cc74fa7e426a4768baa2 -:00e420f0fb69243a76af873f7363834d8dbf21 -:00e4307c844000e0c41259324b4178ea702994 -:00e440f44450c1c5b77984200d3ba4e49c1f03 -:00e450b4d6bd6f489383dc8c60886abd4d7e95 -:00e460ff7eb47b6d7716e64927a85366eb6ad4 -:00e470cb369b56c3e499ef41374112ba68e1b8 -:00e480bb21440ea581dffd7587c75d9a5e1b8a -:00e4902f9d50935a2ac92a94ddd68fe0be846d -:00e4a05495c28ebcb0745ec1417f8c267e69a4 -:00e4b0fefe23e903502d596ba738e6b18c65db -:00e4c03ca8d9bf32d7f2c2dff9405aef2e2148 -:00e4d0b6b2251a880a53a037a3cac770ab1368 -:00e4e0f291df97255f3e087e0789dc8f782bbe -:00e4f036e0e36b1e83c7a486a424a2dd447770 -:00e500cb612f982b31b47c15949f8e1f42df74 -:00e5106caa0bc0b777feececec8d77ae4df994 -:00e520e8f413704a860776b4ec24a1c2408666 -:00e5301e05b6b7035479b42c0f4524eeb92c47 -:00e540f323b73a8d109f52391b7651311e9c90 -:00e550766047bf76c348bcb8f88249646441b3 -:00e5609f14f371cd512ac4b1c1631c11df9d85 -:00e57002b45a5c210193bcfc35ec307842f4c1 -:00e580fd8fcbd31da7e2776f922f0c657a646f -:00e590d03cca269ba015aaf2f71bacea091f66 -:00e5a01e4042682a1a9b05a5f170f4df5ba247 -:00e5b038fd1a221e7daa230a5bdb0eccdb4149 -:00e5c0833940fc81c3f567d4d5763bd3b04bd8 -:00e5d078691c8334ad2dcf825b2efb0472168f -:00e5e00c63ad878e4c44b7807d82815765027e -:00e5f0ba544a13c62528ec7ec214307592dc65 -:00e600e54cbeb53bc817456aea0bc4ec197828 -:00e610981d8f526ab0b5cc7a065e038029bb0f -:00e6205c333209c765274e9eb9c088cc2211a3 -:00e6301d014120c28420c0bd597030337f4c15 -:00e640cc2340b3b9743bf02a10369da13f7539 -:00e65090854d9ff6a2520b58a7c9b0d63cdd44 -:00e660dd630508831c7f1a9e0608ffcd341a16 -:00e67012228cb273ee4e107e2d89de04517866 -:00e680f5395797b7f85c67656ad2b6cb9f8abc -:00e6906298cdf6aca418553980af2050add8b3 -:00e6a03c076f5baf936b8543680358906bd1d2 -:00e6b0c44529768086100272db66ed02a746ee -:00e6c0b1f0f3e5cfe48378cd1d6f8e3d1de704 -:00e6d0e2043a3f82e6545d129455b5c792e2d1 -:00e6e0fccb5cd9bbbf69596086b890de69c8cd -:00e6f0c33ff8d4bd10dbd380eee096ebb6c8b1 -:00e7003278a2275c715b75747820ebcbf92ac6 -:00e71015bd9508b07667723b0ef5e668296ee0 -:00e72057070bab5d925703a314b2760f315cff -:00e7305be6153d1d2c76717a42905c9f9ce437 -:00e7404cd60ea18c94fa6458a0d523f1b6760b -:00e750f9b54382f3e63288425e6b910ed39359 -:00e7603b464635c6e5e12a548e796647fec6af -:00e77061c75b632374307e4c65d015b190c265 -:00e780baacfda17e85b47bbcff4c132b6eeacd -:00e79000bf5a6c0f0bc76ed0f3cab4aee72e1b -:00e7a0883c58c5243f2d1bc6d9812aabd652c6 -:00e7b0e61e83cdd5bbf48a24873002f15ce2db -:00e7c0480ecd3f62e00a78a759307432a43106 -:00e7d0fe230540b55bb39c0344331a4efc80ea -:00e7e0022fe95a3486e93ee8eb37c3e84ebc80 -:00e7f04d16e9a27457b2942dfb15b4b8c5e219 -:00e800a1d162dee4ee4faedd8719768a858045 -:00e810b2ab96939be932687446550b3d59dcf0 -:00e82009382042a7e820eca162ac5f2dc4be3f -:00e83057af17286addf74fa0c61a6e2a118c0d -:00e840b8836b8493e4e6bcb1102fc3412d2a04 -:00e8501bce10e1c3ba451b9ec3591828177da9 -:00e8606fbdd39b23599f9fca81a60a7ea8f7f0 -:00e870377665e866a12e6daed8dd6661d1e00c -:00e880f6a66d2f624c36a2b1f201d0d75270f6 -:00e8909fb30569bb8202eaf7d4694fa574fdf1 -:00e8a05c44616dc2f8e2b6001a2dde027cef52 -:00e8b0ab1f055ed15a4e302651fa2ae4b938b9 -:00e8c07c39505ef9ec9406148dab341c226dbd -:00e8d0ab828468a04723e360e74550846ddd6e -:00e8e0f8fde6cbe3b894d62574f889837eb040 -:00e8f0b0467868f2ee9dc81ceb1ba284893794 -:00e9001b9ec79f178b173d0cb2345d258f67bb -:00e91031269334aedc919c0d0ad9e59587e0f9 -:00e92012768428b5beb6a1131dae832e691092 -:00e930ce958773ae041d0eb37b505fcc04a68a -:00e9409cb7f1df10075a54fdded7000250cc0d -:00e95020f0d41555f39faa427fbeb0828d70ed -:00e9607228e83644f86b2f9be54687b1d99e26 -:00e970835035097797af7879e44d3527c46349 -:00e980b883b36c453a9dbc5cea2bd634d33cc9 -:00e990b8d8f45773bc5a54799647c52916f11d -:00e9a03eb902d7250794ed5fabe795ddab95f9 -:00e9b072756e36ec1cd070ae47df6b8ff6e06a -:00e9c0035ce37518624218e782f293b206e9fa -:00e9d00090fe9a2139fcdf8189efc2b1f0cdbb -:00e9e088338ccc43a21c301398b493f103ab38 -:00e9f07e7bdf78ee35e4a02b1e372bcf07458f -:00ea001aa37f1464236ccfee9858d1cf093f1a -:00ea105d6adddb9124b6d6a9b06ffa14809cc8 -:00ea20f30190c3fd3f93048c47af9aea3f738d -:00ea30b068bffd88bfb159e95b2909075d0aa4 -:00ea40d51fca36edd01bf74b975d0dcf1ea662 -:00ea5085077c4ad6cc131511c62f6533483ff7 -:00ea60fde49b89e49d0fd8c32625a83c13d169 -:00ea702dd5bca12e29aa917d0c1b78f195ffaf -:00ea80c55030fb2b17c81a292aa8b9c7b49578 -:00ea90d9151dc99755fa84e3b2282b5c9f4b38 -:00eaa0c5c6b255b11f6f03615948184ac753c8 -:00eab0403e7ef05546d8ecd14f925be3435189 -:00eac0989739000b2e89601404d35e552fa9a3 -:00ead01ba87a85d806785bc690446013bc5267 -:00eae0e24e08149af7ddd3bba1218525b8edf2 -:00eaf070201d0af0265a0fc9a6dca2d583471d -:00eb0009f7cd904ab854191a58a4b1c28ce207 -:00eb10694660a6f635120220c10779cf3e5360 -:00eb2098944de77ec901f30d35343f2f50e145 -:00eb302c8edaa16d05f6880521257d1d1ba57a -:00eb40a5db51e755c420dfd8ce8226ebef13e0 -:00eb5048519382f30fca575543c02e3d1f1c40 -:00eb6007ac8413ff27e36eb3cf631152009804 -:00eb70ca13723f0ec4f28d1b99dd7322d19017 -:00eb80aec62bf1e713c5641289034fc12f7780 -:00eb90ea5ea4ca6e9d9b95757793a4510d0d34 -:00eba02d7e9d6dd878fce8e6707137a7cb821a -:00ebb0b39ec2b7f3d62c2c87fd3d154a871fb7 -:00ebc059bad004772c0813cec47bd94d6a68a7 -:00ebd0e7db1714f5f43f902c8258c865b02c66 -:00ebe0e42b81cc46f5ac09fcc97e282baf5ec7 -:00ebf053056ee77fc2dddc822756d96c8efb48 -:00ec00e130eb73ed638c3756001efe28bc1ca0 -:00ec10cfee8019df8048988ea021c052e6214c -:00ec209aeaba8aca5f68b6acfd97153cd35ebc -:00ec30d903146ddcf1bed6c8e35df27ddfe8d8 -:00ec4043fc7a004f3c91ccd06cd9ad7052f0f0 -:00ec50b9982e4a1862023a5eaf459464fc446a -:00ec603a2ee7a1f0516ed3404311aba106d4c5 -:00ec70c2a8ae6cf75471fda067c055f834932a -:00ec804987f31296b33fa3064eaba84f1f487a -:00ec9032beea2c237462913e4c7c0592828353 -:00eca019cc6889acbd2b2d1bf7310efe211bf4 -:00ecb03fc88c7893e41026b301c1c1f1a1e662 -:00ecc00a5119b39e991f60c18c8a43a8cfdc6f -:00ecd0b334ca08ae9418be2858c08c09a4f5e1 -:00ece024b4023cfdcd9775f2d7e325ac5f72ee -:00ecf0673456f9e877951f5b7a13e7adfb89c3 -:00ed00ef45ba011cc06f9f1900dbe7ea069e73 -:00ed1097c9710eb5f9052f5fe8777c5488a62a -:00ed20c8eba59a6a0ba065386ed1311ed3bfcd -:00ed30d83fc6f1ab530d212cc6614463b931cb -:00ed401d98e1bdb1fdb5e6fd07958d75988d53 -:00ed5035a144f910d3e12e3cbfe701dbfdcb19 -:00ed60b03977407991045583873c1c9e0bab89 -:00ed70cc88856371f191b92f04e5988e3e1e5a -:00ed80d202a0bcde6fb939ec5f96cf17e1f63b -:00ed908c91e407cc83d01532ad0a8630640367 -:00eda008b606b621831f7b11024ddc2771abca -:00edb05d3462b592d753ba1d1c4a2efa1caf8b -:00edc0cb13e77fb2097faf5a43b03550dbf635 -:00edd0606ddc9b04f99c12d5fa1e67fa6d8b18 -:00ede0b24d6cb79e914205be297896c54f70b9 -:00edf057fe5ffd54f9946e8c68ec38f9082606 -:00ee0086b8875e5b9fdfd4c201dc8542ad9e58 -:00ee106079bf49192f85d84f1010371cd2484d -:00ee2009a7f4310a1f7d08ef6bec3128b9fa2b -:00ee30a31049e7e95291d956e82ddf16196609 -:00ee4065641d508628f2d64a789d243be4b06d -:00ee50e1ca3176eaac7a01fbe08386e8a16e69 -:00ee60b25d0d2950ab56cf6eaf957374e402aa -:00ee7013153c7b3a73d1c182a2c874b99f3360 -:00ee802e3a6c986c0aedcd0356530ae108bad5 -:00ee9047423268d7221b5604651e3af6a3e327 -:00eea012de074a27cdd48f6df2c6a04ceac8e4 -:00eeb0e1f044a94da34fbc916db144e68ec6e4 -:00eec0e68f74dc93d8fd13a6631ee9f8cb8317 -:00eed0203c35fd3011c1eb830f64245e7f72af -:00eee04d75fcfa6656c591c93c91463bb8f7de -:00eef04fb06c35d3437226422951856745251a -:00ef00358be2857645e246495e2cf0aad26c98 -:00ef108055ba6a198c986949cac3cfa5c98e0d -:00ef202a9cebfd361e5ae9bc9086c8dc067e17 -:00ef30c338a948b5877e65de53c09bf7a54dec -:00ef40e67194344c0985f56c7b28ce70fb521d -:00ef50b6bf696ae8ba1ebf9ca3b9c55a6769a5 -:00ef603c6c0862ab552634414e39513ab99683 -:00ef7000ff7795aa26bf7f68849d8f8cd46fa5 -:00ef808149cdc706f55448c89db6520d8a7a69 -:00ef9072405abb4616a5ddd850a665b5954cc7 -:00efa0daf53bb2b19ef0a14a8deb6d21dd4f8a -:00efb03b0dfaa489b270ef49d6fbc76877f734 -:00efc08a56cada4950bb9d3791e19a614781a6 -:00efd0eea559f5d98b738ce51ef75189f050fb -:00efe093932b7fc6a350c5881ffe2fb93c091d -:00eff0371fd1edf5f853633b3881a26b464764 -:00f000352e10587018e354070f6b676d618bfc -:00f010c20d20cad9a2d9199b149f5d0f5c7a6e -:00f0208ae4e3d8f1d0693efbfa94dfb2fd67b2 -:00f030a347a1e5d2203ad0f4a4643bd9e566db -:00f0408ece74ba2dc40ce03aa50cceb35a7463 -:00f05094b1d4dfccb5b659c8d3221e2998b901 -:00f060816c0900a8a001a4f7a2b9a45084e1e7 -:00f0701b79a6d347869a4a2c81aca6b344f667 -:00f08042ab4a542a8e777bd76d333db2a84406 -:00f090b8f35bbe88d81801d01e177bd694ee00 -:00f0a02729decb0468d212b6c90df8fd4ad03c -:00f0b0c7143b420c8c3c494539266332f9722c -:00f0c06faa7c39a73523027e3f6b316bf7010c -:00f0d076626fd96a560535d2213c3f3f3d9207 -:00f0e0240a1951761479a42905d665bd8a7d46 -:00f0f00dc64cb950581c9eeca7421e30ecbf7c -:00f10076f556dd20599ec790d5efa95f2b9b11 -:00f1108ecb7ee466ed1c5f9fbcbc4b96e56863 -:00f1208344e0bc3b309878740bdcd433ce96db -:00f13092e755192b3a3d65cf133519d1437002 -:00f140666e50c4dadf3964532efcf7564205f8 -:00f150fb3d9272c52ee9d58bd5292dedf76bf4 -:00f1602e32d9c98e81def55528de18f91f22dd -:00f1701fb35fe808c90620de690d7b2297f911 -:00f180856808d6acd103810cc3d83145756cbc -:00f1903d4ed662cd324f9cd026b9fc08dbec45 -:00f1a006592e5672de3999f91f2b1f7fae84d7 -:00f1b035904e1d781039df458b3236876c65fc -:00f1c056b1c88b847c2a829dffe1ae5fe0b79a -:00f1d015d92df18255078876666fc0b78e7a48 -:00f1e093d836d3542caa05de69286bab8651d6 -:00f1f07d3663dbb70fa71bc140d367bc4813a2 -:00f20008a73fd8be944ef977f8aec307a6b65e -:00f21080b9fa414451c4f93eaec0e050412bac -:00f2208ebd869b0cf66cd245d834529eb764d4 -:00f230cf03acf80ae3ac0b4c3a39c198fda380 -:00f240fce62bc10e3c1fc9d1d78abd506914f5 -:00f2502e88b3f0bd078565016214b04f88fa0d -:00f260fb44ad16b98da6b02ff5450225342593 -:00f2704b3926e33e63b71bc050919559b3fa0e -:00f2806efd7ef00ad01c63a894cb12f75a6e2f -:00f290bf53451b83dd4509321205aa873a352d -:00f2a04371b9bde10eb4a33b182c618f25070e -:00f2b0708851b2aae714549d0743b4a92f76cc -:00f2c0fd0908676cb1bee21fbf41a4e9f1c4c1 -:00f2d0195934eaf9b7174678314ac80fd4ba80 -:00f2e0af3938654131059ac76a187e18b7c475 -:00f2f0ed1205401f3fdaad6ad0db133f175b4f -:00f3000776726c66d5f3050996f6c0415fef2d -:00f310358d3ce62db1dba809da79b6d59e5728 -:00f3206ff37c1f791b306f709c6d454745dda5 -:00f33020857137f82cf6f9364750a6620648d8 -:00f340e1cff2032c207709c959ec9a8045b664 -:00f350e065a9a42b384cf8888cd3bc10552c9d -:00f360ea4d5678bdbda7b6a170dcbbe2270d84 -:00f3701cc47109793faab442d4778e9a3d800f -:00f380d1abd44e74b548fd698e482115127cfb -:00f39004843786d089f68eb439589828826576 -:00f3a0675255c8d7d6b1bf8276752705c6952b -:00f3b043351775ebbbd48cbf28228f901bee76 -:00f3c0e7fc4bd6458ce41960606843c7f2e7bb -:00f3d0ef4da60f2ddae116c49d227db0b9b9a2 -:00f3e098ea09519f7685ed752bba6205e6ae33 -:00f3f03e422f7b6c59b9caef171f4e380b32e7 -:00f400732cc38fd34413095902dc59875746d1 -:00f4104cb43cf0fd130355133018cdaeebf6f1 -:00f420a55e5f75b4e48bbf2c6cc34e12b14038 -:00f430082b6957eac64e985be1e0aa45b99375 -:00f44006bbc48977dff2424e3894aa37485db2 -:00f4507b0f59739e61232824568796b75bc007 -:00f460dbcf1e322a95222388cf0f9683d1e241 -:00f4704832857ade6c2ff48f95bde7b9983663 -:00f480be8c7b2ee60211fa61c3f3a0acf1f109 -:00f49000d0cc181482fd8d8db830f2954bda2e -:00f4a0a015a7d28c2ad879dbd94521f29b72ab -:00f4b0e6a2260b7c922a6235d8181967178dec -:00f4c0da485e7218a0936e2a0111cf0bec8743 -:00f4d0fcebf8678a8f5dfa75efa140962c891a -:00f4e0c3b917d4589e236305cbf411566d516a -:00f4f0eedb2fee97871d32bf8738ade465e62a -:00f500168bb733aec7155aba1bf3b156808a0a -:00f5101bd973265256538ce1b58c2ef7592ad6 -:00f5203e69554545aa1722d2f1d84c6bf160a6 -:00f530a3f1d6723e3f80da1bd8530dfc7cdd20 -:00f540a13185f6edbd1f872a8c4abb8936736e -:00f550d0c843ecb446ec381745a2f6cc7caf0c -:00f560ede80d41776d827c17cf59beca3ea07d -:00f570dc9b2eaceca0da0a411f5e439f0635a4 -:00f580dca9247999875311d9f1582627185d61 -:00f590ea85a652db230859cacb52269d940841 -:00f5a02c9b6d1fdda6107861250f5612ca0bae -:00f5b08e78ae4cdb7fbdf263eae951b25335ac -:00f5c0768991db0c0760a90a134f3295c3eea3 -:00f5d01e5d1c0e5c403838c733eb41365295b3 -:00f5e05d139d491e0a5e58b8f8b06d7ef24e82 -:00f5f021964fe4607a60fa5164c56727cae848 -:00f6009ebd694b182f29f338381cde18617f95 -:00f610dd1e0ecb17bb3f8179290bb0ee4a0892 -:00f620894721850e52870ae0b7d77ed110d0bf -:00f630be70a68235d619b186110b22e04cb64e -:00f6403990784c8ea664615bd30fb41fce6972 -:00f6501efbf08d06ec4fc70d237c5e8c8e588f -:00f66017159c8b646e863ef521e5f76a3d82d5 -:00f67074b7b5812ba7f6d1c8db43f5f456e75a -:00f680d2726df27c0bc801d041d42ffcbfb857 -:00f6904404e44627a244d64610749c09772c7c -:00f6a081b2997148a55bd63ee3456027b0252f -:00f6b027c4710c0c52fd4661029dfb3d93d2bc -:00f6c061cdee467948f8f10a5f127a77d9dec1 -:00f6d00eb075dade46a08cd09a0fd0dbbd9ea7 -:00f6e0b8e74c887cab42d46a7c62f6b40bca12 -:00f6f07605ab41899971a4afec9bf69ddd05a3 -:00f7004691c21c106efc14425ae37c01b63dca -:00f710dc0d06822a49e1181031c61f73f8afc1 -:00f720958d1c737b553e69af8fa0f29610b18c -:00f730c53079505a45dcbac708b8798ddd9845 -:00f7406ca46e41e55bb3c1731e2df1d7d8ee11 -:00f7509ed9975296b45601365af8cff0c5ae06 -:00f7603575e578fd4305da6bb7fc02b3f24b49 -:00f770d65510103950f9e74c38ff70833d096a -:00f7801bfcede86c221c7ccf515d3c5e22264f -:00f79065cef809591be70ee43d11bb409fcb37 -:00f7a07eb7f15f0bd6414e35be0521c2749e92 -:00f7b076c6cb7cdf756fbc874ddd49462f816e -:00f7c047f35bc69fc0b16980ca51907c0eaa2f -:00f7d03f492fe163632ce1a35b8fa7d2e31e72 -:00f7e0f8882c0213cf7fc552c8d0fbd14d6ade -:00f7f034e33b3e46ca5fc84bd2d018a09a7f9a -:00f8005b76497f886cf7f57f268b5bac3304e3 -:00f8104553f9f2d008174f873bdd61e9e28185 -:00f8208b3726c6f125883ec381b3594e20e35c -:00f83031d72117b0957350a3e4495cb0c5f2cf -:00f8407cc850bd51899c8dfc058a3e7d3eee75 -:00f8508175cbc1f26bee920bc0842b6ab7289d -:00f860b9340355527633105e488608a980a9fe -:00f87061b08ae9b95d9bc83b71523eea574f52 -:00f88039a031d54a8cbf94d4014e0c2e710505 -:00f8902e77e79fc07102bd9ea1b94341d3a800 -:00f8a0cabc2a9aabea0b7de8d41f58e6d8e41a -:00f8b090cca9f423b7cb56730ac3d700132c65 -:00f8c068842193c6c88fa1235b6f734cf1e005 -:00f8d0e57622f44ba547758366daf575368f34 -:00f8e0c9c8c61c5f226bcbd603c9d7ec099d86 -:00f8f0ee725047aec20c6eb02a17b45e27d039 -:00f900081b79b4a2b86f33f8269b48062e26a2 -:00f910a148d40a2c08e692ff71da4c4e22109c -:00f9205e9a636149bfedd056ee81e7ba3cd488 -:00f930febfd05ccf1454c2639b003657edc319 -:00f940b22728a7bc14b8d681c118a07d5c483f -:00f950c1a832e42abdaa673285b2bd494f8298 -:00f960338af7be9c1441ae8150bfa00b6975b4 -:00f970366e8d7e19a87744ad30f569b9ec5e71 -:00f98072d0e23ee5b81fd6171c148960d723d2 -:00f990562266fdf81598f0f7e66ce7e7a375ea -:00f9a085a9aeb5c83b28381eb51c20b3156b06 -:00f9b0ff18db4c3fb1da7ebf31cbdcd98572ee -:00f9c0447ef5bc28c312ebd5be068d7f86d3f3 -:00f9d0b4816d8a37d4f817788683e4b1a9591e -:00f9e0cd8336f0a311162d0d0d69ccb17b1e71 -:00f9f0b85f7a110231561e13c55fb758611c52 -:00fa005feeaf44f7a6bd560fb68af56592f64b -:00fa101e4126b3e88fab8087ac821873253e53 -:00fa20be5790a109655e61a2d5c4085d5ba88d -:00fa30c35178eeb810dd37108edbeb06c5117b -:00fa4020489a69f87e087968d6aafce67cad1f -:00fa50b05e1293f67ba4d86d907c4f880e17ef -:00fa601719b048e2c5a7b5eb5832cdb70164bb -:00fa70aaceeb7dc576132897f7425ad7a78442 -:00fa804112d2e6c020a4f129bd49ea0198caf5 -:00fa90c5ebbc05abcad682e5f7fd3309d593ab -:00faa0f96828a4c6150ee3233543e991dc6c94 -:00fab0a1ebb3bf391c133d38235470b3d5389c -:00fac0bbbc66ce788edeb30f97aec7e3768dd7 -:00fad02661297972670b09bc25c8bdbdd517d9 -:00fae069017500d023de8230ac2477b594b2bd -:00faf03eab2a1581802fee843ee154fac95d7e -:00fb00c4470cdc5244f47e122372e294549c1f -:00fb1046d52aec242f537f6b954bb8bef96440 -:00fb20c95c6de323ead1b59b0112b23b5f9cc0 -:00fb30b2430d4daa89544d35fe2dbfe1f68775 -:00fb40aea261e609036afd0d9acf95f8048a85 -:00fb5096d520436e7b2949bd1b397cdbe846a0 -:00fb605e7c0c0f9f15a724519f9fe1bdd6ad70 -:00fb7074b2ab77c39b85d53b446a0647bcc29d -:00fb801302706c05e6c5f633accf513bb38a3b -:00fb90819126ce0e83298bf5e9216fe760f53c -:00fba0608caa64d2c29ee455e0efdc0b915f9f -:00fbb01ef16d137e0a9d3f1652a8c8c0be0731 -:00fbc026302ae08b25df068ae8664e309c0734 -:00fbd0870b68711b2eee64406af3a9d67cf734 -:00fbe04b4a5d4dbc8ab35831b7edfd51686714 -:00fbf0fb080742976235d3e36a3154f9a80d2a -:00fc0024b32b656feb1d52481a59c8ec5a05b3 -:00fc10772f298acb03508833c6fcccb223c221 -:00fc20b1d3ce6c0bd92009c781acd36ccced8d -:00fc30fa067701e176ea1ac4843a37be86ed66 -:00fc405567b65e69f2b68976572bf9b3c5bc66 -:00fc508ff80f005d5f25469c50dc89f1e44055 -:00fc60f84fef487777618dce08d65ab376e006 -:00fc70984268b6f0f38604c0982879360625a6 -:00fc80183d36816412cf63115ee7f746051d3f -:00fc9099c1c9a94ac469548812f2eb4c1d67e6 -:00fca04b9f27afcb38331ec458b5b747c2c5be -:00fcb02931587f851b1adab8cba09c370cb5b1 -:00fcc0fa214c45b6cd253883918fa36d54e7dd -:00fcd097595dbba18bf51c0bfedf38c9461491 -:00fce0d648ab7b20ba1da995a7fa08fad42d94 -:00fcf0a9a53ae8460d0d10de9f89046df14a01 -:00fd005d01b846721b4618b294caae3d18e30e -:00fd10b5d13721a83ff7550352936b36b3f2d6 -:00fd20f7f9645b34ff650f92e27fefaa7a48b4 -:00fd308ae0e28aa423fde0f36031395d5099d5 -:00fd409b997e3990830fc6b17624ef3b1fe01e -:00fd50655688d43630f1bb053cd5ec47608bab -:00fd6057a4ab4925f7911df65b2fe37c2faac1 -:00fd7062b989dfb9969f5ad016267ba474ebd6 -:00fd80f49f4cba5e60fef9f3c8cdc83b838855 -:00fd90cf56bd69148c987f96cd86a9e82042b6 -:00fda0d908d717ce504644f916cf16e7c06362 -:00fdb0c0bd166b29912d85461159c262fecb71 -:00fdc0d2f01f571786856833eb65f470dcacbf -:00fdd0f4f644a04ffaa22ba9cb28e207172b31 -:00fde0c2563e23bc20db65f6a14304f3f7e27c -:00fdf0320fa68c6384f30972f7b9d4c1619988 -:00fe00fcf1cd8764fc247754c988f121f367a0 -:00fe10e3665b66528b1fa39bd3b314d9cb90a3 -:00fe20546ee6d640c881a6ac9807d0ebb06f09 -:00fe303fb68e68b54c9e60bfdfa84c7be7b2e4 -:00fe40191d123699216b4ae37521c8bbef90fe -:00fe50995d9119b6aff1a9bc12422286717f4a -:00fe6036334f507c561dd95d439148755653c6 -:00fe70a7e90d64959181ee48fda510f52390c5 -:00fe80bf5622021bbb668b2a759bf75ed47dc2 -:00fe90ec65761b30221d72266d062af1b06a90 -:00fea03a9c466b9e1e7aa11943bdbd78342c86 -:00feb0055e3adf2684240d940bc16de16e5cc6 -:00fec0d6e271387bba63611d7512b21b725d88 -:00fed0e274bee517df260aae0a6bff3c9a537b -:00fee009b20a7170f7002814f574babdb1fb52 -:00fef09d8d14ad385691ceefd178effd54cce6 -:00ff00aeffc867c9d6044e4947eb0eabc2f843 -:00ff10348b3dd81ff8c486a6779b1e565a3e37 -:00ff207a8adee86e34a34b15fe0574d71c7907 -:00ff30ec3b940b07567c1ea3a2260f283fe26c -:00ff4090c971eb0e3f96530592d8ec7b263271 -:00ff504e4721eabc745c7e97775f32c0e52455 -:00ff60e6fadbe90c02d6db0c4f058dae0bf2fa -:00ff70939c5ba2043fb2124002d4a2b7c759b5 -:00ff80baff5f7402a059f65c5e67f99623d9e7 -:00ff9053c8416aa05fd93162aee2764ecce51a -:00ffa018992271ba804491e8e498d0280e4e00 -:00ffb0599104166cc354a4c581b36a4888f5d6 -:00ffc0fb74e9ee1a2ce1057a97600e412979aa -:00ffd00abcaa5475c62480069412c95b93b173 -:00ffe0da8b8c6948c7b7918dfdaf3538516101 -:00fff009644fae340c047055c18eedc5c206e1 -:0100002cc02612c9ddf0ae50f3d73bf1865d7a -:0100105769da28b48e987dd317583f13677d16 -:010020eb51c5bef09122b34a1145b8503c8979 -:010030e364da754547a638161222d857c31ba1 -:0100406231700c4ab587c8206fd493beac57ff -:010050da44888a91f21793091ac235a68273c6 -:01006096416d76d86b273289410ece02fa81b3 -:010070ce425e7bf25ad322d7b49b134cf5029b -:01008090727afa09eb34b730db1d9199279582 -:010090e69c8047de71b509a34fb6c3c9297494 -:0100a003eb61a44de3481d3773a6575f1910dc -:0100b0200b2966d4e8ec079dbb51e6818c5857 -:0100c01a0b2120fd55c5c61aef351cf66e82b2 -:0100d061bea92f9f0ee29cfb80d83d6711ecbf -:0100e0074122ef54bfcf2f0daa0d22077e42ae -:0100f0a5668c513cb6766cd66a5ddd1b74f2b3 -:01010018b7d4837fe5ed78f1cb33f0908c8900 -:010110537aa73f29c6fc8fc0d9a2929811d515 -:010120e7210a2004e28b0f99a0278fa1005827 -:01013034fdefa3d3a10d8860f2ddce1ff12775 -:0101406a02081a9cbacc7c0c4e04c93ec275ef -:01015010d501b8c52aa55bd866b3ceb621d116 -:01016065b475a59c5c8e533c3d921dc70b321e -:010170247a58fd9f5343b8126476874fe352ac -:0101802501ff840b0fa2a5ea3c42c42e6f8259 -:0101906a5eae7f97f03bcf994edd320fe44cb8 -:0101a0ad6cc94b113439352aa142b703949e7f -:0101b07837aae0f134e264ac37437f193f2340 -:0101c0e2ad83f616bd979c1cf7538f5763a082 -:0101d0ad0fd2adbd333bc6d1fabccddc547d9e -:0101e06cc15fab7d8d1aaf7399315d83bb89b3 -:0101f09714b8dd0900279b157ea4d3585a1242 -:010200e4ddbe5743c71840e58f10fda6231b4d -:010210be73d62be320d6ef87b1ff5dc51e911b -:010220f6cbd5725804b40262599319410c396c -:010230721cf1d5a83f0842eb9716fb98cddd4c -:01024035c4a1758749a6236d1fa27c81a8c7c7 -:010250040cccecaec10c65009057ebf5a8312c -:0102602ebee10bb65bca79f5c2839ac46f24b8 -:0102707569a210071c4ac90c72fab791823ae5 -:010280de467573067118243c53abea4f99e0e6 -:010290632ae16401b77023ec4943a3079bf7ec -:0102a04761fe83700bd02a535a07b019a59251 -:0102b06ce09088d62a26b4edd55bc7dcee237f -:0102c082af830f5196a2302801aa5ba11358ca -:0102d061b0d0251c6aae3baa674d81178e2cc2 -:0102e038e80193edc92cfcacb772d914da7b82 -:0102f0596551934e8d09b38cfe2350ab62fda5 -:0103002885d962e587a97a2c13fb5959481f98 -:010310975834b0390213ba82ea106fd9ac088e -:010320957da3d5a56e8eeccfb76fe96f2cbfec -:010330f9a0ef3140dd16d0dfdc237faa00a8d0 -:01034088dd79e8663d88d9a776ea112154d3c5 -:010350224e2d63dba579028c750c2a94c2d2d8 -:01036031623e4de0c21df7be2b14126a31b1e0 -:010370df67f392a3d65df1ed05d0d90baddc5d -:0103808d30eb8afdd6a89eac25cba3d779b45f -:010390dfec6c7098f87475b1d67e9f6aa77ad3 -:0103a016a012b823db1a08da95dc2d112f7204 -:0103b06fcb7c816645e32605e1b464f24fe50f -:0103c0e782fe7aadf0e30e58c4edfad146b5c9 -:0103d001ad812f297cc138a912fc0c468f27aa -:0103e0c360e37e88d8eb3051624e9b7855c7d7 -:0103f0f3e6fea20ec871927a94125fa9280461 -:01040047e7f986fa33c57351cfa4dedf35baa5 -:0104107bda73df288134a164c222b199fa4b1b -:01042029a446aeaed1d629da19a9769f13ba31 -:01043094ad1adf7e2b1e65c7130a9befcc6434 -:0104409f010dce155a30f2c237abfea41c38c7 -:010450157fb7edc3d6d3ae77789ccf13dd52b9 -:010460c8b8aa8ce3621c24303885a8db22ac74 -:010470ca8d725e667d7d635a12d1898bf2b44d -:010480e2e0868744e9c373aa7deb633f8642d8 -:010490f017530b392952882d583776a1109c72 -:0104a0544b6632169882cef49edb9a8d3fdfd0 -:0104b0a5227ec0c0dd4c2ca5e0f107ee9da2ed -:0104c0065b25afcab3ec8ff542bb126cc68b4d -:0104d0f29b4355a8e3530c99743143843fb106 -:0104e04e884ea6f8771ecbf62cd4193fda7865 -:0104f072a253155f2db984039aaa24e58790cf -:010500915412b0cf027d30bb4bb9a63f1cee5e -:010510d934f7231dcfda16630a5c1e8892cf6f -:01052099febbd4a41531171735d0ce066b0edb -:010530917d53e6d865336425449befc4cf4358 -:010540b1265a2101d4828498349a635518ad5a -:010550cb054deca5293c214668081d286e88f3 -:010560952782915c4b8a65b1d94d55e1d1b678 -:010570a36280d44dc02d1880fcfffa5eb83058 -:010580556060a8d5b47aaf1f56cb527d9499f0 -:010590d5bbec6b5040569bbdd80e5ffb66e840 -:0105a08f80c7424e655df86fae65b42b533e56 -:0105b070e6165646bced75ab1ba6496430f3e9 -:0105c0c4d48471791579050b7b0469f01044c7 -:0105d04d47dadd8133f6842a552f41b1d2dfd0 -:0105e03e15865c125fba2acad3ef928e8d84f5 -:0105f0cf3173c5c5dda88628cba409f73e1434 -:010600d02af11c09f752a69d18bc328a979cfa -:010610e874d861955299e2a5793599370141fe -:010620f3b90bc7b0736c6a69a453734c6254ad -:0106309fae5c8f4f05b77d950eda92860a1d8f -:010640612b1dd4f868c1d51231412efd53fdea -:010650b5097cde8419261ad24b2e2b54c67f34 -:010660ea963c2807192163c2bad8c463901325 -:010670347cba25c83dfc95c30c992090b30873 -:01068078f22eb66a5a5ef5fa68f246a0a40a7b -:010690aa165f60e574796f32c4b90e8bd8159a -:0106a04c795a800202942a37b1c0cc6fb1a9a3 -:0106b0dc05c60f92e5cb514738032d0f70a96e -:0106c0112efb52e8b339c88d7e829d4f4f4693 -:0106d0037f109b7e4a8755027801bdc2f06246 -:0106e06fc298da9d220e3f5370d03fa57199d6 -:0106f0e3bfebef5f02b380ba3327f92ab135c2 -:010700597eab5b719c1353f0159794e0c4cd4e -:01071017721ac94d544aad1a53f7c7344dfeeb -:0107202458be9fc2839df90a9d1cc138ecb953 -:0107303eb626cb5b4a07a8dfb78df5d7d6b16c -:010740dfb7bcf58273032a471031a98251c03d -:0107504cc89f3373701c87d34c599d39cc5f94 -:0107602a10e46676258e67a498ef91c8795923 -:010770bb9345e666c811b671c0309091ef93d1 -:010780ce2c63c976af5d2837efe3d5d34f78a2 -:010790c27a33ff0be2dffe0a5fce18338a6af8 -:0107a0c6e8633682fa1fcf5196fbf2cc2a4c02 -:0107b0389ebacfad203f47d457d12916d72d51 -:0107c094bacb97aafb316ddf83d3fa4cae0b6c -:0107d01b74238f2d2bde68a279707e986a52f0 -:0107e03288debebb4d6ead5bff736eacb46a02 -:0107f0c030d5472a0015d2a32a48d15421e57b -:01080075082fc96789867179c9a44aaf80a26f -:010810645bfbc97813247a36f4ad5f1a4bb712 -:0108209135c45b3409c99d70b03c926855104c -:01083057d0b20889a928ef81611ea0974ae533 -:0108405ab54acf862c21036112313db3f3c050 -:010850fc779c3c4b495875cd8fa5f0ff4af730 -:0108601ccf69baa028a58a40d0d3d12fdd60c7 -:010870786f44c04ed7e5b7c1cb990618557194 -:010880b47d5806c3eaa8156e5e04f8d6fb3dd5 -:010890150366e22e1ffb6e77d2e148212611be -:0108a0cefb90f82c408588fed1d230163d1842 -:0108b0518bff748c652851942ac575d94e0112 -:0108c0d69ba35fe42bb73e2f47f58570c2f35c -:0108d089f7937645deefbea9b163a2bc9ee416 -:0108e0983e6b88f047716813a7f649d7b21a09 -:0108f0e8962e7719f90226a7198cfb0c3682e1 -:010900f29d13cdcfb8211145880c5de438107b -:0109104700cf55ff4edf5caea5d5b2c93f7a53 -:01092076a87568071dce6d2ecf3d1434fb0678 -:010930e0ec8e44087e515009f6f908b2e1a7e9 -:0109405ffcbda75cf737ccfad637aa59866d9c -:010950d0e024bc43858986d7d928d7521dffaa -:0109608a1c07494ebcf71155dd7432881f38d6 -:010970961c1cbf8befab3452d6896a6cc417ee -:010980d98c449f4507ddd36a98808119ba245e -:01099092d97f97056c211e3b7138b58bba3c07 -:0109a09680e8b235b12269860a5109c3537460 -:0109b01927682f6468835bbf4d709ee1a2dc54 -:0109c032c4b25bb89fcb885b79459e0b1395b7 -:0109d0f996e106b559941613de933da7827494 -:0109e080b8d05e16d6e43899d9acfb7fa522ac -:0109f05b5d505b8e455133678412abf6f9641c -:010a00afa95a087e3114156947571e7f174798 -:010a10070ec40206050fe88e209a8691f52ea2 -:010a20c913cc67e8ecfb474ff870d7b8b6d33c -:010a3036f6bcb39411159e524bd2f067830b6b -:010a402bc274176b97bf8e0bc0d255893d65fd -:010a509b9c448b1855fd8e1e44d734afc469d5 -:010a60c6250bdfb53caddb33c9073d5ae8cf38 -:010a7077a915c1195eb01eea45dd35364cadcc -:010a804d0d3d3dc4bce37904e9532d29cdbd0a -:010a900cad4b1fed8f8ab08eec0cd3cde49b19 -:010aa0ab9ce857dfb696ab8850722eccf65297 -:010ab010c00f4074dbfca12cc4033bc5667984 -:010ac08a79cd58cc8b3a8e36e248e4ee6e95c3 -:010ad0e17f62b772005d0ce39f6e6b1693de1a -:010ae003ec572d5753914a5d148654cf5cc686 -:010af035a36b41693ac024361471499c167b22 -:010b00721d617bfd6295a5a682e421abf9ed2e -:010b1025a08fcc12ce687bf4bf84585c294fa6 -:010b201aa4865188d396fcea6e8e147ba5614b -:010b30a33e38b01d6079b6be4cd8f85827b76d -:010b40e8aaece39685d3155cb80261a846d187 -:010b50f56a7eeb0b9501c62e29741257606bab -:010b60436c82842ae4938aad2fe7a6ff6e2d48 -:010b70aa0d6b18ce11c297b27ef6e8a4782766 -:010b8062efeb58c4a5d983066f3bc8f632b160 -:010b902d2235c352d048aa8f52759bc47d0713 -:010ba052ad3b16d8c9ac75da8d5c355f99b1ec -:010bb01256f73d8fd2379e256feef978de23cf -:010bc0c055c6c94d8a19a104bb969f097928b6 -:010bd00703ac99a990b24cea4927d09b8dd5cd -:010be0900027cdd21ae48679a52532265f5dc6 -:010bf063624106d2939b6ef24b1e08571f6685 -:010c00a1241a6aa801fba60c12ab08bbb4f280 -:010c107d7b6e7f257d1a7b686620ca440dad1e -:010c20cf914003fe17cc32139a463c00d79856 -:010c308c07bcc17b565356d0b3056b03fc57b9 -:010c400e4e4e10a097053a34ca4f135bbe08c0 -:010c504a9de2a960ca47b187cd7fa3844a3728 -:010c6059837eda569a67f1a8409274d5a7c39f -:010c708c359447930bb8fa086774513f0cdfc6 -:010c8060b477b0c01438fe45edf9a95e8fa51b -:010c909bba23b4b3e1425a98bc764730af38df -:010ca025506c99e084e4d4f14fa1743d119a81 -:010cb0b930901b575e74a5c91f6d46a1bdd603 -:010cc0896dd66fd366280aecc78f95d88048a6 -:010cd0d04bdd2ff6e936267a0da93c1501ed21 -:010ce0dc1c071d50b6cc6fcb44b353d141c8fd -:010cf0557de9083c8ef9ec2522c5b1d62766b9 -:010d008d6e5de209a92b896ff727171367dff3 -:010d108fb57d7fb87eada19a2034884b217bb6 -:010d20fd38c1d5280d11bcb40d912f4d2fd66f -:010d307a17a95adafde8d5a5c779ea2809548d -:010d405431e56dee1793541e34f76c2f363291 -:010d505882cb2359f0d2559603a385232dbd25 -:010d60a4e94ff8bb3e39ee684eb03efaf95b9c -:010d70fa3f6d3457128fe5706f136428da1db6 -:010d80376f68d161b58efc299fb14f2b0bb002 -:010d901148f708fb5688db72d532309d3ad9ab -:010da08da96db30c421b3283a006a03b7596e8 -:010db0d30827d151e9f92cd1809f172b6651bd -:010dc0b0e8202641393c022a6fc06350ed38f4 -:010dd05a458db488f3a82e6e18c763bd323088 -:010de09ae9e65fabf40990e6178ad9e293ff19 -:010df0f8588118da7d4189d91e7aa6aeb6647e -:010e0092a1fa25eae7cdc04aa6134437b55078 -:010e1026cb288b471652dd9f4a975fd0b0d3da -:010e20944a1f06a0ab8439702d406cea74cc27 -:010e3014502d2450c885f7c1e7d73764ce55aa -:010e40f20670d9211630a124cdf51a42d1424f -:010e50b167ffa59112e4a898f467063759317a -:010e60b757bfc3783141f5e680197db0b89efa -:010e705bbb73fc00093f65f775f8b4802992ad -:010e80759747c5d094532ece3bda175dc00dcd -:010e90534e936c4d42ae1dabf736ef33a02194 -:010ea00ea52b2dff8475c18291222914ec739b -:010eb035295580b18c17772c2c692e160bf9f3 -:010ec027a4b70aacdd60d60b3652c35d8e27fc -:010ed0ed4d1fd4d10e3cda6dd9b94917caae91 -:010ee0772d4a82a6348cd5dcbcad5077736f1a -:010ef0d335c3a5a9ec09c2cb94e2b6ef810423 -:010f009f1ad04a30f18cf13d575b96c2658627 -:010f10f166db0f020fae1ef9135c75f9838c6d -:010f20a1ba6a5ad0357e85ee5748ac794c2c97 -:010f306f6b06240b72ac0af4709a1de70edf45 -:010f408097cd6e380fbccc17bf3d3f53d52650 -:010f50b3d8fca35425b9990c98d24fc8c69261 -:010f60110c97724ca642670ebb7c01d0a713bb -:010f7085ebfdb44df6e6605283ee29eff78fd7 -:010f80b8c6412df37dac0760d56b8b11111696 -:010f90ffc1d129432c4cc24d5047d895210758 -:010fa07970147446e3cfad1b9525b5273e896d -:010fb0499b520f798707a5513468386a3f511b -:010fc0b6ad3c2e65c785f7716ab8f65448400f -:010fd0fbaa2637c6f6006166fc60f30e1e041b -:010fe0a4fbd3563c54e7e6f02ee1d8bb8ed1d5 -:010ff06c5e7d4971fa6acac2476cfde16ff4ca -:011000b1cc9e7f432e677690eca2e5664b4c77 -:011010cc041d35b3a9f9baadb44e283e36ccc0 -:01102046e7ece23d04a35a497564e319501a7f -:01103054700a9820b316124d4557ac26c38372 -:011040df1f75b5ed9b744525341e880bdfa34c -:01105071b26a22ba0d458ff67775500c2097b4 -:011060f301cb588609a14e174a3ee260063de7 -:011070711e1a62b0671c050ef0c86fbd657222 -:0110808196bea4f4b9838b4c02bf0f5e47f77c -:011090c318d5a1af969bff97ff4aecfc3f2cbc -:0110a0080b4ac1ed2307b2f64318a0ca703da6 -:0110b06a14e1ee0def10e8b29919254591266a -:0110c0f16d09c448fbffbdf37a399877b4e50f -:0110d0f340f3067abfdd5435a135085cf27274 -:0110e0d68557c0829a8ee49cfa06b124abedd5 -:0110f07073c36c520ca136ed41697d07f9d24d -:01110031b6d8fd648a130ec95df0566a9e290a -:01111011a818a8f13fea2f614d59f379994d7f -:011120218f14be6a537a5c1e41bd7d62aa4143 -:011130ff98390e172c93cd96e485c8e354ed46 -:01114091d934eb643a8a95ef49358077586da8 -:011150d15c14052659449ad327d608710fe3a6 -:01116036ce22c943071c5fbfe95c969b5dbcad -:01117011658dcd2f5376b21a0e1448beae35ec -:011180d944ce48997f7fd242aad1b4e6b7d609 -:0111906a60453821ac44bd1e4c8237072f5629 -:0111a02265d9a3525d8ad7dece2c93882267ea -:0111b0674dcd7bb0db76aecac0012873568647 -:0111c03fd65406d6d89a9485f73541478b410a -:0111d0553eb2bf8e3d38bc1efa54b3b84e231a -:0111e0062bc9e611d4e837cc0c90e02ebc4cbe -:0111f0becbec93ea78c0ac032e2ad12110c476 -:0112009a634d7e7725515c94243d85057b4e63 -:011210970a0cd59271eb1fa7d5201649c7b51e -:011220949ce84bbf37c7cd73a239bad856c626 -:011230517f1aac768502ca25e932ad355b7f57 -:01124046c38742dd9c640963d3a1e48ba479b3 -:01125084735854fbbd187559b6396384dfdfcb -:0112607a73a392b0f7ccd51983309d0bf7b332 -:011270e66476beb8a91c9f0e0856c444fc31ed -:011280e0a95899b486c8810369c7b2e9a90337 -:011290b2db317506a0985066fca34f17dc73e4 -:0112a05d21a2f4f2b9125ec37128e8b52cec2c -:0112b0f9756a3ebb102722bea3b5c4809e21a1 -:0112c02119a08da612e8f671c3906217b3592d -:0112d0dfa117074c3559a53b758c1e8f551ab4 -:0112e004cc83d0df2df72fa1c17094e0a7f581 -:0112f0525cb438ed4a63a42995d595b571643f -:011300cb6f6fbeff9bdc6919f6b434099867f0 -:0113101b035a4deac6f0ae1db407ec20a13168 -:011320b7d8a5b9db81ac9db3922f1bfd2cb772 -:0113301c924e4540cb32b03ac98ef5f46a1251 -:0113406375763a2d08d01e5afcd376f0eea6f0 -:011350180e597a983aa57d08ee50e7f93ec1de -:011360893f0bbe6a8722a93b649ced7edfa8ce -:0113704b79f4c4f546cc4d58780526fb19486e -:01138086addc7aa2518e6cffdc14975058b6ca -:011390e329bf118a57ac594e09ee87ec170d0a -:0113a05d3a697be1b21ec306d3c2515796c1f6 -:0113b0dfec74c44911e5cdb8126256e1f4ff3f -:0113c0f8f2c8f260e82fba8d6018cd17a11c3e -:0113d0774065c8628a58a15f83b47c345fa77b -:0113e086b65034ef5b71839116ce9d6a20b053 -:0113f0fbcb96c0abc05bd659f7e138ad65d27a -:01140029db1d0461551c10e5b96d389f2709d1 -:011410d78d0a72bd20f79035f3a66ea0a9fc47 -:01142084337596b3f178a553b021592fc51f5d -:011430805070129db3a738624416c61db03158 -:01144016e3c3afa48bde56787df92b2444bbeb -:0114503575a4c77344697f77d205de8c2200bf -:01146046d54826d3769078126e0bc17c9e777d -:011470baefced9effe1e29d1cdf6629c63a838 -:011480f87cf0a306178152a19fdb9d18600f22 -:0114908674dbb38d4ff9967fc5b20920e86677 -:0114a019f3663ab74b6f5a922c14a17eb14d23 -:0114b01bbe75e2b1a5d1dd50d936b920c21ece -:0114c0108ca595f6066f8f61de2f7b8ef7a6f9 -:0114d0e2fb3f09bf13390c46d086609f4f154e -:0114e07af68317d93ab4d6e0d50caee610e34d -:0114f05caf8dbf98a0036c7d1d7f417554180c -:011500916f66c24e4880b3747c9ace35e8b71e -:01151052a70dfc0acde542d806f1474297bfb8 -:01152080743320ec51eb2cc11cb782e17bda36 -:0115308712018909c96d7e4840f4c8ed289e5d -:011540d2542a8f6a835d282446305378d4502a -:01155059b036677c27270bf2beec2a46c142f9 -:01156083fabe76b409df8ab3e0d242651ab503 -:011570c2478a0910364c307388c020e9c04bbd -:01158075fd8daabd10ab7694cd3582a3583e02 -:01159043f0b28df6f5a1d5d6c4d0613b940d1f -:0115a0182fc0c057dfa54e4d7b43c9f42b692a -:0115b019c2b2a59d639f19ca853f48ec603496 -:0115c0a155c4b4da30b12e061ac84e6fa0897e -:0115d0e1d8499f066c5504f43ab8925d3f2902 -:0115e0c5cce259ac784495734ba20384c05680 -:0115f0d883234d74351d167b98f4f8573dcd4a -:01160070f7df49aa4798f207ca384fc90acbdd -:01161095659cfda5006a2a3de12d6b7c617096 -:011620b938e0d60307180d563f6c38901b0376 -:011630d4a31586c6677bda71a1af8373767984 -:011640525b8d48c2de3cddef53e3d8a971c7a9 -:0116504d979898e507e66e6cc5c0dabecc4624 -:01166066f37ea48ec707797a6c3d3617bbd2a5 -:011670d59c9dffb89fd47ddfd0f92bae67df51 -:01168060d354b767d6d31af347f7f2292a1ff3 -:011690f14e2b01ab1efae2eb39dfdf40eeb533 -:0116a066690c2cc52a4c491b6f4c15ce9fe25d -:0116b0122dfa3a3f6c91ddad4872cc5606374c -:0116c09e697b5caf50e120eafeace5aacda7c8 -:0116d0bc5a35895a89f4cde3ea92b895355d3d -:0116e0de54603af8113e9cc18f059b6a5c9cdd -:0116f0f78ad5c163ad42714f4e550570960121 -:01170045d705990c78a75ea3c168062e1675ea -:0117100316c12b6801c28d354b741e22a772c8 -:0117203b48c1b25a833c064f12ea9973c60fb4 -:011730943f5fb47e0dd4b449aa156826024844 -:0117402deb5b14a6279b60145275b2ee19ea57 -:011750bb6df1e15dff9f97e8b1071424b58619 -:011760d665437cda1f166b88c2ab75c16a0ab1 -:0117709b9c979e3a8ef22c4b48c19d27db35bf -:01178027b40375a403a9c2138870c3df1275fa -:011790f30fa8cb1b5b70ede9abf83aec8c9d59 -:0117a057e870dd1e3a09596e8369e80cc23e49 -:0117b05c3a8b91d066cfb429503e0088005387 -:0117c0692f8d6b8437460943495efe96061ed6 -:0117d0a941cb9117587f2910fc114184a86983 -:0117e03ba9a197d4d10f5549b2c2317ee8eb77 -:0117f0b162373629ea3ec8b05173edf463258e -:011800d6a41b2c53d9e46ad23cf81512dcea45 -:0118105d544006847bee05cd26c916dcc1bc69 -:0118208e956e4a2072c373c0eb934b2d92bb0b -:0118300912a94b3b650c624dbac0d838536ac4 -:01184003a92c22f464a5057ce0a3cf6def0994 -:0118502f2f37c33a15adb89bc2622c82f55a02 -:0118602b450a41be3d53ac1e324b39bf23a743 -:0118701c0056239b02636942dcd35dbc615741 -:01188000ac663497d34551ab1985069decec9e -:011890b90c3443fad9d58508cbcb44e7ecd55d -:0118a0efa152dab74397951dc410db54478cb7 -:0118b0aa78c74a66905a4e78cf2f8f90434404 -:0118c0aa2cfe663b0f7aa8cea7eb1d830c8bc2 -:0118d0aeb7c3db6c7bfc0d201715526fb7ba30 -:0118e0c949bb14d63cdf4368c0c197b6af4b8d -:0118f0be85c94b165513873e0e94dc3ccf64fd -:0119006cb0c3a9c086fcf3c9eee6d99e132042 -:011910c0b85a5b45e6c2c3db5f51629da0c315 -:0119201e2a784aa272cc35a81536443fb3217e -:011930bfcd6de32fbb7b90d94d4285ea641d3f -:011940b5de8e8a9ae48045d8443d57598ce69a -:011950faadbb59f38b25bfb45af63d58d3978f -:0119604fb94d9fa4140cf841b636e19455257d -:01197041c417cafec7188c84601394fc3b605a -:01198091b092cff10ad6f1445dce201d429df7 -:0119903258109d7bb1d17f769cd3c85266a808 -:0119a0b17ddc0e7f25a79ebc92f294497239e3 -:0119b08c188914ed0f89753af3510c2544a7ad -:0119c02b4f910e2dd326388259d03a293bac44 -:0119d00050839db4f3b7c15bbb9147a1e7f391 -:0119e06142a7ee680465a3ddc9fc85ad87f252 -:0119f033deefb8b466537b9b3594a9a5d6906a -:011a008be8ed312b4257a76ec73b7479541414 -:011a103768a0761c60f998b976d35f29125358 -:011a2074008121d286e85157c444a35d2bdcee -:011a303b7b6168bd02da68df4365ad42cb9729 -:011a40c404526cc84ead0378f17603cb8fdce8 -:011a50cc4c1014b345f53203565d7b3431299d -:011a609ccb2253919ff365a1d4b2fc58f36ffb -:011a70f1b277c0e34261081c94f45434d9e4af -:011a8034002fd1b54b3533ac780d0e8fc02612 -:011a90cd46421edb15bb8e525e34ad0e92fabd -:011aa0a9a14d674ddb24ed259043a6450ea9d9 -:011ab02c8a55a763031732891390c29686e17b -:011ac05507243f2df975652750acae0c5f959a -:011ad03cc7c6650f71d436c19da46949e34df3 -:011ae0e365a72b77d97d1caa6c735ed7e3e239 -:011af07d754a27f450a9b0b1dee02dd755e96a -:011b0042d19cf865fd4f69b047c46c7226b465 -:011b108b3b940953f0817271a91717c0534119 -:011b20afaf912fb163b0270c619c212793ba81 -:011b30713dc73cd7b05a06ce1035d03d1606e4 -:011b4083300768d7c0f6a2c1853c7afcaaf845 -:011b50ca7a754b2d1c29408ce317bc1e4ed5e4 -:011b605be9d755b4a4a0538b0febec1ee7c26b -:011b70163ac56f4c624e00e7eb52396660fcbe -:011b804c07d5126a38ab227c70777734a4ce65 -:011b9063f1bd882ae959f37b2c809d76b8db15 -:011ba0f1c9e5dc44edec6552d324944196f9cc -:011bb0964fecb706650a97e67ef65c4f07d124 -:011bc00fd2f7b36a758829224bfa420e1ef922 -:011bd03538ea48335af52a41ed66602d5dd541 -:011be02cbc7e6be725f3ad167a5d09c2a8ef46 -:011bf0c5c2967c6412187fe40bf721e521ed53 -:011c00f4136bcd069d9b16c54c42dbe5a9d7ae -:011c1023610bd80cdfdc74c24f9306a660cd3a -:011c20a2ab2945b24883ffc371e9898417f346 -:011c3024cc26e526d4bb5b995ec8b0c0f51fb4 -:011c40d509f19ccf8816f248c28fa591b740d7 -:011c5038b4c4f064b05f318e0801ce77e9be07 -:011c600524d265cc47993606ed7e153c271e90 -:011c70aabe70dd88bb675110d173d63e9f4e8c -:011c80890a119d6f20819d86cafe2d80f25581 -:011c9051f5efba1998c1a5a043af5a90e28771 -:011ca053b38f14df11dffd30aad7ba22f89f7f -:011cb0b9f6a614578c9af9e1ecb5681204bb32 -:011cc0108a91a6a7b51f706a20a2736a2e4f4a -:011cd0a681596c270fb484fd640a01a55c30ee -:011ce033ec23540c6d901de28a47ceb2e240d9 -:011cf07d61c3cb9ae65fc52e01845143e7cc76 -:011d0083f29347ed17a1f8b425cacd2c21e3dd -:011d1032d7d149eaeb8bc377e9c19cd45447b6 -:011d200838e9f706c8d70c3ca678e57842450e -:011d30c6ce19cff34402371fe4bac779d360c0 -:011d400570f08ab602abc039e6f9eb79085ef0 -:011d50880139a362c26532483b1e207117114e -:011d60dc496cf5bc02afdf8340f4ff89d39704 -:011d70b0f31894846883dd2edf4a56ccaf1274 -:011d805da687bfb766cba78f656b9e4f54065b -:011d9063f1b2da79d36c58662c7f854dfdc6e0 -:011da0804b4963fd778adea114012dd1959364 -:011db00c5db20469ed6b59ebd475cd9d21d593 -:011dc0ad6ba93e02f94c58b2e0bd47e972ae29 -:011dd03bb56fb049f822a1fbf0a663b508959a -:011de0829196bff3fcff42a92e7eddd9425003 -:011df011af061f3b8bbf769624f8da7a46be4b -:011e0084c395670dedc378eaca766086dd0a9d -:011e10013add15447013e405e557364a0cbb06 -:011e200ba576a295615afd466745fffe7d0c2b -:011e305be38c7743744cd0fe01cb85f29cbf44 -:011e40ab865dfd2c75524899794049f6696868 -:011e50efee8a5289833e8203ba904bf127716a -:011e60e30756af853e13c06c6b290a26028335 -:011e70df1d869d5213d097e250c41a3a81ccef -:011e800b663edbc538282b13ca7088053d98ba -:011e90a4bb4fb5f7ae3f5b33fc4df13afd412a -:011ea0819bcc4e4bd66fae2ab19e81bb4b3a9e -:011eb037a3126cfc00e923196a79467e65b0e6 -:011ec04e060bac1f5c7e45a2387d61928c757c -:011ed05f48f1f11203753a1b1f65376c13afe4 -:011ee080e7419ce86df759e8e8585de5807372 -:011ef026fbf54254e1436ade3cec27e144c869 -:011f00e69bee67dde7c1feea685ae9fb6e1cec -:011f102bee02923811a818e0a61fa6397afb87 -:011f202688a4e2239cf7e0729f0e14849e0542 -:011f309f4561fe7640ab91889138ed801f6c6c -:011f40f453988629f37abbdcd81207a702f013 -:011f50db7b26e029b986135aeab08788ac734a -:011f60b5b74e40dffa4a519479c73297e8728b -:011f70276a0ddbeef9dc32c021b381230b8ea4 -:011f803e34f043be61f0576f73d584baec4376 -:011f905291d621d1c5dd89742dda1978eaa073 -:011fa0cda06e7c6441c474cb0860d042fa1b6f -:011fb0aa1db7a6e615a210897248cf84d6b687 -:011fc0bdf83ec1c46e4a6662b1af905585ce42 -:011fd0e8df66e4c3aae8f1126ccd4e969b32c2 -:011fe05a4b6946e62f9acd12ebb8bb8da2e0b3 -:011ff0cbc93e5ca6273840e7902101d2113bf0 -:0120006da2e646620eca7ed44d0f61b6fd7232 -:012010dac8909bd4c1a4b7ebabfbd932927674 -:012020adb30c2bd6917b344ff68f3b87ae1d25 -:0120300a2e0bf7b89d8ee74808faffe3fb7c04 -:01204006669bb8b5fc5aa44448cdcc3735dc2d -:01205061446a7b36645fc70288f91553e41d1c -:0120602f6711d7645c594aee3bbe9a1fca10f0 -:0120709d7dc1aa7d26fd638761bc2591c4f1ec -:012080a4f134c4258bb5cea8e6ed59cdaed4ee -:012090450db00a57eaea1de0fe2cd8125d810f -:0120a0d103abf8f11572aa2f90132efc7713ea -:0120b03a2609a0b63fd436a1342110d08afa33 -:0120c0a2b923aa2a5c826f017fbce0f1e722f7 -:0120d00a6604c89291dc38bdb1bd288319e496 -:0120e095e0d618e6de42f2604872f056065c8b -:0120f0259a6196ef00f076e1a71b0d6dfba328 -:012100025aa52f8bc9193efd4a2cbe4a4f9a0a -:0121106338bcb649902ec0c7490009dd1d1e29 -:012120e774386a6db43aaa3a6bdf59dfd2d7f0 -:012130086427f1e7f5b151e3c760de76df4e0d -:012140b8c52ecac6a2aecf321be97c159edb97 -:0121506bf1aceff1ea2ddff255de40458dd00f -:0121602545bd437eb0dd8c8936c4c5fb5e3557 -:012170732fa88a20845a49d2a0a63c6f6fd177 -:0121804f1512a98d787815695b7f4649fcc9c6 -:012190f4ccb82c4ec27ce93e7cc2dafb31c1d8 -:0121a0068e0de586c58bc2761d50651cfca582 -:0121b0e467f04118b971b85d7820de8228b61c -:0121c09457d5a2d8f81df9b3dbeb1bf768b53f -:0121d080a0681392bb7800ee88fef8246f34bb -:0121e02c33a8e3acf88eaf0c372db83fc4bb74 -:0121f0c7a264910297c8bf6a409eca311f1719 -:0122007dfb0b7cbc360e4970cd5f53e5c5f6f5 -:012210ac0c922b5bdcddb0138bea7c4d936394 -:0122200f43daa328a9e83283b2359b5108a9db -:01223088791eb6c7a3eb51a91f5ac9426e4f81 -:012240fabff87fa26e145232f25ee51e956731 -:012250596a9ce1f2b41d29db1ceeb94c97e4b8 -:0122609a187b676eeea2cd6726d0a43c79ec2e -:01227091bef4bf34cd68308a87bfe7cd68193a -:012280bbbb1c7b0e2a836f782b3e1402d94cdd -:0122906155752d8de59ff081d4f2325a7236e1 -:0122a0bba255ac49be519f36be3d9a7e6e2743 -:0122b02d4fd5d4bc8a670807e07458b40ab99b -:0122c047c86eaa96f9a7cd131d6ca685cfefe6 -:0122d01ccfe674095b1e794a981d68cccd9558 -:0122e022d112c46de04df48e9b569711678b01 -:0122f0faf190e8bca700c1c52e985d787b9d8b -:012300285d3368fa8180d691c57adc99c66b02 -:01231058e55609782199573248289c20b063fd -:012320b8132a8224d241de8de4c666d70500b7 -:01233039075681b02530fc155e77283fd358ee -:012340cec2baeff5661db285c01141d35ebd4e -:0123502c48fbc48ed61a7345d139d5c60817e4 -:01236050bd50642d604f60e3ea30c7ea7dd204 -:012370ebced9794adba6d9264868881a07733c -:012380a5dbf502a6e5f428d3194d63d9468343 -:012390d733b61c2efb9acaaf88a3f3f423a3cd -:0123a07227fd09f824f1db6f37a33e8b4a9388 -:0123b02f90daeaacd05ec58144cada0e6ea987 -:0123c041f6c2e4db8537ef278f8fb185ef4659 -:0123d031ea1944c268cd49c16c681bbd6779a9 -:0123e0d6dba97723b6d8ac9b01842fca076a8b -:0123f0d84e4ab3205c243c8545af969687262c -:012400037d463cb32e555def95733449a0a304 -:0124100ff0408946280fa6dae36c03042c6140 -:01242059952b3ae68b373ae115b055ae595650 -:0124305ad33004053bd92b6ed0d2ca396d2094 -:012440b4063cbeff05f9e405bf7ab5df9d29f4 -:012450f689de5bca41f64f994ae245c886478e -:012460bf858c89538b2d329579aaabac108f52 -:01247086fdb584764ba936c657cc5277d29876 -:0124803ee4c37188d20b29beaf7f815e0f4f93 -:012490e6d02d3bf8d8d5cdab30359bea09e527 -:0124a040e7751af8802f6ad9c9b6d097e69c9b -:0124b0a5995467cac875b9adef34d47b4ccbfc -:0124c00d7b85c693513427ab6453faa43f3528 -:0124d0efe2ac25ff78be6610785a4cba3e280d -:0124e0aec28e55f19d9bcb0b5c6e282ddb2459 -:0124f061531e41e483500f1cb248c1488eb3c6 -:012500fd07bc8ed8ba3bf37a284d782333fccb -:0125107a8a85d85c583d4766c6f3082b56e1de -:01252085cec00fd6ab4a08c79b3a1ecdc359c4 -:01253067c8a804f265d7d9f4699e66ab735fa6 -:012540f48fa7ca97eb8e2fc29fa3cf4de383cc -:0125509c845c85768cc3ffcb7fab8f278ab84b -:01256057fe5f4494fde9ae7cc1d9895dcd3f03 -:0125703a555e25fbd6fc9e57756b47538dc4e8 -:012580437d9354a66baf1d4c2b88b26913f433 -:0125908f3b2b3dac6c082c2723c0321bb4140b -:0125a0895f62e6dd9b3a0871feca571b4ebabe -:0125b0c116bcf5fa5b62ba727563c774a45702 -:0125c08a29e13e8d6ce347add0a8bd2cba9c46 -:0125d03f0abda68f66a28c1ba172df9a214739 -:0125e03a1ecd1423a8339ba8e3334944dc9815 -:0125f0a62683e319e8941c9891abe022464427 -:0126005a224e8ce4b33de82f7c9180ef45ea6c -:012610eb580804d5bcc8c5f46b4d591ebdb52a -:012620e3e7b69b49d65140f5603acaac534952 -:012630d7140337eb8e4522f525e51d53e473ca -:01264081f4e50528b94664efc1e1930057a3c8 -:0126502a1743ebe1fb7bba0e0013c00e9cec53 -:012660938cab4c0eb8df1f73ea4acceba594e7 -:012670ca6433a52ec8a557fd353e7398570dd1 -:0126804045972065cb784e3ae28e55e41c7b41 -:012690ab2393e04abed03057b52407b4e2bb31 -:0126a040732361f574154d2e092ca4396bb846 -:0126b0d706136bf02e5774b5151aef92754ef0 -:0126c096f57c40cbfe9187e5e524942119b1b0 -:0126d0f16e16d9da13f18149b085473b08fdf1 -:0126e06b5b3d730cc72933f145b9c298010fc9 -:0126f04c1b7d922081aaca6f5e929eeb315600 -:01270037b83d2e90f9bae4f309fe3f37c306e2 -:012710d0e1d6c718ae0b9cac6928cfcdee1217 -:0127209be5c8481d7f1564623c0312832f8406 -:01273016c890596a4bd2f5bd9375b222fc32e9 -:0127406f99520035aacd6c62d14b9d7411a3b2 -:0127502ff2d3ecb2118c650d1c0aa3c8e92a77 -:012760e54f841cd2d14d726bb1f983877a4f6b -:01277029ee5ed24131581887023ce883c5d549 -:0127806879e485473e8fb57d77741a40960a05 -:01279097d44718f83a1ca83dcc7bef74336b8d -:0127a0229d3faf33d0450be19ec2494a42d4d5 -:0127b09482929a67a6f06fee1e2d8e1e441092 -:0127c08517901498f16a30c0ad7c82f07bd76c -:0127d095b78bd8d6643e2e01141949d7bdc20f -:0127e0ae01b99b0eb0dea3c4fb692677e72297 -:0127f0d97c7e870fb4fdc0b208fce9708c8d25 -:0128003e16713b2478d5c0045b551ca4d195f8 -:0128100db194ad1dfc03cff1225852df6f85da -:012820e72081f591e5d9617af4ad512835c792 -:01283017e30eedbfa092a518fd22a8a3428752 -:01284033c6c934758adb6b0fc4882f49a30944 -:0128504864d57668762a498357a35784deae8a -:012860867f4c69bbddfdd5ad0fcf60ea697b67 -:012870353d44eb3369b08612ac3239760f76ac -:0128808e9f5ea0d63f3329ee79db742632d2ea -:0128907155aeacf877025533ca89053132b17f -:0128a073edfa4bff260b780ace929d77027ed6 -:0128b086bea3a1d0e58a0eb04e584eecc84ca4 -:0128c076aa3fc903eccae35411248f2508e839 -:0128d04db993c7dc8518a813fe7d07317a2561 -:0128e0088662ec7ae942cccdabea8ebce6715c -:0128f0fb1956c35c82cf136e0ee2f2f99a2ed2 -:012900190d7234b07dec312d5d5a86a3a16f60 -:012910f5ea1c4b8c80a6e91fdf6021b44bd326 -:0129209ba5bb4c167c821eb8752820f0845cc9 -:012930a8543398d3fe6113646dfbbd2f232643 -:012940c0bf6db5723e8e6ccd8e3a3303c1b464 -:01295075de7d39601aedf4909a97f38b340060 -:0129601beed50b090d28f7d9f91aeb8ad1d4ed -:0129701868bd4b6c4103793a070b6c31bf7951 -:0129809194564f4390f17cf3074074412a5eae -:012990ea7a6996d6c0fc3733e91ecd6a90f0a5 -:0129a0bde41073347f4505ca0993a2d0de2961 -:0129b00dbeceba5307aac283c3b829d9c4cc8f -:0129c0ae0d647d023cb54e6c60a3579b35a2df -:0129d09fe9128913eb22864d5778eb3102a1d2 -:0129e09935d2758a3d5ba796a58bbb0c861c0e -:0129f04a6677c17e47317c9c41ab854e542e79 -:012a00995bc10b80dba8f17e9b65b2511258db -:012a10547aaa47615790446b2e5735f01d6ac1 -:012a2098eb38cd65aac7d67e03143dc8824bb2 -:012a30a42dcda40db98e907cf74447c461751e -:012a406cdf25b9c1fe66ff12515440a27d6560 -:012a505282ab0bab1bdfc00aa0b96aae10cf19 -:012a608109c8388640392647fb6d402dce0fde -:012a704e8acb91ba5395ae7106b49e71088277 -:012a80b568b85d673608cb65a6ba599cf98044 -:012a9069fc9c62b81b08c9c30b09aa57793e20 -:012aa0fa7509ca5b838bb27be24672adc90251 -:012ab0a84bb3eec21a10d3e48c029a424dad63 -:012ac017e300d1b85ec0be7413fbdad6ca67e6 -:012ad0133c192f936073b246c126c1e9cf8e4c -:012ae0792ed6121b1309338687497ddbce758a -:012af0e6050ae6c07b803e3de7c486da4db6f9 -:012b00473595688692d1e89b2c2055505ca553 -:012b102e5a466c418a746dd79e2f336fcd7609 -:012b20fee0da8d2367a827f3d87e7a905a5778 -:012b30e5e3aa4e309b9c8b4d7ad5b3f56ced48 -:012b40ebb6f6f13a60a366c2e35db7457d6106 -:012b50c3ed4755d6c641dfc45cd0385d59b7ae -:012b606883a937e61677223a5c7338d78572dd -:012b70657e13511706a8759f2c4139bef962e1 -:012b80b98834ed55fb0f3fcbfa4f163253dd9c -:012b9073cd04c1a324ec3a0b17f3499ebe0988 -:012ba033b135b0f5302e7049c72424e85e9ae0 -:012bb091691f284d10d103043fdecb632a11d5 -:012bc0fb41fa17dcd0fae4a90b34a37d665610 -:012bd00ce0c83e3390f07e4941b6b720c41ce5 -:012be056a05993e2c2ac792391fac30edf8b22 -:012bf0652a9db2563e416bb1660e45acc339f0 -:012c009e51e3f9592837aaf4d21e79a6daf0fd -:012c105828ef89a450b53bbc26cf03ba734e5c -:012c204295d3de8b1153e0221a5cc5a702abf1 -:012c30927d8ea312e5adf8e969357974cf6755 -:012c405dfb647d1e725955eda5c3c69a92efcd -:012c503be318f72a57c5e122892a8e8637af87 -:012c6037ad7b5276b50c19c897e01cbe33af95 -:012c70e453237706939ec1aa2147efd9d31053 -:012c80da030ae98fe1339acf9ee18ed2bf832c -:012c905c328c59ad6ea7d38b0551d26310479b -:012ca064b85f7723fc1401d2de0a0b7a4ac46c -:012cb0bcc016e91a02cdd2acd46277efdb9117 -:012cc062db514459dc1a5a10e5bafaec838222 -:012cd022e56c4d492390f3089bca98a405fda2 -:012ce049509a31c109d8a7b8f7e74fcd9fc491 -:012cf0c66495fe77e130927fcb3c8ad14ed833 -:012d0050b08e884c61ff16e03e8817f7957a70 -:012d10e2b13bb106500580977c3f34b3c99283 -:012d20af8dc77e527c14cc11b2856a1fc49d47 -:012d306faf4ce4417524aadb0d1e462911f51a -:012d403f99c8403a2478ebfa845a5e799c6ff5 -:012d505911aa06173d09da03e211d4a7d36db9 -:012d60e473d84a3ea31e2485ff91eea823e4fb -:012d705419697def5f03ba103211d9ad190236 -:012d8039f4d46fb6e6e40ba217c8207a175398 -:012d902abf479e29080c9a53e0ef982bdf64bb -:012da0276529a2dc811f38057817a0bef18aae -:012db0e5d1ee7347a38333ba751c4360d8e88f -:012dc06456d7810a7f25a72e4de4ae9793c51d -:012dd0b3bdd8b80d557408e111fbaee7055209 -:012de0702c5de77eb5ab52edc0c9f64499f206 -:012df0e2f07841885ec3ec46820e4ab767621d -:012e0046442995d7f29ff208c237d03e4e34fa -:012e10211d7f841e5cd069836e75553122e232 -:012e2064e65e3b646c49d633645018fd906c56 -:012e30f2a18610b22e51e65e24230c0a08cb18 -:012e40e0a0e695c55e7603c93b79ac65cf9481 -:012e50ba5c06bc8a4b9bba4596c38871005a83 -:012e60de9ebaebe0de582acebda1967a5ccd19 -:012e703ce3f455bd5a67b8d8ef475369b62974 -:012e801c6590d9a92162ad4b861784c8dcc56a -:012e902668f2c0bf2c687c5e4df2769c6f43a0 -:012ea077b101e62fffd8b2576d2ec5ac93d82c -:012eb04104492ec8ba53fd83cfc16a6d24b1ab -:012ec02c71c03aed8878b07d135aeffd389406 -:012ed0dafa9990b73dbbe1663f7b9e2b65e778 -:012ee09fad123cbdf04c4ce187369226d708e5 -:012ef07f59b9d25db059885116c22087eba45d -:012f004150384cd2bb2f57524c7956cb02b9d1 -:012f105cd9e7904cdbad79df2aa3a2fa9f5997 -:012f20a492616d1d9f64e11029802d32278a03 -:012f303ae782f11d92285c449b39622a99d055 -:012f401f4b6ddf8d84db7a534637aad288e337 -:012f50bdb739874abdc9fadc6704ab01bde1b2 -:012f604dea625559fe6eb33da905d983ffc953 -:012f7021a6623a7ed4f9cb4dd8579713b9d669 -:012f80b3f7f66d884b42715be5a22e41f111f1 -:012f90435a7aa0a1d699c1e1eb5f3aedbae43b -:012fa029dda7da4d72c73e7c6daa82238b1322 -:012fb05b708f6ff50eeddf63ca6de3fa08b938 -:012fc0f62e5e08d8fb46b2e8e11bd0c3223b44 -:012fd0937b3f9ace803307afd744a27d60984f -:012fe0aa84aaf4e57ba4d91c672617f2551478 -:012ff03944e63a00085932914d416322cca481 -:013000f00f7df854f509025229cd5d9b55e441 -:013010caf31b736dd6742a28835f118bcedb49 -:013020c26e60802605c6a15bc49c458a54c69a -:0130300737b7f5d0a2537d5ae9488b16ed674c -:0130402716109da8b090a200ee33faa3239a66 -:0130501cb38e4bb12357cea1e6a2d15f9866cc -:0130601c6c00ea8f40483d2193b7fbe21477da -:013070fb321300c6adf8d0b26df2feabd620f4 -:013080c9e80a8f9a1f313b6fb38782d7025ef0 -:013090d822a60ebb70aeeb1cf8f107d351200a -:0130a0b1cb0853c153c9ae96d133e72b46b912 -:0130b0d10069d53c91a54b8da8f9dd5794d727 -:0130c08047e9bb0409eb7237bd1ad8f6e0ec90 -:0130d0d1c8707bee0c786a0bff723401abc691 -:0130e0150831499bed5f5987265b32874d1675 -:0130f0d5d7137fc2730959b0bb3a816bf3f9a7 -:0131001a643a4d6fd0b4f75125ede576c53114 -:013110a066e5d8717eb1badd035ad14ac59526 -:0131208c552cb125b973b4f5dcc6e84ef882c1 -:013130d9cafcce288d6b3d288cda00efb5c36b -:01314088895d3c6869747c0414be6e7ad1b9d6 -:013150028fbd9450309e96e26804d145399283 -:0131606055bbe12405ba806f0f4cd7e50f6bfd -:01317025d1ad35c95e8f5b0de4d2085c01b351 -:0131807daa7987de29571267ac4035c048ede5 -:013190f0cac6b81dd3b872c7460b0f61310644 -:0131a0be9032db7e96bb3e3bd8a434740b1e87 -:0131b00d49b9bc22ffab34df09c0e5ba0170b2 -:0131c086e378ff3812e27914329608b87e87f2 -:0131d01c11ca4f270af65fd084c2f0caa59630 -:0131e093fd42968bb6d8ac031c75264d57536b -:0131f00970634e6e0853a042ef183afca7e3a8 -:013200bdb950e20385cff98932b563cb5272fa -:0132109749a2b66014c0169e9a4368ae6cfb60 -:0132200a64061531bf2bac1cdb6a9f2b1dce1a -:0132302f2a3be8ceb4faecaf0253e6932767d3 -:01324031a17cf16088d9dbee48d85f450579fc -:0132505d226baadf0173ab4f34b7d9981f5836 -:0132604b75906a486baaf0d39095c2384c2420 -:013270e2e3b695b310f653640eb0d99c4dfcab -:013280e00f3036b41b3673a8fd3dcee661e1ff -:013290dcfc0647423a4d2b00076ae513d3d2ad -:0132a0092dac41aaaa8114b8407dd1ff75d4c3 -:0132b0562aecba3cf653db79bb68b641e16846 -:0132c06f4ce50746897ecfe8625970dc5799e5 -:0132d0f1ea4755ce844e15ca11301f2ede953e -:0132e068d3e51ddf2cd9503795bbe98fefdce6 -:0132f0d84f4fd6d718162df2c85b409fbf2569 -:0133003ba4d0e78d420bd23ab9fefae9865f89 -:0133100122be66a867bc0b19368541e10cdcc8 -:0133205bac23145e29d25c970ed9957ca7f7cf -:013330b751ee6f38f51a4a67f5019523a1c563 -:013340751938178f9e56155f60cbb8b6e5d727 -:013350b74c16f9f26e7eaa8ae74ecb5a3f27e8 -:013360ce6b8e16a8f591c2268aeb95b04949a8 -:01337045873fb5398d627ee5e43addcf3e7865 -:013380cfd9de586c3fd0ef824638901b60e7ba -:013390b7efc148de213654f671f58d9db022b9 -:0133a0e60af367d818b80aab1c8f8fe5a42894 -:0133b0ee7e575b413d6d19a8adf1b39609644f -:0133c0d768350937f2c9661dd1640a00593382 -:0133d0a9d7f71e19854d3e115c4e9d10c771cd -:0133e03cc2d9d630344dda7a31d31b4b834fff -:0133f063ca059edca3d96ee46fe4b00febb5c9 -:013400c8f0a3b169ed24da5c3d8a18d6ae0358 -:013410079c3967a39789b59f58ae99ae9394fe -:01342056dc26107ea8dcfd9d3ce52485caca5e -:0134301a015ba1aa802470968affa47fa0b51e -:013440b0748e1d954d0fe0218b589037a61d2f -:013450dc8824e5816c6d8625a7532f6a76b541 -:013460e25b2a543165756b04d5645f4b2d6b03 -:013470427abbed17decd6745d14990f0ad1115 -:0134808356727c9c54086eb52c566dade88d97 -:0134903b698f13e5b1154869f0919ac5151ebd -:0134a0f554602a5d0206a5f91ba54ed0c184e2 -:0134b0cb36b9d444211df102963ae69c4820f2 -:0134c0581608a3e76aa23d87c745b572285e1f -:0134d0c194dbc9e34bce54448ba87b5ed4b16d -:0134e0ef41c87efa4d44f4d738e9d366bb5c71 -:0134f0f3f3899d634bea999b12c1a0661c70e7 -:0135002b65277112e692487feb84ab05c263cf -:013510a4848424d076a7829148eecc56a37cd8 -:013520568a63d480c95a955c9017525af8cf81 -:0135301ce0839eca075cb83c9299b6945e7ac4 -:0135402b6a323b1265ec1a71b06f223ded9581 -:013550487a153dcee67eeef5d6b76652d13e0e -:0135607625deb19ffbd95cda74c315340a3c8d -:01357017583730a869689cb52bd6800527dc30 -:0135801f172b8adb64b384dcb5f60ac75c2b34 -:01359004468a63f6f5185ce2c7b9baac24cf7c -:0135a08e8ab51750ca2842671f3d711aebf40d -:0135b027ad92a57fb0f23ac9d84f10938a097f -:0135c0216b1de3587d71dc85289cdf8dad98c7 -:0135d0886db69d03f0fb405cfd86a180cd2815 -:0135e03ad07669eb7589973933185f8471b4e3 -:0135f0ef6084e72a2923f72da362200e36ab62 -:0136001428007c9bb23623b98f923ac4b98548 -:013610c1a01a233cec0647cd67234597eb0f45 -:013620195af4e799875a287bce8f8c5793ed84 -:01363009aa01edafcb2148f03c54fe7ca7caf1 -:0136403bc772c4a14160eacc704c850366f43c -:013650a76db7dc4c0883dfd810a7b29b9a687d -:013660862a7e5805d7cf891699e77b181cfc76 -:013670841f138225d74e132e134d6a577e3713 -:01368062ed232b97a6983deb34fdd2b554ca6e -:01369057a3b055a5fbbfc2d3852d2c3a506086 -:0136a0c31bf26f6f975435527319eabc70581e -:0136b0218a25a72a589fe6ab37784b54727a00 -:0136c01bab31a3c5a98a19883ba88b9ad137db -:0136d0d00146411ffe41c7fbe103867154b7fa -:0136e0cdba103df73dd0664f35174a3282176b -:0136f09da1ae2218c68d90f68fcd9a2653ae96 -:013700ef2cb122ffca89ae3174e83565684ace -:0137102e1ca6fdf4e147dfa982e0e4129c659b -:013720b5518376614e51a3e42d6cf57cbf56c2 -:013730cff67bc829a585929689bce711341db4 -:0137409d421662fe6213e7120423bd7aed1f3b -:0137504e5f5192bc85ec440f23f8882fdc68c5 -:013760662e9cc8526cf6d530a8b1d63de660eb -:013770aef980b5c9d13181a3a700cc1e05aafd -:01378070c763289a33016a20550b43749a1a04 -:013790c50d28bccd58b5ca0a4d36119e8248e7 -:0137a06976e50f980e2598ea97c5a6d3ded479 -:0137b0fc39f80b968bee1e4a9cd13e7ec412a1 -:0137c0b878348b1164dee0f8ecc1ca3db29c26 -:0137d054605558a084233bb01d287998d23e0e -:0137e06689b1ad91726e6a59bd948ed13beed0 -:0137f00a8c406dc8f96006e4f3e12f9e9ced5e -:013800a697a7c1e08ea6a04579b4ece0413258 -:013810c0bba389790fad27447ea65cd1d0e9f1 -:013820e9f6bc2364af54d981b43eaacd86551d -:0138308d8d41b787df2af99ca72d11cb8fc31c -:01384031b149adcb10f322e686c7251c85fcda -:0138504c8f7ca97f2294312bbf15b597c44f1d -:013860373da790027a547b62b13ea790805a91 -:013870439a1a5309208bc3f8195a926155e050 -:013880c59256bc0cb0ec065e8f7b188203e14a -:013890e061c37bcb63644516e37914b1599de5 -:0138a02f059db06650f193a7b732621792064b -:0138b06ad14d5f874c140d2b67e2f15adafd1b -:0138c09a933b0395ac086ce572bb1ec1baf752 -:0138d09d2f6c3207b5d92c028e3ef7af8f183c -:0138e0857fd896cc5a5ce74ed12210cecedc25 -:0138f05a56510f94b3b076fc7a9618deb1c38a -:013900c24ebf58c2a999defa3960ba57eb481b -:013910188a6c7344c785d21f803e0db1dd7ed4 -:0139204ca3be9810c759851be600ff1c5d5ba6 -:013930a4b78fa78e04bf6de1c58caf8de45012 -:0139409c70e95c3fd3bd5266c70828dcc1ba07 -:01395066633923fbc17190aecf8772d0eedd43 -:01396054eeb2854f433cbec5077e10cfb7e8cf -:013970ed2f4a77e7d6b87676fa2507dda78657 -:0139803ea2bf052176ab6a0bbe764158cb5983 -:0139906bf64c3992d760b09c6f2e5782fc22b4 -:0139a02124a9480fb18b6cef37b3404d9f9d39 -:0139b0c23866a15617931d73559d8704b66782 -:0139c008adadf318cb140c7ec2c1a5b247b703 -:0139d0d49fe7016e6eb045c07765cc4066ca2f -:0139e08d87c7e746ee860b75753a5cfc5ecc5e -:0139f075590f5064f101acc1c1f7b3e0bba835 -:013a00b449171212bbea0f9e87a182baecc88d -:013a10014014e818b2243780dc435055d19fbf -:013a20a68939b5e38188918b9367994e96e6b3 -:013a30d01e2d8d043b64422d2f80f6d691c03a -:013a40654932b1fae064126f4a3853b2d87165 -:013a50d1cb71b547f5a3e160e9b3a419cd8837 -:013a60df00da1335af8063a49ecb42eccacffa -:013a70f89a8735710302de7a5ffa23f7bee09d -:013a802220dd35ea9454d6f77da08f557feab6 -:013a9059e6944a309b0ad4c6af670e4d753582 -:013aa0bbe44787c17996b48b6513d30561916f -:013ab0dd1f32678eb5eead702ed18db9c973d1 -:013ac01ab340549b1d786f94b16dd1b943d2d8 -:013ad0a5ac595543161f2a7caef197776d7e70 -:013ae0a02959acf9eae37ff2c720b9bca7ebe0 -:013af001ebf1efab2ab469d938aa52c4663101 -:013b00bc9087d68ab5ab74a42a83bea94931b1 -:013b1064300b9e396cf8b7d82b40a578c1859f -:013b20ed03f2781e10493d918f7d35d2ed298b -:013b3019a96fb893f1974f0947594bb0eb95a1 -:013b40672133622993c270b9981ceaebf91265 -:013b50bd063155e93ef682a802f01015766495 -:013b6089d20c9ac26e2008c445a49e43ddffd7 -:013b703bebea5f302c6e18fe329a1adfecfd32 -:013b80ad2d6695df9a49996868f89309bbf94e -:013b908f1cf54f13e632cd37dfc1a5c52bdaf6 -:013ba0c859d3a869a1aee44b222c34ee153e48 -:013bb094b62bbdedaf213894c066ee46dea9c2 -:013bc0d05d09af83d08e1722d911e7964698e3 -:013bd088155c066c0d1712bf8920f82d3bcf5e -:013be004751560ab107f94e582051b109e06df -:013bf06f75eeed30458f1f9b7279873f10b3e3 -:013c00f80525a998b40edcd9bfd812d0ca0763 -:013c10a1dec3b0acc81c68739c715cad169230 -:013c203d55409a3bf91f433a8b9118dbe6963e -:013c3052559993a4dcabe18bfa22f4d9cbef3d -:013c4031f91d31d8a6d637221b037d89c4ac96 -:013c5027ab671e6f82541df94136633bdc28b9 -:013c606a80afa8109b16459e2cb134e79df292 -:013c703e4da6e63485334f81a48a4ca05012f4 -:013c809a5a4c749fdcdf1ffd413b8c0de30cea -:013c9019f8e6db2cc04380b0ca956fcd5ec541 -:013ca0f885c8807581ba66c57cc21cc166a6a6 -:013cb0103cd546651fa89519ea5e8a4da87fa8 -:013cc0415be038f771c3d67c2d99256adf7e27 -:013cd03498dc32e2d2c10b5ee187f9b5777e23 -:013ce07acb0c60c09853bdb8a1be0b73a974c9 -:013cf0bbb4b905b4b12f2de18be234b4e3910d -:013d00636b1791481f65a38ec65f657255ffbc -:013d10c02992d39b5535760ce77055059c96ff -:013d20e4326e480269f4aa31b298d9ee11b6aa -:013d30391fab646f8dfcc1b21e4dfc6a5f3771 -:013d402dfa43e534899adf2b3560d8a724a0a8 -:013d50b14413b8b2336994abac01000944f026 -:013d6093db1fbf928197b89906bbe224ecb738 -:013d70038f05eec69e6102d8994efd6e018ca9 -:013d8038f401cefde60d3d2e32498e2d7af629 -:013d901a1fe1dd444ba37b2cc3dcfbc442e8f0 -:013da03f4fb3eea030207b48cccb4b801e5f7f -:013db06501484e334c71287a5ab5c01940dfee -:013dc0dd7e864e8b02c5796ae15629773b30c0 -:013dd0bada71e8058e9006e7afe884f94ae56a -:013de0c743fa5cd045705c1db7327cf1c67f22 -:013df06f827c08a8ada456148e9bd399722d48 -:013e00e186180d491fd483d2f953bf0a5f5d98 -:013e108b9294ff22626c3ef50bb009600fb39e -:013e206271c9c3e6e7d4983f50478b58d79dd9 -:013e305440b8e6d91d27036d79400b64bd7fed -:013e40e3a4f5726864a2651e2b47cc5e615518 -:013e50f9833372bfc8f974e1738f67a7446a05 -:013e60f0d9c7d37b7418f0315c41dddc196130 -:013e702c3c0fc8555800a04c3e082c77574fb7 -:013e80dc1eae1bd33c3d42569fe8bc09b54be5 -:013e90c3e77e504e8654f5d918f579929c15f4 -:013ea0e27e0e4750af4ebf983c3ac51f00a459 -:013eb0d3d1a861441002e0ac0df665d8465ba5 -:013ec062a861e8d93c331fda518e56b4b57766 -:013ed0c3232716dd99aa100c541ce3b533c269 -:013ee08a3c0c7684d3c86a3b92c734f39b4de0 -:013ef01d308ef31dcccdf80c2b456ed7b4641b -:013f0062ae1d8e66f0c331c6c44e35a02c207a -:013f107d660d647f664b60ef3853de98c27094 -:013f2000dfc703257a2e5815b294d2b98a1a07 -:013f3058657ab93117eec6e88aaecdee67b28a -:013f40806bbc18895126d4511457b274bec80f -:013f50ec56ded42df92ae18f112561187b2040 -:013f60a502cd35a2ed0cfdee4baca74f8d3137 -:013f706a486ba690cd611ef5ce7b9c334c60de -:013f80838cc7d196ff5a95c47b3c5884efc6a1 -:013f90b9b32ce71caa3fe90f680e3f6e0a7222 -:013fa01d3983128370c0c962f1f7b8d738abff -:013fb0482a582b7b8ee31cdb8273f176c397d0 -:013fc00293c5444d55357b2bd7f02885cd7aaf -:013fd0b6060e7ffb7aaa736694db1049bad672 -:013fe0c6b826df7ebe857b291bb6d73f6a0160 -:013ff091dd33db0ea1bba76ec79fcecdafc2c3 -:0140001cc33c56d8fff4b4062609b3f87b63ba -:0140109bef45a0bb3086cd49d96567e2af3142 -:0140204d897bc1762013bc757a60c07c04e337 -:01403042900a5f9727bdda72a8c486230aae9a -:0140409f432ff2f6bf98f7d8b7f95705573b45 -:014050907ee7b77febb7ea5d009794c8750a10 -:014060f36273facf21e7c885e3d57d8930f8b2 -:014070541cfd8df99a723d1eaaffb4f874b502 -:0140800e5ea4ea380b7fd89a3ae3729cddf7a4 -:01409010ec31a6b0eb3b5129ddba57251f86ab -:0140a0fa7c32dc6be4b160d729572fec6cb7cd -:0140b0eed2109bc8a46dfb4345714757700ed3 -:0140c03bae5bacd73274d99d5b281aa288a0ab -:0140d0e0251e1c12b882c1f5a06a331546cf20 -:0140e045c0072f6b45da8d00f7a077168c07a7 -:0140f0d05ec0cf3e4de731c84e1c17afcb950e -:0141007b26e096f311962dceff205294ad8b4f -:014110ae96ac6a4b182e7fd626a9eccfbc0798 -:014120c81e72893f1b10d549f7585ecc460467 -:014130ed296bbfb6444a6a96ec78001fcdc344 -:01414083186fd6760a39e082b635ab9b929a77 -:01415001672c4e7e1ec7e4c0aff7253d9cbf39 -:014160497cc0a1683b8d17fc538b3336ef4064 -:01417051323c236df23b2767fc2c7c44867b4c -:014180f1a4e434ba6c1c36cdb3b9c82f461824 -:014190cf4333ccec9b998794eaeec466c699b1 -:0141a0f0517d7d362090a559cfd71f15bc4942 -:0141b0fa58c15952b87e2a503c795c048dded9 -:0141c0910480271229c87b4258553e7015c1b8 -:0141d08b035323c3b3234a5758d46b176a83fb -:0141e0e620a9d838c6852eb7b998344f30901b -:0141f07e2a80c528d8733c6262f9c791898ee8 -:014200ff1269b8d19b122e703f2a8d6e2d6ca1 -:0142108ee8851f4d8f22b25f340d79a5ed6241 -:014220a5dbd724ff027e6211df23590470c999 -:0142305438953686002fe33df5d14cc1e236e7 -:014240565a1f35ba4e7ad2943e280b5ed8481e -:014250f00d734885d6d21deb22b6d263e67679 -:014260306e4013a2bf08d5116ba410418320b0 -:014270d113eb7fdc5363e3cf94da1909b316ea -:014280f4aa1d49be604ea2f126d7fe22789b29 -:014290bf6b2a0fcff501a6ec3ba0aca7564505 -:0142a0ae01b4acd2f82c4a096b070651343179 -:0142b00fc1d8b16fce75e103d67d1a1edbb1f0 -:0142c01ddbba8a7cf111bff4174483d5e9e77c -:0142d0b197b4bb94121a0f1591d8e709076e7f -:0142e01741a11059b2581c0464ec48855e719c -:0142f07a03fec65e5db793dee47ef7234e39d4 -:014300cbd5a71a191af50b9be8f069623cf81a -:0143105376b1ef27837379765ae02d56082107 -:014320fb79376d34bb40c4f7d38617f838780c -:0143303d88319f39b7b6c4fd5655ac0c7cccf0 -:0143405619572a5ce08da316f50b7bed42f93c -:014350b864e01a1725129fa50c3d915c9f4350 -:014360432161815267eddbb3df0b5393f6d62f -:014370a8305791c4a4343e167c7f7babd5e1a4 -:0143808b7c91233bc15c271387a705eec5ad56 -:014390ef890236e60e0c9fcfbbd4fbfea2320f -:0143a077b947cc577e6dbee2d50bbaa4edfb7f -:0143b0852a0d365d36f628e4b11b4710116baa -:0143c000e99620bfed7a917aaac954757f01c1 -:0143d02357dfbdbe1bec40fc5b5ebf462df46e -:0143e0210b46a4c84aac7dab701f21a7581934 -:0143f08e3220812058eb3e58de638b9d3de7b7 -:01440086569d507f95246b5375ca822bd688a9 -:014410c512081fa6174bdbbc2c37dbc4279702 -:0144207a4dcf855a1b648f88ce4dc801e820b7 -:014430bebe0e689f487477cd0e0696540fbc72 -:0144407467d8dec32468b3e53b8e22863e2015 -:01445037752e4160133e799575dd4277478a31 -:01446030a9372fc7f779513142ff9d5d70fb23 -:0144708fd8e635ebee37cc9c11e3918109accb -:01448095ddba4ce7c4375507ecbc3fc16fb77e -:014490e18182ec88c2b11890322d013cd9f53e -:0144a08462500146118f0aff9e1309449684db -:0144b0ea021a4b5984d98fdb1eb337f5fa895c -:0144c0aa38bab05fd740d36767ff52372258e1 -:0144d0b2fe9ea3cbfa6cd5e860b8cd86e9d98e -:0144e03cefc3f89df6f5de5d9def6ac06287e2 -:0144f069049ab4e09a7ae9546f1baed0d6eda2 -:0145008efee5963fabb1c87f5ff21a87a22774 -:014510e17759bc3ea0b91f21b5748649bbd07a -:014520ee1e860ae416b1b7950c4b186db57d35 -:014530a7b54a3344e4c67cd1f8a1ee218b86d5 -:014540fedee5d12f04c4b545ebd696c78ae33f -:0145504d8d8a3d1240a633d8efb73f5f0c5743 -:014560e4103e1d6114b3cf6694652c28cf506d -:014570ecef00bc1f981c91fe4404824c27a74e -:01458002fc6142d781528e2a6a3c34d190490d -:01459056a07fc9cec649164e8c4c1c6271fbac -:0145a0da1f1f373f26192d4e3c1e8bfd5aaaff -:0145b03c8282e9caecf350b6e322c385f3c26d -:0145c022963bfecc5f5d79cb793433d10aceca -:0145d06e922a6c2c746322840bde2d4135310c -:0145e0c658e6138c45d2df38848eaa979efde9 -:0145f09ee5e41ec01bef86780f92a0d6919ba9 -:01460084e1f46d046e0a2d662066887989a18b -:014610a3ab5bf2d2314a40dd01f9ea93ad1e6b -:014620396faabf8ae0459e2bfe4371bc0c3ef8 -:0146308c05976b8a4bc51f2bf3c69f8af163d9 -:014640fdfa90cb529319fab1decbff1c34589f -:01465039f264e6c1fa4e61595788058104fbb5 -:014660770341292669366f277bdb411f1201bf -:0146700d834159472538abf25f34e4c69d3de2 -:014680ff638f69f7d18de8180fa37a0cbfa267 -:014690bc05117edc67cf9dfd59a0abbf9d1432 -:0146a0f35c15141adad7f1a53d2d91ebc7fb83 -:0146b0241a4a27cb5113ddc584d2effeabecda -:0146c097ddec9c7a30af0c0ee63dfe8bb8da2a -:0146d0b2cb3a86b83363d8a0be275a4d1fa435 -:0146e0f269434752a025242086ef1a635b335a -:0146f0ce7c7d8f9992480e02216ebdc1fbc190 -:0147002ca9c4cf56ee3db502fc4cfbe8d25c3e -:014710316255d1f316e6c4c4fff742fd6ed718 -:01472063aba8d1191125998a6aa41ea9f2fed4 -:0147308323063425c9ec90032d4d1456808064 -:01474026b972a64552a56bb99c7f82b4b08af9 -:014750c595a00f7927a40c7d40bc9f8dca86d6 -:0147603aa8c947758d8259613f01748e619ee5 -:014770c6dc9a5c3f47e4dad533ec0ca4bc5973 -:01478021ffb4eb25d041b1da3517b9900edb61 -:0147903fa8c6750d9bfb8d23f5de26efbc2836 -:0147a03a38a9145ef8e272d462009fe0a09354 -:0147b0a88c4e8d604ed64b962b61385e69e789 -:0147c0a63d260ac801554e6667bcf35e315d8c -:0147d0a09ff5a031bc7ce42530828486297eda -:0147e0b5ae9008eb9b2deae0064dce44db823a -:0147f078e858d670eb6c3539cfe9ecb67c0571 -:0148003740602b61e7f2fb08f5b43836ceffa8 -:0148103858ce078ee371096bab400cde33dabf -:014820a908ef8e14c1bf6a5facba796533ee7b -:014830627e01e61734c6e8b4ded836ab4acdbb -:014840299f18cbafc0673daa577badbddb4c51 -:0148501ca229a0112f97c868cb583c6d675934 -:014860d1a46bc97a352b737faaf5f9548b9dea -:014870d27fdcd7bc1f615e6e338c68c7241795 -:014880ccd30258c5e6282f297e2f2eb5281cb1 -:014890081ab86c34ed9b006192426a54e29c45 -:0148a084126e460a34c6c2141b8068e18144aa -:0148b0bfaf7f5ac9529d994132076ca4e723db -:0148c09ea01ad62073c0e33ebbf4f2e265f24b -:0148d03c5ca3a1781dc781fbcc93e8fc574f46 -:0148e0cc529ba6a8a9185df72d00cecf2b988c -:0148f0c9e8275fa5b7379b070a131d2c7ef94c -:01490094ef0cd8e784e14edf2f2b6f9e994e3e -:014910ee36a1a556ebf020127b3f310e8c9ad3 -:014920c9f18fda6a5210b5eb5e1328f756477e -:01493005ecb943f9373aebf767c9cba4892d1a -:014940b6ff860a8f9eff82b36fbf55e965694e -:014950b81b1d81160b1898ba34182566ad6981 -:01496009206b95d875acb0d50fadd47550288d -:01497051b0ae3e48d2fcf0f7908002afd93184 -:014980b9ba67f2c4cdf94060bd582c71cf4e91 -:01499056767fc46481e96bb57420a493c2f723 -:0149a01d5a51462796da4d6b2e5ecf7683438b -:0149b033444bb8f139cdf4cd12d81d477cb35c -:0149c087fc165972fc86b74162d7bc18611fe6 -:0149d076c60b68b38fc072d3726aa7d19e1c16 -:0149e085f6fee1ddd210e445f6b68c5ce2dfba -:0149f091bbec3df3b7e6f763881b3bde6b5f43 -:014a008fd3c40e02c1bbaee1af926d44bb017d -:014a10584de8567528e118826e5a79acabce41 -:014a20004545d4b489227ad7512be0d6850415 -:014a3075d42b7ed73726a94d4880e55362c8d9 -:014a407b81ed43f8bd213aee58305aad7c94c1 -:014a5054894bf0c25add086089025454ed8db9 -:014a60cdadda331245dc3fa7e18882791f4301 -:014a70180e445a8be65c73a69964ef1778f5cb -:014a80f0107982d616e27ac3598f0704912eab -:014a900efa42a379cdc54f3fab6dd3835edd78 -:014aa012165ea206b233054269dfb761cc7d92 -:014ab039bdf4177138f688e2a10deb0479e1c0 -:014ac0efce68f0ab8bc60688860a58b7063650 -:014ad04d7395aff0ca0fec85a0f96046383490 -:014ae07b883a1e5adac33efe1972969b682d6e -:014af03f096886d000048b9578bae9d1119c7a -:014b00b2dfa3224a9d9e41a8d3d7e64b5e5322 -:014b109821e912db1fdab5a2b13d35efccd2a4 -:014b20a697bf8a7f314adfb1deac830af6a5b3 -:014b307984d031b87ecf8e002da2652cdf3d2e -:014b405599c70492aff551d68e357623c6bc3d -:014b505c678b98c2ab337444abfab1904695f9 -:014b60cd8f94ded12de18dd54abd40aeb45f61 -:014b702fb4df916d2bc2aa798c9b647d7e82c8 -:014b80fe2c133313f1294db5f09cd2bdfb866b -:014b908e2fe4f224881a2dec58ca199436b6d1 -:014ba025e40eeea8673a9306c3e2478cc61790 -:014bb0c70ca9022ea719b2137bb0dddb527679 -:014bc056c36c75a3b506097e0266d467a4dd85 -:014bd0147ec9f115a7db3dec91ecbaedf9642d -:014be044fa4b3ece30be0ecd1bd371c2b4ce1d -:014bf09fcb02f375a5b405a3333bf906d1e289 -:014c0005a8dde299f593b0fc1fd5b005f7da10 -:014c10b84cfe93fb203e3e921ece3b0bd8affe -:014c20204c8f603a1b79d87574baba387bb3d8 -:014c303467bc4980412f780001f40362466b52 -:014c40bfd9c96494beb8c57aa0f4d4f77b9be9 -:014c5025b245fa5202bc679132f5397a314ead -:014c605cf72c9ad0e4fbe1d465380f30af9eda -:014c706af6b8b40de3ca01c6492ee95a90fded -:014c80546abe851d9906edcea0cd0f880f6f32 -:014c90015d115799a12b8a044aa149d450456b -:014ca06c97fa4a19c5869854c7fb219502a452 -:014cb0cece5570d7fb3057bc9ed1cb2d111e8b -:014cc065315e2ce895b9407e328b56cef6fbd0 -:014cd0ec58f85a1a90a8338d86ca883c075021 -:014ce08d97055df519b7bd65aa43b0b6c987f6 -:014cf0be1529eff918272f947a302b3e0698f4 -:014d005cb81fe62eaf693de5aa277608e38b46 -:014d10079948b8b16dfdd1e36277fafcd0d26e -:014d20f4bd4873e5fc0d9441c108a0ee96df62 -:014d3071e4908b0a39d913b2dff780c5d61070 -:014d40e5eae7edfc49ef34e773d750a30ecfc9 -:014d50d07d4c1a3fcedd0f943f4d589e97eeff -:014d6000f9537360a71ece4528922401de73d8 -:014d70f5ef410c9e7e149a6c332b3ece7632a8 -:014d80db337f6a73ac596d7d781cd76e5f0f8f -:014d90d27638482bba88d1e4997752c2567065 -:014da0522e4f7fa5e0aa1e3581a05ec9b453fe -:014db012dbed7d5992916e8f12ab0c18832b20 -:014dc0f137929c27bd65100d6b9f58e2f4533a -:014dd0a045b09ce57bdd241dd1c5840e5dcd54 -:014de00c8914e8d3b2e8f6a850e4c868363beb -:014df04ddc19a437b6f103f4e36eda4301db8a -:014e009f6dc6f4c29330e1edd57b212ec347fc -:014e1088c91d0f199b4dbc47a7909788f142d9 -:014e202b0385252abbf474afdba77f64fd5dcb -:014e3096dd1eed0a6d533934c60df76976da6e -:014e40ef78ab8a84da27b80f9ce3f0ef13a401 -:014e5012895aaa5a08d1420e0be118c879c8fc -:014e606448d4e54ed24020c6b1a1fd56f38aab -:014e709a8d36d2b95fc61607e30af5af0a4174 -:014e80050f800e6bb0479e20aa416875eb2ed3 -:014e90145c23ca49fed97611ac3df96e2f7a86 -:014ea0fda6f67d7a0b8512a21dc3f65bfc43be -:014eb037ec8e8fd3aff5b91a4cb16fa9869fdb -:014ec027a3deb323619da007b5165f217cf292 -:014ed0c7e930fa426c1a535ac8ab8abf1d8bd7 -:014ee07a9979fd0a2853e4b9e83b6bf3661f7c -:014ef059e024975f4e12ee5f2e29cede74661b -:014f006f32f135174aa22e69812e8e41416cf4 -:014f10c3b419222363f43d8e08b84ddaae2250 -:014f204fd68da08789a79075edd87b5c937461 -:014f309bb0cd25fa3468898fd5002328fcebf0 -:014f408c5c62f54070100f92cbc004729e9fcd -:014f50dc3b4b7da835361635a66dd6a4e78d00 -:014f600632884a2058beb563f2172e7b0318f2 -:014f707058e68fe115930bae7cb4cb551bab65 -:014f80c94652429527603d3787880e21ec8e23 -:014f90f7442b2d45dfbb9dab1dfc846f5a1bcc -:014fa00011a94f61d0a75abb08996931ef285e -:014fb0fdc3235ad63c2baea3da61a75869dea7 -:014fc00e2358fc972373340eeddca4f7d8ea86 -:014fd04b0948b1eb97d092623e0d0435be215c -:014fe09496f9426782c468a76d93c810570eb2 -:014ff0fd450be0420bf2e7ea56b7e7c145c0eb -:0150000c0951d7b1bc69cf73db4199409fce16 -:0150100022f444081e2c01ab54f9fe85c4a787 -:015020927e1d8557c749b523c7ed9973b1569d -:015030823477253cca4169c9a20c167341931a -:015040f8bc3cab659ef25fbb77bbddbd1155e9 -:01505030276739ddf32d3a94bd39322568d663 -:015060044b15420075f727f673a4ae489e0a24 -:01507057de1ceff70680398daabd13de171533 -:015080d8cd9cdba2bcfb70df68f707367f706d -:015090b534405436dec8bfe9dc67e47d7d3ef8 -:0150a00f26422750905a0bdb19cfd66badfa9d -:0150b021cdd1c59960bd6872e9a8c6302cd3d0 -:0150c05f95c5c329224a321a1f750ba3721858 -:0150d0882d5a607459ac955e1abc6a78c39dfc -:0150e0a7a3796d9c3be1ae51749f45364dfd77 -:0150f0d78d32c787adc9395db2387bac064481 -:0151007aa2cb98d881ebad70454aca02584b50 -:0151100e7bd3ca238cdf6400ff84b846d408ba -:015120411588c0b3015ecb7c3c7d874f1dbadc -:0151302433df34642b010a75abdb6922ecfe9f -:0151403ef4bd9b60881a87a60e4d984769a22f -:0151508beecc41e8a1109331a54181982b0556 -:01516084dc8350810850f5958e85030308e2c5 -:0151700a5ddd18c0b9d28751d0bb9bff4ff4df -:015180827d35693e63504c4c56d620811b8834 -:0151902de2d66c2995573647489b18a25cffb6 -:0151a03db77e6e4b038b65501b59ee579ea107 -:0151b04c98712d5cca978c5fee5b371e4e7ff0 -:0151c05fd1d005b819017cb42ad8dade604923 -:0151d09d05fdc7d29f58740ff597e648bd88a1 -:0151e0ab647afbeead24eee8c927ef8a5ad351 -:0151f06e6d13cf888f06be7e5317dddd51ad67 -:015200f4bba925f446c2c4ae58d242125a178e -:01521028c078372ee33c26d0f7176ab2f8dca6 -:015220046aef8133ef4c31eec9f69ad19d471e -:015230cd990e5bb7fc780ed9a7212e8c48fcd7 -:0152405d33af0c0440f0fe7157c9ef1a0e915c -:01525049f4bea4f9d48803f9c3c52246f36882 -:015260929cd91f34b11fc32fd2bf7b0ad4ffe7 -:015270f6a1029de6edde9ce4e7673ae8060124 -:015280220f7b7e3fb02953aa164d53c9e1274d -:015290a580625caa25701ca5715d2bd6b4bbcf -:0152a040fd64d355cb0dd4b512286c15b0e9ba -:0152b00b0b220f4a0de4942885e74a211f0387 -:0152c0c9f18d316e75b98db7bec54b6bd2e625 -:0152d062faf681d4bbe483e0f45078a3615d19 -:0152e01624e9925d6ea9d8067589ff85b13d39 -:0152f07fbbb4a6d8c3569aa5a0712f1de0316a -:0153004d643353f616f8b7992164f17d5d8b1d -:0153102df1961692550e932a4c4d1dd7434bd6 -:015320cad6efb8e8653473f51ee1e4c1c5f8af -:015330a28046cbe97cacf983253ea74b530069 -:015340e4f3e18655dfb5edb59637094426b362 -:0153502ccf9def9aefe9294aa2a9e07c2415fd -:015360eec46e10254ac3356b709dcb772e4db3 -:0153708776d8e967e9a7f2123f4ec41c3c5e7f -:01538018b502ee676ef747056c5ffeb7de6711 -:01539092f9ea8b458793d2d96902f63cb04f39 -:0153a0f9aa8b8b51ce28bb228fb2a7a6343b6b -:0153b02fbbe0c9bee1f83de2d864a15fc30149 -:0153c078d3af1209208783aa9da52263ca1820 -:0153d0e1b18053feb9e58680c00439c8693467 -:0153e0cd0aae5e3babf86b999d117a154abc03 -:0153f0a9928acfaf27a79a5aeda95abd13b9bb -:0154005cb13a6c65843383e8a92f4bc8d499e5 -:0154100bfa4e71dd2b060d560ceee19deabf74 -:0154207d88c91e7e28bfa4729be7c3ef8bb5c1 -:015430a743ef2837129375c8b9724b5301f87e -:01544058c44110dc71b4022e6cf99585399a7f -:0154502904197956d1c38028e109e29800f97a -:015460d788a31950f9d8d7a7cc293780e810e4 -:015470b93e5db29cc9f61353d7ebba47378339 -:015480f306fa831ce6b85f5d931b354be939ab -:015490a798cd5143d75f8e71cbe74bb5bbf702 -:0154a0d8e3424708c2b17748a2149652f8da48 -:0154b071da9656f5b906c12b10d6a3ab8e605e -:0154c060ddad6b1f2f3f932e3e448933e23235 -:0154d077160fddc9406f871155a229a7694838 -:0154e0f9824f88466490bcd18ad15c92d4ee68 -:0154f09e524416e276e5598540b3d1b597c5b8 -:015500922e1ea23e8fa9dc2c2f5de9f5aca030 -:015510c2b1d0c69527d3fea0fc8f9816a4f2f8 -:015520a27fe3aeaed848de05bf143a5a5b3952 -:01553083663a41cdd47c200a12486834644fa5 -:0155408f462392c200a3e24af88e7480d1e01d -:0155507e5046935aaf84a86d75e54fd5989ff8 -:01556018fe1eb369a5142cbd24ec849c5294d4 -:01557090636307c76fff8e18ae8256ee7e5b06 -:0155800d264964daa32d808f33c0f180a5c196 -:01559092600b56e8b2a1b9ab280a816226ffa3 -:0155a0c1c2c91fd667dba2f9f0dfedd1ccbcc3 -:0155b083b7ebfb4da431b8fbcee2a5d6e984ec -:0155c08a16f893930c1ee4709340a1799d059b -:0155d02ebd658fe9741e4c1ec5a358ac6126df -:0155e0ddb3f215ce5b8da35e4d3ea995dd4bb3 -:0155f0b09c53184934c6dfa3a9762a014c53dc -:015600a79c1bd410fba816a36d507ea7116bbb -:0156101ebc5d5f6e84521583aebb22763bcaf5 -:015620d9e4eae57a2a7d50e162728f24fbf2d7 -:01563036d1da4c1b90146b6c24875113646013 -:01564024c7e58bacccdb4508178701e633528c -:01565055150b8e8fbf3f601a648b07444fc506 -:015660ac600243d2f692e5a72c7096894438cc -:0156709a2e829be657890ad8b0496319048830 -:0156800bc51f2c5518ff34dd1b15000ba11cbd -:01569027e76d76d9b905e9f1a3766c8dd95066 -:0156a04268d6438e7fb0f76ca1282049af6b9f -:0156b0b55608657557cd09f5911a87f0227e31 -:0156c034298e96e145a3dd7ebcbcea0c3bfd7c -:0156d0adbc033db3a7c0315505f9e82364c9df -:0156e0b42ea53cacfd1b3dbdb370297300e9f1 -:0156f0ec2bda73044a35a30f062cde834ea522 -:015700cffa7bd57c1addc0ad4d1b4023c46527 -:015710e0c29739a79622958c7813c6aa1de80d -:015720eb47dd149fb19035ef39da4c73e9fec1 -:015730e0c1710f6c2ddcaa75c4e49892942368 -:015740c1b72ec9dd15aa1595f83fde32b3729c -:0157502fc581a6ee929b446c5577936d20ae83 -:01576052c8a12f5784ef9f78cde3ee9e72f8c4 -:015770f0cc0ef3b84d9cc955cd25789ff4e0ea -:015780023c21e167ee7af18fc952c76b9c7b42 -:0157900c8429474aa8f17e4118b6f92a0029e4 -:0157a00124cfa6417cdda11221d5b9a5ae91cd -:0157b0c999283f59ebd13b368acd769c4f7261 -:0157c0e0335941551ab555b41225831ff70ee8 -:0157d05925c6cf4ab5ac1b70b657895b2bf654 -:0157e037c5946a75f5adc55c1b044584966b15 -:0157f09712b32749328a39fc12ce4012eb6986 -:0158005bda6cbd74769414ca0feb14bd9ab6a4 -:0158108d75ed82746c69962f2c6c6fe32eadec -:01582094677c2f1a88dcf81b886e03cde4d45a -:015830d9ac45ca5f127bf8bd39617161b0a455 -:015840c9ca31487c3409a1976443ba20fb0497 -:0158507e56526ce080490759355a184b85b6e2 -:01586096d44bdd1de0a954d09f62a827657b2a -:015870209970ffa70042975e26559d0b4987ca -:015880cc81a726b36ab6964a705bca05b75a38 -:015890bb291e569260696f5f457207f59bd529 -:0158a030b026e01290a07c62c97d899f08d9c5 -:0158b073d18897753250f935fd126f600b0942 -:0158c0df9969d9a21ba6ce3006a2aca38368ac -:0158d0670508a3d8e7c17dbe4901bb6a36f225 -:0158e091ad94121d3dff60226aa8d04eff4dc4 -:0158f069c7fb652002182acb1daec34adc5712 -:015900ff55981d9d8744ac1bc55d8a4a445af3 -:01591062cd76fcd701d8cf2f2d4043f6e1a75a -:0159209c8f430da50d42d85be09bc50517df82 -:015930e0f9a8571d564d19ebc08c142ed89b75 -:015940b80c93647f89e31b4eb56ff8eb2ab082 -:0159500ddab25011f7d827f8a846c25db4b1e2 -:015960968c901cd6849e6f0162fa81a0174f34 -:015970a970b33af2d01f5addd682280a59b3de -:015980703e8e463dff497608d2cdd63dd92ad5 -:0159908e9cae0aa24fb8499653e9a135f45341 -:0159a0ae042c274150d0ee8338ab289ee96060 -:0159b0dc5af0f261ceab80db969d32a4766997 -:0159c0d6892b9c626392e672065f4cdc650b30 -:0159d0d7037d782b807d387e49441456f3d6c5 -:0159e0a0060702c3fb5553203ff3c9222444ec -:0159f083a97aa2e153870a8a3e9f248b1f3554 -:015a00d45771aaa5b31ddabd28d0910d22d067 -:015a105657c649d08029b337882fe279414bfc -:015a2019f8f752a1223c75a0195cc3f1cb8575 -:015a3054459f91f92ce5c8f8368e3c172ba799 -:015a4025ef6ed917a5a51bd9b8e48b0e813735 -:015a50c2e6e553b232c7e4bb339b8360f52520 -:015a60889f553ae13ee63c7a7b02d71617821b -:015a700d779f354a357dfd6256f18fb1116868 -:015a80a6bf622937c76ccb78f629399d9be998 -:015a9069b14e90e740cc31ec3064b01eccf242 -:015aa0a9b6ff8e0d7707dea8e986b7f1c15164 -:015ab0854a00fb18c162fc225e5a2abefa041c -:015ac0b775155afb75666221904e7b6a1f436a -:015ad01e12330b20392fcdd00b628662a0b01a -:015ae01a0370e479bccab4693f69e08a327bcc -:015af0a3603e0cbaf748ee28c9e7fee5254e64 -:015b005e349f373213d339d4e5f073c1343eca -:015b106042738a7c9745bdd9969094ea5b12fc -:015b20a0a3a3b1788c73543b36b4cc081b33d4 -:015b3099dbe171ced1c08b81c5e0bc8b47043a -:015b4067fe8e8e9cce2aa50b267f2ba305df51 -:015b506d9cf9fc91fc89b753327ec35e3e91b8 -:015b60baea6fa5c5d429f879a0d45fc6fd51e5 -:015b70535cd2ab7256f7d44362d648915da63c -:015b80d9ec8e45f5699e348ba597892849611d -:015b90492895459918aff0b7de876d7c2f68d8 -:015ba0360caeb948255ace2ffad0295a733e30 -:015bb082d8fcbea78be749b1c9557a80593b91 -:015bc06717be85c26e1aeaca49bfce38986256 -:015bd0536b588396479c9b45c16c9233d87d92 -:015be0e20acedd227d2ff8dfc24523709c1a49 -:015bf0624112893819c94c6538239fd6be7be2 -:015c0001db43412b5971485d335be39a1f6702 -:015c10528e94e37fb73d8b02806d169ecf31d0 -:015c2088283126195a20e84b7be851aaeb158e -:015c307335d0a5b848664a1a98367fe5739a33 -:015c401fa709092a31211daa7d1d3e9e59f243 -:015c50033e12de922c6172141e419a1257bcbd -:015c60848331114e55ed69d5cc52b3228cf724 -:015c7094d6b18ab042c32c79ad2c4c35dabff9 -:015c80b76e86adcdc177f1619b35f39734c8d1 -:015c90dbb65018f9cda1e1936330ad592cb0e1 -:015ca07f1f61f4b1cf92fde31ab6e776a95ccb -:015cb0bd1c6ec6e5a8036b84d3dd88c33ce310 -:015cc0da6d33add40271b75ca9e15ec00337ed -:015cd09208f99469f8590f01c7f561aaf222de -:015ce0b28005f2c6688d414ae248f607c3a0a2 -:015cf00d89ee9226a06dc9ee60e24017ab0ff2 -:015d00e96522ed841907870b15caa56e01a093 -:015d108636594b7f7cd0da818ee96157ae91af -:015d20bee15c3ed4817958a634540aa30cc68b -:015d30d8e66c1602cc2711ad8d358e630d193e -:015d407f89d8d6af28639afacd078447311246 -:015d5000a179f5b9682ba17d28787ef5826bde -:015d60ece6fb48c9376d9494cbd1178707b153 -:015d70fc6b56e0776a000fe91df935cea1155e -:015d80be23ed5d598f4d08455416b38557bbf6 -:015d902ccbb33170c65548ce2a93e1c72189d7 -:015da05bd8e902c62b548005858bb06f47dfd0 -:015db03008d99041c7f604ee82f065f5f06859 -:015dc0fdf14f62dd5370c0aa7cde5b94d65cbc -:015dd02d5ced99822f0d370db184be8f0db8b9 -:015de0c19b24bdc9c011782ea5b974932a3f23 -:015df0b48f6d08fbccdb407766423396e1dbac -:015e00d1a8ce79bfaf7e34dddd0f8b3be1becd -:015e106dd2e4c814cb05dd3f12ab2e3a020d45 -:015e20076f82420a02853ab69d118a80c351ce -:015e301487b11741ad518d69be1fb6554ec69c -:015e40b9094eafc8238055beed8cf7f08bf2fe -:015e50d756937e343a02c8034276ac5b025bff -:015e607ac35458ef9b2e51595c8db746acc137 -:015e70133b9c75be2a9858322b51cd8424a1e5 -:015e80114042374e2f877e12fe7eb649a67588 -:015e907200c3e94adc6e976a7a442ffe5aaa40 -:015ea07b8a39702cba1c930069ee165cc09235 -:015eb0e7a329037821d672f8f45dcecee17a2e -:015ec02c6041ae9fa0569e077d897e9db3bc3f -:015ed065b68d7b4277061dfa7e811e09c741e7 -:015ee01f448c201ff197200de3a68de46c06dd -:015ef04dc3015d00e2b199ba076797c66ca1fe -:015f0000aef388bdec00584b950231dc0fa9fe -:015f10233d3c5f50d8f6ab0b621fd58771f0db -:015f20fdc6f69f651a0874fa8401343af774d5 -:015f30cb557435c95abb1080c3091a2ccd7e3b -:015f404c7fbaa9b813e8f0bff0c51b264f6fac -:015f5029fe2cd53e49e2e32db9d2df2f330ddc -:015f604f44be81f448b30a2b955a0613d15b6a -:015f708e283b222a5a340585f00c4cc95ca195 -:015f8050d000c288f537aa4982c4a8ab8d98a5 -:015f90374d5fbf9b197d86ae33b4c5eb850954 -:015fa07b6bb59a3def01ee685c796b3b432b3f -:015fb081ab2b36ae334f0ec139a949c490c576 -:015fc01cbf50b63dae520dd0a30ffed94e8965 -:015fd0e4292e31d451ef4b33d7b8dc96dd2a9c -:015fe05b00622eaf578ed757090d83b43a764c -:015ff078276f494da58739d09a2fbc1945c855 -:0160006a2b19d2675e245cc4df05dc8bac0c5f -:016010acf0097ee3b22398585e578c174fe870 -:016020d1f871d4264e82084ead9fff229a35f6 -:016030bef6aee9bc5e9e8085c57d291f743766 -:0160404cfbc92b62a7a89f77b085b5f325f2d9 -:0160509c738e856c596d8e2b4e86bdf19a03d3 -:016060f0c18570f2fec215c77fb8386640b548 -:01607046bafe2b226f39d6d71ba3ad63814792 -:01608086c8322e47dbf324c734e29bbd0bd666 -:016090b90eade4041cfb6fd0dabbfb8f3aede0 -:0160a0d6c009f5e03c0f838e6e40f6c7d3a55c -:0160b071cfc5eee9871d6b55e83c0d2ac23fad -:0160c0128a50ad20fef70e64ec2d42105e9c86 -:0160d0fce3f1cf7e2be7376ec1f0dc6256f703 -:0160e05e2fb1d0dc83bf2fc78a09b6878a9ada -:0160f0d06c5be2716e077e0f3656feebed1a6c -:016100917e8337076f77f7125716b5718c2395 -:016110b79843c98c64d58fde32deee291fdc6e -:01612091b6f68c8b1e6408b5dc3bebc08e12ba -:01613092f015e05403e6630a50e4149cfac90f -:01614070be003cb231be02315a32cea6fa5d47 -:01615066f5bbef09704e8df4865ea353cb5305 -:01616067e3da6c2797f69c245b64b97e4a1460 -:0161705e8b20e381fe6408ac267a1ae37ec7b5 -:0161808ea9b61fffec1095ac83acef698b5d86 -:01619053888382658daeeb9fc023a378d062b6 -:0161a05d55ff24c9ec426132a5dd44c06ececb -:0161b0dd511a02b1bdb3a609ff71121a4d9625 -:0161c077dfa993e629976befd49d30b370e2fc -:0161d07979cdef287a359694ce538e668a5d91 -:0161e0e51b76c76525bbc15c07f6407f9412a2 -:0161f0a27994b0c040e789ec37376c7da1a830 -:01620000f73e5cc965411574d44e2dcb12258f -:016210a4a24c35b1e073e81642ca568182db68 -:01622004f8b13164c0fabf45ce7293097ff168 -:01623028d03a56571ea7d3f25d1edce2ec8327 -:0162405026ef58b2790d0f13c70384fdb09889 -:016250ffe23ad625cea034a6ee4d3351a3ecfa -:016260eb766026bf65ff918b6b125e7bedc173 -:016270b0bc9dd0c3aa78e8f26cde2245f65d4a -:016280f6028f17710a440945e18b81442d0abe -:0162903cd35fc5d08fe580b18f9eb1d7e805e8 -:0162a0cf1d8d9a7b451fdd85be9c4218e7d7f8 -:0162b00531dbc311cb75e6ff44bfac1f7e09d8 -:0162c023988409d9294578c394b01fb3335344 -:0162d095c5358b15e782577cc1134416b41014 -:0162e05bdd20af4fd944c2161da14916121765 -:0162f0998eb2bf50709fbecb20e3f45fbc812a -:016300e020e71c7968d79b8c81551e30874dc9 -:01631020985976cde5eba54ac2690c638d5971 -:0163205202c5977e36f8be71d70a4ff0491974 -:01633079026d6ca41eb3d2b86952cad672e8e8 -:016340e9ce1922b33baba3c85a5495e8e0a9f4 -:016350042ff16bdebd884684875136679783de -:016360f728d8e548ee73dc1a4c15a9ad80f888 -:016370c19a8f4ba0d44637128eb4d4ccd8ce05 -:01638016e0f600463a662799663464324e1882 -:0163906cddba5c7f8c9e5bb6bf3d590bce8694 -:0163a06a924b6fc9f476b0e2361c0c7e2f9061 -:0163b0dbdf251c5a4d9f9a88138f04121bfd5e -:0163c0eb3d940699cce3f063868ffd5ffd592d -:0163d0fd11a2e25ba32a1e803864a8821fe65b -:0163e02bfde74c7183d1bff91c1a85d44e86e8 -:0163f058a85022860ae822a54c802aeeeb3ac8 -:0164008be27ea82f6ff93420b60544cd9f4782 -:016410c316cc77dca041c9a4f102ae45d68136 -:0164201c0cab8f2139e5f34f658c67b537513b -:016430d9254938369b44148d245a90b9a7b571 -:01644028212eb2a9d8c723094edb2493eeb68e -:0164507e8beed60a24fa5bb2158e489026c73e -:01646014b3e3987d62043354c542e428359fa3 -:01647031ffac16cbef4b91d9f5ba87df6e6da6 -:016480392bd855708474538808a266dd775efe -:0164905057e22aba47f4b05f97a88b048d988d -:0164a0b5f2daa634d40861343d4bcdb10c2e7a -:0164b0670f1694808dcdaa688639f4afddfe29 -:0164c06487616a12ef67af133da74831cedc49 -:0164d0b6faa607a7e17376106ec7b1724bb53a -:0164e024517286e54753f2202e2f797338d53e -:0164f09fe6c43576fd3409baa1064c0d736cf2 -:0165002aa24800eebc67a2cd9fb6b7c32688dd -:016510348516c2501e6cbff6f546c7cda887df -:0165207e8ec920b0f9b5981c516f99c63b3171 -:016530993c7a326f612bd00366ae971a15fd08 -:0165405a416612a5ee845eeaa678c11324793b -:016550bfcf6763df00ef888d8cab556d53d4d3 -:016560735a51f39b65e91c525df2b515790f40 -:0165702b82cbe982a68bfc4c248dcda6709642 -:016580a76ecfe08b73330f8d539212f2392461 -:0165907a7ce091da7d1e7a842b8b4af04aa377 -:0165a0490c972f6a245a0622afd7e8bfdfda41 -:0165b0d816e86226a10f6dfc2f05f0053dd3db -:0165c0c12e7b882dd41ffc51a04dbd64da5537 -:0165d0db580e70e75a9bd83120826cd2bf283b -:0165e0b3b01933457d4519745ea4072fc98567 -:0165f07af73070568bf5c4e3a3dbcbb90d90be -:016600825d92df9d3af60169e3bfa8d70e42a6 -:01661048757249f2f6047e61398dc07c505688 -:0166202a41d28bae200d14df3802cfff29c573 -:016630c0f3c7f48f5caed691b29c617432f9bc -:0166403b67a14e027592675c2c069bd1e73534 -:016650a02fe771f4049052057e2aee5ca9c055 -:016660a4eade5bc3a3a2c06a9f26110d1373ae -:016670c8fc43fe02d3ca6215c10cc53da23ae1 -:0166809d13ddfd2b32c4c74ee9b537e8d40028 -:01669069565b1cd75fc7132341bfae06972ed5 -:0166a07eca39e74477bdb66fc6fd0c58406806 -:0166b08fdbcb201813456fe720b4e7787cc106 -:0166c023e016373c5fb3bea8f1ef45269ee7d6 -:0166d014cafd8dd5043843779925e782848cdb -:0166e06807b37ff5edbfd3380fd72ccba69b41 -:0166f0bd9cec4e31c9114dabae12c96b1dd092 -:016700f893223a7ffc1bd04d00ec57f9094255 -:01671025d6de29507f282e64120894335386ec -:01672031574c279f6bf11f4754845f8690cbdb -:016730f74630c2a067b5613b241fdc40f8acd7 -:016740f105a4e3b74eb3ee8709ddea350c4f9c -:016750ff9983eae15f3abcdad2e28cb231e3db -:0167606b8908d52c27681d6031337ba63d2b56 -:016770e0731d1e101befcdddda77363149d8fc -:016780c2398425105c2470e6954c34619a0f1e -:0167905277b856c41834d0e6f10c83e61bdfb8 -:0167a0c4c50379f6eedad47c881a5a117f4078 -:0167b031539d666396dcd1172a4efc5088151a -:0167c0be2473700619594ec2717cf27ea61b87 -:0167d09222d71ca8936e8f6a6bb6befe61c230 -:0167e05247e1250d56f5d3dfb98fad84f0a3b0 -:0167f095c843c8f67c1be5d2a82e6594502757 -:0168000bc7b33d3b0f84f484f2ae11bcd6505d -:016810294d34cc62d9915cbc423c277d14eb89 -:0168209d485db043284220a397d3c15c399907 -:0168300177e547758898f3a56c544f4a5e8c2c -:01684079d2424a494d6cf1dd9d9a2458e735bf -:016850a4f42b0d9e50d6c4e78ea163f20d6710 -:016860e5b9c49d4d47bd0c1c3a95c2456375b4 -:0168709c39c8a74e0439025d242a4e9eaba5d7 -:016880ee19e20fee8fbcf5b85156c5f38587d3 -:01689074625cb4741d583452656c6c7c8a07d6 -:0168a0637c8e144ff72064b13c9dead981377d -:0168b09e3ac84dcb8383f08bf57c96fb82c122 -:0168c0ae453bb93e707a09f51b886329b33387 -:0168d00ac1394e054d21e7e4670581cfde6fda -:0168e038c7274e440858fa32475e4d2c817116 -:0168f05ef20cdda5f9824ee83b6a10a7b7acbe -:016900f8c1f78812b5c6fdc396ed68ff446454 -:0169104bbccf1608bee88319b8c81b6af09c26 -:016920985c1605df6b545fbfe629d48796d607 -:016930596b26eb94d15c4653d7f78bbbb238f1 -:016940baa34e9205a7b48a7b55e13e4896aafe -:016950c9e135f723c9e7f35c8fa1619a67177c -:0169602692ea1a5a97e8b8f8b460f5de78f3f9 -:016970e92dc9f043f8bc83bee44d4410c7b91c -:0169800466d564f103cfe10524ac519ba9edcd -:0169908105121be9fd378fe6fa2ad19d8db924 -:0169a0127d5a3c30f3ae7664925d85602a3023 -:0169b0d6833fa62452603557b398c2463dc4ae -:0169c0ebbf424aa4d9a2545f61d600e22ab962 -:0169d09fe5d9933c9a579bda6cf140c780d502 -:0169e0d92a185c5dbf3fc55161b76ec045158f -:0169f0d981ac02c5875539982b148522a19130 -:016a002525c9a7d91537a3639a8c8b1629950d -:016a10a0bb9516e172e806d185c77041b46b5e -:016a203b4063b591c7e81de61356729f958278 -:016a305f600cd8b5df17300b4c58dfdfa41ec5 -:016a40e8c806ab90a9d1557ff0492b2ac1b431 -:016a505e0fc8e68b92e7fab4d0cf26ebdac74b -:016a60aceb1651b882e403f97679d185884090 -:016a70ff7795ad5d04c3af3de383fe9344a029 -:016a80275e5a7c251eba1590b611c1d11e0576 -:016a907052acfa48264443bb0e3b867efcd6a1 -:016aa0ada65b688f338c4f43ab87bc543139fc -:016ab05d7a9339ab72ad5e3c39f2b1fd8f5f6b -:016ac069651e7d271ac30e1ae77feded08844c -:016ad0392b4197769bd9a939e0f03e84bdbbfe -:016ae0d24eeb6e0c4e037d72874ad95d065c45 -:016af06462b453bc074d7f96fb6dbdc06e5b3d -:016b008091693510cc7b60d08a6463a0dcab77 -:016b1076399dec2e887dcddf7cddfd13a15462 -:016b200322c1e270930c12835e25cde5823ef5 -:016b308e42f718e93db15177ca136af5dc765d -:016b40e997479d52bd9086ccd10eb08251cde6 -:016b5091eb8685ec5d9dcd81b0d41a84b7c923 -:016b60ae67bfef8d1fff105a89922b9699b58d -:016b7025dca108ebcc791404a71718e03f1b73 -:016b80238942365aa546e6d85c7443d7d2fe7c -:016b90cfa3d4afc4bc18937f1c125b5b379248 -:016ba0a6095fb5459315043c69165192a72eab -:016bb026561b576db86a8c8c0bd827d64adb37 -:016bc03256badd10ee5980c460634f50516408 -:016bd011725de69e4cd935c33f150caeec5a1b -:016be0ff55232a1f43a4cb48af4de33973cf7e -:016bf0daf30bcace66a652e9319b3f043e5df1 -:016c0059a2bb8276758094bc8141543c205f0a -:016c1039773f08219d10a28e67b4a2bd34f9b4 -:016c2020f52771746ca86f9b6ec9b32237c4a7 -:016c30d3bfc3d613d5508f9df6fe4de93b7e8c -:016c40af33d951412b128569891274f3a9e0c2 -:016c50190c2fb0d42135aba10924c7fb9ae701 -:016c60733943c25d636012317b88e227bc1431 -:016c70d1667ae534104b648fbfbd747e607126 -:016c80b8a22dee8af4fdcfa516dc4af3d5d4b2 -:016c90006010c00efcb923a718bb465e23931a -:016ca07a213e7c24d3dda798750dda813c3bbb -:016cb0509eab4fb312b7e22a2db03f6196d20d -:016cc050b9d384272bb54acec5ee87c6960976 -:016cd0671888260c7cb4d40d22dc812859e418 -:016ce0f0c3fdef8018c951098cacdd8e2e544d -:016cf0a8e5b8ad7a2f22264a0e3c1aac60695a -:016d004e7b65775e927c30fb079f00e5ec535d -:016d10df03412b8af2452764ca480d9a99cdb7 -:016d20678cc1fbb95b79dc849c931cd0a45494 -:016d3054472f7adb59019b1f9ee5f36dbd04d9 -:016d4074d8c579608c70503ce719517ed375a8 -:016d50406b432df09932265cac6297cced6b86 -:016d600c61a015f82de914a79952fb2570bb57 -:016d7091e8bd3366923c0ca7438e3998c4a125 -:016d80fa66e2a0bc8cffd4f7569fdb28ed3067 -:016d9014382dc288df032f38ea85e337038e3e -:016da0bdab8b59c89614781cd769698ba92824 -:016db0a65df11a58532ba8947c71cede65b612 -:016dc0e2b619e19f4e33359e0af2ce372ed7b1 -:016dd0533a8d3c97dfd3b02cff7db26e0e1faf -:016de0c1a2f3a33f0afa7d7b40469df3fc764a -:016df038c4c4dd462da820085abd729df6dd73 -:016e00a2712a069626042ce10fd5cdac428636 -:016e10d56cbef4e78ef22478dd10c2740c2e45 -:016e20cbc5587b10a703b0a06c001a315c4391 -:016e306aeb273bbeb023abb76d74763f141df8 -:016e408b1feef2661c0404e01b26af97044ad5 -:016e50c4b3e187d95e2396900cb2f12d51d27d -:016e60b0346139aa34081fb36be457f99c9f86 -:016e701418d2294a87ff6dac641e29ba9d9d90 -:016e8088164d277e4be2f9355715a8d5d77cdc -:016e905f01d611803f502452dea3099823d417 -:016ea0119b5bea2db5808a935d2b7f8d2c08cf -:016eb09ed714a371bd0af39e49d7c24a9326d2 -:016ec060f1c7c10d4f290aae0b39a2fe83ca07 -:016ed042cec7666d812430a8e98c11a5472279 -:016ee0e55ea06bc29a15982f8c0141cd15515a -:016ef00875cc2f6d3ba2115e29b988160d9390 -:016f00c0780f1de0918165b6fc86daa3756f8d -:016f10e566518734094e6607e687330dc958d6 -:016f20a6b0ce323df92533953acdeef502846e -:016f301f96f5891c0396c7f647d2779cf6402c -:016f408ae45b8a0518f473131f31a0eeced4fc -:016f5088d36b539806fbb343677911651d9724 -:016f60de3d23a43e92025b44329aff06c6bc4e -:016f707fe97941d82683d1194fa63b13652035 -:016f803e82f8af5ff6d894525837ef76f7d832 -:016f906ba6d015590bd0bbc0c0a470ad1be856 -:016fa08b3ba1e77c7f933279cd7ff056237167 -:016fb011a39b305308562ddf7e4636eeba073b -:016fc0b9a2f30ef448400c8dd3a48c692224fc -:016fd0c08998d5e681a1aee5019845d105210c -:016fe05da749dfb09412521b15aa66d48fb83b -:016ff0fe5d7a2a34a3657085dd68757dd1f237 -:0170001dabc1bc1e3c3fe7e2f25ec522997556 -:017010d099d61eef9a274d504e8a9df92148d2 -:0170207f27769386580728283add8ac3b8c3fb -:017030b937aaf2d8d76e5b5b220efeeafa2d78 -:0170406cf379417bea0c7f28772cdbb9ff9252 -:01705017768d84b0ee01ee2e98e028ef869714 -:017060ade82b26f00b726e738507a22a6d9f9b -:01707004a0b7f056ace7e48d124b6d615512cd -:0170801ad56fb2e0fbddb825d3a6d98348dff6 -:017090a9b6dbe5bf3c782a980a465cd64ea025 -:0170a0b9baffdcd8557c29651029860106bb18 -:0170b047f19f2713e3895e61553c6b9fbce8d8 -:0170c0952993fa13381216912268f1b68312e7 -:0170d0faffe6379dd6d3ace22f77eede8e3e5c -:0170e07010a26d9a792ed7cca423fb3faea037 -:0170f0cbfea4c9ba7b6d6a02acb8e0fada220a -:017100cf2620ac0356a8ea190c393d8093b7a1 -:017110d79c9ee96750241fb285652d256f6934 -:0171207d3ab547fb1ee65fc706d9f9a5b83c47 -:0171306d4e0bba11e493a4e5ddf1176fb19f34 -:0171403823a210b34dcb6dee67f7a4418dd95f -:017150c2bacc6281c05615882c0fb5ae5b34b0 -:0171608dab793358f320b36b3208de219eedf0 -:0171701d07ab423c0daeb3a0602740d702251e -:0171802ec02e22a5f2314ef6f9e82afee0bfff -:01719078e880d1a530402a2a2e5ff02dab76c9 -:0171a06f17e9abbbc66fa15042572e5e539e08 -:0171b0cfe36ea083a2b941e9c9a4d5e14faa81 -:0171c0247a40edc9465f6f5a147106dc71c2d2 -:0171d0910742ddc93d5e4413000c30e16d0975 -:0171e07e7d414c09252b0cd2406d65d060d5e9 -:0171f003fcca9b9be389d01f97c45fd2135e6a -:0172009db6c81c5f097fcff14ab68177296734 -:017210c8f1b84437006294592924aa3dbf0baf -:017220484b5c73b3f2c90bf0fb9c93b73def66 -:01723087252ada6823494c22e6fb1389d1dfa5 -:017240087273b48b3efa5a065acd0721bf798e -:0172509a5d30d33d793328ed8594976e8696cb -:017260a08bbf3c74332025d9ffb52005387e4c -:01727035530622b037951fd07ebafe3888a528 -:01728080a2faf334a7743f7e2c8977a4d82c85 -:01729079511bd71bc6f9ef6c83971535a33d7d -:0172a04396039a4160d55104885c749761e584 -:0172b0f013cd386b91f56873099b4eda139bf0 -:0172c079319018b85db36884ee5caf8cbd7793 -:0172d0fa1e191a44aa787992bff95dc7bd88ce -:0172e0f23877ff4d149f7780a58b2c9dc200c0 -:0172f0c69fa0f1ad02cc454dd047fb495d3bed -:017300ba91767e5db240523b8a9fbacef9664a -:0173101461faccae655b863a026a00870ecdc2 -:0173204efaa0512b5ab1326c952d6c14fbadd5 -:0173306eedb726284f75fc0083d297cf9075c3 -:017340a952fbf291f1e367f08842742996bbea -:017350dc6d1d96a9ab0e5ad15dfc88d6c38560 -:01736064fba5a94df42278e45831186d7dcdf5 -:017370cab5efa720fec364dad970518b9d7958 -:0173806f2dae8417ef2b337fc427cce99ef09a -:017390137685716cef7927d97e56e92f76bd30 -:0173a0eacde3dc72c6c27325e8b9a4d6864371 -:0173b07792ee53137c5c2fd320f96be27dbf85 -:0173c062b841c454d52cd85650a582b0dc68cd -:0173d0e34282a6492d5e6422e2ee4248a9ef6f -:0173e0a37b1c73538b9dc91b76bc19ec0f75b2 -:0173f04c786d6941f9f71920672b2d2e4821bc -:017400a9552b6e951030dc81cc6b1049d16526 -:0174108041d08c66e9c45a7455afb4e5704983 -:017420ef869d431b3c53d109a273c238aa3eeb -:017430e89cb162ec77955ca5f947f89e8e09dc -:0174401318e21ae073213fd30c799fc9626ef3 -:0174508e070b7b032e4c6b0ca3a1ec9e2a60bd -:0174608155ddfffdc1ce5980ce37276192af48 -:017470d576dc098228ca99a18aec75e956f1b1 -:0174809085b5009ea7f0d860e2865357e6e34f -:017490de95dd25f186ee50df4a28d98fe79f58 -:0174a042ea75bed51d4ae780762de9d364f01e -:0174b04a6c76665cf9eaaf3e4e07dbcbf8c2a3 -:0174c001f383dbf6a59d067a3f75286b793585 -:0174d017915a1b1a6dba79b0475f09e44033da -:0174e0ae9e722cd5a18febd88bd1d039fdeda5 -:0174f08822f9a122d6c681dccc3223ea99fbb6 -:01750033b1163dffa5c827523919d83e146bb0 -:017510cb179a115b33a13d4c0dcf5709c65639 -:0175206bb8b907bd54de2948c858aa77ff06ff -:0175302454bce6814f7f948281dd12330ce717 -:01754074a8b661df7c5b7cccf5fbbf134cede0 -:01755043c0d2a088926a6869b320c867f8b938 -:0175601a1b495c2b003c06b66b7551bcf08bb0 -:017570b9f8f560abffaf146c9467ba27c570e4 -:017580223a3ae053b95fb04b84bb54fec27bdb -:017590a446347bb2c915c4f3900d8fac58e301 -:0175a03ccf5f0f373f9fe8d56cdc86095413cb -:0175b0f488779c15918266ec8e1291dcf0a48c -:0175c0f60b0b056d1c95a2951e40fc81929f83 -:0175d0a8fd87a10b0b2dca3be82575d209a460 -:0175e092cbcea3567d60fd1066caeadedf7386 -:0175f0a2e8a795dceac6da688b0a31de05ad8d -:017600fa9a2a3827a97a7143b404eaf0cf31b1 -:01761080c128920371923e8b35d304d8033ec7 -:017620f4fcf68405f0651b0d61dae9daadff2a -:01763037b99f74cd1f9e1ccec10154da4cea19 -:017640c9dd396fa077dfcee1647541dadc90bd -:0176503add7e8f3ec9a780a6a8de712e1f2eec -:0176600eb04699e081f25969f0aa6b31e976af -:017670f2139723b95ab3678cd14ba495c04a6c -:01768007f0db9ba25b80c6072128409d14bfdc -:0176909d6ad987b96e6d6e1b04439a701adec0 -:0176a025042c9920cb878cef76d22f6dadd4db -:0176b02be791049207c6765de4dec584649186 -:0176c0daf23325128c5b16a369ecb26b119108 -:0176d00d5890f024c10505f364d24049380d4e -:0176e0708e502c06f95af92cdf91ef9bb7906d -:0176f0fc369f74fcbedd24d850b6e18f66599c -:017700845fd0233b68268b0986d553d758a216 -:01771068d7f644f42593754ef396cbe12706cb -:017720443aa591aed214cf5abebe026b496937 -:017730324e7cabc07009f9bb32555e0a69f821 -:017740a0e6eedd4c7f5d0acccf0b64587411c9 -:017750f5b2d25eebf4b3c990574d3cb65ed71a -:017760f3c9dab75c7cdce214393119a0e73ddb -:017770de0ebb256c92f1c140fd8d6706995db4 -:0177808cf846e6c50f4edc65ed308c93700416 -:0177901c7ec57b500076835f2a2db30b202f1c -:0177a06670e919fbd17dcdaf4af6d1784b2162 -:0177b0691a00221c83afd0c79bffe7640e4d8a -:0177c099ad0186cd5dca50ed2b8d0c407335b5 -:0177d009347258bc21645b2b1b7f8b114ad2ad -:0177e07a0cada3d81650bab3cf2ee07071f2c4 -:0177f0b8900e08cabfccb86a35e13a94bf1c3a -:01780078a8c9c6365e3f26494057bf9e9e57cb -:017810d101f957a9143d4e4f1ba657b64219d2 -:0178201f0a4ea7fa6a5db8276caaa6c2cf1da2 -:017830e5d355d6846bb27b33c6cd04b380aecf -:017840091525f36d0189737ca19cb251271c1f -:017850ef158a111343e45b5dbebd503e665010 -:017860f3d6fbe2d46ddb951b2d2828a85f30da -:017870a4356459e970d4c8500d4fe48ecbc9a4 -:0178809f6c0bd6590a6167d2f9ba0a49a34d68 -:017890dab47bbc8830d7a27bc63c66a4459f52 -:0178a0cc7ad4046b1ad38ec6e8ffc6c1f66e38 -:0178b0ad8d45ea9112de2d73d46488bac33fb8 -:0178c0dca7f520dfb2fd1612ed376ef744894e -:0178d0a161949552cf97fbb2e8435eb535db4e -:0178e06b07ac72aac3e89f8e5a73c5d9e586ba -:0178f0bd60c2418572627ef538ecac59888286 -:0179000b109078c6b3a7565344094843ded9b1 -:0179107d86f697be69b74d6975200769d8292b -:017920be2945f2b0de2a1ad65a7fce11aae187 -:017930785efa1b6021472f2a2f7225a97ad436 -:017940a7a23eb931460395a612309a64cfb033 -:017950940a3b04618343d6c0b4ec381c2cd9ef -:0179602ec36c5b0cc679863cc27b533f69a94c -:017970b343161b4335fda6ba61776558e09789 -:0179805f46c718400f7133f7d2edd89eefb333 -:017990d6533143ad011b4a4042f5060ee4e734 -:0179a03058d78f62ca6773689afaa320206828 -:0179b01338bd61e0191aacae7daf6177132bdb -:0179c006dfa378bea7beb3e55b1caa2eb8925d -:0179d0f5dded7d03c95ae4f69b795c47b14269 -:0179e09fef7833db95ffbf6fc7a6ae587f5d7e -:0179f07a09e9c92c1af4c28b507ab17c34fe61 -:017a00cf049b210d712197c4fb22d5ee564e1b -:017a106c2d17a46433f7ff675787a24b4107f5 -:017a20a74ae1ecd1b20c3e14db5c13d4337104 -:017a30798f18f03bb38ec521e858675fa9726c -:017a40091f62286ae18e40c4cd3912444b216f -:017a504a9b81f8e66ea5cf362599071a5498c8 -:017a60b39c613e7042b8b83345bc0fcc69b85c -:017a70a898ea999cf5cfe24b33ef6e67925fdb -:017a802a83e6d4e6c4bb8487b3321f6db8037b -:017a90595530fd185453b150c2efc2a1e53c0e -:017aa08dce5e9218b6afc1d76eb297f26f441f -:017ab06da77b702503372d2c0361017b2393ef -:017ac067a5329fd206ec36e0f737fd37d55a59 -:017ad05f0849af59d1c4fe65a5c3e7ebc56c13 -:017ae0f214418445806786b138cbdc34d04e99 -:017af050713a979647bacde56d5dbe61e724bd -:017b00be314afd2d05e9b5310a02bca32cd8a4 -:017b1092b7857e05155b734299145207e692ca -:017b20939c83b24bb768716b5b839b1d3ea616 -:017b308903801a550aaed837bc869516885e8e -:017b4016c07238092e5769dbe7b67e0bf2a00f -:017b50a7b522dd638b4bff7c300286e4c0158b -:017b6098dac4e5db57bd718b2578a0d7fdc171 -:017b707911198c96af690b21754c80ba114a4b -:017b80e875c9dc12d1e562f22be87a32e5c89a -:017b901d6390b4b322c280decd00b46d4bc073 -:017ba0e2d34e5b84c739dbad98bd85035081fe -:017bb08554de5819017069cc28867f7aa05d2e -:017bc059434f30620f422603d9ac3be31744bc -:017bd057c2b2acac404e2b99acdefc0a59496a -:017be094793053687912e6d42a3e4fec767e21 -:017bf08b6172c8bd2437acb6a41312e80d765d -:017c008f1eaf600d8fb026bfa40e58b991bf2a -:017c104d29825ad7e9bc84e34549cbc833be01 -:017c209fa26e0a3eb727edc2d467e2a3bc9936 -:017c308256381e91e3caf0af1b300489025dd7 -:017c40492e35667a719eba009f7591e80cff00 -:017c50610aaee4c8a08a305e5f039a7a20bf2d -:017c603700d82869f273cb26899800f5c532b1 -:017c706078ead5ca22b6a11e02b3b23b8c0047 -:017c80f9c1f8eb1e87ccb779b2495271155720 -:017c90b0bc1baf669a28c773278b8f6a8961d8 -:017ca0bffa9b9d9a448314efa47451255ed3b2 -:017cb05b0b9fe8e572c4beb15f21096c0c3d1e -:017cc03e9c052349610444c7b79a46f4cb990f -:017cd07eefe40258e4eb0f08cde5640815a303 -:017ce0005feffb41016c4bd8f18d8995f0626e -:017cf0f714355c19260bec59d849ef73b11f2a -:017d00a1e32d82cbf0f96f92d6ce99cc28e3d1 -:017d10b6ea16b0f10225f0cac1baadd031b753 -:017d20d938326b3dbc113541ba0f53fd9501af -:017d305703c1f1061cd538ac3265c6297cbf89 -:017d405121a85cda4f4a3a3a7eb47583328837 -:017d50ed918cbb0819370b510a95172577434a -:017d60d33cdbc7696876ebd3b0f40f57ec4c0d -:017d700a1d735acd16b59f169cfcdcd30d2562 -:017d809540762ee967b3f688a3071a0fdd39f2 -:017d90394513cb30fef473edb543bc15bf3f2f -:017da06674141239df1fbf96be1028b435f678 -:017db0254c978f7709a042b11faf776893fba3 -:017dc00f17450b05e7c5722ee4ad0af31059a3 -:017dd07f76de6a469f7a81d082ad09c1742a18 -:017de01beb2d730caffa391eddb92b2d728ac2 -:017df0cd325dcf73b5233045e362a794af2cb2 -:017e006f6942e1760d1f46a5bf3015520b4094 -:017e103be2dfbec43826f73b23da31336b30f6 -:017e2025e7e9802195b9b70f82f0b2085df961 -:017e30637d2aac921abe444a40d5e82bd8ddbb -:017e40af76314ea4bea167ea9019b3d139e2ec -:017e500c12c623f69041303a70d431116ca55a -:017e60dbf18113b567572b99a3325d2e68f34e -:017e70b8612891d63e3ff494460ff76e26104b -:017e800ccdcfb1abd92ee216484ded18d03c95 -:017e90d37983516d9848808b46777d6952f5ce -:017ea0a84156e75320a6ed6f2e5fc234cecad5 -:017eb078ad95be84d7d4fb9570e20709767cbb -:017ec086ba4f4122eb2c91b0e84bf1eae0e9a6 -:017ed04f214ae8da20388b9eee15a63aed21f5 -:017ee0ab9610b0ecaf70c7649bf126718048e4 -:017ef0fd04294ce9232de569ddcf04fa0fe8e0 -:017f00da4473062ce594fba5daaec2eacfa73b -:017f103070c7f03e972e0535f7c478a1ebd53d -:017f209a2b71f1f3fe72e4b657779c90c7aae9 -:017f302dbd4b2b9a14c1d3096ede79acbb1e8d -:017f402a5cff07a69f62f513b6ec562d244594 -:017f502fb1f7fde56118d873e45431f2a4eb27 -:017f607b7ee739ee8f44aa6b26d41c8d178aa8 -:017f704eb955da5ef0019b40e6ab83fcce805e -:017f801449a05306a561726e3c62e5e03e831a -:017f90ecd2aae1dfc72d2f01ac15f8b2dff723 -:017fa0cc2f12139a9c408e9fbdda8e10691eef -:017fb0e9cae7dd296b52951bbefc8547ef179e -:017fc0d9dad9f34b44c14f4d1e2245ce7931e2 -:017fd00040f21a4de888e4e88670ad0307c6e3 -:017fe0da88f9dad62ed275c57281ed6ec6855f -:017ff0c61fcb80c23b043233b22ae149a643e3 -:018000b6ab9f24868f97a8be8efce971faad82 -:01801006592fe8db9fd6fa3f512c7df18a12f3 -:018020392b4c7cb23a127daac7c8c05068a5d7 -:01803049693ad662288555bd9eacb14f9f83a5 -:01804007abd0268c5ac069abc7f723d7572b30 -:018050bcff4094d877bf90bc9302a622c847ae -:018060c8344efd695d8e6fb8c343be3c3c8d43 -:018070b255d93da70b219b527e46a32562bba7 -:0180808050b16383b994058556cf54fc35ef22 -:01809005bd3388ea66cfbf7c87350824acd438 -:0180a02791425da5c521e317558783e5cc7399 -:0180b03fe5d8e515e90cc6d40b1f1c18418aed -:0180c00ad183ac116ba807c658c88cc5a749aa -:0180d0786dcc3d4e8736c4c7b36d4f8a9c4942 -:0180e0b29dd6cab24353beca502a60f6e40698 -:0180f0e54302ab8cdbb010b5e36e62ead09fb5 -:0181008ca0705660d5433ce0dafec94d2d4aa3 -:0181107739b763931eda33ec8e9d380bf0cf01 -:01812086a7bb4f87bf14e1180766da765ae9c6 -:018130216db58672fea6c70ce2ae70f083b01e -:018140341b3f7650ad1e66c32fe3478f374d99 -:0181507c407ab2af18e9f4f45dd93bba16f879 -:018160ed0a320e3b1781914443987ed5737f67 -:0181706b89fd5134a374d401b0cf9dcddff57e -:01818018ec005e404d3b4eec3f1f75548ac5b0 -:01819040cc626f7b065a291c6c70d141497695 -:0181a0cc800931d91450841060394db1fd3e4d -:0181b06817654a94264c0e8bc8a4c30b18085a -:0181c03af3fe1d54fd5cfb954f13bf81169879 -:0181d08d94593bbdc932e85f791b90378a7d04 -:0181e0a7632785bf229f586832cbfaf0681b91 -:0181f00705e03f90d4b8c56d1c777a6b3273b8 -:01820025c89faf6a00119c7fa70fab5eeaf3b1 -:018210c3e54744168d882f9e541140abec1636 -:018220595b8099db7acb5eb1aabd23719c403e -:018230ccb2b03b087150a61166de0acbe8c995 -:0182405cb5bd9e1af9114078e546215073b543 -:018250b054f10122c0a8c2ca8242c541be7ee6 -:01826041fbd53bc422a04a810ba9bb05b43001 -:018270535a8f053e29d6699528f65ce2aa370e -:0182807b665bee22b100c80d4199243f066243 -:0182900ef0b9e5ca3e27e39d3e74f118ead7a6 -:0182a06edccf3452083b07bb71675c520f6d42 -:0182b088c317bf15d33ff2f479d3c4a20d6de3 -:0182c06693c41f0fa95c2f09610bd70359a69a -:0182d053355d4f8b9f8acad842e9678c7a23c3 -:0182e0286a834821e4e25a5216c74d5e67fcc5 -:0182f03b84eb1e5d8c986cd8c4102bdd0ea0ed -:0183006504873aab30ade142610b9d7dc14f61 -:0183104cdc7f31ff3dd538178c39a8972619c1 -:0183207e0a82ce7569bc8942cf5050ab9bf47b -:0183309663b402850289d5b0c994a709fb4bc2 -:018340a695af5e18d1f8ea58c2645e279a4ca1 -:018350427d12e25c41e1e824c244fa44b44f0a -:018360f5ffe7d474f6ae4a6c9f970da6f3c021 -:0183706759137175f7890abcbeac3acae01039 -:0183807c6d9cb241f85f0459d82ea89eba70f8 -:018390f132647a30814cf34b675183480f2454 -:0183a05b8ee6e0f60c2938c59ebe816b25c32e -:0183b0e0c4e957c7e07177eac0e349ef993239 -:0183c05463cf2193da626b75ab33d65d59ad82 -:0183d02b4b246aad30ad422d41a2aacb42ccc1 -:0183e0e6495e4812a025a6867840cfa4b45649 -:0183f020e54201776810b196bb42b9cdb5e1e0 -:0184002700b616d9e2537d53fa1cfa6f01ffd4 -:018410bb6f69d007d6e213ad769d4775f44507 -:01842090c3890b9bf40b5f075c6aca3ee63cd2 -:018430e73dd26022532ab66fa1a5f3dc87a60c -:0184400a28ce136b58270d735ac72c303a64dc -:0184500cdd34bfd312017102ce5f9022f443b8 -:0184602066b6574ca2e5c1a6297ce9beb7b43e -:018470c8c4668a3360c37a2fb7c7a6d5d7d746 -:01848085a615df6a7e802729e1a922e2d442f4 -:0184900b86af071787435b1a61683cf496b3f1 -:0184a02bd6401de9dbc0201d0079213ad64364 -:0184b02cb8113908a1e68ff5eb7ce6fe7da812 -:0184c08f5269b9bc5ad712f041b094b880b3cc -:0184d0f37d160435a7cfd75678fc7a9e7dc8f2 -:0184e0aca46513496ff01d97ec81ea0a7260dc -:0184f06f5be2a21dac4771852aa1ea5abbe320 -:0185006f1b9fed433af40eebe478d4875dbcf0 -:018510a9de39f4feb66f839133246d288860a9 -:0185204839e5c0278c533eab60022fd9e8f4ce -:018530f2ebb9b00ae074adcf9be233e5fa2e01 -:0185400c2552134dd761c1eca8258831ddfc5e -:0185505ce95205c8284796ce63f826e8dff2e1 -:0185601611e8d9b4ae8c5e5da62c4dae66bfd5 -:018570a1f7018652d0ec2c7d5c871367b54b77 -:0185800ed503cb33060e5e8e1b4c84ac6d1aaa -:018590bcc25c8e7ec219d70b1048622c841bbd -:0185a065812defcff8a527cd31b1d6731d452e -:0185b038e628f4aa7c30ecced616002d6de4d3 -:0185c08bea0be5565ce1cc735d507c52a0d81a -:0185d01ccb421cd574c78a0f2c4a16e5d72c6b -:0185e05e0a794a45cb9a970a2ee8edce2f1ced -:0185f0ccc66a7bfa9a2200b5e46b9255dd272d -:01860041cf367447125f960f44040a5435749a -:018610dc59ed3a068af6a02e4266f55fd435d8 -:018620b4fcbf7b4f2be5303a76c0d881ccad2f -:018630468c4f9d31e58e150bce45c8ce89ea59 -:0186409d3e2816bb4572a9be308dd36291c1d2 -:0186508c9fddb37b035d626f4816e60ff38a60 -:018660995443aa2ee556e9aeb693ff7aafeb63 -:0186704f6c1b5e95734d1c4bda3ef06421ef34 -:018680e403787d4037567ee88efa409184b15a -:0186905074ac762022a1fc40571444e2b5c327 -:0186a0f7c3128bb8c38cac47426642f2b37343 -:0186b0a49c26e1c4f197f0c1413871cf803000 -:0186c07b9f833c60268091e00707209393a76d -:0186d067707294ead81716048864f782442b3a -:0186e0b58abd21a5b2135f79be46909f42eb68 -:0186f00a677438a7613e125de78350450551f6 -:0187001a5eb6932314e63940417d0b0fe66101 -:0187100b1180038944ff4c19095db9e87df51f -:018720c0c4ce3f5cc3964f58e0fe1a950fd059 -:018730c896def25184ed833eba1f3e288feb3e -:0187404f24f7ecdae17c87870d271139a92eeb -:018750ce8a8d089c0217cfaafaf707300960d1 -:01876006149f525107982db3a72dc690899625 -:0187700750950cc013d56e1341641bd54b2aaa -:0187805e07861f192622ea8aeb9116fb2a5476 -:018790a61936b807a19d0e035ed4b3650c9e44 -:0187a075070dada6c870b7d73da29bf074e937 -:0187b0cb85d9ec9776c0529f968bead4ecd936 -:0187c004f2ca80b5dad13e46b52138b5ac4a5c -:0187d08ef5d595877ba3624a67b6b8eef7aeda -:0187e0dc56b1cb84904753eb2fac8e266aaf09 -:0187f0763de2e1a6cca4fde85fadc8c1ddae0e -:018800050b815bab49daa8c4c9e25664d7080d -:018810d37889c25f14e860831b2f83e3c01d62 -:01882021fb0d93912275806b44fa7e4ef8456c -:0188300c0798baa7e85898cb1df386511bee63 -:0188401d5fb52fb7224fcedeafdc00389a4bbe -:01885001a676aaaa21d2fcdfb50d455ca56a76 -:018860ab35c241dfa166224f5aa5985b1d4929 -:01887094242e09ccab89f3e575926fab9b3df5 -:0188803684dfa71ee789b19597dc8ea7c496df -:018890c860affaa607fb5dcacd9c34ab27f6e9 -:0188a0304dbbb55febd1fc3d16708228900f5c -:0188b02a995899b18e6d2dd8f7badf00ade63f -:0188c0f2ddedfaf8eb721736349a89a3cc1cec -:0188d010021741d4332169c05e88fe9922c199 -:0188e0fb12639431ae06a4b643eaef7f2fafc8 -:0188f05dbf797182cdc866a5b358d5207e7a5d -:01890091adc23a1015906b574d2076347c2975 -:018910bd254ae1680f01e9e49b50c54274c1a7 -:01892090fbfdab4a61e05c832954234c692dba -:01893033ecbb12d4622daead9e491d26f174f2 -:018940bcdb72e43956c0a01998955605458530 -:01895045cbed330379a211f41a0b6a1e705172 -:0189603c417584ab0fdc02a3b4f7b91cac6443 -:01897067b6d367600a0af62f4845fae0a98f2d -:0189801910e0ce05d5a14892fdb373527a8705 -:018990467482c330e530461d29a0c854eac945 -:0189a02ca5090985ba9f0c7999039452aa5452 -:0189b09519e6b22c9ac52eb195923352bdbbb4 -:0189c0aa24045f65a2d0caedff925505a8892a -:0189d0ee7d25405cffd214cb8f02cc0985b3ca -:0189e0384bb2393a00a8c8c92b3a919f030af0 -:0189f08c18dff1710e1cc6a4246a2703d19d9e -:018a00985b7863079b5e33ad65e1a951aeb02e -:018a105a93085b5a39e34f9f41be5f24458819 -:018a20e73d1955ce0fda7f18939955d02a8a2c -:018a307085aee05fde84e5c018d350f9e026e1 -:018a40ccbdfe7b771ed80a82760baceb3ad6e6 -:018a50c181c2a7850ac8f5d7b48c6d4a122960 -:018a606fda527e0f22a143c7947bf5ea523430 -:018a709895389f124d6d528dde3647bbcb93c4 -:018a8045f34d951d580a0143468235679d005c -:018a90b552b9c8705abbb5bef602394ea59e3b -:018aa04f797f3b0fd49410842a5342fe227cc9 -:018ab0ba0e65f029701d864665404244e8a560 -:018ac0151a90a97b960299ffa16f16f067989a -:018ad01c5244c121a8c29d66ee8c295b214713 -:018ae0a5ca05ba4c61fa2849d81e88943ad726 -:018af0f3e2f11f34470ee6b226ff7ceb90d132 -:018b00f994f940ce28ff86736bfcc7b4e6f3ce -:018b1038bed2e92998984899fc5af9c841bdf2 -:018b207f0d55fccf487e2d548a54b8dce26128 -:018b30204d019ae20a36c87089bb12e03428c8 -:018b405aa9814209f4dd4b380cdfb354a19985 -:018b50e4cde841666a2d125d0e23dbaa1004d9 -:018b60c8bb36cdf691af8304d01898c7ef636e -:018b705868666bcfc4fa312dcc6b8a54b65134 -:018b80c9afd03d81e217f438d011ed9d8cad68 -:018b909d1dc7b9816efb538034356dd2aa0716 -:018ba0fe9ea48a94823c6c9629149a8704ee99 -:018bb0f88968e365982f5fb682da0b14b66260 -:018bc009e834606785213a7b3ed60630e10ae2 -:018bd0b7342f00c01b94b42b799a50716f22b4 -:018be027764e23ddead065d298d6493281a5ce -:018bf001f5daa1961d81331cea531335718b73 -:018c00c666b24c4ae33d27edd0cba344272552 -:018c10847954b40bbbf7df6e4100d5c276a60a -:018c206e061837f289ad82d73cf2b96370dcc0 -:018c3096f5c1f9164043dedba6443d34fdb9da -:018c40df92861780f79715230c214fca994d5d -:018c504b4113cb4f9afa3c2a9a14846357b75d -:018c605f0809b45178dc440669f4cd272bc4cc -:018c70307dcb55e7992a13e40e1f43a780243f -:018c80c36c037b56fd8f2bcce1422056d9771d -:018c906f30e0dd6e020f03f3411dacc1393e57 -:018ca031737971e5c9057cce927d87cef2c24a -:018cb093a7fb958a5bae8bf38f6bfea202a54f -:018cc0a717819c1db5034e752e0c0bf81e93db -:018cd08282c7db855145374a9e591f23ac6c53 -:018ce0c7a3b4a4bc5b8b5a35217e9992dd7e10 -:018cf0ac5c747ee1a169c6862cddcec43fbccd -:018d00b036613ea8a86dba4bd80ca528f1abe6 -:018d106d496529df888d559e1e063fcd70895b -:018d201b16f7ae2a90718b38e11690b00121bf -:018d30e12fc5ebdc71b0c25c679f67ec667873 -:018d408db0933c02e378bb4548c27429ca5b98 -:018d50f439d3df50f2f9d46729da7c23a177a8 -:018d60011669925b9c819e7c6812c00ee2a2f2 -:018d70c056e01e9bf5dc2449af05a866b94af2 -:018d80eb0b12fbbb60de6c38a7015d508800e4 -:018d90c4883875244aea6091780947826bc778 -:018da0233247ff86f747cdb924923974bdad88 -:018db06a9fd540ebedd4fb3d5b7b4c943b52f9 -:018dc03a6633079cf9fde846e4e33bd5762067 -:018dd05efd06f5305c2ecfd373f1eda7f74d3d -:018de09c4c4dbc708f82a74661ca497abbe637 -:018df0160a27f11ea7a25d1e720dcba9fce8e6 -:018e00f48f386b09917b6577d2521e5c6b1858 -:018e10ab6c003933c78018ab1f15863486fe9d -:018e2027e72838c48d070ba77c14014e4e536d -:018e30c0a6485d31f8101cf4b478fa84a0dbbe -:018e40c95fa534913b00e1ef35a8a16f77f8e4 -:018e508abfd69068a0282a6a2f2bf982a47c7f -:018e6083eef27c5fde58ef05cab9c7e5e2e308 -:018e705567d29fc5d5961a4e247951e3858099 -:018e8018978fba6146fdcd681af9d1d9138202 -:018e90a1140b5078271491c92706e7526e63e2 -:018ea0f0c803bebb3a8c8d6e55101aa272d142 -:018eb0c0ae86183d796680579ad98c3e3c1f6b -:018ec03382d6db7367da55e4a21c8f2106d644 -:018ed0d6855462cef5bd7fce5fb6963b810f4b -:018ee0d9ca297faeb90bc1213811606ad4c676 -:018ef004fecac2bdbb491c9cdf5125f6d56fda -:018f007a61fa85c33b879b8569cdd76bf9eb49 -:018f1029407a383fb6f00db5ea99060c5306a1 -:018f20b9ab8e45a7876f9fd05544cdccff0095 -:018f30e1e2802136298194acc24fa25e668515 -:018f4003d8c324f644a26bf99d245fc07fcd79 -:018f50840d83ee50d05ec7f72227e890880b29 -:018f60bb635520e03081faff2d1330e9211a2b -:018f707f27d23d3a14a8e7295f2f8856862e75 -:018f80abf083c8312a1ed3d534838804c9ab24 -:018f90e3e8f451cfacab65f652e87311210165 -:018fa0ec963eb6e567c539d8f9153a0b7aa94c -:018fb0e4756f17c90a0f40844f119bbe9dccd1 -:018fc034301e3f6456d2569ea11b418a195426 -:018fd005082b82499d0fe8d83f9b6cabafffd2 -:018fe0f549915f6fb0c0d7389b24e619156fae -:018ff011b64b3c910e096a6230cb07c55d84d6 -:019000b4889676df9bb146e88ee488f99cce9c -:019010e9d059bd7fbb97aebade1d974ce92e27 -:019020beed35596e95260b983cbd537b829c98 -:01903040c88684222b5f5f5f2c8f185c09d907 -:01904028d326411a55a31f2d1560b32f6d4bb7 -:019050c63eb57731641f0192e7f2fda80b3835 -:01906038b50f6002367f3d77ba932a3ba1ddde -:0190704d30db5d7b93fee6896eca0513714851 -:0190808a691fd4e44102d27726d7f5a388b184 -:019090a3037830aa2544d0eb24c2a5fc1a7725 -:0190a09216e58da5666831212cdbe9b8adb855 -:0190b0538325f70e6759ba86cfce35d8b695ab -:0190c0d3d583a82d0a8610d5dc737453165a41 -:0190d0ed28faa6cce74fea1861d823c69867e7 -:0190e06037b5cf687a0ab5c047be535f00dc14 -:0190f0a1fecb7a22596d7b5c6541e54b5b9f1a -:019100599d0dc940b0d40124a8fb21567d7000 -:019110dfa15c002bc531c53109899f8ea882a0 -:01912094035a93fd99af7f26c3e570ac3c8e94 -:0191306876009c98eeb7dbf3c7cd8d3910fbb1 -:0191407c5c26c095e09145b5e17ce07c2a4349 -:019150926c542cb9f5a9c41dd163a8eceba75b -:0191600fa95d5c999bc220a0af78d7a03becf3 -:019170221e544aa091afa5cf3ee0dc4fc42894 -:019180401eb1386d8ab771b3f9f7a8ac21934f -:019190c1c9cbe52e7753939f147b05c9cd05e5 -:0191a090adfda3b2e93fcad76ec0eccfac572e -:0191b028128bc516649260652b43e5d796bc15 -:0191c094a04181a6c699c093ee348f8d0766ea -:0191d06d8b148bd28b559ddf276be0ae36ede7 -:0191e025624b2769aabd388f0b3707a23d16e3 -:0191f058c4d7503e4545f0ebb66ed242a7a433 -:0192004676ae3a69cf36bb4ccc94973fc3ac24 -:0192101168afc9e8cf1ede781ded70105df591 -:019220393e89a17209f8baa1f4c5b2819a13ac -:0192304e058d5d0747d07beb40f1e9a6c7c9d0 -:019240814ace5ad7f9c16547c1d86d657ed41f -:019250694532276074c55c86e04330862cb7f3 -:019260db5482294a9efbd2d9b38c9e2064882a -:019270acd0e303908f020999e326b4e654a674 -:0192800aeb7fccb2f4fe9977a89311b92e0750 -:019290d2ace1952682e9bbbe7872a1f5dc7b13 -:0192a094a8a87d5af3bf6d86d456f1b0e8030a -:0192b0fddbfa2df472630f60bbf357a543fbf1 -:0192c0fbb9a317cc05d619d8c2064254471b58 -:0192d06bebccea4d5e3356fd69aafcb420ddcb -:0192e0c423d214b5214355e17f16478c68f925 -:0192f080dd6039e6abaa03aa2c49ac9e585057 -:01930002ed67f34b6850c3fb8100001a104be5 -:01931075587f9ef24ec58a39414d386076446f -:019320c8142e5f09345f66079fb0f1e73a3bb7 -:019330cfa177bff2507b3266271228ae5b5071 -:019340fb42ddd0e80a6e739970d4e0fe067c27 -:019350ba042083f69be99c8acdd4c5fdd0bd14 -:019360af5c5b7d8cae6b3fcd372bf27fff9707 -:01937056432a75ff54e8b230ba2e1a1d8b64b3 -:019380c6a809a16037ba8490c865dd61b615b0 -:019390f6acf32fd6c73523574f51a096ce61ea -:0193a0b6252024ad937729cd55e355eab40ffd -:0193b03434f87931c8bda702a52946497bf032 -:0193c0b54c2e54cbc01ddc38b6d09d96c766a2 -:0193d093176005219b7f8b54d9612091ac2943 -:0193e09387cdbda7b9404b5234c96b2db680c2 -:0193f0acd6e4571d1512c8e4cdfae1b6a89b94 -:0194002feb922dc451f7cea20b86fb4dd83d18 -:01941028a4bdf28ccfb57c0dde4a608c2929f8 -:0194208b2afcbf4fc4116f5ac24d1bdb6da254 -:01943097c6e88e9d2a7626a30e6797eea3512d -:019440194c229c9e64ec6070607c6aba2137e9 -:01945067cefb5e24669eb992c6af80bc2ab51f -:01946009058e83cc9a0c2f74e94f43b41400ec -:019470ab407c44328d4d8dc89957168656c3e9 -:0194809f0b239b88992febd9d5be7b53c5b8ae -:0194901d27ed41bbcd86e0c46e37128cf27ed5 -:0194a05339f8a0fef59b0604389249e003d278 -:0194b05e4681020231bf7a1a112d781ea737c2 -:0194c03e05e2dfd135e56ee733c88ae6ee7cce -:0194d01278cf4e3c58046bae3070f7b98d29d5 -:0194e05edd12d72a3f7c1821c11856c3341f12 -:0194f021ae7d08b91f333796f0218944de5d31 -:019500711a970229cbdbbb378d3976ba0287a2 -:019510fa1b167166b436db1b3cab2d598a173c -:019520e05fadf4e9523633ec38ed5120cbd532 -:01953062220b96bcb2f51f32908c4eb94e154a -:0195408b0a938a45fb139e5f22220aee2db3d5 -:0195507b5942af26d6359a75c666b957ae47c3 -:019560836be7eb43e0fc88ae18d7970815749a -:0195701c3a2c89dd4ca082cb2dc16427546133 -:019580f08444559f2b4e8ca23698aa2d6dc6fe -:0195901084c77c54d38b78b52940c4f3c6adaf -:0195a04e5e426849754421b35fae4cf1656ab7 -:0195b0467f627f089db0d39757f792b8b7fdd9 -:0195c021b1a9978e3360c49e78fac995e965d2 -:0195d096e938e36d0318b56de8d8dacb92e7f3 -:0195e05c1409b904bdec6200800fc20ee07da4 -:0195f0d46f27f6e71f4bab9ca2993352bb6fbd -:019600fb830d80c9234e0136954870281979b2 -:019610c5028f947f84b29c2d315b5db50b5e57 -:019620c5018c0808b31c9b19babefe8b9c20f1 -:019630c88472206932a36580384c7207471586 -:019640507e91e089547e5dcef93686970b02c2 -:019650df784a6f012aa160220ffac4f116c1d7 -:019660aae97395d4e70291a95e4047788cb791 -:0196706dd311895c4334605146056c7b0bc126 -:0196809bffba04d31ce1cd9a1d7c1d6a6c2620 -:01969068960e3c669af855fe161eebb3f2ca3d -:0196a06abfe506b56dee74e74b43ca1d03173d -:0196b0a16f22b1aa459a233b1b024bcb9a8d6b -:0196c0613456c3d53922442011aa70aee3bc41 -:0196d092a6f35034fbe3eb80b465a2a111565f -:0196e0acc5efc5f8426b4479dd4a72f231649e -:0196f0429ca1f89eef9414a81302e9d960274d -:0197009e0f0c02fadcba321808de83424c59fd -:019710b404bc4ab4dad9ae982a73aaf88d4623 -:019720512f551f2185215005d8a3ce4abf4d4f -:0197309626131585ae9350dec5799f9cc8fddb -:01974044079513dad29c7fc9bed6af290eda6a -:01975046847c7efa76dbeead4d3b8381b36862 -:019760c079bbdc8eefd839aa39331c6aeb9c3b -:019770626f152ef408bcd282ca6850a83b4376 -:01978054ca609bfbb2aaeeb03139c6f7e94762 -:0197902b461b20a7fd335d903426d57049d05e -:0197a0f4a2a2fb21fca8c6982f426129d72fae -:0197b09dff6e6eb0486fba051779a97698de1b -:0197c0bfa222a72089a60dc288c532a2970783 -:0197d0a51f2139b8e7c9133e3acc16da0ce727 -:0197e06e75d0cea68ec87674d947ae0639b23e -:0197f0ef2262acc74f2f07e9af953a8059fb6a -:01980036f92fba6e6b2700841bc74a84a4aeb1 -:0198104757bd6b66451460de46a21f1803b0e4 -:019820cabdda27140e737570a3dc7a95310f43 -:0198301612545b3caa72298d7c0773a4a13d12 -:01984091ca00a6cc471849fc41e3278ae80d6a -:019850285a467415837fb01db47f98859a0c27 -:019860df4327624dad9be5cb4686e245af337a -:0198704de2e7751689b4215770c160124786dc -:0198806a0d01dfdf62c18267b3c8183d4bf6ae -:019890bb6cdd53ad1dfe6a5d646ed634d01454 -:0198a0e534e38f79ec761c58776e44d17fbc4a -:0198b0a67c15a94929a145022ab5cca7acb887 -:0198c0e3d0092aa082d70abd0a1820dc598b82 -:0198d0434f2ce79e51da88793d070bc2e20f28 -:0198e001a78114eb5f4fbc4f8ff64926309568 -:0198f0f5d6de03007102f64bcc866e80c62223 -:019900af2cf27cb1185e434f3a258d88ccebfd -:019910778c472f0dc808cd5b97f54bf088182c -:019920768a379b31069aa1de80f308b776409b -:019930dfb8ba7d3a45d029dea38de5be8102ad -:0199406db9f7d8a7b4b6bb52c09501b877a506 -:019950d7fe2a4100adc5f8a6fd38c359246524 -:0199601cbb321a5ba8a8e240c9e0bf78dd91aa -:019970362eb7d40567d0b4499a621844146bcb -:0199807cc2416b3748c18dba3f954b43a34faa -:0199902e7b73b2f91789a38d75529e7c51a674 -:0199a036acc0d2e15fedf2ef90063765deeb82 -:0199b0e1fffb9eaf36e789a731c49e64d84efe -:0199c003c41feae9b09a691e048e7a959a1c3a -:0199d0827774dec5152a786901c27b2399adb7 -:0199e016e5af27870985dea13745240b43e7e0 -:0199f03445c6ae29e751dbb850445393b3fb33 -:019a00a285affa948f0c377176a1b3193ec5ab -:019a10fded3ce4dab0e53505fba4155ece2bb3 -:019a200743a979d85dd68d383a11826a2a9505 -:019a30ed54220f8e41ed5e151c4a008119be7c -:019a40244fbf3ee3ee1343bd613c8b33806fb3 -:019a504305c7c09177702e67b538611e981a22 -:019a60449f6fbf988cdfb47985414b9b77362f -:019a7000b63665d57c252023b1dbf512553b29 -:019a80b06f18b3c288e55bcaaa1aee5e4a2950 -:019a9052a0babace1bc93edc55512b4abe08bd -:019aa00858ec953873f905b980ea11a437d958 -:019ab0536c9b2ba6d93e61647da0cedb76f602 -:019ac00633805ee46b224a0cc9d01de08646ea -:019ad049277a4d0c02a8f41a42f1a4f29ee880 -:019ae05f02b6dfbdeafeb3eeb94887edb9a7a4 -:019af0b2e51f75c14846f9fbbc4705c2e375b3 -:019b00dba28456ce3f0ee09e037d615d4d92a4 -:019b10d7aa38bba9e3b71469721189e63f8839 -:019b20a23ffe2b07a1934dee744035cc996a37 -:019b30c0bd6cab7f9212316b69ff7ae343bbb7 -:019b402a1cbf8cb094f47fd9b75b92514112db -:019b50e0ea2342f4298e5706e90ffae0d30311 -:019b60cbadd0e94439e0f2da3a684d35f3d7be -:019b705ea2ef6deff88b670e0e926f517a0031 -:019b80fddb51396f468b33425eae8a7ce04945 -:019b909294f4e18ccac7302cd2a5ebf03ab2c0 -:019ba072c9ab44b902fd20a0be55d0ab4aaa84 -:019bb0cb346beb4cb0e7b35c7c60bcd48dee06 -:019bc01db2142b0eb946330548525915ca5ef4 -:019bd03e4f46d7a4cc79dcbdecef03a9605006 -:019be04e2bdc616d0b97fd7afba37e5ec067f8 -:019bf00268439589eb7e97bd505e7e5f46b271 -:019c000f1f646b4a6170f151411191f38ab342 -:019c105a8be0dc0bdefe0d9718df7e88e0be54 -:019c203f462277ee1be0c92fba6793aef8db8a -:019c30b624a7e25ec9eca133975ec53e07ae98 -:019c406120274d7a2681fcb24b470bd30d5017 -:019c50e529c7c141743fe20ceac123bc94967b -:019c602d9cf0e6de580f41c18e6450bbda9b83 -:019c7058d689e7aeeda234dbb9a82a304d2fea -:019c8005c5a660c36fcd31de0906cde609a2a3 -:019c9022e158fd79380710993478eb81cf8520 -:019ca00f61b24357c3da67dbd91fd5d67e666a -:019cb06e3447616b5951b91352f4e1633a9a28 -:019cc060a75575e735560cd886b10db2aca977 -:019cd09fde6ec66bb02466be0e3e3324a11e97 -:019ce04283a6ceea2431a6453909458c286f5a -:019cf048c972ee9f45192e39c342645c85c4ef -:019d006582f187b4ee1447b19b1ca7604ff592 -:019d102885f9b05ac1386306cdc7ea1654eee7 -:019d20bebef9819a33f01c3deea2fa6eb1672e -:019d309143683e8d2ccedd6239e22cb0a440b6 -:019d402f5a2aa28b60686b98ff34a8d163dfd8 -:019d50b155593b9d2994ba08d627011fa7e6af -:019d60791e06af27ccee8a418a41158d543aa6 -:019d70ca8e35f15563172fed243c4f78594425 -:019d809d74a756a9e2a78fa461343158d46a12 -:019d900c806e1d6104459d1a27a1178a5a92a1 -:019da035395a61a1dcc370df0d4f6627a42d0a -:019db03c0c81935c767fe1b3bfe46b1b086b34 -:019dc0b612afc4d57f4727d2368296535be2a0 -:019dd0575384ddf2787364f9fdab3b5314d793 -:019de06f5c0355ffddc762cf607e04846e2cf3 -:019df03b7e5f18418a4e1cf82fa620f0803b94 -:019e00423b5e7eab70065a5590c1029f7bb364 -:019e1008c9922b82ae2d1d2c9a9b015b5469d3 -:019e20dc06641121ad6d72ad6faba89995ee38 -:019e30c10395d7d4749be692d60b4d06325718 -:019e400acd9d5437c19408a1a05ac210dcd09c -:019e50a8d895104bcd90b1c2695638e62383b8 -:019e60070b101b373439d19ce1f6b69e09e08f -:019e704b3cee99578ef3b29ee306cfe67eb4e6 -:019e807dbcc46d0377f7e2baa32a2476413c76 -:019e90a21ba3e3056b37798011040e0c798cf8 -:019ea02c004f9fd0e94d0d27a94ee0367829c9 -:019eb02f32b43549b747268ac80f4b4c66a047 -:019ec03bd04cf95aa127a7ca19eaf182a843e6 -:019ed0433bbab59a373d6f264fccbb14574b89 -:019ee046135fcf6a3ec0b6e27ce21475cb6f8b -:019ef003c99a1e7c7c989dc1932ff9c7d7a5fa -:019f00039af3bd22bba6e759a4ccb3ae17b25e -:019f1031a7a4b5be36042b30d965272b6446bb -:019f20066a29d5de364ada5923d981836403cc -:019f3098a3284d76d10f77df4f9204f3ddf5e7 -:019f408d91f833f0f9be630da7e1c3f4573876 -:019f50605396c4d6437bc775dbdb989994204e -:019f6072160b44e2bc513c6209fdc2c61c91d0 -:019f70736b9b519ac415249218a0d44a69103a -:019f806d3130420b12d27d7750bb155b19a7a4 -:019f90f2353a8d8682d90fe5a4c7a5c9983396 -:019fa0dde5fdf08cb5a8d6306fd34e64f0ac6f -:019fb084b1ff56350bb26b8dc732f8f1bf83bf -:019fc0068559784708cdc2b710205b65f9d7b4 -:019fd0d513a345e31d1d69102e277b50391721 -:019fe0254d7365004a9182c5b1d65b6ba4faba -:019ff078c645c76077a75c624c08bfea49bba0 -:01a000251917b1d1d7cf4f492afce18235de34 -:01a0108290ed4af6478d986632a7edfcc675db -:01a020c2bb00e1aa803c76758eb875be15d6d5 -:01a030841a1538615b280c2a4d300ddf96c8e5 -:01a040d92e0fd0b3a08302667815fdf7de8c0c -:01a05031336fcbb50175a821fa9148497dc372 -:01a0603c5b050b2c1d29fbc3d6d0f8f449c851 -:01a0706a3ac0c5e5e5630699c218ace1d70090 -:01a080fa48223890632fb47134cff84a6ffa14 -:01a0907e7b5370061675d5b91e133f12c64480 -:01a0a075693e3a1cb6c620e61aa571e8309c3a -:01a0b0834e2e8048b68303120fc2d9deff5a1d -:01a0c060fa4f80f052400d88d753ed59be3b5e -:01a0d056d399adda98a99f6617969398350f3f -:01a0e0ccaa033575047f344344a3646840baea -:01a0f02805b9a1ac1ca16a5e48cea379c4f4b7 -:01a1004eb1c2e50aa1db6d534662f193eaf6e5 -:01a110ce965b01779c69fbbdbdeb43142087b7 -:01a1203d2fbfb0921087ad74b75f6b90fec775 -:01a1306600eb4c09bee7a30c0dacc7d32ccfbd -:01a140c48d7aa73fa554c1824ce1f05d84fafc -:01a1508592a33775f695f99cdc357bdf076104 -:01a160f1a135387dbdc1926de706fcbe4abd04 -:01a170f0fc9131359ebfd79e10ca33642690cd -:01a1807396dc678931f5daa4093d0abae78afc -:01a19033a38d7dce2cd48ebe3e198a12c82b95 -:01a1a0388cf5e795b180d8881e822de7509390 -:01a1b0b2876cdef3e5ef70f4b8eaa13141bc90 -:01a1c0f7252f3f976396e228535abd58f8587b -:01a1d03ef1c996abcd980860dfb34ebd16eb48 -:01a1e0c5700dea8581c0afefaed187c318a1ec -:01a1f0c6381283850659993bed597761ad0de0 -:01a20095f84d2f18f43f021b65d41142d312ea -:01a2104aa2513d783111571cb66336c265b855 -:01a220fd5d7a834902b19f8e7e0853a001257b -:01a2302dac4d7d94f8ecf2d5c783950c94baeb -:01a240d5572c2744199ffe5a8ed56c7a16800c -:01a25062f45cf251b161ed0f591bbe7b3ea3fb -:01a26028c5af5ec2954e69a5086a35b4c70795 -:01a2704c287221e90a3345545170a6790ff980 -:01a280c18fdfd11a189c6e65791dbb2e623dc9 -:01a290a5443cf189894c726af37b432a9f8585 -:01a2a0917a8e1a202497ac113aa82ee40d9f15 -:01a2b071df7ffddda0642a6530292ada39b144 -:01a2c0c8577139d3a6b7c97ba302d939f082cd -:01a2d0036ce6aa95aed2bc5e9d990f9061b4c2 -:01a2e0632e8780b3943f35e7339e3ae21b3645 -:01a2f0e9aa1d80319a245c449a1da493275e27 -:01a300b2cd6a0d1d45be0acb0717a951ebcd15 -:01a31000b53b2f0b2cbf3c8032f4be97ff0661 -:01a320b7c4489289baebb92fcaa485ac9d199b -:01a330150c3282c765f28da5b03b106437ad96 -:01a340bc2b9749cffbaaaceca152d0f90e98b8 -:01a3504dc30147fabfa87a43545d919ccdf20c -:01a360e8c33bf58cdf5b86f494a282bd1e2852 -:01a37009ec4514f21e9b024c0becc5cb0c584c -:01a380ae2bdcfd4d58816ef4561f0a72c92d36 -:01a390bcd2909736fc67baf4c4c5357f1c3154 -:01a3a05a52edae9447080b511e4b4c2ba17929 -:01a3b0c3d2b13973776eddc15d1d83f0159320 -:01a3c01aacd20abf1bc9b839f529628ca70592 -:01a3d01191a8773de5974352acd9efc1b3fc75 -:01a3e0d2a451c6d9879c2b11ccb2c9f9b0e43a -:01a3f02bfeb2c07a1fd099196afce9830b28ec -:01a4008426013184a56527fad52123b99bb8eb -:01a410c26c8c59c7c594d4cc1a122ecc6a40e2 -:01a420d80af03ebcd6008f6751f54d0aa1c01a -:01a4309fe95e7c44019bc9c32997de490d051a -:01a4402a4abb9b0b3ee3560ab7c1cfa46cba4d -:01a4505ff9437a5e99e63aba0242c8e36f5737 -:01a460800b85b653d68dc515c113203f0685e2 -:01a4703d129ce11624e448b8fbddb4b43c0bf4 -:01a48059162b3e061c8656ebbe5489936bc445 -:01a4904037990afe6d0cc5df124a49882c5a32 -:01a4a0e0035046fbf853b6c313566b1ce57311 -:01a4b08b1f97a74aed269ae56defd2f444438c -:01a4c04a17a398036c0b49f8d68668eeafa0eb -:01a4d0eee4377aa1bc07bac6265ed60e3282c9 -:01a4e0e1b64a142a1da801cec2c3f145e07928 -:01a4f08aab1f13f42ea4aac820711777aca34a -:01a500938ec314eb7f7a8b6892b78c9f04d81a -:01a5100e31cd3b2186fa443cc60b06fce37593 -:01a52061fcd9a6ad70de4d6f51572737ecd66a -:01a530af68d9dd07ead93d068cda9242839103 -:01a540267dc8d0ed895b30df7847246de43e9c -:01a5503605eda92d8da3377eed7296daffe1e6 -:01a56013b30a65ef6f1109f3db8207204b02a9 -:01a57091440a57f17a735cb1546f05b107c3fa -:01a580291ed45d40778ebb5750e6765d2e36e8 -:01a5906f81fd6d0c1ff181521e125bfc135cc3 -:01a5a0ba7c12717fe9050e93f65ba792774034 -:01a5b04e92005beea48b4cfb53eadbb3833139 -:01a5c0d1989116c648c3da79da783b1bd93959 -:01a5d07169e8e61a3632d5419bd1aa115fb361 -:01a5e0a3430638ed72098e7e9e0bc50a542ffc -:01a5f0b737580e3fecdced31c650fc983bb03c -:01a6005ff50299bdc1533c6d011a6fc2de9780 -:01a6100467c3f8030e07c84b7b2080038a3cb7 -:01a620f28dd3f139fae1bc9f71c44dc3a797ee -:01a630365af715186a522e2c22da47657a5f67 -:01a6400551186838a57ad41a74b0b12e1b9a48 -:01a6506d618332580563ce21b3689f01d54bd7 -:01a6608eee532f287e328aa4bc1c42ffc92278 -:01a670cea5d64b77bb4f8fd8a698f354666a46 -:01a680404b4f726e0d05877175fbd939fd8e04 -:01a6906327fb2909b8fa030bda1d777d452a77 -:01a6a0ec9ef7901e9c360b1f2cc6348b74da08 -:01a6b00db6ee14480706dac4312c44ff3d8fcd -:01a6c05bae1513bed2276b0db29f244b166ae0 -:01a6d0df304d1936d794b55405739788e1971d -:01a6e0459b049d0c78f1a5da5746d99092721f -:01a6f0eab2a5d3c16304c819cf483018b6c655 -:01a700d78b292339e0d3de034bf14b01587c55 -:01a7101ac3e917901d4a44a373723c0cf5fb75 -:01a72087cab321cdc3cc801339902ed9975a3a -:01a73025ca07eb1b41ec14375f04c970d5fbef -:01a7403e5ab2d26286496e0c4f48e12a1ab360 -:01a7506d3a9714add81f0e0dcdd9ca26f88285 -:01a760fa3973f1186ff8a7536c8e0c0e34ea4e -:01a7705335ebaea8b0f8f01a2360f05c52d19e -:01a78087cba1e451310f61e18dcb9b98a00e2a -:01a7903f855d625845c332115070820b71ec6f -:01a7a08090663f273c1f2d9441837ce47f149b -:01a7b0e0442ce9c01e41988a0a0f0ebc742a6c -:01a7c056077c44174dc21a91d2fce1e126106e -:01a7d054589c793d4e830e726cae704892ee93 -:01a7e07edc88655b3c838bb92d4016538b69b3 -:01a7f03666899badd3401b3ac2c547302beb7b -:01a80050ef181eadd6cb522a2f395b8283b19e -:01a810d7255ec74deb3a96219c921e89b2e235 -:01a820f999d615a7aa7fd0747376b586de1434 -:01a830c12401ce4f13d91f2d427a04dd248d23 -:01a840bed676e1fc8ae399c22bc5fdb9f54dd2 -:01a850da8493dec8ccbe29b92fc89dacef1b6a -:01a8604e92762eea9af787b3d74855e293eaae -:01a870deffdc8c18ec2dd90cc42fe4b5416ff6 -:01a880d536b60fe36fcd962d87573881e59ab3 -:01a890445a3716fcc11a5d1df74c1ede7efcda -:01a8a0f9747a5133334d1249da43818042351d -:01a8b07530fa57e04c78a6e6c54abba0f1ae59 -:01a8c046c1d99e66da89286cd33cf9c2e38515 -:01a8d02d8015fd87bd3bcea8e281dc26b62678 -:01a8e0c1ffc6b37272046f8ecbf3cda8b0c1fb -:01a8f032d0537cd5101068b53804a27a925953 -:01a90080f6d7596f21f78c44d4d2f7dc9b56a7 -:01a9105226b21deb0f522c6603d42e82f098d2 -:01a9206202732114ae38ef17d4eeeee02543cc -:01a9304e0358b1a8b5a87eff9ee6214ebe18e6 -:01a9405845862b4a492f7982d40c416564cdad -:01a9502b785825b32b030c40527e9fc0ed0957 -:01a960297a9e8e8b7915d3cc10598892110f0a -:01a9702975ccc0f50c17085edca1970d324e0f -:01a9807e273ff5b8c5f9935f3bed4b1a14d25c -:01a9902e787f21fe2f3f4f1ce95d96276818d2 -:01a9a0f80ebfa0143324eb82577e0adea70614 -:01a9b00618111337ddd199ef43e37d93a17ac6 -:01a9c0c896c485b3e411808f3e056e2aa3211c -:01a9d078cdfc6b15c141e1cffc75e2bd0a1f8a -:01a9e0aff29f56270e8721a6a2f42b52a40156 -:01a9f002b55f1391d980a454a79b5a2f4cc1d2 -:01aa00d2bb97e5f09e063c19bb413f030cd95f -:01aa10fee6061bc3e084f895f2d100d460d1a9 -:01aa20998357105586e28f2ad7daeeb2a85bfd -:01aa30208c92f8e2e907e278ee66295866b6d1 -:01aa403ff50878aeddcfb991793d7821c04370 -:01aa50dde21c1cb6535dab8a255295919f74f3 -:01aa60bbecff48521ec12b3f169c78eeb694db -:01aa7033b2ac99d9361ec9d40e8c72fc8830bb -:01aa80cb6324f0f511d555ce721795e0ab740c -:01aa9049aff5a7482e35d89ed1f8a631474adf -:01aaa01bf41803a1bdef4ffc635e2229d7d9aa -:01aab04dc5fb98b1f8aaafc7c051951a8a166d -:01aac05765592f7b961d4c430e71c3904ffe5b -:01aad006fb590fff7cd24604da2dee8e62a574 -:01aae0edb5d2ef2a39dbd9e5b7222fb631a2f3 -:01aaf01d546cd672de8473420a0a69d6690469 -:01ab00c4d2a41095b27448f7d18b45c6b7ab70 -:01ab1080a1fa787c80a4880ad961f9f40661d8 -:01ab20d07c615fab2fce25f9ca998519b3a0d5 -:01ab30509fb9b274676228954019c316b287ff -:01ab4030dad56167bc81fa5ff8cb54fa5f0b4f -:01ab50068eb510c2b606ed3df06a1f035def91 -:01ab608c0c7c2ee8311fb7e857e40c4f8beca8 -:01ab70afc97bb65de2dcae2a7dc1ef19156378 -:01ab80f7d0623abed7ec3fa8b816e7f86b1ab8 -:01ab901b885c3851161ed3b1369d6954222255 -:01aba06b767f8f7e4a0274488f221a260e8fc6 -:01abb098b0ff7a8504d42f4e1a1cda51ee8919 -:01abc0dd6dbc98d464a08e67bb206396e38a61 -:01abd0f5fbaeb88c0bf494312aa4376c2b4690 -:01abe0e70d301cbbed9966a4f06907b97a68fa -:01abf0de3f0dc6d6c8cfd4bbfec43a7a8100ea -:01ac000466ccb3be6d7f639d5dca18b810f120 -:01ac10ace5de77148b07b8f79ef609bc13c0b8 -:01ac20f37e406c03b8ee22b1ef536052d3021e -:01ac30205674dec74316174deeaaeafbdf9f91 -:01ac408e112fd7ad359cccef826b2dd2325caa -:01ac504dc6b2d6e6de9b09cb0c4f8e14f8ee6f -:01ac60569feafb3f6c1721052e2869e4adfb09 -:01ac7095520ce81807cd3f78e19d4bb399f81c -:01ac80239ac8473d5a5221666f1701a0179d2c -:01ac902bc623a2f5d1f81a20962663e0f34f93 -:01aca0c7e3f1e04f99e826a3cb243cf511209e -:01acb03e551b5d83cc84a07d2108bb0be77d12 -:01acc06cc1fcd1824909033946e33f5b556d7a -:01acd07d4505ea4a319104fa52fea3887d530c -:01ace0f4dd083da2540bda2ec77a33ab0b9844 -:01acf000f3beaa2720ee4e7813a73e6ac79337 -:01ad007b31c0717cd6525ebfe14c5b62593bbf -:01ad10eafb12bf713aa7d38a8df8c73be3b4b7 -:01ad20b6fa59271bb1f7dd17dba07b5bf8eafd -:01ad30287d7ab4ac790cda326b7759089c09ad -:01ad40529935432832a90e9f0106f45571ad8a -:01ad50856119dfddc4ca975473e21b70d9fbef -:01ad60230fd7970ccd489a805afbe6a8ab8bf4 -:01ad70f37f521b652665f695c96dcb981eeef8 -:01ad80a22734897af85e1ac6f8129e4515e42f -:01ad9019b5b03fe728eb284ece8f47b7fd0aa1 -:01ada0809708155d9aa93031a71c443ff81539 -:01adb05ba7d80f99186e3d13e5e639aa314bd6 -:01adc0674dffc5c9b895bbadd8704474a01c35 -:01add0e3af917f5d7571015aa35268567d161b -:01ade0ad5d30ed0fe9d69a668231fde682b108 -:01adf0cc2c1bfcd1354b2965ddfc3b4622f44b -:01ae00d6011bdc486d300ab50c2e56f8d583fa -:01ae1016c04b80789dc1767bbf2810e18e634f -:01ae20a944c28090765dfe5a7dd700090d7995 -:01ae30ab06a57a7ca760df37ba2fcbe601bb38 -:01ae409bbfd564b7eeb8a47529a447ef513368 -:01ae5095ad4a13bcc2ba05f331299640cfed6a -:01ae607801bf3b47da2c7a53e6d827c99071c0 -:01ae70a3c9bb17947d228f8f33a20f785e64eb -:01ae8097ddf2575b6c306001167c2e8dcf6446 -:01ae90b322ffedb554583bd4d47fc905a43223 -:01aea025160cefbdb9600e14b38e60893f2720 -:01aeb0e821ecb6d13c4911ec6cae051e8f6502 -:01aec00cc043b363beb1152577623ddd065b1d -:01aed08568e2323bb0899ea776e659929f7824 -:01aee056d68061a8b76f00c557a736a7ed4b75 -:01aef01f1ca33c6d75de150e0f05947dbf94d3 -:01af00b018a6768f96f2b6868defa356c071c2 -:01af105b619694fa010112137ba7cf4535e7ee -:01af205bb528fe2b010375ca15c01c39c2c5c5 -:01af3086d29ffc7912e7185ba91cb68a8fc628 -:01af40b57df232752c1273d4902e2e4ee70849 -:01af5048e6851d2f16cf781487d56d86722679 -:01af60215b54b8391ea88195b4be5ded01ad0a -:01af70b1fb1baecef80e5bf32812847e5b6cc0 -:01af806465dfd192ee3e112bb3c417d6a660b7 -:01af90d396f5df080e03a338eba82b5a816f56 -:01afa09d03ba4f55591fe3fbf9864dfab97282 -:01afb0cad394afab110e98b2727e9da2d2a142 -:01afc0da1d7fd2d6f6a8e6a06f225b69fdea7e -:01afd074b004caa0c55515f9a12a4e47b4de61 -:01afe0402155e711e4209827f4371c76a04fb2 -:01aff016133674442681b1dabf5f4559d17a2c -:01b00029f0e121d7e272f3d8e14bf9a53247c0 -:01b010b8343256770c17a007e0502adbf70805 -:01b020b09debb938d03b087aaf2289aeb5ab3a -:01b03043a88f8664897ae07e71bcfe0f53099d -:01b0403547be2d10e5ae33b222e1c188872543 -:01b0506e2dc0a11c80fe1fd94be5a434036ce4 -:01b060a8f0f6a82c27efec8e91b2f89e448f78 -:01b070865b8fccfb7ff5e57a383c6a39f61ae9 -:01b080a2da5c091f57451445c8603a3d216c80 -:01b09013acf4ed00e058e91b7a9626887dcd58 -:01b0a01d9a2161c293e380c7ec08e4b7d1e196 -:01b0b07cdfe381b4b786fa420389f2f6b80a84 -:01b0c0948a03ed2673801b9f04c345314a3605 -:01b0d049deed9d02c40b24616b9fd788e078c3 -:01b0e04885bb6c8d4d7ac88d100db240f78392 -:01b0f04a35194f7c94b0cce82b28b915c5d6f5 -:01b10051c997ef2f2bd32e914d2af7c89883e5 -:01b110c212a5654d77d32316e96f66d91f4a7d -:01b12054c3f7d69e8294bbef79c59075db28eb -:01b13032d0dfc888d5b6807bf12a15db61e3d1 -:01b140fb4c86a3cd4b43ef2dfb3397c1027c51 -:01b150d366d26dbe51ee2220f4d267dee3e615 -:01b160a2a5dce6d2309f055ad1be45b0367a28 -:01b1701d5dce0b80d138ca72e57eedc65a8a4e -:01b1808a8e5c422c107abaa943ea02f66dca9f -:01b1907f17185502948a5b9f2261873702c743 -:01b1a0867b11d29d45464de6db2e7523a212fa -:01b1b0949fb0365db2b1e7336ed879530340cf -:01b1c0b5c1c2ed56b2aa7fa4d3ee71151ee78a -:01b1d0a258cc310361d77576a6cd600d7a584f -:01b1e0ac6a695955a79c51c6bdfd068bc953a1 -:01b1f0889d1e3e9086acf93bbfcb658d76b992 -:01b20099eec95bd3eab01e1c00968121b66ed9 -:01b210065cd1b7eddf2f8f682144f5503cf9a1 -:01b220072bfac3f384c6df1a5746e97e5b1b5c -:01b2301060c75f2ae1ea340e3590211478dc4b -:01b240bd16e1e81d374d5ac0813ed3bec44af5 -:01b25028faf43077551c1ad20e32742e3c8501 -:01b26042d6edcd57ca75e7ffda434f4d37db5a -:01b270d238969f7624237cbec13c9937cedf25 -:01b280445682793e49e60cf1cf80551c6d5192 -:01b290bac8e375dc158938fa24788037578948 -:01b2a0f52addb89b058e3847ed562449d947c8 -:01b2b002a65de3aac21207de5851ea33f330b7 -:01b2c0146686db76069106094701c1a00a2739 -:01b2d0bbb05ae4e48d20b5ff4a101dc39df974 -:01b2e05c07dd42ed83899676f81469a45d7d8b -:01b2f0cd80ae9cc731e56ddfa1ab01885bf842 -:01b300807797b18d2af3a83348cb1927a6a518 -:01b310e0ab0c7972014683b2c30fe94c692c42 -:01b3209cb486a6faa61bd63c397b6ad8f4059e -:01b330fce663b120d7d668e1fdf5fc5613f495 -:01b340397534fa0005c2d031a50e0a5835f36d -:01b350ea0151ff3cb30e1244fd290435b6aa5d -:01b36061ff776b86d0166d348cd076a278ae1a -:01b3705c8787c235dbc575faa4aef68128a7ab -:01b380e57202bde08f0ad3220ba41dde3b4586 -:01b3906344ef19cfbe71f98b049c9174f374c8 -:01b3a02b0443a87027cab93daedb32fcfdab36 -:01b3b093150a725b61cd66e68e3dd6d39fc0fd -:01b3c0733c7340538fe2edc6a8249a7cd60613 -:01b3d0d438e8c29cfba33f990e15b36869afd8 -:01b3e02260d10744bd2b886c1fddcd0dd12f60 -:01b3f05a25abfce1030d3a823c54afb1cf0cb6 -:01b400472d26d6c7cb93ea84c078aab804afb0 -:01b4101c191a19d6cde247ec38c45914e9e9be -:01b4204f875666df3a9ff8a919a2ee146c49af -:01b4307a96b21ded1070829bb1e3a718bc90cd -:01b44038047b05a5338b09db07677da0980c30 -:01b45032233e0baf6e0c39b2bfd4c4be186ae6 -:01b460679fadd2b87cd03e282c76286dd4a767 -:01b470202f6ecb00f71f7eae10e21483a27dc9 -:01b480bccb2f5e5ef94fd259c741929fc86149 -:01b490838fa3510e294f0276d7935410f4f688 -:01b4a0a195f51ff2091ba25e8a37d5d31b1f59 -:01b4b016dd73be5fae5c6c24c87f07318eaebd -:01b4c0c1b932e535ddf78e6738c6be91646ed1 -:01b4d0e757364d8bcf671366f3887d17bd557b -:01b4e0ba2f92962cd49c8ad85b565c9633d8ff -:01b4f03293b3d0e53b0c67e939652144c224cb -:01b500afa6f7b045deae94f0b9de6c767a5712 -:01b510b9ef476e503e68a43f239b4b25d01ce2 -:01b52056392e8d08599d55f094031367d6dfb6 -:01b530a2b1669904eca4a5fa0506258d37dd98 -:01b54004a4a9f14f7c2366e41aa4b03eb69d15 -:01b550f956cedb05e4fbef4f3a10d6b3aa8d37 -:01b5607ac5f6e70902b2c74e98817f8c63ec37 -:01b570acc672fd1d86aec3f6fa8ffbef65af78 -:01b58082a59a54b07cf0a8de1bb7f40e12af03 -:01b590a3e9cb7101389654db4180581e02b627 -:01b5a0f1df7acafaee9f3462e5158813637249 -:01b5b055debc5feaa3f9fba79b4fa25e8cd8f5 -:01b5c0ae1028cfa430070bbcdbcebdd59046ba -:01b5d068efdb7f10b01518399135ca0a62ebf2 -:01b5e0e0b009db2f8c1d66600e76f8cabd3e57 -:01b5f0ee9cca6021cac2289fb5a1dc4ec692e4 -:01b600b4a5711aaaa0296abe782693b6717055 -:01b610f113dd6e0f632ec6d1bf2f7ce427b6c2 -:01b62041b15bf2f80b6fdf2c1efa5da1982516 -:01b630813c258ebec1b53adcbef624e75dfcb6 -:01b640397e5d92b3807e297508c49955f24ab0 -:01b6500bed11c191fd9083a0654394a150e25d -:01b660d824b2fb2d62af7fe5fe06eac6e0c022 -:01b670bd340d91248bf48cb02f071f23f3905b -:01b680445cd196e39a7281f3ae1d63add572d8 -:01b690be9eca3e57088886e9ca10452db1825c -:01b6a0532b4ba1f3e17add1c20d8aefe299d23 -:01b6b0072a1160b64c47ddc26f9629ce3d6ec4 -:01b6c040616ece6227e8ba80ae490e8a9dfc64 -:01b6d03d40a66711958afa3405f037e71f4e69 -:01b6e02a6add682486bb07bb4bd9149f6eebe7 -:01b6f08986f4944ed3b3e0ba4ce29256518bcc -:01b70021c10ce91cd519dbe4f0a2a23fbd980e -:01b7101edb6ef3494d17cf3f206823c9f0d9f2 -:01b7209145da84ab3204dccef0fc00de2f22a9 -:01b7301973e05cb26b8a027e74a8c1ccc814e2 -:01b740fe42ce5e1ff7f445ef7d497ec7d373ee -:01b7509caba22a17a4248c01703bc4d4ac775f -:01b7607c0c0661fe7cdc8d848cd30ff0067945 -:01b770590407464a8befd2389c709278b9532e -:01b78053e09287fc30d2614ec71c2d2de1cb59 -:01b79080de2ad7026231a813b682722f15ee51 -:01b7a0a67f78b0c55021bf59270bef19690277 -:01b7b037ffae2f11b126672885a6af60a92d09 -:01b7c0b50191491f4e7c6b9c61ba1231e4784f -:01b7d0bf1a73a96f725abbe9d81496ba47ac4e -:01b7e0877354674e456b2426afb77d61f7824d -:01b7f00548ec5cee10f4caa0652fc87fedbd97 -:01b80013f8331ab4d5045a244cc680d654b8d3 -:01b8104ac049a7e15d8f2af7c1f95bbd031874 -:01b8203712f73987dd79e3d0bb975ec9e9c386 -:01b8309daf1576133a25450cbc352f4fff1616 -:01b840c86352a717ef989736d7ed5147a7b8f6 -:01b8506544be8e211041e6ca477968e088d79f -:01b8602ccc9a76cf8ca291cf872bdc9fa69828 -:01b870995cd236e3b7ce770fee6f8c40a85c44 -:01b880f286438b508aa08055ac029dca5840c3 -:01b8902b4a05d369d53c39f962bc46df3cba38 -:01b8a0106af2730b4da4582b7fb04878bc212f -:01b8b0b0f440c7908c2adce28332caed52b42e -:01b8c0bf277ae497681aacccc7b902c7fd1229 -:01b8d0017085a40bbd7e60a2d72106a808b5c3 -:01b8e01db98797ab84204c33440ba1070520c3 -:01b8f0dfdabb801746e3402ab1bb457033453c -:01b900a2c4e15013d993e3e9734e0d4ed34fdb -:01b91087cf6bee3f33e81db5276650fa6f1ede -:01b920c0ceef53d15edf80ba7cb287ec47b753 -:01b9309a3e078b98fbd6aec3e3a95f103d0c44 -:01b940d2517e3dd27edb874a7e2dfe8b16d570 -:01b95076934e46e1078ce2356963e3c353a2cd -:01b96088c5c3930618a6a742d0fd2a0bc35f90 -:01b970f71bcb72ae8d0e69c264baa79ccf65ee -:01b980ad07dd073581ee2d7e394596c14a487c -:01b99000967fe9bcdf7a4ba571b8ed6ae5c27d -:01b9a01dd73a489e03b57ebcb072168b7a6d6c -:01b9b06d6d0d7d7116a12f0eae33b5a7188e8a -:01b9c06313a9b36a08a6d6b96a9f75ba432320 -:01b9d02e76498175142076be711568de9da0a1 -:01b9e02f4072e5c60535ba7f859cdde191c897 -:01b9f08107e1bdccec22a5946c91e124e4c3d3 -:01ba00a33d34988d5e2db6e46fbcfa6f9f8fa3 -:01ba106ab5bc0c569ace664dea54ae987c8c92 -:01ba205d649aaae1bd2b25fd50272762157851 -:01ba30c2241e2bc67ec933656c5b1df380ae96 -:01ba409e10ecc9993b77bf2de33e693a117efa -:01ba5099e4d1e622823d01eb5c476eda3a7e87 -:01ba60fcf68331fab97c8e38b28b2199b3108b -:01ba704767e87eaf6bc42eda15939b859e885b -:01ba80177cb99b97e18dbb4899edc92e47ef7d -:01ba905c3c191cdca2dc182e9007c9c7b038ee -:01baa033d7f51472270ca91ae7ab53de55b3d5 -:01bab03c03f4cef7ae901fbcdf9fa22e0dbf97 -:01bac0a37c038136a019e82ee997e19df20a3b -:01bad07f72953aa3db024d470f5a19478dca13 -:01bae0ead54436fbe21b68214b97f974930c1a -:01baf001d9281ee76b41e3782760eff0822918 -:01bb00494a4741f4542616abd139df31ba5e2c -:01bb101de43cb7155529eb08fc03581a13aaf8 -:01bb20c3572f9ba537deec7ef4190a4b6a0ec6 -:01bb30355b234d3d85413d0c1ed9770cd17223 -:01bb40323bedca8864d4c9da61d89d095a280a -:01bb50419e762180579e4e9f381cdb5cb4088d -:01bb608e400558e2ec9d21d7f21536e2ad5c16 -:01bb7024e1b93619d2c964d20bcd6241f09756 -:01bb80326d4860bc3d2e582469a3f662d77522 -:01bb903f504102dddb8cf31b2e21e3bb0576e5 -:01bba08226490a0861ab04cefd7458b73a683d -:01bbb0ec05eac1602a372a61ea16e4c82fce0a -:01bbc0a293887f62352fec29f1a56872e7de51 -:01bbd02a66e47bc9dabbcde155bdbc4d1f310f -:01bbe0e14bce834b514c33581a95d789659ce7 -:01bbf08d9bad49d7c6857d7785542d0d4dc1ed -:01bc00d34b3993935db66f657b36bc7b42779f -:01bc10f5bd750776101b6c724efaaa6a48ba1b -:01bc200dbeae184d3012f30db3a207337fdc9c -:01bc309b93c6743c3b81dae392175a0f380507 -:01bc408effe3d7cdc49b12ec274389e03af570 -:01bc50aee43b024a17c053d4ec635031c264ed -:01bc60d415cfe10ed346ce5f8578e21feb27c2 -:01bc70f33fb4f21a57f968a027bdae83715440 -:01bc80361c815ce54190f47b515ac2ce36a045 -:01bc90124c2a9c831d0007771ba91aa3f617c2 -:01bca0ac7a0d0b96c579a2109e8274eaf3ba56 -:01bcb07dc491eafaa71b5e4b857704ab518def -:01bcc024824e59e8be359cf504a6322346a5c9 -:01bcd08f7f51c06b6b2a6f301db5b463f1b01b -:01bce0d9c91e553eeefff06192bb060d6137a3 -:01bcf0b9d90d9c3815e2652c6a442ebf5157ad -:01bd0017959a99941df2fbcbdbba08d488b805 -:01bd100b7e3ea7004e034f3bd01953a5cdb410 -:01bd20ef78af6d1071b7c2073769b005c73177 -:01bd300942143cfb37cfadc2b2e8fea35d03ce -:01bd405e38a17d2f7c8c2f69772faf275d0933 -:01bd50de0522a9922659b897c0c4aab71798bd -:01bd60e995c160a8295e53e62497e37382f387 -:01bd708513d20866e7b20840e6b96ce9049866 -:01bd80169f57b2fbcc73516e12c184331dd913 -:01bd90906668528222c6ac191bdffd9113680e -:01bda03db8afe37a7c7e7a0837ed042c071f21 -:01bdb03efa99818e96524fe99c757125ed6db3 -:01bdc07a8d3262c41bd355df1981e8505cb98a -:01bdd014db7ab4e6b80e3d4502ddda3152091e -:01bde006f257ea4f6ea1a93f5bd9bdfb6c9b32 -:01bdf068f1e38eb8d4800ca2af9e884b8cf605 -:01be005dba6f555dc5aa4989d7dc99d5213774 -:01be10eb6813da1425bfd206a30929379fbefd -:01be20c22dc960e7d2e5b6b13855196b1dd278 -:01be30ad726a97132912ab33158431ca6e5884 -:01be403f337d79e9210162e945087df4b8da8f -:01be502a5b3a6147ff70ec67f726b5fb9ea1d1 -:01be605473eb723546394c0b1eea1b9dab7dd0 -:01be70371ac0f9adc90d6b212fef22d9be4684 -:01be809d061884bae256a8e3b348b2dffbee88 -:01be9016b79a4f7b4bcdd0962e83c0d23f5495 -:01bea0e2aaf0a686606d616988a9a1d7935f04 -:01beb0e3ad14d6c83e624a66b22382744eaf74 -:01bec0d16d10525b491ef5b479e2fc632f25d9 -:01bed0d6074cd8b431cbb37980d2ad11955b14 -:01bee052c8677e0d4d199d9c19d6302ea7d442 -:01bef0709773f6595b10a2a857ed1b477e7c65 -:01bf0023a39d6a6985869fbeebf2087e2e4363 -:01bf10d1cf45dae8cb8cb2353b55491b005c19 -:01bf20eb867df75dd88eae92091318d853a33e -:01bf308152c7931753f29e3a93ec1cb75cb82f -:01bf40b7e164341dba76fc95d920006170a997 -:01bf50ef1d09b0549d53299617e9c2443d9fcd -:01bf60a50fc55604522596e89b43d23dd4fb00 -:01bf70b1d2ab0aceb7d04dd62408d20e55c43b -:01bf803c0fe484bd91e8d8859455032f289a58 -:01bf90649469992444829674573046723cf6f5 -:01bfa0fb73005646a0bb7525ecec66d2826be3 -:01bfb0cba26d2245798bc0f60115ed398909aa -:01bfc00ac4a8949e6ded1f2603ea160e33fdd8 -:01bfd0c71e6fcad84f60086d2daba1703abf06 -:01bfe053d857ce4b66ccfd157a1d8598233971 -:01bff0205133935b179d87d21dd0bd8e943dae -:01c0008cee43969141ddeea0cf786923adf0e8 -:01c010d815452f50e4de0097a7db637696ce9c -:01c0201177507345cee7bc340dffbf5481df03 -:01c0303563f170fbf07821ab1e91b6195e6ac9 -:01c040a20ebbfbe32a0d00101afe176045e58a -:01c050c67575323f1c3ee6e4ab68d454af8261 -:01c0601ae1914e1949cb572c4986d839d8b6d1 -:01c070767477c370d3a12e7410ba6931ed7d2d -:01c080350e22a46edf842d362c1130819d5d30 -:01c090306ec06603b9e406188dd30b31d1d655 -:01c0a0c2750da474e4bf910d5d9f8a395a17d2 -:01c0b061c45a9afbf19ed5078a8db2b5904881 -:01c0c0a3d746f1d9972499598539a60145022e -:01c0d0e089088deefd0f86d05c85ec28671191 -:01c0e0d2438b1608e497e1d7900a36c50ad574 -:01c0f0b425dc98d1823e782be7f307027e05be -:01c100ff1b4c8bf5c4aa9da241cf93658a9c65 -:01c110c39e302e278daf66370295251b1c4729 -:01c12074be4ef70574d1b368cb1df887bad973 -:01c1309506db8ff84fd56e1a2d4c535959e5e6 -:01c140239305dfa8b992d0f22e36165f6efa72 -:01c1509f1cf5f484076eb26fb9f49c054c1402 -:01c160008184893ff8b3ccc4293fe77a03e356 -:01c1700bef90fef1f832d85e704653622dd06c -:01c180a5dcad35a8c1f1e27f28ab1fc2880d15 -:01c190f3ca1fa9c466947948f50349818bfd1f -:01c1a0c98ffcd6c6dc3508193eb18e5041a304 -:01c1b0f094b5eee2d4007bc5ef842ac3bfce75 -:01c1c0ce94a7e8af3d743cda274df51f87833d -:01c1d0b230c45b21829a3d5428851a5947e792 -:01c1e0d760fdd0fd1438922ef020b9ef8741cf -:01c1f0f94006f2ac3d7de03e5a7ccd15e6403f -:01c200b89071c633b909467c562b739f940a49 -:01c2101deab3d938fc2baed15d0e4425ee8764 -:01c220e8b54788eabdbd9a520e1bb474042c11 -:01c230114ec7d2540b8330f8918c9585466238 -:01c24063d869341936fd2e0f13ebcf8e21becf -:01c25023a68e3596d69f4a12cb872964563679 -:01c2603c369424a26c4c8ac28237dad0f3b38f -:01c2701728b5095aa75af99ba983ba85e12e2d -:01c280e588b30feec66b8c86e621ddafb85138 -:01c290f26bab451e5467ca29f8f85f15d7c251 -:01c2a0eb74e79aa6aae49be26ffff336600184 -:01c2b0ad68913d46dcdf9f17d7c5d8c82936e1 -:01c2c047b5c406e02394e5a95be4103c9d0739 -:01c2d0e8da38870873f6262c14cbd7505349c0 -:01c2e0ec5d5a2305b77718c82ac1602581c1e3 -:01c2f0dd967868386568f41d264678536ccfc3 -:01c300a64efe6dce5d7954a389010b30285b24 -:01c3107fe0117666c767b1cec9152acd624627 -:01c320004e2d44e1783b3eecd3b4ec5e4346e5 -:01c330a07361273289ed90a8515a678b8058af -:01c340eb8ecd478bfcddd3566a7e22ceb72550 -:01c3507ebf66691fcb17f68434ef0a4fcc0515 -:01c3601cb034ba9b26cf8ccae7a08864380310 -:01c370c4aff21fbc83748dfc9b7b656fd26c9d -:01c380dfa4e283c366da83fdfc2a7b80588075 -:01c390372edbda958752ba12c69422daf18548 -:01c3a089b6f0f96419b1ab83c5151568afea3f -:01c3b0449aca224182fc6d33f0efa4d2f519f5 -:01c3c08f47bee4ac78692410d48b6240b1a781 -:01c3d0c8703f04162ffbcd664e65b04c0f8de8 -:01c3e04d9c6e46b9a3c8774ffb46fd30bc7cf3 -:01c3f0edba1813450e80e2fa11ca904719e107 -:01c4001737b6dc6d3cb42dffb2ab880b42aa58 -:01c41058977f606ac4034a8e2ccb1dd9e77fab -:01c4206bb6569ebbbccf88fbdb5485c50e5fc1 -:01c4305a271a95adaf824b51c5010b613cae58 -:01c440b4670963fe90fafb6d08234d6b8d30dd -:01c450a84b007b2e268c2e2b0cf35fdfde6df5 -:01c460711d12dbc5df05b0912a9082affb563d -:01c4708fdf4f8a56f90b405490daf849de4637 -:01c480198aa490bb46d26c9622f72c7bf15e0d -:01c490f2ed198912bf3329262e9ce7d4528736 -:01c4a05ff1d1992e264d5c17768566b20592a1 -:01c4b04c33cd609e69e7b614a6e52841252d59 -:01c4c0dd30727d97169d3a8209b651421bfa7b -:01c4d0507cbe88bb24418b6434bab2b8097990 -:01c4e0481cdbc9fc66d192b9960f0c789eb0dd -:01c4f03218af00f258aa5ca69330f2e59b1d71 -:01c50055052e5e16aabfbc2f675a94eb7982c8 -:01c510b8ffe55ea04c207e6073fe52ef44b3cb -:01c520a5bd74660c019e5deac756b81e9eb60f -:01c530fdec7458786b30afaf3fced517ec1455 -:01c540172d1e99e7255038fcb17821c72590a9 -:01c5502ee5a4827c349ac18f8f20d9206d0118 -:01c560fc04ba32370cbba0529dc7e83544ce96 -:01c570f90b1422a0d6f5b2111f92d181f0a2a2 -:01c5807930606f3a7273df50df082e74baa1ee -:01c5901760d11f142bf1145eaf81a76662de04 -:01c5a01fb6d2b8ceadd5e443e4609c3aa39942 -:01c5b07322514391a7b54bcbb8dfd1eacf58b0 -:01c5c089e0b5dd17a50e461f73bef4cf753347 -:01c5d0b4bf62d974bac866ef7fba823b1124de -:01c5e05e2c91c09bd474cb1159a4b09d6c9a4e -:01c5f063ac6fddd3b96b3bcd73fcdfa268bcff -:01c600b5a00eeba4078e4a84173de2e541c184 -:01c610bbd82c9b196f45dda40dacec9ed2ca7f -:01c6205ff8298843573598752f1ff6754f48dd -:01c630950c0dd901a64c9886ce544961d72f0a -:01c64077ece7fd887b629af370e80215441e00 -:01c650867408af82d348037a2e00353310847a -:01c660948b637127351f2bda9f4382562bbb2d -:01c6700c852779efbfd46c76cf854a183a791e -:01c6806a34211c364ba0edc7aea25636c31a0c -:01c690647e83895a22a660681899b9ba63096f -:01c6a0de7007de652f53212a5ef1bd0914f4fe -:01c6b08eb8770652bdedc336e29395bf41e480 -:01c6c02bad7d97933dc63fa9e51d5dfadebfbc -:01c6d09fe481b03b10b182834b85715767c5a3 -:01c6e0b1f42c66242ea0411295fc440613c01d -:01c6f032f4b21fb754b4b0947fba8afc531efa -:01c700d9ae47151af94cc05288ff7bffdf20af -:01c710a7ebfeb66b91a477779b0eb23c1f5f6f -:01c720e874448b1016c1840acb20788d360ca0 -:01c73075f20d683a1f0853c8959c76d82dccdd -:01c7409e9a19ac98f5368080d8fd227d041010 -:01c7502720f58b1ad2edea2141c8e9518f2f0a -:01c760db09d5b7f31fe8faae762dd78d17d976 -:01c77093c67e3d7462ff97a15ec17eba66cd2e -:01c7809ca82cddbd1ad530fcc162b2a9be46e1 -:01c79016ddb2b8a60ceb4d2d892c814e4d414f -:01c7a0466ea3a74ea967601d747e7b76646f9c -:01c7b0759bd0248a89aac8dea262e7eb0b79fe -:01c7c02d15b540881358b9d646c68eb7b5542a -:01c7d06f42cd7efabfeccec9357ee23d47367c -:01c7e07627c918ead5156a5ac11486435d9d84 -:01c7f0a67d4adaef82d5d032e38ce25ba2e5bd -:01c80005397a352378cf90e355e9b5651bc560 -:01c8100bec466f536cc042014cea96f12b154a -:01c82069ae1a81217588ad283f9abe5562668f -:01c8304466ec243c5d58160e3469061517e0a2 -:01c84060a495b266c224f4bbfa5268402db7b9 -:01c85079b227608857287fc46b1b3b289bd1ac -:01c860af493a4213fede0b320a9df0bd6deb64 -:01c870725325e36ff2db4680f7bd872afae2b2 -:01c88063f8acd20111292ce6c25d62bee8b28b -:01c8905a5711bbeb3b9d76cfdf8a2b3b0f3f9c -:01c8a0d1d3d4ba9e0f0efad2e6a303cbf1b7ef -:01c8b0168bc897704541100e35d7a3fd5312b1 -:01c8c005521262a60925edf0f855c84d7aec63 -:01c8d0d94521ced42ad4ed46e9090078ca5701 -:01c8e07c23f27a81cc9df63969e3a42154daf5 -:01c8f0edbc102ccd961aebd5cca1a0ea898229 -:01c900c85c5210e81b38a5eb37f459b918c2f4 -:01c910d135f468715233ca843892296bf7305b -:01c92015edc58abbab65d021cf04d5ccfa7f47 -:01c930952e2e3e2cfc7ed75e3ab8082dcba8f1 -:01c940e775c983788e8b969d3b67792749e914 -:01c9507b572f04823d8164db15d2910f75c0c5 -:01c9602042bca2ae3877acc3411e2009841a89 -:01c97085ca07ff93e747bf4cf8c1ddb8941807 -:01c9801a7803d22e3bc90fd841cb56c1a20cbb -:01c990d14138fd0f03cb0248117c41546325e7 -:01c9a0816dad75e63d603e84ef4dd6ed789270 -:01c9b0f1ed790882b8420d07b85d26376f4d12 -:01c9c0608ae5942c01ff795971f79af12b612a -:01c9d00d081082e8b76020301df31c4997b3ad -:01c9e06324a93e88ed09c07606016c274c37b9 -:01c9f0aacf870ab373128de825563706478475 -:01ca00345d7897f6553ab219b61f6b6569eb3c -:01ca104515a2b1f1e37ba23beb4e7539f0bc09 -:01ca200c41a9e87920c8b0c39e4f8a1f6d15eb -:01ca302ac0898a8ad78e581371fb9c9327cebc -:01ca409e9bb20372e4ef14bcdf4ebc4b072503 -:01ca50dd12a833b0b7785856d2defae3b484a0 -:01ca60d36773b9bb9bd811336390f3041eb436 -:01ca7015bedc6b8c5e0cb7a28352d39d687ff4 -:01ca806493cdc96ccab1ea799d8618bc8250f9 -:01ca9014a8c77b7227be5d5d3f25b534ccb8a3 -:01caa0dbd97557bc60a625f355950f0a013f8f -:01cab034bf9de1b01a6c39d2bffc1324d47758 -:01cac009a149e62dcb32e39ecaabf3a6c561e2 -:01cad036276bb62cdf5b77798e4e37a93d9dc2 -:01cae0a1537890e9b677ebacd808fe09ff753a -:01caf00d6e69ab8debe954485c5074a84c8e9e -:01cb00ce68338332891449ad5d77cfb5ad9204 -:01cb10867253901ffef046e9e95eb9c2dfb2d0 -:01cb206ff332d88c831f509db2f9860657c732 -:01cb30786dfd41938801efc286a1082c9192d4 -:01cb40d77c50422ad173ac6c99d7547c28f4ac -:01cb5018439cee79d345a9bddf0fd8f37ea19d -:01cb6029602895d53c3cf4063923d80334d795 -:01cb70ee8771c69560b697858a8434464bd6e1 -:01cb80e06cd84f50a77d7c7d5bb323ab851e49 -:01cb9030d6eaaf3c4f1f9beabb52c019afe5f5 -:01cba02790200451d435fef7c5e8dfba9b9515 -:01cbb0a8645f2331a247202c02b1cc76dd5478 -:01cbc0f636523bc253c7caca4e73c879487e31 -:01cbd0a423f16b7c383f3e0dd5d8ee5880afa7 -:01cbe075ae4f41914fc253ec3cbed768ec04dd -:01cbf07774aa193ded007c6dd84964f1dcf7d6 -:01cc00ae38def554836564a72598a9d9bd7aea -:01cc103389ca3c0fe162bfa3e0d7d5412d6f4a -:01cc20777c0afefbd64b91240846f1acde36a7 -:01cc30e78c176ef1f9d54a0a04f77125b4efff -:01cc4026a8132922b80addc6599ba359be7853 -:01cc5037568a0421aa7bb5d58545479d332478 -:01cc60f336e828b672ade01aa71497655edb7f -:01cc70b9ee7a11cde560e27f9479d5bc3252d5 -:01cc802e3d85af4a1319d1ca738653bfc27d13 -:01cc90d88e4f3d8a67cf2e9670e233c96faf29 -:01cca0449a3c307b87fd84e1dff86c8df8e657 -:01ccb00639f463f4c2f15aab8211c92d178830 -:01ccc0225f6e10c765b096e13ef1a92a7090c9 -:01ccd0fb052809cfb2600a64e2383d889b0e6b -:01cce0d3da04b313638f16ba323c7642755e68 -:01ccf0afb2ece085d684050e48a385f5dbaaed -:01cd0031087ab09cf8ca35a18a9551e26ed2a0 -:01cd10fec127e644f1994334dea9758d65e1bd -:01cd2006ad0eb2a19b82e608a2ca55d6a1f7fc -:01cd307bee6ef2bf4376b577de86c24c420166 -:01cd4020fda930a9743ac0941966e1646f8ff7 -:01cd50fd4617cd9a4d616bd31a864538a77029 -:01cd6097f79edbf9637ebac2f141e4c84456a7 -:01cd70bf3c2cd890df0cf4402e3014653964bf -:01cd804b68fc0f1883b2ecf27cd10d967ef65c -:01cd904601a89506a70d34d6c58dc840482a51 -:01cda048aca095d39c13691cfca7678b559672 -:01cdb02242482471b9acbbc63cc8b3248e24b1 -:01cdc088d161b8c6aa488dab487d265aec52c4 -:01cdd04cdabb6ba70725f4e1bdc01bad1a48e7 -:01cde00e78b4e877d187f38b0149067e99b3b3 -:01cdf0daaa83e8387369db8d7ad9c27b70e9dd -:01ce00d22a9ec667cc6cccfe4f417b6856332a -:01ce10db984f1d0e1eb77e72c279c8511ee676 -:01ce202dde52e3fe721114bdd72dd66f5a1eac -:01ce30feba06d27403bb836c27c83c5715dbfa -:01ce404d65971d997e52fc199d0a6c5b8a97a5 -:01ce50c84a4104eb01a39d758f253570e7886a -:01ce605848da1d5d1e1708710a1997e55d9b7d -:01ce703303259f8319700280b9b565aa6ea880 -:01ce80699d0e3c2f5a7fd4f865b9551eed971d -:01ce90c9ba30e3b166bad30ab83a0af6cb3567 -:01cea0766509def2808b275e02bf67514b615b -:01ceb017f044b08ebde1ddf50b991d5622dab0 -:01cec0057903fca961a672026d8f0215273b41 -:01ced0b06ba0048ed0388dc9d1ece91a3145a6 -:01cee09499a2441cc5da6e067c2d42fb81fd31 -:01cef0ef38e87e3eae587edd8a875032b30216 -:01cf00218f86133fe63b3055e0f8b702b5246e -:01cf10a4709456e526278092b189719b7a3a79 -:01cf2080ef051df6e6d0077c270f22d9a6abef -:01cf3087cd0c7ca497b31882f1a8af298b1be9 -:01cf40240e74ec9be8a41c96c0a63bc2702b13 -:01cf50ca615a466dbd257850c331abffdbbb44 -:01cf60cd61df7f523c3ddc432d41601cae7143 -:01cf7011605287e2fe908644dc2eed069ed355 -:01cf80791835d2bde320ca7a1f7ba057f3b0fc -:01cf907c3b68679e74d9321f9bd03e70b0e16f -:01cfa0f5e958bedf6fb7dd4fedc43df927c634 -:01cfb03b2432cfd89c74612376b3b4c13f9201 -:01cfc052e206f5ea43a26adc2a4bbf64ef74a1 -:01cfd03158311df88640eade530e44c61e5660 -:01cfe04ba5720c09f180551d15d5ca2b2dc01b -:01cff0f0fb91aaa36b541482f49402f6481ab1 -:01d0001e01ad4807aa6dc1697dba21fd9d59f5 -:01d0101c5a8740ecbf38c2e9243eb7b137d8ec -:01d020f99fbd8a3aa9ac401ac1e3279fba0281 -:01d03074dde0764051270135f88af2ca7e08e6 -:01d0403e5314ea4df05309c766f446f75f7a63 -:01d05041b89e06548dc668c0c5d71a7febe25b -:01d06050501101f16e50fc3b1e7d55eb50b7cb -:01d07091299e475a55d3a4c6c3644a4ce50647 -:01d0804b77b9cdf9e5e70f8a3837911f3e6a08 -:01d0905e3c06cde545a9eda5ffc1de58326020 -:01d0a0bafab46c99411b9e3a03406faea090e5 -:01d0b0ddb04781e4ff6ef8ef9350d3cdde1a7b -:01d0c0abd76a3823b77994decfaddb65e25823 -:01d0d03453822511a4ccba2a0bea83fd2fc126 -:01d0e0c6a076146fef55d608427bc70f0eba16 -:01d0f045d1dcdbe9bd18b1cae0faf0cb718eb6 -:01d100156b75c13f8f0c444c6851da4158a032 -:01d1103e9407e7217f189291fb3c103fbe2fda -:01d1205cf5e591d975690ed301b0a6614f23bf -:01d13025fa93d5b98ad5d5fe2fc430c4e488c6 -:01d1406fb1d293e9e7a239aa4f98447a056c20 -:01d150f25eb50e98aea1fd003bedafe0bb7135 -:01d16039e52e63b6f70d967cb1f788a91802f0 -:01d170757fcc7f2d21a7119c9b2854a4fd0c42 -:01d1809cd015d7346635d4f831926a9f309ba2 -:01d190969434e7c2d3eb1a6a9c31ec00016202 -:01d1a0e52b08c743daa5569908d8926f08bd95 -:01d1b08a4a54e97c8e4c5767574cd33d9dbb3e -:01d1c00af3cfeddf9880318d0ff50bd3a9386c -:01d1d08279d20d32f6c3e90ea03c9ade487b24 -:01d1e0abfefb44702628e1968e450f9b258478 -:01d1f0caf763e3610084235c773076114b51d1 -:01d200e04a757b1d7b3a5606ae14a492dec3e0 -:01d210b6d08bcdaa1be313e471f9ae09100fce -:01d2203f69eec4d78b77249e222b5bfa7cb40b -:01d2301ca3acf7c25c10125c8afbebc10c4598 -:01d240393db6515b1c97bca1529b6500667d4f -:01d250d2453e93560b6663e4fd6fc6216924bd -:01d260de02f3a68d64fb4da57cac5ac1ab784f -:01d27004998c99a668fc18bdc95c1f03c4e87b -:01d28082457d5573d268158c2dfda728d5792b -:01d290c26dfd5ebce16ce8d8afce6cc5ac0c5f -:01d2a0ae883c836a0f1f314a8cf91b13898a51 -:01d2b0d430328185ae571170eb35b97c2378d0 -:01d2c0cd0a7a12386d86c2e8da0fd7f6dc6d25 -:01d2d04d2d39937e76bc07726b668589cd675f -:01d2e0fe316f0a99182d5e2983ac02450d43d9 -:01d2f0eeb164d6f9ba1e8218ea83262257b5c3 -:01d300a10ce5209f2bd1f510da528a6d5c51c1 -:01d31011dbedf3c65d428703516d6043050f24 -:01d320e7f166bad705f75a3d324e3a97769906 -:01d330fafc84060a5f16de48b0f5e1cbbefd92 -:01d34095cc3eaf1ff9ff203a85f7d12eb053ad -:01d35045139de039af3db16a7416def1d48bdb -:01d36003c79856e0db3de0893dd4d1d68723ea -:01d37065ec04c70b3b129b8338bcdfda129c34 -:01d380d08b4f8fe8956dd53b433c325c6afc9a -:01d3908cf35b88b21833bea90a01d7d46e43b6 -:01d3a0d25501accdf2409ac827b9c2a539f2ea -:01d3b0fb98b902a3bda9c2f369f44ab020b808 -:01d3c052b7bc6b6dea5bcb090633d8edb853a8 -:01d3d0adb4a87f7aa52a04ec20c40eb74bb964 -:01d3e09f5fa88ca60bb4a859342ebb2919bf8a -:01d3f05b36f8e781d209c0fb1c2d468a4a0775 -:01d40012f385a2feb527cfbf928a2b32eeb7e1 -:01d4101685f237874e0de7ef59aadb0f1f5592 -:01d420abc95673a139eef2662920e714f30101 -:01d430a259663a103bd09854f98ab59a78dc46 -:01d4409879afb43267b637bfe588797260904d -:01d4501eba03ca89d946c9118d18101046922a -:01d46043a921656d93c54bf94a331cea9207bf -:01d470bfc49455579edfc39f78f6655f560210 -:01d480f3022bf72f4363bfec15f76650276e13 -:01d4907bb3cd6958afd9d8b003bd5e6d517d5a -:01d4a0bc0c64843a2c780fd9f313dc80893037 -:01d4b0eb25c36dce1a04f5b2b75bea1b132763 -:01d4c0d0a80d02e9c2af284bfab6f1bc79fb9d -:01d4d0c7e0d0be751b75216e412b7611871304 -:01d4e0571cad554aa4f9f2066b1806a9bdc0b9 -:01d4f06b93ec724f5ad9d50217ed4b1c2e1c4f -:01d500fd10ab1dc629feee0ee771bd5be51e8f -:01d510ef3e42caecd8ca3ecfde0dd6de88779e -:01d5209a4f4ff7541d4a95fe535f1f9f2a49d9 -:01d530cb856e673faa336873a9ddf2d5fde683 -:01d540182e090c7f8b69bb6bd5ba9738257194 -:01d550b2c3b3c34aba9fb818530cb340ca5b06 -:01d56065d3519dfcc14ede7484e7d4aad6e380 -:01d570152fa6304b54a8addaa4f57abde1acf5 -:01d58017e761b60e19fbf06fa0801237d7f1a7 -:01d590cfebe3ea2d154b40557ff06c4456adf1 -:01d5a0082ebe305d7a138d80def5051516104e -:01d5b0b87f54251cbe3b44a50067d2a7e4d3be -:01d5c0705341a649e21052e12da9437122f682 -:01d5d088168abe1b518a81d5d07db1e7b0d62a -:01d5e0aac667f2c753c4bf4eccf18b8242aa95 -:01d5f023091e004bfd2e988c76a1d83710bb2a -:01d600d6d046e5c859dc8648de4d9c8e77db18 -:01d610b133c6e46afad602c158a4fafeb5b99f -:01d6208776263c24940efbabf4b22be52e04ac -:01d630495cb447167f297dd9f09bb64e0e6adf -:01d640a24f7e5b8814011b648b55bad35d2e3f -:01d65012510909dada4d8c94f13e8d1368c24e -:01d660537ef92555318d6125046f44828deaa2 -:01d6703c988dcb226ef08f29024023f777d567 -:01d68018360c05b91857e5ca68edfa4a3ce916 -:01d690cb42f0f97f047a70ad51b7f588e0480e -:01d6a0c7849bccac720796f6c93c78e7302cc0 -:01d6b0bb1f8756d711f28d2220214c5f22a359 -:01d6c0f43b849adfab47d669edc67697a19ae4 -:01d6d01fb294194d55ba7be35b9bf57219e0ea -:01d6e08e334694ebb0cddf77f867df2e259687 -:01d6f06f3cb697f486be4fd0c44caae642a430 -:01d7008a71997937e418ac464ab0336ffdf4f2 -:01d71088ae55f0d6cf18f9ada152282b114003 -:01d72019cd427faf5d300dfb49df6a8202977e -:01d730d9023f8f8f5a34d914fa2c888eaa92bb -:01d7403badd5e2d81ae893409f24f1d2247da9 -:01d75088ac2e019c8499c39550f197f5958c7c -:01d760bbe1de981374740b3afbf473f10e9224 -:01d7706968f29258af75e8de00bbf5c800f83e -:01d7803de1ee36dcadeb4f57cea5ac4fa9896e -:01d79067b5843b6a9f54c143f13a50a25d0624 -:01d7a0f275bec9ad6ad1c5ce18961eae7a15a7 -:01d7b009ce199c260b04e58b297bd8564cee1a -:01d7c02aee7f519e78bf5b20364482d70c33ac -:01d7d0b1f1cde950252270fd16dc065baa5bd6 -:01d7e0de93ee7f285a3cb1a5587d23a6df59a0 -:01d7f0a55899e6a38ed17d92464ae1abf1e434 -:01d8007501fbe617db75f6d47ad2c90a0b4f01 -:01d810ab418aadd28595692e2978637a807098 -:01d8207351a57de23e438f9a8e159503d3ad12 -:01d830f0efd85fefe2ab1bf14f428672138081 -:01d840188be3ebd1f0e957a4a68e2f28f2758c -:01d850c17a83ca6ddb810d20597ea144b9631e -:01d860a5b1086016c2165bd47b1ec7a355fc33 -:01d87091a4a46dd1fac03d97a762f15992ad6a -:01d8805468fbef23ccbbb34431ae27a4889c3c -:01d890961c6c1af4eaf80bb930844d8433b838 -:01d8a05b97d174ed9ce6c45e3334d595ebb1c6 -:01d8b06a732adce57b703b38440eaf96ea079b -:01d8c0908265d25de4edc4011cefadfdf0007a -:01d8d0441bd642ce9b6f4d00164be470b28b27 -:01d8e0ab6b8a9d95a7311f1f12f9985555715c -:01d8f0530efcd983bb4f0d6467cfcbc4e13c7a -:01d900cc2c22988323aac430b99478c574943a -:01d910dd10f38f5a3b0da7e29acd90a7c402f5 -:01d920701bd4db3c47cd931ced5fbf5a2ee0dd -:01d930def4e3da09838ef7c6c41d51168a8746 -:01d9404ca727774d3c1079c062f24934db62dc -:01d950d93f8658987dd412fb35a1524387cbd3 -:01d960e8a6f9e5e31cc3b3fac0df1e53f3aaa8 -:01d970aabe893d0ad6fbe536e31943adcb9925 -:01d9802948e6a231a65592201d65df00f23ecb -:01d990075db8a7ad73c079b302eb9724316a87 -:01d9a0958c5f2a99387ac9f036ff20e8af40d1 -:01d9b0efa0d7d0c9716dd36862995688074400 -:01d9c0b32e3a83d9a7da0c23c169be201f239d -:01d9d0219f7149577ab9447227df04c945058a -:01d9e0a17378ead79b5e7a8d85346f2ab3929b -:01d9f0c10523b3db12eb7bd81bd6635220b87d -:01da00934d45ad59808aac8639084b4ae7acad -:01da103eb0c11f253fcb3ae4907b5f9ff0fb6b -:01da204d0e1653e275b478c13c0e0ef628f5e6 -:01da302ec46d1cc38445a934f0694a7bf28c38 -:01da40af6c3835062cf13156b6039558ef344d -:01da50dbea639c26d7f28ad46f4bb153fb638e -:01da60cd81f66a9b282051072950e951d835fa -:01da707e14d5a3a6796afc76054273340ea0d9 -:01da8023c73f2fc8fa600a91dd2d7713d42dc1 -:01da903317255f89d0ca946a9390cc7412ccf6 -:01daa0db67d55f4ec1b650742b3c53f1845929 -:01dab074ded3a801428716165c464e9009d713 -:01dac093e59fb0b9ea1aa32ecbca715a6a78e5 -:01dad057320141c889c5e40f3fba448eee278e -:01dae0539a455e50ace17c31e0de79876f20fc -:01daf09ffeb6cb3e9d6d6e4031d3b2ddf1fad7 -:01db008f0cf49f9b661da50d476957be58144f -:01db10b5d159a333d5876f6d8434451bac58e3 -:01db20f5e1509ccf6b7d9e965587cb6c0dc482 -:01db3022bf56a070a248494d3160226434c9a7 -:01db4054c8d50a8f8dd2e615a04c299a3f0692 -:01db5003923287e9b8353728a03fa5d9a3a9f2 -:01db60517746cd99d1f203455d4cc09fa19c29 -:01db7056182e246317839fb285278bd3ef31ca -:01db80055a6fb3f4447afc428f20b930ef84cb -:01db9019f68b7ab25e1db098214b2383a5f789 -:01dba030ab2dd774c7d8c341c66872348c7291 -:01dbb0f7bbcef58a75c68c0e1cc80d31b0595f -:01dbc039bf758f717f1142101f87880c11f57a -:01dbd0bb4feb309d12b592c3b7102f1aa45706 -:01dbe0e2a2b8fbd8ab3143bdadc8049f69f2db -:01dbf0d51ea7c8e35e95e65421699f98a0c49c -:01dc002a2d4f2d03f8b68236f93497476fe77f -:01dc100dcfdcf2b1b518aa60d5341856917bc3 -:01dc2024a3839603afff3f3a67c89d2dc906bd -:01dc3040db64b5c5c46e54d66898467982efb1 -:01dc408e2e8d48b7c3f6c249954b8dcea255af -:01dc500b5384d11c21afa153a301802f17d0d6 -:01dc60565548a1713d528bb0e29f241f389423 -:01dc706e98959fccac78138a76ee6c5aa31bad -:01dc8097666356cd51a75c968d90501fe3926c -:01dc9033af548770e2a3f6ea4a41a24f064ca8 -:01dca0b3eb69b91cb1d253c5a756a34eb55905 -:01dcb050d09a3309385997a475b843d9e6f7f1 -:01dcc0bb48146908e9b0345c190cd6e1be73b4 -:01dcd03f421ac8171ade90b9773ecfaaefa4e0 -:01dce01734742b892e879f97f33bb484df79a1 -:01dcf0cdb7449cd3b0e3b0f5354d20017c50a8 -:01dd008c36fe5bdb548f22252c360255904d81 -:01dd1051e28662c4549eb2d28ab88ddf9b157b -:01dd201dc65f52cf20f36313efe064ae015738 -:01dd30e768f556af6239fe27ba8ed5f926ddb4 -:01dd40b52769cd463be60e041ecd9f83ee27f5 -:01dd501eee5167bf3e6c5fb2176c650ad24fad -:01dd6038a7e4c3642e485a864357178177284c -:01dd701796006f188b322183d23232d08c6737 -:01dd80a26948b006bbce2bf9e0b1c51b044f27 -:01dd90f0d05839deb4cfb950e0c6b3c842f775 -:01dda0410b0c892e781a65fca8884c7d45632f -:01ddb09b1e70b069b690d9af1e9c2b66a8f2dd -:01ddc0e4df59c3e46db1a132422476ba6e18d4 -:01ddd0f81acb64891fbf05aa6733737921c2bc -:01dde06cefc6d711534ca4ede56f788511c916 -:01ddf079a4d89d437f9dc705eaf8448cdd7fc4 -:01de0074eb7cdb4d56c91755bd6879e50f404f -:01de106acb7d24ba8064505fd00ddd786c3105 -:01de201c09964dd7e42373df6e19f81666b4ef -:01de300cb43296f84bd3f4a31028015e3d938c -:01de40ca53f527926535f4b36ebbee69e150f1 -:01de50dee514e6aed07c2958d7cbb12dda4add -:01de60c29652d21c4b52a2f81d0bf4abc5fb8e -:01de70fc7a692543b26e92832f2c2a68ed12f3 -:01de80bf5e2d817f1c7913718374282e24fa72 -:01de90967793b127b8a38e860e5aefa545f2fb -:01dea09090dd8b5ec501f74ac43a95b2564487 -:01deb0362f3405f1020a85ae6304b2d05d66ac -:01dec0d36a0546602d72ee4d63693f8024fd2f -:01ded038ad73d0720e965f6da5f38956527cf3 -:01dee0fe042a957bf87409273fef781d0a0daa -:01def03fc2477e9762af7a233624f23265b091 -:01df00035f41dde1bb3f5b3a1792c8806cfd3f -:01df109b974231af153b67595bbd6b25fde409 -:01df20127a7c2c4087848fdda187517b242e31 -:01df30a118cd9bd2059c6207c237d3796d22ef -:01df40ac0cb78bd76ecb96d98d532c2e11f3fe -:01df5037eb15b38df9858cf64e6b562ba38889 -:01df605f3c19d7d7138af1bf4b78228bb457c6 -:01df70eb1ac9db0f1748f35b2f695c0289847f -:01df8098e4a093b75f3c50b65df894e3cb656e -:01df90f81a187e07b373fc6a8247115d4ba7e6 -:01dfa090cffc952c2dafea31cfb6d0ce3804e8 -:01dfb04380387966643d5b84f4d355875d861c -:01dfc03b6fe87729d8d4785c5b11c40670fa45 -:01dfd04c26be247a08b3b8c288b299d06704ad -:01dfe0626951f2037d5d65bc79d85aa4b92138 -:01dff07ae8d97e1193f05d4f6e424f7f77e36d -:01e00098e9caf8e1b597001270932a9718ae33 -:01e010e133e37d +:00000042ba9255d17d0c995a2125657e991820 +:0000103bbdde4995b8213b06608c47571ede97 +:0000209f337c1ed6c63c60f8fc3583432a7b3c +:0000305781cfa661141661d1165055183d2274 +:000040320083906a7fb8a0bb7908d83a599ee2 +:000050c0b373a54f7a29c99102957798af9e7e +:0000604ecc06a5d57800499c3ca2bb08d7bb06 +:000070d3905cd13ff34d682559becb69ada27b +:000080a079409dcdd5f677cea9b36cece6d712 +:000090cb57302e950ac55f3cdd3c7214a00883 +:0000a05b7bd76ecaa92b3423c17d556d2d5411 +:0000b04b8842464805555890b9df3a6da714a1 +:0000c00d8f8196688b7798d89b66a478a69262 +:0000d066aee46319b399a1c1aa8ccff14ff732 +:0000e0811fba67fba389f274236badc5eee1a0 +:0000f0166e440bccd712346d25e6421deb7217 +:0001007e48ee1b9e0e8a382b43a51269c00b28 +:000110b6b86bb08bfb7f6bdae62764ba8e3703 +:000120f7dac09f32daf289bf281d3688649fc6 +:000130b4251f1c083e5c58c08d56273f54a480 +:000140a3801afb79f8e94783223ef1abe686bb +:0001507b727cfce3bee89dae959e0022dd72a0 +:000160caa8e2276566b22aabd52cfde6e9ffd8 +:0001702dac3e464ff59171885b22d3e5c216fe +:000180738700b6dd7497b6cda41ca5a3c89675 +:000190e5af2f3958eb604334b3a871ffd02963 +:0001a05a93793610f7460ef94557ce82899eeb +:0001b060641183c51fd48e30a717a8f0a17f1b +:0001c088fcf02b7bdf28c0b7125e2a437c9e76 +:0001d016e6c42c3c3c571f04547e99512a69c5 +:0001e07cb98203627cbdea148d48d440301913 +:0001f0dc0aa82d40968804d64bb5ba38471a8e +:000200e7f0e538f9c97755eb4c51d5e8037bbc +:000210f84cecbdad529a0bcfe0174c7f58c8a1 +:0002204953585cc3fe8e927adf1f0dfa834224 +:0002308cc09acbabecb724b7855b039f213a5a +:000240b776238e7b48274f5ff8d00af06d5a27 +:000250fb37ece27fb7d1f8d12722413f780a64 +:000260226f814a9e3a0fb93f9a9c8212f10959 +:0002706f1a4b3427b9e7b7b9873bb4eb026555 +:00028026afaa54b158c92de76f05272c252fd0 +:000290f70a56f7d76b2be1b18fe8bc7937ddbb +:0002a0c06c82e93f4fc1065f00619fcddd5c83 +:0002b0ae20d78baa42619f2966b2612a5c09ef +:0002c05d7720a27c9e7a7cee7242195b68624d +:0002d08c85b6fe0d7f054707a46763dbd93cd8 +:0002e0dd5d34d8ca4a873c18ce5b6449ec1fa9 +:0002f04f8df2b97caa7423d6cae892d6a78437 +:00030048a5ce5c06a2dd0052dee3209c03eb1c +:000310f0392fa4aff5980f44c468acd36c5dfd +:000320a2744fc78df8f91551df4bfee06e027b +:0003309c5ac9827ee9d670a5359062b53b0523 +:000340f466af50829b0ed3e7e59d3c431223f9 +:000350270ba0d423f36c1ff26c2d6084c2dc93 +:000360f89b1e431bbd8b54f2fd48248bdc6698 +:00037046b61497b8662fb16c1a19b7e653e013 +:000380bd0877b4dfad27b08c4ec9e701765b9d +:00039060bd03f51ea6344e5cdfcb364d98976e +:0003a041535136e4662532f12477db1e2272e4 +:0003b01c5f8a46f640bda5a186b0cd917b36ed +:0003c00e64964ae97a799779092c72c65611ad +:0003d03387da29a42c81564a5c83b5a6d20764 +:0003e0cf51ac6646606a084f0c375933c1de4e +:0003f09d65b9c70c1ce113f525ce0b35d99dbc +:000400c42340b07acc601ff7ebab7c2d59fedd +:0004109a8d9228e172d8b44b60a3320acccbe7 +:0004200dc54d0f7b2ba9098ace437a0da49949 +:000430ca253efecb5ac62d50bb4d5352a4bddf +:00044028d43a6d6088b4134f183939f3ad371c +:000450b33282777638887285c18a1848a65b68 +:000460628c3952a6253bf9f066f33df11b847a +:000470cf647dc9cb01e2dc490821efaf5920ce +:000480b9d2694b1a61f994d14d374916b0a0c2 +:000490b889f53c5a73b3ca35ff50cc1a00cf20 +:0004a01af4ce4742c1a3413221a39a62e24abc +:0004b015811041ff0fa2fd1013a6e72a1b6cc8 +:0004c0f5712ae26173d7ab3fed8aaaed9d97a8 +:0004d0eef7413879d6e151afea14ead285f4f3 +:0004e090fb115bce0bc0678da8f8f9f690aaa6 +:0004f0bbd927cd07a87dc0381eb6e6604fc177 +:000500bd1c2b80fc414ba4914a2119f264870d +:0005101841e086144c925c789b60b4b210a0c1 +:000520826208bd2b6dee04c93e78dc56171037 +:00053012706a7900729a4e269ea27c212bc347 +:0005406d86ca69030308b3928b28924dea4bf0 +:000550b265695fe4a51c143ed294a65e22a141 +:00056063db77ee86541fe97fb282eca6a03fde +:00057063529aa772279846153bb7a2436f8ee3 +:000580de56edf325b003bb62ddc66101b39598 +:000590d4ec737f86da297ab48cdee2881f58a2 +:0005a02fe641f2ac70090c2a5992cf26460d84 +:0005b0eba527a1ec73d7d56d09b6fdb3624f1e +:0005c0dfd6c64a6687cde19868b0067062c76f +:0005d005d027630cb5a9d279700c13982d04ee +:0005e0a7867ad8f36e82cd8cecc4893c54b7f6 +:0005f086137cdb51578ae60572b4701a04b88c +:00060026f1fd666f6bdb0d21d526938c8781ea +:0006109b745af5d7a4058da852b34d1f17c619 +:0006208a2985407c74eecd27fe77eb82ab7d4a +:00063022db3f3dd28862296343292ebed3abfb +:00064056bf4e91c01f4f7d25e51cdaf7c8c0f8 +:000650d8f4093526709ca42eb7ef841f36bb5d +:00066037eab698d1855a466b24f792a4df42fb +:00067082bd071e34386c420b7ff33a70656c22 +:000680939bd4331699f864ad2ad1509a75959f +:00069060a0e5d441d36f0d856b4b99ff7b2faa +:0006a0c70f1e5fc207986ce4edcd32d9665741 +:0006b0131487aff63dcec183263b557a0bf48c +:0006c05c76f0dba178d3bd0b31617109a6c514 +:0006d06895cc4b6bce81c97b95d5e31acf1acf +:0006e0c56dd258d98b85caabf345033fd4bc17 +:0006f06546c0c831786387f5abc4542c047aab +:000700083dcfb22253b68514570c805b603a5f +:0007107f96adae35f04f065be3a774d2a97764 +:00072078b200bd52f2e7e1f7620d01027d26d5 +:0007308292803927f38f60e901c71c8f80ba33 +:000740e8e3105a278bcd7f3fa0ae59c46bae25 +:000750ec836623b090d7a934586a3a44a72d35 +:0007603707e61655cf42a28b0021a498d5c7b4 +:00077016baea6577fba6456f30cf55fb9d6faa +:00078011117801527b17a143e8ecedba5d4bf1 +:000790f02ba4a57b6e97a2b1b700c8a4d3f462 +:0007a0246f6f1d2c3b940cdcb8fc1ca5b18c67 +:0007b0acea866235ad0edd5741ec14f98057e4 +:0007c0c1861a3e8126f9ba9b926b7d84f41468 +:0007d0a5e62e1dcf42b67c4cbdd08c81865f04 +:0007e07675024e867decddb85f7c192f0c2b65 +:0007f09e9569db1897a144438259aa1a7f87ea +:000800434596e8b3451723352cdcf7b531cd9e +:0008104f49e9f87c145fe014be3bc999792e7f +:00082064414355739db75be0a41d5025d171eb +:000830aac07d9cdad2e7a0c71d88e25d9842d9 +:00084000a938fcde9f831d895db4adbd7b0304 +:000850e7923e1ce3133e6e502561195499ab59 +:0008607b688a2474b7271957ad5d05baf1f65b +:000870f53798fe13eeb476288b0b21fbb2b024 +:000880875b84084bac375141380d25d0094aae +:000890e7e5cab196940babbba3f3bc608eccc8 +:0008a084bb521912fd022c9f3c99ff32f072e3 +:0008b0e3ba2925632930dff82b0fa1be548961 +:0008c0029a989ef2337411fed165c4e513ce33 +:0008d0c39ec0f838a470c2446df19c06015996 +:0008e0ffb49b8ab4fd640fcef1f48d928b15fd +:0008f0bbcb71636648f39073f36e5d63eb612d +:00090060c2c13474ad30d465bdb5aac69ee8ec +:0009101938a0bc5aa62098d3c3569f3a6e75af +:000920e756046d33b79e4693db694c2528e8f3 +:000930dba0c64064630d1e813a1cb263990df3 +:000940eec859861fcce00c76ab42e24c58df83 +:00095079a8b899b51603166ab030501fb4afe6 +:00096063b4f03fd565b58490b7404e32a3bc2a +:00097037ceb1f0542ced7a2c6012c799c5a529 +:000980cd91ecc677f59193041364b16544fd0d +:0009907fbf01227157a0a6e84b72eaad981801 +:0009a0ca2379a419e70278835803f8f87b447b +:0009b0b8024b3b074c23f10a6793f6c391d504 +:0009c0e5fc994663e673678e50dd97f0ec7d8d +:0009d0e0bfa60fa892bf8bf85043582ec05629 +:0009e0fa180f2ce32d2acacc425b90ff7ba127 +:0009f06183d10ee7575d6e26ad191e5cca46fd +:000a007ea570d060278fd5d606a52eeb6d5b5c +:000a10782f7bf80a9141199ee98b6e2a9318df +:000a208e8c4e2ceaa376620062d6c5a4ee7042 +:000a301f6312042be02e3f5df6f28bcfab5a22 +:000a40dacb2dba2da9ef89aa647b8fe02446c2 +:000a50fc0428b052da1ea450303185cd4efcbf +:000a604f4c043a837cbb079abecb0b85ad23c0 +:000a701f869f72ddf2700a0d0464b7fc13b21b +:000a8073d3754c9e1ba964992a8a4dc5f499d1 +:000a9069b0467cbd81f84a337f01781d87615e +:000aa0f24a54e10bed35e93c76568f1f08fa57 +:000ab04afc0df18678b2e6695f54b6e78c00c8 +:000ac0029ad57fafba96e2e9587b6ed731909b +:000ad04e94c5f03d12a04ff5b48c2b90e8c6e9 +:000ae09792f74971f8f5cd9adceb8528a60503 +:000af0b2207d53e9df9a0ce7b962ade1e4b698 +:000b00cfa87b9b4c843d3457e5a80128d77dcd +:000b109d3fcb44560c90e0a12578f0f6f3e3ab +:000b2015d3b741580bd28e3d6da6fae35fc67b +:000b30ddebb2feb0ceab5b3fb159419e31b2ab +:000b405ce22fbcfb0573fc5aa4a974eef80983 +:000b50193a17c014eb6ceb6a9e3c95ecdb25cf +:000b603d8907da341e5dc0ad88b54dd48f140b +:000b70254672372313ebd408e31c476256164f +:000b8050877622846f84a46cae3951ba826844 +:000b904a83749b43c534374142cef4daae37a2 +:000ba0bdd2aa98cb19060d87e9f76a86d600aa +:000bb037e323287a14eeaa6002e097a5513073 +:000bc039a861e3826e1f1c74b5d62e50c633c4 +:000bd0bf52ad548712b7fcb66d7215c961ac2b +:000be01c2af6441794a46a733e3595a4ecba00 +:000bf049996adcc61c697f98e2b3fe64176f7e +:000c000a6c1c0d76e0e9235864613c139fdffc +:000c104b4affff4f620777691f827d6e2638b7 +:000c20eb8c68aa69bc29116bd057c60751afd1 +:000c304907f33cee9ecb6f0bf015cce5ac74b9 +:000c40e14329f0b00af079630d53e50b1acd8b +:000c50007f639bc3ff72e9b95d4ea484a25a19 +:000c607b72a5b554504cf2bee71d8f5292bc21 +:000c70a258607b1e06a23c79c6fbdfe15942d0 +:000c80de2c2cfd92b1d52329a0ef30fcc20219 +:000c903366b3e33ea834ac6c891d549bcd6f72 +:000ca00b549f3eb7ea3b1c76f7398948937ced +:000cb0f2580beb9edfc1d4ac742707efee2ce3 +:000cc0a0aca54f8309639c0a4f7b9d78a05575 +:000cd07be248068d6a82e81bb4bcfe2304ec6c +:000ce0272d51b000e1d4e6172a3b68190c4675 +:000cf0cb6a48f2e07a1486e5c62bbd40b4f1e8 +:000d00e014c351192ddc1da1d9857d63f6dd00 +:000d10cfaf052a57ecd014704139429110c054 +:000d20224d82c48a58f1a15733cfde4c4672a3 +:000d306d35845f45238cffcbdbace959dfbe86 +:000d402fb7fc51b74da8121fa4c9b70f145401 +:000d507dfbbeba6e7168bf411c3c3e41c3a869 +:000d60881a4d36571b962403acad0a8de8bdbd +:000d704704640798879e680763f47f23a3015e +:000d8024b7bbf83f43720c00fd442039444381 +:000d90e82c784572e29cdaa3124b9272e951f2 +:000da0c4fbc78024d16fbe0fdf6847e66d4f69 +:000db04cd3d0f563f23647045130d3db92c405 +:000dc0a8d8a44f3bad6a256f05a584ba6b39ce +:000dd01b99158726d91660aa2666bda244aa5a +:000de0899eb729e43ff04d7097400e4d2159ce +:000df03684697976e021f3203d0c9c76ff6b5a +:000e00c158c15d332344d012e7ed8ce748c34b +:000e10189bc806bacf2e1a83845ff839524db1 +:000e20fc5639a606d88f9e41ccf7a0d89ea75b +:000e30035f29b7b09dc59e0f4406fd7ebbb2ef +:000e4062c0983fb027a8f1a1c3cd26427a3034 +:000e50b3fef162c9ff63f93df61f4c0ca1a535 +:000e608252f887ea28dc2b55fc8a2c2b4b978a +:000e70c47f5f632528b21ab3bbac336e241555 +:000e809b01a8d24629658ce176c5e0d1cabe5c +:000e90dda89637d977954fc0384692914476cb +:000ea0f6b5f323130058a7241ee29ddb4ce041 +:000eb0c3db7db9de42f70baf406a8fe004fd44 +:000ec0edabc7aa8971f7255803c4d891b31f7d +:000ed0bf5647a67490923ee8955f0c57594423 +:000ee07bd771bd95fec3fab8c8e763fc104398 +:000ef0f98fbf55a613a4fdec73ed29dc2a8504 +:000f004b2e923c73467e75a7b8ebdcbc0d2586 +:000f104aa7336b16ff5581b331c44e160da757 +:000f204c3041aad8a9884e81baf23ac2884321 +:000f30942d43608ef513c38bcd07f9a053af30 +:000f405efdf6799fd0506cd42381ca5eed978e +:000f50812054dd94cc7142958737c129e6b456 +:000f6074e48f3087157101d8ccc6df0a532418 +:000f702d3c3f428175cdadce784a74a380ce92 +:000f80759c1dbffb90db4b23ffd8855df304cf +:000f90d4d32a3c20cd78cb7a359dd514fab032 +:000fa0f56ade5ea556e532c6c96a1b7bcb176b +:000fb0b582ee80c1729d7a1626c23332622140 +:000fc05b29cc23eed270275218d13ae6956696 +:000fd06fd58c2eac2e9feee784114ca814a649 +:000fe07316a5402cb1e3f4b14d4a1dd1a96d9e +:000ff0d3088c847b02b37f13bbf2bd0f3c0e86 +:0010000375cb208386dbe86d24be310fdde038 +:001010362e05454dd54e446fee1ba5c5a7d50c +:00102011127be91c6033c582cd6800035d00df +:001030712d9433e63e9ef01501c07959627475 +:0010400b9960884d87454536bfc72c12356861 +:00105017ae7662874090075ebfed05479271b1 +:00106046e786212866007ce0658d000315455e +:001070f92fc2aabb873670d83a72fa7bb1d98d +:0010808574e04c450f6593fe465f44491a586a +:0010904fa68fcff0e755d6ccbe476eda3d1643 +:0010a0bdec1e17ffbadf22da8da250a9d80f5a +:0010b0de4b5e87feaca942ed3e9ddbf7a140cc +:0010c01ea9176a4a24d563033299550e66de3a +:0010d0a9a0eac65dedebf7fbe96e9370b368a8 +:0010e0ac8aa655c38d6c572b248360215037f2 +:0010f0193cf556b2778b94928cff97bd49dae8 +:0011000aee2007466c52c3d41888a19c09dbf6 +:001110d0618adab63d850dd02dacf56cb717b7 +:001120c58cf5388e2d14224dcefa0d38e81fd1 +:001130aa3cf3243be82ff72b68cfa74a8bc746 +:001140fa1b3921b9674420a59b503be8940015 +:001150604a2d28ff0d68b0436a11be2143364f +:0011601a3ebf861724957266ac5c597c49888a +:001170dbab5b25eaf114616649b201079428b5 +:001180988a02bf9bc7248a88026a44d4c7c926 +:0011901f263b9a1e183e80cfbd56a428e2a471 +:0011a0225607b40cdf911afd9afa4776a40280 +:0011b0b24164c5dc295e50dc0b9a374847143a +:0011c04bdc9146eb79c78f8bad18107775d831 +:0011d03e87393eb6459ed62d3fd20dc4877348 +:0011e03b6fdbaf12e983083bbb5b812dda401d +:0011f03a9f81b9dc485d734c100b00649b37e7 +:001200b21110ad7ed39771e5a0067e37f4c37b +:001210bf418e6eab1330d104f8d6dc92618fff +:0012203500616faa612dcebf93c87ea5c7d333 +:001230546b18b054bd784c348225967cd0acf6 +:001240c2ed7c0d7577a54c0f696a64d0fc51e3 +:0012509ceef0b570a0c2e8b9400e6432007e86 +:001260781260f9e9420c46520d1453a20e1b60 +:00127022174f3f9bb3b04f172de214738d20e4 +:00128000fe8bd5b048eafdc14a007b8d59031b +:001290eb861422c5a41716f386d9b6ed94f255 +:0012a0e87f6504187c69eb7d15627b7d6d52cc +:0012b06ebe7a88159d2f56263b4067d580a0b9 +:0012c0f227eece8bf713564a8338692dc0df7b +:0012d0e13c685c06f907775cb076889568ba99 +:0012e0a663dcda39fc60336b3ec5deb23b93a3 +:0012f0452565616b965f5f74be4f3396ad80b6 +:00130035b7331ecf4b8fb9895b6197459de8a5 +:001310ced8d14d32b155ec1f0b199df6dfd047 +:001320490463d092f20b7c2d3f96d91c39c05e +:001330e36ee6f8ef09128beecc10e2e7fff11c +:0013406bf13405bc6831ea0d4dade6fa8a4014 +:00135098b41b5b0e057e1759cd120181f0a6fe +:0013609f192f073ff7f5ef5571bee4e9fd9678 +:0013707f2fef0006763189a50eaf116c4e8d6c +:001380bb30d83762dcddeec2357d315a4bc00d +:001390edc895f5134202c042e2156e96771f93 +:0013a0ea3059012524a45f22f53ea858ddaee1 +:0013b028e209e0554a71535ff92ec379c03b7c +:0013c0980151e7eec437c540021764b72b2e86 +:0013d0878340a621a38ae9570c9264fc172b0e +:0013e0d5d661a6e9c9422c3ec6884cabc7a6be +:0013f04bdc676e6f184b33a4396d02dad3e76e +:0014006c8bca3ae381b1b72d4e24fb4e96ea0f +:001410b0db17aca95a0656e53140eef7b1389e +:0014205b3b42cd74a907a85f7b0288f12e05e8 +:001430288e2524187f151ec0be1cff990245e0 +:0014406e574c650240004357072e4cfe7315d2 +:00145042a6a92f5785f260f9b5d89bc8b19728 +:0014608fd0c6390740a23539027edb17c76089 +:001470b45783ae99f170e5fb4877b37ce78875 +:001480df72b680d092fa41bae8e60fad6bcb60 +:0014906d7531d9788439c0de8f4ce0b4ee392b +:0014a033679b395aa558fd4dbe8c3eb2b82e02 +:0014b0c0aeab17fa00b081cff8c16505777e18 +:0014c0a21ea427afed895a4dee3db5d46d12f1 +:0014d0810c53ad5f78df0c471fb08c84679899 +:0014e0c1e4cb721768f1ca9a8220ce74b2e200 +:0014f068a26abb8964df2ec2dba1411e99ec10 +:001500a2f64b344c358ca5798cede944c4cf8f +:0015108bb6d1de13f1ba987660f1d138d33ca3 +:001520433f01bef45d9207063a1b13f2563b06 +:0015309789486cda704cf8eac4c900b6c78676 +:001540179105d79bad10d789a147323efa97da +:001550ec61250ee283b48469bdcc97c82d7e0b +:0015608ac9af45fb0b9b26c07729df1e3f97fe +:0015708c3455dcb92148f87ceec11a92f61e12 +:001580eeb6f452cc6f50906a76efda4ef9c428 +:001590e525faf5be56002162386ae0c7489fdc +:0015a0b55d38dd8376b695374839b9e3562fb4 +:0015b09595f81ce2e655f874ba4b03ea2b7322 +:0015c0fe759bc8d9b4909c7f9f11e3d6552da7 +:0015d03f46f2a9a77cf22a4a18f29398def9ab +:0015e092e8fca1ab10b61bed9691526e6bfa3d +:0015f0e54550dbce286fa3873361078dceef62 +:001600f49cd708c17f39ec06d5bb29fa1f9797 +:0016107cf7027a84853d97518a90c1fcbe2694 +:0016207d4e99196825d0c1a509633bd7903130 +:0016307762ec68c2552738f42373535e90f8fb +:0016408b3d7d40ff467e1c3b51d7bf0a00165b +:001650a2f44354f130055d94e8f7f359d8020b +:001660d27c9aac93344654039c0285241840c2 +:001670c617e6acc24cf1cbd6c3fd97176930f5 +:0016801f312974848ff94cab5d1c3dd9c0c32f +:00169056c0a3d83aaf90dfffdb6691020b2b66 +:0016a0919c3cc2baa0667b436163156d78eff8 +:0016b0af40bee23d51bfed92e33f4a3b91960c +:0016c0ff38a84c484f2c585ceefd66af0f8943 +:0016d02fd27f53716f5ab55717dca507a1be46 +:0016e05e7c63f1464b29209ca475c4f66a2cd7 +:0016f0976b198ea99dbc52338d03d592b6bf61 +:0017006450050ff9a5ccb342a73678e9c654bf +:001710669026e794303f5148038338e1d8663f +:00172023889fd7ecfce8bdf34110edee4618f8 +:001730e42bf5f330fc1ae594b2cc367e558c8f +:0017402bda58b5563dce5d00875f3d6d1a91f4 +:0017504902e7c6e84f7d7022024459ca60c780 +:00176067a535e2dfb68cd7f486c95c503202c1 +:0017704b014f4ff0f0ec49f889c5703ece2a35 +:001780947514bf6afe14f936f059867e508caa +:00179060d67fa90a9680f3e390d00f9425e50b +:0017a0a1298c0a6161db4d6fcd0e4f39725682 +:0017b0792e07cb114e9a100c1d4bc15f3dce21 +:0017c05e10c230bab616de7325a1076d79b608 +:0017d0e3f79b2e8d95000ac66e3dd6d99bd5f4 +:0017e0a35068dc835090158a8bdb6808fb803d +:0017f0c3e1a69516f536bafc36b790add3fd45 +:00180036d039b38fdb50bfb9cf3c65bd64d622 +:001810d471ce84f8ec2dc6bb4232a8321782c5 +:001820b2dc77eb97b3e5979056c94a1e316b5d +:00183017bce08d63d2d75e42ae32d5935f5ef0 +:00184012d00492bee30320ed4b059a731cbf96 +:001850fe978d2ec86ca62024ddec1b5e949b33 +:001860807386dda85fc5dcf03db1266686ac05 +:0018702ea7839bd3adeb0e0da380e6d54351f6 +:001880ae5f35338ddd0a034f858ff6beaecba2 +:001890dd11caa80e6ff21ccfd62c3ea4e0a1ac +:0018a089cc1773376e4838d46717f15fb51d57 +:0018b0a8a38691e9c0be069f5b8142ea5acaa6 +:0018c07a45ee72b40e7d72128ac66c77040467 +:0018d094092f43aadc72af66b4d9494c5c9a81 +:0018e05e1fccd443e21385da83540f0ba5fc0c +:0018f00599368951a589ccd064e568de56fa3f +:00190007635bd4201a769f17fecfb9b5a58418 +:0019102600d5b1f07ccfe70abcb1e38cb61ba5 +:0019207d3f23a47257ecfd9939b4d2b49aae5b +:001930492e3770d1e2353c08ec35d982968822 +:001940757d0cfc32114a4513bfc81f7c494532 +:0019506450887e3dc7f2143a8df154ed9dbd77 +:001960e2d6a2edd45d4c70810a4936b6afcccc +:00197064a9cedecd3ffa361b9b4cc5803b2d3b +:00198092a16004c61bcd3d40d8126aa2359e02 +:001990fbd8751a11df4f7d9315eefb36f922a2 +:0019a08f3888c17032dfccb40e06c98ac316d2 +:0019b09e63129c7d0e129951ea298c103ff1c0 +:0019c00c2c5fca18047bd5912ba98909e02125 +:0019d0b14a28accd6e8e0542e52fe04e7191c7 +:0019e051c0be150b5ab60c12e6744369c2a015 +:0019f08ca768b4a9f756f0337f283f106bbcfd +:001a00edd7557fd69474dd050504273a8a9690 +:001a10926e01adee0929a31e8602b68876fc5f +:001a20c4e4821a135ec1e59d3f146eb88909f1 +:001a30dde29a4413e75be74835b2d15d48138e +:001a40c7c65096487c5ca600043378b0cb752e +:001a50764a74003a1bb8954f3feb3c4fad66b5 +:001a60c6f812c6629947ea34bcd8a5126f1e79 +:001a703a18901105adf841e2c8fa9ffd8cea9c +:001a80e05d6e1ea4eaeb5e039f0197936670cf +:001a902a1c8459816629b4be05146b4031d4cf +:001aa0958d520ea22c7d75c56fe35a0bb7e1c2 +:001ab09b0a0d7f634b7f9a5eab4b5ab6f8b2cd +:001ac089578f7410552ec6f650c1f69f93ebdf +:001ad06b543e32da0f5d1adc086a8097003d04 +:001ae0d9536797adc6227126d9acd165a979fd +:001af079b9092ac191b68b4cf33c9b139776ea +:001b00b761c0841a976acc7454b72329465b1e +:001b10c28f4476d1f69ff8e2f0538d6281a3b4 +:001b208b8d3783af78b4327faf9efc7e10c3b2 +:001b30101c712012a13c994547f807bcc4e8b4 +:001b4006b67143b4cbd3107c90ffdebb95b6af +:001b503b26b8c07e675aa941d741cf786e7763 +:001b601b5d691b5aeb10defa85ee21a21d81f7 +:001b7053628666deb91a5fbfdac42a3985bf99 +:001b80524994faefa2a811772abc117f9b7810 +:001b9042f84c690a272e371475449d085c5280 +:001ba05e8252fad90c8635c9ea1b38f5339fb2 +:001bb0a1d4d870da4be18274b3819f193474a6 +:001bc0b44266f75f4fa691b8bacb6263a32f67 +:001bd01ffeea5eef0753dbd114775ce3eafe0c +:001be0a16a368879380f5f8da85f62532a6c5d +:001bf0c1ee6f32dfc4c5903772ce6b6b573a6a +:001c0063ed9878ee9be674ca5d1771229827f8 +:001c1090b9b13b0b787ea90f94ffb8c8c0d315 +:001c208a278c6a81da10ef1f5c4bec0ddf5bf8 +:001c303b84fdbfb8b2a53c47fa125ca890d380 +:001c406db3eac81e63e8d22a17309f06feedfc +:001c50bb7605d7209f76cafd4584e449c31fbc +:001c604b28c6d2f93acdd2207c854c02fc9507 +:001c7010e316fdbcd1eba21512f5eccfe4f077 +:001c8012138ca142f6b7741307de1444a2d2f8 +:001c905d49c88e3f82ec78c20b2f1784f7ddc1 +:001ca026cfcf9d8f692f6bace3e59f5755db2c +:001cb07502b08fcc54522cd4b681b4bfd4e723 +:001cc0432f0ea3726d4cdcbd7803a3ebe714a7 +:001cd0b39844722a3c402a5539e9680243cc79 +:001ce0094df6f67fc1552d56164bae445e22b2 +:001cf0662f5df4e1f20ca1a631eaf9891a6b00 +:001d0010b9f57718264eb386d2e388a336e4d4 +:001d10dddc24f1a971d1b77fe171fdcf5f2418 +:001d2011462297c007bfaed90c27bff4293a48 +:001d302d93829c68bccb1eac90edce86200144 +:001d40e797caad2e957814a4bc6346d91c2524 +:001d50bb158a9b704cdcd8db35fdf0a35a1727 +:001d6035e31ca761a239d1aa4ef8deabacf7f0 +:001d701e53429c381a32576bc420c146991184 +:001d80b9c537d26c59aa81e757d80de87f3ddb +:001d90a704764bbbea5d8ef896d0ef512af6e6 +:001da0a11682955977f067e43b0baa6b1288c6 +:001db067ce4620758ac7c381e45648eac34396 +:001dc06731f34887f9c219bdd7da1685e39e0c +:001dd09f8cf2a0c9c47bf7b852f3f30400cdfa +:001de0beb2c1d0fd74775c2ca83ec9722d141f +:001df07b3000faa3b2ab4faf8c1263c0f25d72 +:001e0066ac30e438734035753ce72ad6fbad79 +:001e1040dd1435a9d0f87b99b16a5d7213f527 +:001e200368add6c59f5a403dcaad76c5e7842d +:001e3097efd479bdb32e9365df2dcfe79341a7 +:001e4074d28edc4f9da9c1c0878b916749ffa0 +:001e50321e6bcd5f063799850ace19b70dcb06 +:001e60a44363048ecfbc47cafba8fa9590125d +:001e70021e52f77f7b1039ea05c855f6577669 +:001e801b6beaac058c01c2853b3034602a58eb +:001e903ade75d79721393a199f90ba6770b6cb +:001ea0be6aed28b94dae780e93f2c31aa9091e +:001eb0138fb3022c6390db9765111c24b215d1 +:001ec0d3765fdfd5685f3e10bf1de0bbc95fe2 +:001ed0dfd81cb66852e8f0d95e5f0361ddf61e +:001ee0147ecd2b73da45b61090f3cbf7581623 +:001ef011b03301966f05670a167820da1974cb +:001f009cc66b411e445c770d161798868c67c7 +:001f10b41ad8215bf34958c7800f6111f31923 +:001f20a3431782a950fee5782901574e748cf9 +:001f30bb0dcc74eec6b55710a1b3c4b70b4c30 +:001f400003c67c7f050e757b5a8c6234a10099 +:001f508b6d9a78475b0d9f73c15d77f29aedf6 +:001f600ce6f66b410c1fc81d2f90a4919a58bd +:001f70190db0efb7bc9c4c01f64496e557499e +:001f805304255d72ccb519d48a0bbeb01ef9af +:001f90849e20beadaedec472f6a3bc12807c51 +:001fa0f3df1e7b184dc5105f3d3da5abe20769 +:001fb0b8081c09f5442af2a4e3e0e266d75510 +:001fc0d97b7e427ef162b771c5cf1ae22f657b +:001fd03d01ad3caaa3a6688741d8ed2ebd657d +:001fe0e703335b53387ac5bba277ca35c1a7b8 +:001ff03fa07dd6f4efcf3cc3a22675fc1ae41d +:002000754cca7c6e498ebf458048294c936ff9 +:002010734386040b6c200f2fd686c4dac65131 +:00202013aec233c647db948b6c773970ffd394 +:002030977dc00dbb7951aec25e2e66133d3d37 +:002040269f79afd40f2e6a43f85d7e5a90bc58 +:002050430cf2d86e9cd865593d52ee9f97edfe +:002060486ca52cbe656a05d439b8fe8f626ee4 +:002070382b9f7783412308d6a9d8bcced5f524 +:00208079a8c82ee7e5ff3f2b87c1c4c5330a4a +:0020908ba5883c920aad69b01ac69137719c99 +:0020a02ca2138f94d42acd54eee406805d12e0 +:0020b0ca0d8c29b748df1658a91a4ae3e90161 +:0020c009e5c43f72490a4d98b47dd45ca875a4 +:0020d0b82f4d46ee661380f5ede0012706d28c +:0020e0a90687361d84ad18bb1d35c4a5b00ca4 +:0020f083d7e5e38ea80ae90412143539bc4e41 +:002100890355dfa55fe288d401b19def6cc4e0 +:002110907080c91e3f54ecfdf24b8e89a55b68 +:0021206fa5be5b393a0613f989674fd28b7aac +:002130b87f5fb94d050a7b2a86ca9e4341cb79 +:00214061946feef8d7266db28e7784689f87fd +:002150fca96173737d32fc688fdb1c21c0af74 +:002160d1c2546cd3cb2568b3f8e7cdf2bec294 +:002170d09183ccf61d0f439f601bff6678a962 +:002180b745bd9af6adb94c363a7688e99563fe +:002190117a7d68a4e78301bd01d35c51d19e62 +:0021a02e6412d26fe37b31c77b42f6e749f2bc +:0021b0f6ffc95c7e1508311fd8b28822fec700 +:0021c02412e287d4bb2632a4cd62a1fb8a08a4 +:0021d016da7a4186e11ebdf7da62f6dd0cde76 +:0021e0815d9b13bcbf888104f59c01e68d37f5 +:0021f031e8de7c79af2c096ea49dbad9c1fbab +:002200f57f29c0970512898a54dfdb3f66dcf8 +:002210afaeef7815e9b7a03f9a1d1e092e8f67 +:0022207f50535df95332e5f8d1dcc8f0fd713c +:0022305f3f12f6d271cf0157f5481a6ac13ac6 +:0022402097d93b31ae75d3dcf49af3749d58fd +:002250fbcf26e5b2ce48f934415fdf41ce44be +:00226065ba9f28b3d9f6b8e7455085b4796206 +:002270afd854a24eb1eb5fe0fe5c506aafc9e0 +:00228027cf44cead8155eda985a4a9171de6b9 +:0022904f5416967f6304e16421e8948305baf6 +:0022a0cc51fce71e64ffb4184e489401e8f6cf +:0022b0bdeded6f9a49c8de06fe397f8e407404 +:0022c0a7776fb35a3c430ddbd3bcfb1f00f73c +:0022d0c417300bcbe0d502c4b916c3283fbe07 +:0022e0f2e385e7430bb398de2086122b042d40 +:0022f01829971b149b2014e8cfa69c67e9e5e4 +:00230003ef256f552e7fd11b4d37f1aa0da8a0 +:002310fae1988567994f70429765e291e68ca2 +:0023204dc3e4b69da1b02dba2a25ef27b082c8 +:002330b1f3ae85a57a08279177197615a218ed +:00234070633ee7f3aed4ff39b63600f2d5d91c +:002350f407964ec24bfc8150129f2a2f35f967 +:00236016766047c3130802bbd3c3873f8e7e96 +:002370565e310ffd5d66fa9ac3ea2cb1b480de +:00238088f86ff751c7a1599247cb18419e9eea +:002390e15b6409368c6811dbd952b5a197e9af +:0023a03c7767ecb293b95d3fe6414d31ae79c0 +:0023b0f0e7f86a5cab0d767a69d711167b67a6 +:0023c08bf1998cb222b9bf0c996f9687098085 +:0023d026e22aaa7526682d9b79c52df3be1eb0 +:0023e08c8a660f5f20557423893a84c2be4fe0 +:0023f0337ad437334a8f411154bacdb8a92c23 +:002400ff401f60aee1a618b85c81271d0ee2b5 +:0024101baa886dbdd4f785123631bc5afbda2b +:002420d101a59e6f9ec27af6979734d1421e21 +:0024303a3f48cdf3121376172aef8755733e64 +:0024401318328d01234ecd140c6f95367820a9 +:002450bf42cfbc8e71e4863caba81f0aef6000 +:002460d61e42d8b788d8aade8ee10cb1dcc734 +:00247059c882bf269f4ca40c3130fc38fa534a +:00248094569214216bb0aedc8e458b65e20e5a +:0024904c59af81b5c593bd778c34fba284fa1c +:0024a00aae97e74da4b2d5b87e5bca4fa74eef +:0024b0167ce16f0fa32fb3960767cbe089fbe2 +:0024c08f5e6239a35e88ec271d9d9f3ee05407 +:0024d0613a14c58d1c958f2d357efb0816018c +:0024e0fc1cebb9eee6190a74bcaed63646d5f1 +:0024f026a27201d5d86fa42505f794fd30adee +:0025009cace90329363218cff834b694172f24 +:0025102ef8e590959e92e064fccc5db8cdefd4 +:002520098bb66c66159a6f1f6cc48314869678 +:002530a020f3cb7e80770161cc5d41a1e74c5d +:002540547bec2ac9ed54361a0981b4b6977dce +:00255055b91daf7620c81f7bffac95e6a3ef44 +:002560b93e3c28254ec313547283bdd1661b1e +:002570fd556885c71daaf8bd05d565f5405eef +:002580bd59b961d1dd8ac527a011181cdf0d8b +:002590acefb78336df3308155dbbf8bb775df5 +:0025a0d75917cc51df4558138e6229359e39f9 +:0025b02ccbd9858e1e1a3f9039e1d3065798ec +:0025c016d0c3f4a55548672e42537102a324b3 +:0025d0ef118852360fe777e273f41f47aef343 +:0025e0e3dba540c58cb01e454b57ded2cb4176 +:0025f068a81982cae10b62a73d22b4a23a43b0 +:002600fab359296aaba325c86f89ce872048c1 +:002610672a2a6d22694678fcde9b92f8452033 +:00262030fef39ec2efe9ed90a3a5b3074fc6e5 +:0026306d341ccb508d97791145259bebb422b0 +:0026406a569a54f44d4ac679ac3da799e9fa20 +:00265077d905bb2ab50fb496c56fbfafaa1754 +:002660d84e3ac6773be78550030a12218d999b +:002670e704d137e3e2b25bea791170b515a7ff +:00268054dca84b2c2b9fd02b5e2c931027fb4a +:00269088452c7108d9df32026d809ca2b8b86f +:0026a0780abed8c2386a753ae3ecb44032d819 +:0026b0936c58b3a7fb43d49a787cc4740d2384 +:0026c02e082869cc4d30c1a1be872d41df4af0 +:0026d081e528a439668625b2309903f291630f +:0026e0d19ae7454c81bf019e2cfbac0130d375 +:0026f034f3467412fd82a160fae084e73eff81 +:0027003451317084af7140defbc54e59715a83 +:0027107f0f39a01ba0e0301aec4421834bea57 +:002720e4fabd66b6caf800bbe2d142c55d1671 +:00273077c243a67432b5d049f86a8f1d75dd5f +:0027407c64c54ee7186e854a485554ed29082a +:002750f5e7a6fae8f8eb0e7eef862e3f526790 +:002760fc8742a57646166d589c2032a5c3e72b +:0027706466d13f8c858c5c81c6621f0c6213f4 +:002780cd7cfd78797dfbcc550d0c24f0521e4e +:002790fa5ef0506c4b32bb377a2fdbdbf65ec1 +:0027a09522ac4ba464f2636b306b06bdbedc9f +:0027b02690d35c0a08ac9c5c0dad87a42a4505 +:0027c089a5a1de71162979375717b3d58fe18c +:0027d015aa8c3178062d82181a6ec739b6cd22 +:0027e08e360a5afcc4fe4eb0a575b41c501636 +:0027f09b1fcbf195ed7cfce763d993eb665b21 +:002800ae266117859facbb424db08d610ebc68 +:002810eb8585077814e436cff1c6a1b6041810 +:00282045d2fecf0f0f9fb2c1fc72128a8291c0 +:0028301a7414c8b748ed0af6513d11f5f741d3 +:00284070f9ea689b57ef6a32f75bf418ef41ef +:002850cfc61a28369853165e3c2796fe205236 +:002860e82494b2655001f245642980a6930504 +:002870f85d96766c7559c779a01ef674f13d08 +:002880814080e0b19f4e2ba93bde3384d476be +:0028900f2941cd40d311cd0d7a04034b3d7dbd +:0028a0c609c17d8b33e52f48c722ffcec15e86 +:0028b01a6f37ace7b328c697a2947941486921 +:0028c040641c83bd79ae572b938d1405667966 +:0028d0e6bb931775be18078824513f80712be3 +:0028e0212d1d194b6b491593df2cbd76816160 +:0028f0f713df219bcd0ea02d20abb0f0ed3608 +:002900b94d3ddfe3d067fbcb3375793bed1733 +:002910b68a6090f6522c5b4e11f0b3ed0d4285 +:002920090c7be47e7cbf4c67d5893b658c920b +:0029306bf90a3a33c61b8083d4dd947b81b17a +:002940f41c35778633b7bf1e4bf9c0deaab063 +:00295040d30b0ae3d399adeaee4650c7422048 +:002960afd506940af411079107d632379c707f +:002970c28ada9075d151db9cd53fb0d721a4c7 +:0029800088b607b7bcbe9288e29e443496f394 +:0029904823c182dadbd905038422dab13d57fa +:0029a0b6fef940c80e213276f703afd4157741 +:0029b0e865e3d889bfacff119d27d7d352f5aa +:0029c034e857e792e67fa5b3b269a590eebcf7 +:0029d046a4368d5be16c7bf490eb2113d33293 +:0029e021f2aca1470fd9f3349e387a94de146e +:0029f0a5edabb1937eaf5bfbecac06bbd63177 +:002a00e29e1c9e4f9e6e4a0f627fdc285ee9f0 +:002a1004929d44e28cf500b75d391af1b6c4e1 +:002a2022a07965806c2ab79ce45bcc6052b001 +:002a3092e0b73d51d77e52c3c6451e44b74bf4 +:002a40f4818912d835701df83221a2bc9b7831 +:002a50b023465489424d676d57d087cfa1f938 +:002a60d9158d3543cfa0bc99a0e93f92f24bf0 +:002a70ec851a2c19434d26de33a4c2034e8d1d +:002a808aab8a21b7e88d0bd1cb028e92157a12 +:002a90bec677104508b6d44b5bb6487eff6663 +:002aa0ff7c20c6040a9cbb7d18f9be1789c562 +:002ab0a0c207bfc3693d1cd8335526c662632c +:002ac0b439d844913037df0aba552bc2ffc326 +:002ad043ead27db894c4d2ca18b461d6b3b881 +:002ae07cd909d7b175816e38ff60717aea26bc +:002af0809bd0706b5ba71e7a7c8e42f5da8c2e +:002b00412717741d7b6a4661a66ec017551746 +:002b10a927bb07f4d4942169beb5c327aa1e21 +:002b207679f157b63ae1a407e2eda96ac2bd68 +:002b303a4f53d3dad6d01665d431f5e267f192 +:002b40df9d277997e0085079eefd9d8b9786f6 +:002b50fa1dcf932f52afd71ba61438701e5c1d +:002b60d4cd9d90908d6fe9bfa427b48e08aca3 +:002b700a5deb2ae2b3a7b5fa484ed70b35b8be +:002b80889fa94f2f0b3d90f4473f675e31b1a8 +:002b9089c18bfdd1b90c93dcc66246e571f41b +:002ba062d2c72e90f4e3629f486a4079e73cd2 +:002bb070e0cd8990a59da546307046f711aa6a +:002bc04febaba8648c9567c9dd72f5de503c61 +:002bd04469252c32d37b2a263f9a096c10c820 +:002be03ddc3f1ba0fc5f90cf804821956be12d +:002bf00367ba25ca92c2d5d58c318175839d5e +:002c00560b9cfa003d065e287c5ce2431a4640 +:002c10a3328998502f91a41d8b382a33c0d94f +:002c203ed1058e92f912bbecfc6c4c14108b15 +:002c30254675ddc248e42eb73b6e00e59ec6a7 +:002c4041ce22e69408cc05195851227116ed2f +:002c50dc56e14061bed3b9d08c86a1f8fec439 +:002c60d699ce56b8ac2ce5e8892c3b8622696d +:002c70b5b2778868371681d251958124bdb883 +:002c804c17b7e2b1691b609e62502dd5673094 +:002c90c8855ca7f42f781376a65f0b17181328 +:002ca0c0b6eb5496e76bd790e5a4734975f787 +:002cb0c3245a39bccf7d04208f3df7d57728f0 +:002cc06abaa161a5d11cb5810e0a0132707369 +:002cd0eb46ba07564ae90f445f5f2224188bb6 +:002ce07f066968ba157be1d70b42d5cfb17173 +:002cf0b746971afa9a2cc5cdc859e585d041b9 +:002d00b645865f141a683955258ff574f40eb6 +:002d103103c3ec4e610344bc336effa443d9ef +:002d208de60b911f1e9bf6b02ac579bc884912 +:002d30a08b818e6d268638df699de83bf407ae +:002d40bb68248acc9abe2eb1cd33b9f1485901 +:002d500da2f953e2a0d29d69b4c18b3b9350fd +:002d605726b1f224bfdd53543019b7a339d1e6 +:002d70c5ff58723ad8c6fbc63447bf25a69c37 +:002d8035ff50d35d3ab728b672c9c5400fc91d +:002d90e4035816a06b646406cb0a67ea4c635a +:002da07710d0d365a79751deebfd1d550e5765 +:002db00234aa833cf3d5f3a6ea10fbf813700d +:002dc046f6c8f3af5c1877f07867ddbb5669d1 +:002dd05f5e26effc55dea067f916da401d191b +:002de024ed178ce9d864fc39d3e9bc002a3f7a +:002df060bd8fae042b1bf0da09f43856180e34 +:002e00c5c563825c97a39c5ef0468a74fed483 +:002e10f53aae170bdb8fa52e1709c397505ff1 +:002e20eaec3e8bb19c88622fa163e7abcfe2aa +:002e30a6f524e3bab0f73e5928ec9648c95edb +:002e4082b359a496f8a1820c683f66252afbdd +:002e50897e032b8ac43dcbd46b160a65d18c3a +:002e604ba7fe8c314f40924d6e45ae7a74bd17 +:002e7035f0fd7dc122f09ff343432ee864b257 +:002e80c0bb2438f1a981fafb29498247db886b +:002e9013536d3921c1f9801776702f6220f56b +:002ea025fc917e915e4d79403d906889936097 +:002eb028848d6305aeda5c9616b26bb3000d1c +:002ec06db4761af44d0089b34003093b090781 +:002ed0b84cdf4886b3212a4f33b1a0f58906f1 +:002ee02f23047760a2bee5ab99b774f4dda6d9 +:002ef043fdb1ccdf36e8b75dc9b35ed7a726df +:002f001f152a9e50488aa1a48b8a7e4abc8979 +:002f1047bab81bba390108ce7528f11bd1fcc2 +:002f20a6588547096d8b7831c6cc825570c912 +:002f3018d764e26a2d788d1c3840a55ab83301 +:002f40cfa76ff04949da42825295ce7fd14c4a +:002f50c9ee2bc2cf56df0918d8fef3c513b355 +:002f6057cc3797db7deb1e05e6cddb38f25d7a +:002f704f9e4701fe390de798c60b5f9541e2ee +:002f80d660d5aa67638b0ff9f356f63e7b7562 +:002f902ce5aaa061a59e27798888d57ee37d84 +:002fa0e43d741380629762bc00632d879fe674 +:002fb0f57f3895774523bd8c1265c5ff3e56e4 +:002fc0fa9b3735aee299aca7f4a333ea465d78 +:002fd04058891a26df942f573e0226bb15415e +:002fe02dcedf1a7dd0cdf90f8125868de719dc +:002ff0c356a885d7aa623e687ff291c142a4d0 +:003000717e6921cfd647bcbe5fa1743f4cf0ef +:003010eff48df412128ad4a6ffba3343673b15 +:003020b56f27e988ac8bb940c45ebbad2bfbbb +:003030e6cf3ba34bd9afb4a223615cd71eefa7 +:00304016b6041c245fa7676be80e6a2071364c +:003050fe46ae3624748d5300a0b5c62232d556 +:00306034fe19cc3812f21395ea3e159dd59cf1 +:003070ffc04fc64038531a3488fa86eb52ca6e +:003080858a838929eb0ae881b3173398b7e893 +:003090115b199054cc1dc11ed1477f8066640c +:0030a0dee7fcdad07546701ea1c81671ca6378 +:0030b0a9d4f2a1595db84aa65e865b8ac3f28a +:0030c019be25bffe936a2a3bf9846e2e21f963 +:0030d0bd07882cf5d621c00915ee52e1f24691 +:0030e06ba4262b4acc10054f217d3afa19f4df +:0030f090e9a5b585eb491bc633976d368f6daf +:00310028ce22a8f87748b0a7f3b88e22f052b0 +:00311085e84b3cf8c84d46ea7c4ed3f927cdb3 +:003120bb6303fe3cfa2c7fd5a96d360b105045 +:00313081bc856cc726f80661de33d7e134294c +:003140fc39a321003834bd0e9ab35a95f8fcf3 +:0031506a4dcec0865f66dde00184c5c3ae3c09 +:0031609a31aedbdd90b3af9b08b7397585d6c6 +:003170af031b02f6d90bebe2bf5a5e45985011 +:003180d4758b6e0bc7c2c01007b0326275c78c +:0031905c3c07cde23fc98867f08c2f50a47271 +:0031a0b0b845b554a16c5e9a9384b08c292bf1 +:0031b098a7ff56c39705b5454846c8857b96a8 +:0031c0291fcaa715e08e8cd223866f1a52aeae +:0031d08e341f55c484630a6ce812611c3bc459 +:0031e01fe89244e9590e336135ecb8815fff0e +:0031f0a77e08fb2138805da6b7fb15cdc9e666 +:00320084cf714f3d9e6eb967e920dc174d0978 +:003210fc07521f374693c7cf8224a602db43f2 +:0032203ce209889dce7221ca540f65ceae5b58 +:0032307fc5d2f7318beec75d16c4f3f24a7924 +:003240e91a8044058f3f1456c7dac4925e0ccf +:003250e3ac24c20fd45f792fb92cb3f599f61c +:00326000767d3bdc67051d621c26f66b9ef763 +:003270e95efb41342c22981bb196668a7d56ae +:00328030c2cf90f633590065719c16f2f53843 +:003290542097a0fe92522b816cead4dc514c0f +:0032a0d0d595abf8f24c74e38102faa924c80b +:0032b02dadee3f2233ddb6096bd5aea7923844 +:0032c0348728338dc0dea46a4227123f8b4141 +:0032d0bb24d278a4a8c0a939e5a210bf596e05 +:0032e07c3f631310150436bccd748da1ba4a52 +:0032f092eab6fc1716ab41a1af1213a6bf9721 +:0033003b5b55bc44d2d0ea0ea41f45c3f674df +:0033104fc899e13e0014aa26b490154b42a5fd +:0033208812fd60613bfbf32c63b86b04e2ccec +:0033305e0b7ea854ae63ff79259557f6c5d350 +:00334089ae3f880f3663ff41bc606f8a9109aa +:0033507694e97295782332408ad7e4d7334567 +:0033603b16913642b98ff6b7c13d10f46bde50 +:00337027776abb5125257b73eefcdeda6c0132 +:003380a1665319c012a4fcf74baa23f107b9be +:003390060019d809122d7368539c044309dcb3 +:0033a0b9c269035cbb4dde4ac0349196122d2d +:0033b06d5627823695c779869a8b7aeec922c5 +:0033c0baa2ea3640b01bb4d56e873d41e9c96c +:0033d0a2422122c643692396631df1d290b6cb +:0033e0bb29cd1d4d8c351d30371d5af662a576 +:0033f06179ac717787f03b3023050d9a6f6a8c +:0034003afaa74d4c7bd823613966ce03ec4c5c +:003410a54b60d4957b7ca086ec512ca2639ace +:003420d6b6971420ecafa0e6fbed256e683664 +:00343056cde9ff4172494865b8220d4093d302 +:00344013c56b379bb66f1cf48f170bbf569eb9 +:0034508f5fd15185c3239280a098d4d2938f51 +:00346061a1e2360e64d743fdae22fd6c604b3e +:0034701b3f0d7ab6fe3f1cc72320e3a25e6c50 +:00348043f3fb11af08323cc2d0c4efd2ad8dc2 +:003490e80d116a7a27053b6e62a6f5d6d6ad1e +:0034a0cfbc63e71ce1d46ce045c766de954075 +:0034b0f511cbeac800cc159cba8bfd86f5b8ed +:0034c073119603440d6715c8f76a451d714a17 +:0034d06a16483f4669ff423c3efff3ca8ae3d9 +:0034e03835ab50b1e83014cd17ce3d8a9001df +:0034f0ad1fd34d180c99007b50df9d9c3623cd +:0035000f1714e9199dbda0403309373df041a3 +:00351099242dc3088c66b760c87a8cfdea2c43 +:0035204e7b139a2abee4eff7fae9f73d6270cc +:0035309a1584e32df79c6c0f53b1d60d0ff4d9 +:00354011547cef3623b71b69caebaccaf968e5 +:0035504203f3af743126fb6ff422c1d476f6d5 +:0035603961f48d2ef00a74a98bc06f3b346bc2 +:0035708270c4339b8ae35965d617f8d9e0bad0 +:00358041aa73db6d53ec822ea0645788312218 +:00359097351b59d5c11b558aa6423784681f20 +:0035a080e6c75609203005e0134bc105e75cbf +:0035b0aa66c09676da72d20048ea8c7375daea +:0035c035f2d531bb2a8f56cd1454a3ace15b23 +:0035d0751b8204ad22727d2599b42e7a6fefa7 +:0035e086923af5f3ccac985f2fce6a2fc36e8e +:0035f0eae2e6b8055b60e68e7cf5bf13d7f72b +:003600572e2e9115f23e2d549176799da42de4 +:003610bd650f75ffb7f4f7c136528be3c45aae +:0036207fd029296759f175c2b02f83675e6bae +:003630d2d9878bc5611748d116d858db500963 +:003640dd58b87ff7f1fb1e0a95970bf2759ed4 +:003650d1bc4812fd0f6509470b799cd2a6d78c +:00366006e4dd16800b62aa87ec1019c76a0e32 +:0036702f50c1253fd2888bc0c20b92c4b499ea +:0036806e40dc5d81ad91a0c8ba568c94ff6221 +:003690a5e9bec2d574f1196c75751b96ba114c +:0036a0ae76e59cc281e22d1ec98696da38126d +:0036b0798b4cb31b1ea48348306ac5fc3bec34 +:0036c09e4452fedb7481e6e5eaec06829c56e4 +:0036d0f668f4a67d25481a170975deda39adfd +:0036e0ad3f6257d9bb9e6726d09e28ebd49a19 +:0036f0b8b125264eaaafffb183f0304e1d26ef +:003700d533cf9c7671e61f55594fa8fdff8d51 +:003710c216638bff36e44c779ff82a1a632a61 +:00372031ae82e55973eba91e272f14e045d6c5 +:0037307f1c483d945460763ff27ce19329332a +:003740f66d186188ddf6322b4770a9e7ba36e9 +:003750081546fd0a5f328c0996f9c7d1569a8b +:0037601cdf90f6d6160219caf2c986ab6fada8 +:003770598d0346f88a5342669b87dc765b7cd7 +:0037809721a2aa827fc84f08a331ae4be2b135 +:00379053b53bb9edcef6e2faae3f718609c4b6 +:0037a033c0aafa1e93109ec3ede28c61a7251b +:0037b097ead1c4812f6cfce281e16524aa4499 +:0037c073aa4533d8e1f282d57c0ab81873acd6 +:0037d07621b9e1272504cc11ca859752290431 +:0037e0d8a7065ef9c7c18742c878dcfbe30a64 +:0037f0f141ab8e77333682559dc1fc219833f6 +:0038000fe8e2f55564c2783f9e9a25bc08540a +:003810344bdd4cc3ce5e59402a8fbf97b40512 +:003820c020b696582f72c40425f769c3c40616 +:0038307ee52faf5048aa584d0ecaafdf926aad +:00384041f9c1c92925c19fb2f2b7835bfbee11 +:003850ff01dc2bbf80760a742ac48cbf84138b +:003860e8f0acd39b4a89595b6e662c833f05a8 +:003870c352f155d557ef072c4db193ad8896d8 +:003880df771c87580ba07b70de993e45a1f2a0 +:003890fb0afd7aa772c7101cfea8a2570ce3d0 +:0038a00296fbcf64fc24b1bd37d69cca9b4943 +:0038b056c95f33036b8f3cabcaa91bb717f2ad +:0038c09be8435c94b1be8a181bb5af4f749155 +:0038d0bc52ea15b37360e05a5f512949d150d5 +:0038e0de21f563ecc34590c8bcc46799edef58 +:0038f0d4f59c50d5fe9f92712d05602f83864a +:00390053713d9c003eaec7eba1222e2753a7ea +:003910c9c59ad0650e7877088ad40a665383f9 +:003920467070cc3a3def0064855143c55a9ebb +:003930a568acf97cc65e8f1b514882b80d9107 +:003940c7f77ecab7460f717ac6cb1a2b220fe7 +:0039502b12cc69f454b8ea413fa0ada733e6a9 +:003960222d0c12058d61353ad56cca601d0774 +:0039701245a33c1d168a1964e64f58d3024820 +:003980443f7844778635a31a650dbfb8db9052 +:00399014f5a00a1f45451481f9f4f4cf2d1c9d +:0039a0dd1af3f62c9a07162d8b97840e3230ec +:0039b0a3c352aead5b33acd390a9ef72c2f747 +:0039c03c26e30a6d2de81ab331785007b376e1 +:0039d0e9bc901f782d5960364eacf0c6e0a931 +:0039e0e4a992e96bbefa96d2e413cd2aa9ab06 +:0039f02ff93f4bd7c68da4596eebad6e6efa82 +:003a003be1eb82dcd3e4739105104679bcffb0 +:003a103148117e2f3f7229c63b7ac382ef72cb +:003a20f09e059dfb9532f41c9f930e8aa73fc3 +:003a301c502c869b4c045ed1ba5e7ac99121a2 +:003a40690d5e3ea3550b58acefedc6810a6a3e +:003a502f166db0faa3636219544527ce5999f0 +:003a60bd7fb5db346e39ae6756f50532c18b4f +:003a70b35caf21a13b8ab3d70a782d6bb25d7e +:003a807d6328da6abb372600f5e376167b802a +:003a90267a076b55fa4ecf4a2487606db78021 +:003aa00dd32f36085e1a6d15db131d960ee54f +:003ab0706761a35137e70351876b3e7658207c +:003ac03efc28e7511d6a04e7e36ce7e0f47ff6 +:003ad0e41a87c4e76bad23f15760c342c85f92 +:003ae074e712171e368e08d4f1bdebab03ee12 +:003af0e55c611c1455835a7fd520b432535b02 +:003b00b75f515342c5009f4b8d3bc3cc33c92c +:003b10193f80bb82310b166344cb3a3f9255b7 +:003b20bc706d903b36ed5f5f47df0db1142935 +:003b302f94dba8757d6cf27af5fd8989cb186c +:003b40e4937b2793cfa04589d19d8dd860d989 +:003b50642ed675d9a4579f089e5720da6a5cca +:003b60ad265d948eb8e65f0507487950efce81 +:003b70d9cacd636b44535e41cbbf7919a354ff +:003b800703eaae7e17d8a2d893a49fd30988a5 +:003b90e9d4f432ee3abd7b6ed1ab32a82d2462 +:003ba0fad3cdb99adff16c33f2f737d141ca5c +:003bb04bee58f91d2206862d24e01101c4644c +:003bc03bc69201fbabb5abd50a50d8aabb4fe8 +:003bd0d6deda9a49cf67d555e0a4dedda94635 +:003be0cf5b7bad3110284c0654a3014b0934ab +:003bf0da912ac9d2b08f2474b0f7e541fe0807 +:003c00056a17d97d9faaa872ae17db3f350eac +:003c101bf969c453b60dcb60430292679f0816 +:003c203d5763fca76c7815695779bd2b687404 +:003c309703cdda4194f0bf18fd5ec3cf636ed9 +:003c403add9427e1f0a45b5b9e6ce34de4e288 +:003c50202b1619c2957fa94f62ee5c56c29912 +:003c60ba1a573b89e0fc63a9282b7576977ea3 +:003c705d8637f1e7b4015a5a1faf96de1ccbaf +:003c8011cc68a0610bc5c4c21c7f0976017bc5 +:003c90251a194fd99ce6f3e3089e61a053ca66 +:003ca04b4e96c9dfa19e45ce91774d172faa78 +:003cb083025996a57c7f4c365e082d7c2c55b2 +:003cc0611813e358a1c8c063da173ce176390c +:003cd01b05fa2cda945c2afe0ba69635ca3c53 +:003ce02801784e2b9cfad9b846b01d8e619f6b +:003cf05c463ab9050b38f1f6faf7ebc632eb1a +:003d00669a28938976e495a951bfcdbc26c1a5 +:003d10c0a18124a2565afd059535771f8e4ad9 +:003d209694da9ff2016508e9b55911b1d53781 +:003d30882cc8af5a28dd9537a6034c65cd0e58 +:003d40c1882d1ac83bb6f113b2e210436799db +:003d50ea1b21dddf4056881df59a2418e266ae +:003d60eae48bafc57b701135103412962c6da4 +:003d704e338311d9fed2a7abacb9ba619dc06b +:003d8092027d988d17d0dd8b98ca2894924a26 +:003d90e51bdd3f43a8fe69623d2a61c4842c97 +:003da05a097783fb639907fa80dc51e6bc5822 +:003db06f735dfbacd0f478821e1acddb98a7b5 +:003dc0c5f52c29f7fc0c4d04403067dc45c612 +:003dd07e95b2f01c2bfa04942b0d8832172324 +:003de0aada10729f257a7448ec9c06dd37a42f +:003df0306fce9b36870fd4043ae5a3845d4a2d +:003e00c1c4a728749477ffe748d03406091339 +:003e10706820bc9812d2a6174c9e7cb14000a7 +:003e208985f59d0ede5202c0620de60a95c6e6 +:003e309681bbe3a4b652a8656ec8cca29e5049 +:003e4066f79302ae0ae260eeaee0a0274978f6 +:003e50eb641f3fe331ee97bd30b07cdb178862 +:003e607667d943c730210acabdd772f2b5d5d0 +:003e708cebe65a4341922d3ef5e4194adbe7be +:003e807a9d0794bf4e0969017ab012dc0543e9 +:003e907cabe650b918f8dc54dfd0b2c73cb1ee +:003ea0f2004bfbb7c0e76b99d741db0d562e67 +:003eb0d7e080367cebbbaa40f305175b93ffa9 +:003ec07b2f8d73476c498588066b47ca31b09b +:003ed0be6f9deb2b701f7601439fe800eba21e +:003ee0c1e66ffa95fa4d9c85bc36c8ab75edd8 +:003ef04de59166ef2620c41d248c332df1720c +:003f00f805819351bd176b6fa2f8f0c5fadf0a +:003f10db89c7c501296d588c59f8517f7c547e +:003f20caf028ccbf654357c40b79a5c0e53538 +:003f3008eb5698935c07777142359cdc1ec4eb +:003f40c9780c8c0e102bd4802483f6da305ba7 +:003f50456cce5bf643febe5b7dd7a30f802f00 +:003f6000d118b5519a7b36e9b95f2af5d16a4f +:003f70e828621e623d1809b5937efe159feb93 +:003f80edfda7954ca2ebb3a87772c30be51b60 +:003f90e27fdc37c98dd6adf7a7dac4e809b23d +:003fa035d54f7a1934916f1abbac00bd8b43b3 +:003fb04025329abaf58bf6d074bd07b91b51d9 +:003fc04b757f3c2b067fe859e7396524769339 +:003fd0a9104c8c5fd8cbb3dd9c0bca6782c5a7 +:003fe09bd1beedd0d562ff1f6d90d745581382 +:003ff04690b4d416eb491b648d88920ff797b6 +:004000aa2157926ca77290a4d59d1a27477b54 +:00401070a9b27b17187478124afc5ce499e3ac +:00402009183d8bf4231a8ea866c385ae51c81b +:00403070223d86aa452ca81561a93f6ae00edd +:00404020853392ecc0b8e0209eeba988eb42d4 +:004050625d15c7d5df434857f041648e638d67 +:00406015ecf06cdc70db34ad37603d65da7719 +:004070860efac74ac393d9c47413d1ee904efb +:004080864efec783c570668bba102501b81772 +:004090658854c58bf5beb5f52707078647ac24 +:0040a0b870ab35f87aa128491c4a1720b90bd5 +:0040b0d12e5b39059077bf3eaecf98b482099e +:0040c0181159a371dc60c8fac1c7ae6af4fcae +:0040d0cfe2f0d4f1b863984168991bb42ffbd1 +:0040e09f13ef18d77551d4c7c621f1d7352e4b +:0040f0ae5ec1526909122cdff92df1bf81fe08 +:0041009bdcca1ac73cf65e1d97895ae7ea6bf9 +:0041100f841f8ee3d6ca9ec05b46faeaf1569a +:00412005adafa93f53a0120b5043f596633e24 +:00413091c46db586a07bea01ae9638450a0528 +:0041404a0548b5116ab0cc5e13f6b39ccd46de +:004150dfc13256d3bd2744913ab72663d5f1ec +:00416084e93dabe8fcd03476b8a2110145811e +:004170e2bc16d6fc4552a7721b09665e950ec4 +:004180f43617e1dbf4a2b5b7bd9c2e2319b9db +:0041900d8c0d5ba66d8e556cde00670d915cfa +:0041a03f718d9821f4dadac3094c4ec74aa814 +:0041b092c7dfcb4e31a48c63c84b94cefdeadb +:0041c0da30aad6987780330e60b0a8e235422a +:0041d0d6bf83961e3042b25bcb4845ce313b14 +:0041e0051f2e2a32e8950c89eb41c3789dac62 +:0041f03919d9e11046a26ca0b1dbe120c18db2 +:0042002fd5a4fc0b759d992bc99e995e6eea56 +:00421062f1a29f053cff49bb2f4a6ddb722149 +:0042202a1cb6182055e5375b6e8528ade93653 +:00423096fc5b52f2a4c149e723b18412f1824e +:0042402cc0e01ef79e5d3d9e144c49a1ba3f20 +:004250a1746f85f2298f6a11fcbefcf181f485 +:004260acf3b31ab9bce2776003bee98026abfc +:00427052e5a0be7f11ed14630b7da6d8cb50ae +:0042807e86ebaab11b6b76110fdb548db6e65c +:0042902ba2e48d8187762b21cdbb918d55b14e +:0042a02cd9e1357ffd00943671e3a2b538b34b +:0042b0ad428d482197b1c241d874b9097e5be1 +:0042c00e6b7271a60c6f5482edaed4ba76c417 +:0042d09da124be1cf17d40101df0bee7fb4dc9 +:0042e039559543cab14e2196b8e533d49ab8af +:0042f06ad229a116f26a6a7212de996ad15ad3 +:0043000d7feac25ef3a65798d6c5c2a067374c +:004310b11762ed7bdeeb113bc5f034537a9a8a +:004320b615d27760ea2cea9501798e793cc726 +:0043308ff8481b81ae8b02049313fcac598e49 +:004340175483432d0fa77905a030955477c151 +:004350965b758c704a43e2279fa47933bbf9e1 +:004360564697777c4454793bb60a4ea6722255 +:00437042b4426e0530df1ed8b431267caecacf +:0043803ec485567f179a4a098156d771aaa04f +:004390629d0ef4efc250397b8dd034527f5ec6 +:0043a0184fc02940bd61c5a2b9f5f560e5b42a +:0043b052895135f8f7bab282b9e0ad73538f79 +:0043c019ce5b28d8d8fea213a9a28f1eb9da1c +:0043d04b81eb87b68a0774c8621737fcd913db +:0043e03d19d72fe971af03518bbfc20ff0f29f +:0043f0a711d026c4bc726735bb0576febb3371 +:0044001b73405e9e7b27b8ac47a921d1967cef +:0044101771354ad6d86c8f90dee1214f49c634 +:004420f380585bc3d36593322bb69198da6e68 +:004430b2a2ebdae8005c6997067cde88609a95 +:004440a818aa017bd6ae5f62861334e9645944 +:004450421aede6701f8ffa55819610346d6f7c +:0044602f79558f1a8e69257908230141977e5e +:0044702b8b8e9d015e7288fcb0d47e1502ee10 +:004480b74a5a8fd1c6b2a7977161e7099d4941 +:0044903dfa65c43f9cce9f81638e1344e50e58 +:0044a00f2e35df978ed5abbe0591f1b7a4ff66 +:0044b0b960c8baca358573b33aa197181d263a +:0044c0c48f6a10965c41df8b56b140b8343978 +:0044d00cdc9617f97bd880e439ee1fd9c2082a +:0044e0acb16624611694a05e606d6a84e07d29 +:0044f0b27bb336476c8daade6c6cf840561ea3 +:0045003c62ad144ed587542b1981ff0580a53e +:004510805d350a9be43aebe93355f5d581b15e +:00452045dd3dc08b222a4d038e787390b68c1c +:004530ce851f6ea912f8ae6ab2e1862a151554 +:004540ae7a74ffd5211424c58b3bfd1a60fd1f +:004550e64696f1cca759cc255b75e85b6cc965 +:004560e21ef04c5a0dc3a417122524f4ddc2f2 +:00457020850fd76b873a1ef7d257e27c5b24fe +:004580fbde3f0582c74f5269d876f05735839d +:00459021f103198c66e190ee9a849246e25267 +:0045a04d8ea33be313ef1323f37daedc948a17 +:0045b0ba76f4a41cfc1689a3961789df11993f +:0045c0eb0b1b25ce6360b95ef866816374a962 +:0045d08ab444e2bed1dd533eb0614fa4f17535 +:0045e0a52df01fae37dfd4b8893aef42cb907e +:0045f0374b10f1769359abff8273d20d709d80 +:004600fb9262840827ad9dc42c1a14a8d84c97 +:0046107d678ac90e80f54150d416402020f183 +:004620362eec918a7d1981202ca1941d36e2b5 +:004630321940c72bb5c851f000542bfa5094da +:004640448bcacefa7a22cac499005fdf359368 +:004650983b7fa722cfc11658d8a3a85c4e2ef0 +:0046602d0be0e945deffa1cdc53a3b2df48b29 +:0046707caee7fe4d1c9d8ec077a8a4cc8aa2e0 +:004680e6c6c333327269bbebc60a4225e6d058 +:0046908864d4bbfda0219456e09bc06c6495ab +:0046a08474258e2a95d6ff790d82956708496c +:0046b03922c568cbfa89d7446e43c3753f0e71 +:0046c0cf0b805775a240b2e4bd8c6d2342b8b0 +:0046d0764ebf121c83fe80eaebc0e1de25686f +:0046e06ab28d0c700fdf1a8bd63f251343fabc +:0046f0b0b4326e0fb3f6bf561189cfac7b1750 +:004700288fdab3a4f06adcab1c962961c7182e +:0047100b7ea76818c56642dcfd255ee4dc781e +:0047207721cfebf67f833b757f52a245efac74 +:0047301e66efceec5aa7d9439ccef314c7e2bd +:004740d26f8246e8790c449a2f5c9071995688 +:004750e1a6857d43ec6971da9fe87c0fb52a37 +:004760d7363b68285114d6d8c317b5cd5dc0cc +:004770d41d27cab89bec04d678ed8807352fc2 +:0047801b50f87d1abaa751a21146b5436d6d1b +:0047901ccc9d926fae4fa13a004e59ef6077fc +:0047a03f9ff18d66e255303b4a689f4fd44b13 +:0047b015601b979abe17f8b97421cba8fb8f98 +:0047c06df83303d850d4fe30677fff0453fa1e +:0047d0b268bd8832d07912abe95773d491f00b +:0047e0946e1d1d510f4d6e27841685e6efce7e +:0047f09cd0ceb7d005bdbde6487ccf613709de +:004800d5938f3921ef60e90f40efc0c51b08e0 +:00481017caaa33d3067294b0ea03757040e5e9 +:0048201742244a385de2c207b0c577165e9477 +:00483010fb907dd8bb54b15cf8127301454344 +:004840902dc3a84774355596159576d0a42243 +:00485081edf8dc18bf0eec4751fce7048d7e73 +:00486051242cc1754193fdcc8664ad0a5c75d6 +:004870845685891fa750c0889118749773555f +:004880f4aa745c6760ab91f6e0c1b24110d4c6 +:0048907569cf971643bd66b2e89e84cf1311ad +:0048a037c99e69c36603dba6346b3308de179d +:0048b0e2667eb20a4ac2bd9e548a242329e9de +:0048c0837acf7bd80c27ee7dc816317ba791a8 +:0048d05243ceb8fcc3ad5e1756e5e058a5b561 +:0048e0b175837d7d6778a2c4f4c2bc0022a76c +:0048f000cc54070f26ffec5cf68801b7e6cbd2 +:004900f08a661e60635a5d188c261b5aedea97 +:004910c5df6c125b1dca6cd76aa51e31123da2 +:00492025133da77c5458455b71ff3180655d21 +:004930fecb859e457b8f3f3513d19eabc44c65 +:004940c655154172b89989f08425942d99a539 +:00495016f04e8f284a88ec535c5813c48bf8c1 +:0049609c0e6f65db58614cd9a5829de1387901 +:00497084d04cd2bd472e94ce97fc85f29d5bd8 +:0049804e96b2da89eeae7a790b877f4d6e87cc +:004990ce184f5965e96bdec722110d962038ec +:0049a06d85625cb774b566292afecfd171d33e +:0049b0614b00c4da4e970a49a32448962d3311 +:0049c0ab62e50ebbb042b9d5ef618b1d911932 +:0049d055d644c64482ce2a095cf791b0aa53e0 +:0049e0197dff25a7fcd9148603058196ae0934 +:0049f061b47842accaf14135fc56b4db82fb2f +:004a007aa5570dc46db2a5d1dfac3ccab88119 +:004a103a586141baf77c4b7229ae22d2b08870 +:004a200e8c1c34d8be850439f3cb738ba1378f +:004a3093ed046ffd8e95070c682635b2b68fa7 +:004a402d0e93fb21fe72f9bf0d792c3530a67f +:004a503d5ab69aed7616647078453e76a915e5 +:004a60a412c2fb1f6757fa72b14a1fc288d136 +:004a70b765b09ce3ab65dc107b94d3ae19f3dc +:004a80f7597b30466370a01e919fc15ed3d42f +:004a90ffa26a8f537d217c0ff2eeff08214e2b +:004aa035ea1f611ab19155d6827301abfecab1 +:004ab0af5d479e27c3354110d2ff07fb73af99 +:004ac002e67748238bd62fab54526fd86c374e +:004ad0a15b925346a57e88f10b067294e3d6d1 +:004ae01e0a24e5d05d348f02caf468019b54bb +:004af08a3d6268356e78d732e947d1078728ad +:004b00becb95f2cade19c2fbd9b39511d20fea +:004b10c3822257bf39d71970dd1c159d05724d +:004b2055e4ee18f3dbb2195db0f8d2d6a8fe94 +:004b3026c98f5e44925550ab6c3b18f679b0b2 +:004b40e1603a3dddf3466be72187079041efe3 +:004b508be73bdad6bb82e21a9d6670310dbe86 +:004b608b3a0aa5947c238f9de731e0e65a20cb +:004b7054389b788680eb8c02679e1b653cb468 +:004b8082eccebf783768605c417b1d3cb3c5c8 +:004b907daf3a790610e9dc5a9db57a7008c5b8 +:004ba0b234455463fc22e1b95991fe8d195cfd +:004bb062ae6ff0a1778d8ea7a3b3639c3f4d70 +:004bc0fce0e6f79254e6f02523e6890159b7a3 +:004bd0888b3e0aef0edf661d54e4e6be4785d2 +:004be0c7872543498113ce36cc8a60aa96bb1d +:004bf0dbc0af720031c7c22cf4604c9b0a4bd4 +:004c004aa0bdd6f81f94ae0dd4e6bc3f0a5ecf +:004c10fee0c98eb7fd39653f5806875fc322bb +:004c2074159ed0af5f58634af780de6e1b5cbf +:004c30e2bf09df40b59774e0d431a3346015a9 +:004c4012018ac9b05f59fc7cf9fc24c7cb7c8a +:004c50be9b84e0f5f0d095d7136707775ad551 +:004c60cbbb002b4fdb6189ee5f333e6916af6d +:004c704d0457720f4b4efcc2a8807c35c304de +:004c800ca0060c607d25d2db6012348384f585 +:004c904d2b41a0d13107d37b633be1a0f33f57 +:004ca0333f430b704ea4b09bbf560e662e659d +:004cb0dbebbfa7b120a6b8fa0a0d6b60e5c991 +:004cc000cece4584b04b9823c0bf625e72033b +:004cd045c4ef29b61101897f57739998b97448 +:004ce0bf49827763ba9740a2ef8bf9e2b11927 +:004cf00c88d4ef95cc2ac739e13204fe14b475 +:004d001656a50d1dd67c34da6252072e04c677 +:004d10a7431729c43c01a2c01f63ef1aa34ffe +:004d20e0a042165b84cd41a3ee8ec6c5b1839f +:004d306e675bedd8eab8e297dacffbafb90839 +:004d404200dc632c575104b73d50f1f71f5b85 +:004d50549dd5fd45440f387930cda728359283 +:004d60a1fc9d5703979320d501c8617968ce84 +:004d708054c1e41cb68b83ec1ddd92b8a07093 +:004d802d49101732ef396b5c1a1523098da926 +:004d90256fb916e967f9203628146699230211 +:004da05a23dacdb434c5f393a0dc4b6d23535c +:004db09d328879e52e897f3e4046312dec6340 +:004dc05e08e1fd80f2cbb7bc4af845916d3e63 +:004dd0c8751c9062d07814545da50108fc5dfb +:004de05dc814efeb7658cc3796f8ff1c1598be +:004df02e3cd359c6f4e6beba737e9d0b0d3096 +:004e00820c3913762301bfb7247f206ced8f34 +:004e102a07a0e27aa1401e0a6ab008d44d3b28 +:004e20fd88e577a0b09a24368267444fc45e66 +:004e301a86ed87024f2097a5a072ff02eb19ba +:004e40264a6c977b459f4419dbdf64737b2d3c +:004e50b6ff800eb9e23eb64bc1e9a5d559d519 +:004e60b5239759d10a0533ed08df323ba0a35b +:004e709dd22000bc223138817b43bd68cd1879 +:004e80e381d423bd0fbce105515f2e2483a640 +:004e908b664ada25a5abc09e27e12c8cd2e58f +:004ea0c949fd902f793c22dce1d23e7fa7ce0f +:004eb0fde81a7273362621cb696dd7ad32a580 +:004ec0c1314aa2724eaee880fa7aaff2dbea8a +:004ed0b69442989c01dede6ff5acd97d96152f +:004ee016c08b10bba5dd1fce12c21f7c932456 +:004ef0faff125d3a1711665093d3fe3a651062 +:004f0077ea199a6226158f56b385dee2b11e7d +:004f1066c5390b81b5adf9b937d3ed005eb578 +:004f20d0101347751602aa483fc811f45d15b2 +:004f305d773f0dfb2f2fe112c125c3a861ff21 +:004f40cefd73dae7727fb1f2a311a89a21c18f +:004f50118c85599eadcd2bfbe8790131941383 +:004f602ee8cc290ef9dffbdebad228913f0c51 +:004f708e0db6b11e42fc4ff2b2ecdd46ef8113 +:004f80021d1ab164bf96a8e253acce1a91843c +:004f9012220a0c370c5b115291c6ff0ee60063 +:004fa0faf2c064337a65b5e0fc01204f682421 +:004fb0cf3adf7ae60d578fa7e763eb0f325d89 +:004fc0bd73fe6fd92900dc8b2fdbc1a94cab94 +:004fd0757b80f8121ca71770cc533c26d74c09 +:004fe04a1b73d025f31650ff12df70c933ea6b +:004ff0381bf0e27c210c20a62b4bb8a0cee608 +:0050001158c70e8b8a7069b7554a016d5909e5 +:005010d6942ad691e43ccb36de01622348ddbd +:0050201939fcd1b0ca6a5388fc1d6a4bd520cf +:005030f8c64679e27afc471c99f71a4622312d +:005040dcffa758a287a55f95481e27c5536e98 +:0050501fd7065632878949efd4f7d862a2108b +:005060049a6a4067844418555a5f86ea2c15ae +:005070b014d7004af4bfd0945902e6e49ec2d0 +:0050803d8058cd1331b8274d6270748dbb3f82 +:0050909b3b6f7e998330f7acaecaa2273a7f8a +:0050a03ba5f2e59afc7664f35008288ee01d5e +:0050b0ca248294cfef0f59ac78b930d047fc23 +:0050c0e42dc950309b9daf08f65c974e14ccf9 +:0050d04c9159a4b357c60cc58968dfc37b9cd0 +:0050e09e60ef648dab029b26ec50a129f32c69 +:0050f0739b1aebf8f7f531f917daf42c2b8b80 +:00510064b59b4f1b484382d928ceebeab4e8e8 +:00511098d5de79965134f27188d14a72b9a2da +:0051209125d3f7ca8074134b46c156296c1cd0 +:005130a39dfa09e0f3e8003ebd6cef52c27bac +:0051409345a7d82c3e211ec821d22bd8b8474f +:0051501d31e3207233342efa2ae68dfc9e8651 +:0051604246b1fce8ba18401fc3d94f3c77faaf +:00517009590f9aaa4a51c878a5c090d5a7e34d +:005180533616dfdfe25f81eaaf0b29000f3090 +:005190af93546f27d2690a6a8a03a658865d76 +:0051a0bebce77cd352ee56b82248a849687dc3 +:0051b0ba71a529bc298549dba6158da1770810 +:0051c02c303e68607e313b461768faeb04101c +:0051d0f1ec7de2edd67db4704bf45083248f36 +:0051e0a5eb09c896b6b5800cac88b63e8facfb +:0051f0375bd47750abbc9c5eec00dd4b3c4619 +:005200efb0e1c384e8c04eb0809cbd651bff85 +:005210bb0d7de25c2d0f6253f7a41aef63d795 +:005220d91965f6b238f57f7a6fa55a751d60e7 +:0052303ecc1c7f6439a1e49dc0644cf903ad57 +:0052400b0bd6fa788cdf6a8979355fdc84084a +:0052505f7bdd8367199caa3d342837c6a8786a +:005260691c9652b701073f668adb5eea55e8ef +:0052706229cca11565aecac720b2ca7c5f086c +:005280b70786497b5691926f53bceed5e0034d +:0052905cae1c53fa3ea8ca6614135b319ff892 +:0052a099d5cb397d37b22c883753b8c99db09f +:0052b06668e13f8be460e260310b25640b4480 +:0052c08fd0d6f132b85a8369e295c7b91455cd +:0052d0b6a11185aeecfb64167bf1ca80aeccf5 +:0052e06da573424f359c0da70365323828d4c0 +:0052f0abf884f8610f72cd77d34036b131b2b5 +:0053007b319eb87e2b028e19e39ecebd3579b2 +:0053100ae2a5fadd96f0578179da971219f09d +:0053205d5e757f1668ae67fedd6e80dabfbd8f +:0053307b2b6e8466c79c33416bb805e7639179 +:00534096f4d5c308f0f5bf79622554fd6bf8d7 +:005350be8a56d47e2492f8000da7168ae137f2 +:005360f9dcd0a04cef593a3470bab9f1f17856 +:00537073dba1c63c9448755339f90c6a613ea2 +:00538073016b1fa03ceeceb1e3b23589c4e115 +:005390c2ab7d2d412bc8d7231c542d8aaee800 +:0053a0f8d0a59627c474f7f8193db94f9b7a64 +:0053b07e94fbaeec393939dd7ec0a9a7d429ae +:0053c0a6ba55b6ac8f21c84fa0de91c1414d6d +:0053d0611c4385f0f1488052abdba724a69404 +:0053e0fadd93d7879c98ad96b1bcc7783ab73f +:0053f05b36fea6115d0770dd0cd0daa58a078d +:005400d3c4317ed1b35370c8544deec8bc5dbc +:005410dcf79eee8ffd5226b6a43ee1cd3b208b +:0054202e2369382621ba2b746e0599deabf8dd +:00543012aafdfdfa4bbdca692be4b2af95df8c +:005440211c5f7023f16c1b3a5409fd1a2e64b1 +:0054502fb0650217b48e2b943ecb94cc17940b +:0054601b517ac9c3d1824b22df76256b3ced14 +:005470e6acb49bfb9ad14edc1f9c651e2b7812 +:005480daf4d29aca8da1db8800306b5e67501e +:005490f42fb7ae732b49eacf021f41f87d9e78 +:0054a05298c9b236310dafa85f719ade55071e +:0054b0c4a2228ddd0534648e5ea1331e2ee8d2 +:0054c0edefcfaf2964b48e2beacd58ebeeebc8 +:0054d082b483a2f0dbd2de8b15824ea6af2d76 +:0054e0f1b712973e2680d84713a5959c8a2080 +:0054f0d86ecb1e3be7bff7e470dcf88e35d810 +:0055000211047885f3083526fcb206b1183579 +:005510ba7742d0b71e58dd003824fce9d31a38 +:005520ed1711b0cd3d857371c11e6577c370ea +:005530ef94a6c3954a0dd54c26ea27aec68dab +:0055403df1eeee2d4666ecdb6365b2f0372569 +:005550c1f5b14be3f4c0f2c2af4d7783fa7518 +:0055607462067e00d832399163783e0517324c +:0055700a1a145ae4b6d49020df9b1986590dc9 +:00558000c5d49520cac4441025dafabdc3b971 +:00559069ef6e732f7d60156990384858bba8fe +:0055a0bf5dfbc7f494c4816adafe2827c35fe6 +:0055b0698968255a1a0a9800c64219efd57d78 +:0055c0f133be8f16acf050fcce3bad0de33ed5 +:0055d0528bdc7e248fc3f87eb8f4f4025efdee +:0055e01274def5ba04a068e0eb6b3c85ac19cd +:0055f02c1cf9944eea6b2d6af7348a29b803cc +:005600e2dc723434c8ccd4fca570d9920ea9fa +:005610ee51ca83c5593ee042060da0ebc6859c +:005620e4a1f89c7a9b4fc17ecbde3ad4fbd90a +:005630e1657f0035239cd98db305c2ec7de7d4 +:005640b1f24d45773ea6bb808d83384d231c40 +:005650c1aa7d2e9e185b952d3ae4de7a672fdc +:00566057bd67c892e6b344cfc9aacaac71408e +:005670b7e81ccd8c6ce047d8b3baba6950db37 +:005680d2aca41e2fa5f04afed891d93e38f63f +:0056907c74af3b7c0b626aa1cc83193e0578ef +:0056a003bd8b5901e19337f9d59db9e69142cb +:0056b0b2caf9b6646eda543f5620bec1607b73 +:0056c0750a02e5b625a6c8a2cba00ab728cd1c +:0056d06506a79c614736d24fa182a9b685fab2 +:0056e0d15760c667ba800e8e372c7a2e54b9bd +:0056f018ccf63dc36850110d021418a2fd7c71 +:00570000d566728bdf223b007595747802eb47 +:00571058e19d725e0a8bbfa4b9e59f9bbf5332 +:005720558debe73efa721c31888fa03e5df504 +:0057303edae6b3cbc0c415b8e6d6d31ecc96de +:005740eb1be3d6f0fa9ad6071e677b1169cca5 +:005750b673b977106e79385469ce93cde15e02 +:0057606ab7ffc74c7079e1532a0f9902b7c1e4 +:0057709bbd870258ca22ded67ab5515c81e720 +:005780fcb570d87cc07df7a3ac1db968900d97 +:005790353744f6c0d79542a36e4920a8470e0e +:0057a07584f1083d917201ed1d4c83734bb553 +:0057b0b582962b046fa876950fda6b25dce622 +:0057c030e65ac665efc1b983e22f9f94baaba0 +:0057d0db7538d82a7145bf71c8b5a4f2e35308 +:0057e006d3f3f651891bd6a1354dd2fe297718 +:0057f0c403217280e0bd3dc9f33219a3cf3874 +:0058001df6c3e0ee6f9c91019b4a02b0e40b9f +:005810616a47c97f13911529cee96bc3f0a076 +:0058204665b8217a929d862883c436ac83709b +:00583066345a00eed20fbfaafee22f5e6cae2c +:00584057c3e934a26a40ca809773653a1eb02f +:00585044d190c8fcbb55690e3eec606a0b833c +:00586096008f1cde4340089561f316ecad8bd6 +:0058701c9950f9213518e281224c84d9205406 +:0058809beb4c6e64c3df6a0efb16a85a9cec37 +:005890257c5c0d1de59667bdc49daed452dd44 +:0058a0ecb2b024206bd7e46cb03e3391a37aa5 +:0058b03cbeb9303e39a5b7276f47e5077d5911 +:0058c073fc01912ec6412ed08f76ce5eb9fc12 +:0058d0d3fc4a934e2a8633b5cd750db6a2b2df +:0058e0757a95ebac6f07f97057b5e364abb467 +:0058f0f76cf6908a4da4714f345d3a39042d90 +:00590038f0f1ad1857d7b33a259b38fe31d0cb +:005910b8b3f792377d4dfaaea36034fc1b56d2 +:005920599e7509d2495bc2b3036dd0185ab11c +:00593011657f659286e397f0592edbdfc5d28c +:005940a6dcb92df9fe23689376d165bc336e27 +:00595044b887687d3622a2372f9f43c41cb3c1 +:005960a6f25d1594621384b033c1e74dc6dc78 +:00597021ec43a3316ded6259aec9a00b442187 +:005980b71cadbbc2a9202f8873af22034cc546 +:0059901ef5e55437ae3d58d3c0ec70022aeccb +:0059a078dd84441beb428cc9a33bcbd321e1ed +:0059b0ec8b8e22ef237fd7bc6d31f4b0113686 +:0059c0b9cc539d783d2641dd349147dbf20838 +:0059d094551ad8a17afd146542b664d5a6cfe2 +:0059e080e8cbed488150a5c7a8c33a96c847d3 +:0059f0448ecdf8bb099fa42832cbfc287d4761 +:005a005be2c12c26f84e1648aae5e926c5fa9d +:005a10cccd9b211dd724b47fba173305b14b3a +:005a20f987c211b82f49a1f9606279171104c7 +:005a3098eeb5707685aff1259a4cce36794a9a +:005a40caf793742bb578119d2efdd553b22d21 +:005a50f58fec205f0ec280f64396fdf9e8abbc +:005a609b1d15af9e68349b434f20ba963be3d9 +:005a7079ceb1752aee53c0fc7dee8d7d96e8cc +:005a804821b9bb72f0b708c08bc537ce2c968e +:005a90d2f7de34fcde4ee60e67848b98f8418b +:005aa044e63d745e002d5b9421f054926bc8af +:005ab03f44e977c6428e9516756f2970b32345 +:005ac0fbe2ca78f53013098b3ed5ce03be77ce +:005ad009b773f6778a5d6284fc061e5b3c250e +:005ae036e581e6fe792500517c33bcabf13e87 +:005af021a4e887dbc3b7e23e1d196fea5d2d5b +:005b00d1ea4d3e2bb24119b0e5a874524042d7 +:005b107e13fed60fbea3d0c8f018198b9ce59a +:005b20f9a2ee86639375ee314839a09e6d08a8 +:005b30289966ebfb39a5dae7e5a8292198d165 +:005b40e3f9cd78de467e4e38e2682fc74acf1a +:005b50ede9c1e97627f76464dc5c25d7825789 +:005b60cbd707c3e71af9b35e789a40875846a3 +:005b70a8d4263947cff0450c362cb3d0a6efb7 +:005b80c665d8fb1cfae4905a0b1ec654d86fe9 +:005b900938ba6c75852c3359321f0b6a776130 +:005ba0f67708741e1b266b8eb13637f0cdc236 +:005bb095633c7bae239881911b87787844c091 +:005bc01b6272b5a4261c6edbb2564645f66b0c +:005bd0dd2ae5629383317f2dfc435a5f3fd17e +:005be06568aa2dcf72842c2f9039fb05f77218 +:005bf0af8c1adf77175f0986719af49aab88a1 +:005c00ae13e57beb5437e6ad8d289b5e8a3b92 +:005c10ca15712c79003ee9afb01fca8a3217c0 +:005c20647e44c03571a3b7a9a1ca69680c8b4f +:005c305c4edc63dcc84fe604c9169dcdf906b7 +:005c40fadbd3c3bc9b4138d1c1252c9ebdc43e +:005c5095f11436ad89917b7fb3ad25e31401c4 +:005c60cc9abc0cb0fb436f3025bbc1a0535656 +:005c70a4e25fd02c2df5c480e343b9a33edba3 +:005c80f6cd7236ae159411d145f5b5c6c15023 +:005c90dbfbce0ec13b59e4a3e271ff2c80b03e +:005ca0c5d853bb79e39a8d4397e7a13d98807c +:005cb013ef2fa3eb103ccbe1d165a9c9c4a29b +:005cc0290bf0300c7fbdcc698d104919905925 +:005cd0a0227e5e3d9b990be8e8e105b6be6789 +:005ce0778d8b283f6342dd7c5320d07e179c66 +:005cf0d5513fa9474e49ebf5837d427e3147c7 +:005d00a22feb9dec518c9d85280668a13fc679 +:005d10817964a6c5dd1fceb03e866ca4cea5c0 +:005d20888053f92c2d3c6ab85275e628cf2afd +:005d30c7d6413ebc9965a1b9c4516dc576297f +:005d40c589b8b9d03f98f9d5a80cfc23eef620 +:005d50c54252a17d334fc70400765b16643e9f +:005d60eb69bdafd739933344013f3c00a06a0a +:005d703c547ddfb3da5aecef6f470c029ca0c0 +:005d8017eb5caeb305640010793908899540c5 +:005d903a642aca663de6f4b9853212a8925764 +:005da0cce0bcd71b49dbb8a4f58063adbb7fe1 +:005db0b3f19e1d8731672bcfbb960cdb6366bc +:005dc05ce880088390fb1532eea7a237b6e021 +:005dd0a7de2915cf60b65b6124a60a15ad35bd +:005de0c12229ead921799182db6ba8c6b14940 +:005df0f2b6019aee3e408b4049a248eb66c898 +:005e00a5009787fa9eed6045dc32144833b426 +:005e1051d601588af9a68731e3cc79f50503a3 +:005e20356cfe849ab1c614735c895f9dc2008a +:005e3097a41ae63729913c6872e56da31e6191 +:005e4049e7aaf336994b7c4409d6b9d96603b8 +:005e500ff53601f1e7560e9999c4d09fc29222 +:005e60d99d728f35c0abd2d0a990c809ff2b9a +:005e70dabfe71c45d1e3405941c6f6d2b79954 +:005e80da563f76491897665c1e00851d0f6cfd +:005e90cf18a82652c91f7e3a2b44063561d58c +:005ea0cac2785ac048c9fd5c2fde8a93655263 +:005eb0af0de866c6a6dd2ea5cfcd0136a55e4c +:005ec09f734c304fce0a4b17398415c8923728 +:005ed05a9ae274c662a434e3955810e8d004bd +:005ee0694bd052f543d188a6c6de3c0eab6994 +:005ef0a2370a22575900db2e49090f87a0f766 +:005f00abe6371f642193bc533f4e4835e06d56 +:005f10e1b5fa89db6d39bbe94dcc7a9dafe44d +:005f20b6e0bba432f0277dc45a4b11b2fe1946 +:005f30e66c88321b63682fdaaa548f82b4df02 +:005f40b390658f4b54d81a1dd7e60c29682172 +:005f50e1eb597d7c2d30549a1592a59f4c2768 +:005f6090d2766ff6f95b11a1086d460aa65efd +:005f7050857583e0993f5df939018e4dbb57f6 +:005f80d7ea9a6105d5a2bd5f956867bf22e407 +:005f90a16461938434905d5d5244d27715d986 +:005fa05325a7b0335fa8b9e8037725917f5bef +:005fb0d89cf77007132e2556e4b49c2ce46a80 +:005fc022c826e018fcec121cfd1e877f3a2682 +:005fd08bfd8b7cf869160d4cc1035118ba6369 +:005fe0a742a1ade29d823c7aa6c80f5337e333 +:005ff0c00b97ae414496c566505435f613a2c8 +:00600052ae1f17fc583cc8a1fa9275f093adef +:006010afa63aececd44ba538b045f40759f5ec +:006020208c1e7e8f73fe3a4461725aa6f2f09e +:006030f0339f989c011015607be28c1e7e275e +:006040dfe242b2a92336694a336a7018ac3ac8 +:00605034f17e8e4465b05ec00739b77460d6aa +:00606018fb9535f321049c9baffe7c82653c2c +:006070386d58d642b582f9158c40d0cae5d776 +:006080e1827c3c6d905aead90188c2cf82f64a +:006090f2b856e06a9f73cdb3c3da339b47f4b6 +:0060a0dab97f9beb94b211fef48e2bc5329206 +:0060b0694d4b4bb5ed6a8937fc9a1759cb3c2e +:0060c0f428bca45b05a4c95465652372bd83ae +:0060d07e58d49db81d09f31384645318f4b094 +:0060e0927535fef130d4d814bb261559412a90 +:0060f06080da62be77a902d4bd22a6691a034a +:0061002ddbff2082cd0812cea6e0268d8d969d +:006110293ce8c5184204fbc141a0edec7d4b5a +:006120ae5dcb511a88298f20cb38688e5aab8c +:006130be083ac39915285efe59ce29b2252647 +:006140842c6d71321f0429476da6d20c446bf8 +:006150f663fc34fc2bac8843ac00b67171ecb6 +:006160ddc7b00ce4e3be8a88699ecf9ef22b83 +:0061706878854220b2e191c5402ad666b494cc +:006180b14689b696bf6b7560bae060035fb705 +:006190883fe697ce310011f7ecd739abcc8f88 +:0061a00c5aa00f2e494c6aa5ff90c17ca7cfa3 +:0061b01e910406543d8dd95147d61b9c4ef8ef +:0061c0ebdbd7e67aa0ffe4fc1ac81e67c4a30b +:0061d035649c933a100c69167d5085643bd479 +:0061e0fb7817344d5790ee5bf94e4b1b1927df +:0061f0457eacc3faf1cd2216da60d9fc9f675e +:0062006fcbd2571124da83765622f187dbc6ea +:006210344784ba08ee6335a17a213b358f0d51 +:0062206b09c518e721a70e0a737f6055443cc7 +:00623036b906e5719351f62178b03687e6c38f +:006240ea073702c06a11dcc5faa921b4997a7b +:006250108bcac52954009626e3409dcb2fcb8e +:00626063bd7f98a811e5f381c836f0bc42c349 +:006270787cdebde2bd149143982efa40bcb476 +:0062801949f10d2dc4ffeedfe941ebabb6fe7d +:006290f616f113bd9b5a8939ef364dda55b8d2 +:0062a016356b989443bd173b8b530fbc408272 +:0062b07169f03ec298df0f8990f997024bcc18 +:0062c031dcec860ea71281a13c8af8813825c2 +:0062d070ac9dfb3897dc2498809756f5bb63d2 +:0062e09689388a68cc3b52d0acb5bf1cb7ad90 +:0062f07301c26ce784c1f7f7f0ff45703a785d +:006300a8177af48268eaa17066614180f47ace +:0063105f32aeb033016418493b4c1c17d51832 +:0063206573c22e6b1f41d7bb3d71a09152e2a2 +:006330bf6cc15e14374ab7853e7ec4644ea83a +:006340f56830337242cd4599a684ab59ec46aa +:0063502e697c65fa5db20ba32d14a511493f70 +:006360ad31a613b9d23ec8c2b514ba72a9d7a6 +:00637074b9da28d46769a9a2e079cd0caf531e +:0063801f5c83dee9429acdce4966781d3732d3 +:0063903365ad66025240a957f9fd1215c7b55e +:0063a02201b215753ff6e8cb48802c08540227 +:0063b02635e16f69c6e09187f02072ca9dc2e1 +:0063c0c0e9587f69ef000cf260e78057f5afe2 +:0063d04b26be0e35f58389411bf51f1182a408 +:0063e09906300e8a14048f004979c24e56528a +:0063f0ab38bcb78ea39cfa65dd85f1208032e6 +:006400dbbdeb54a32bfbbb6a8f6d2581c75cba +:0064102f5dfda210a4bd3ec2b43cc108a90e44 +:0064200cc4967edc4f3d2040d31c9c41b6ec0d +:0064302f4fb6d7df227b5d298dc70c8c9832cb +:00644052565d47a5f3f0d2f9d43d126e48a281 +:006450eb37938c7983937510bedf48e36603de +:0064601ec6473fbb575e2e54544d08b69a2d5c +:0064703bc244c888b596cc769c96942db05b47 +:006480ad5a819bc402f29003bd593bca5c55ca +:00649031e2a5b32956ff1196ea9e12d9dd96b4 +:0064a09a96a6a4358d39dab697aa4c4f0b399f +:0064b0ab34a7825199004f960228cd42dbb501 +:0064c0eda3348830032b9f414c637dc75c6538 +:0064d0f3b708620324220cf4fffa961c5feeec +:0064e0fcbb2b3104e1f033ba2dd9cabccc0e53 +:0064f0288eff26d8e1e878cdd2b99470478ad5 +:006500a118b88698fd55e039a4421c60493268 +:006510b390c9d5dee3c53c34714fde3ae665f9 +:006520f78a674e160835da2bc1d362dfec65ea +:0065300b053dd2775dd352be7573cd3ee85fc4 +:006540f94f141058f6dd05dfbb24154faa45f8 +:00655024b49deb7552939b3e864978249b641e +:0065606f9cd26cf0406b6b2ba8b74a8804a6df +:006570ca3f99535831d0035006dbcd0f86314f +:0065807425636518b21becff2cf82be847001d +:006590f4b332e8069395989f8a7af9aca5ba94 +:0065a070263d6e31a50ef1e3464d83232dc7f7 +:0065b0a983c7dc00325e8d5eb7cf30a75afa64 +:0065c011b111a3b800873e887049464eff3950 +:0065d02f753d5270bd7a12c76a6c3c26596ab4 +:0065e0d3586aead1b892b79898ea2df1ec1869 +:0065f045aed50d28de8d5ef52437b085698ea3 +:006600ae16f55a5544f2c11368d356d078e236 +:00661086916cca00d94d905dfd2b9e4751a3a3 +:006620d86093021967347f5d35d8838e5e59ad +:006630e15da67889c5aa3d21dc201c488f7a0b +:0066405187a1f0cb08393b149609368e04aa11 +:006650774434b166133dc8fc7d18dc8aed87bb +:006660b344567748a8837a3cf174dc5f16fcc7 +:006670fd3584427531569903170326288eafa9 +:0066809b622f254cd8acd1807b06e4c6e9f368 +:0066903649312ad638d1024dcfdefac7f80906 +:0066a0749e6aa12b66dd29a38eb6d8321323db +:0066b0a0f64bb97fbd4a87413aaaaaeccd19f5 +:0066c001336daaf0cfef48b4cf70c7e583ad28 +:0066d0385a81455f85c1cabe8ea282d71ae42a +:0066e0ac417bce8a69f856803428399ac9dd00 +:0066f025970af402f50c6997d22ea11971f5c7 +:006700079037763d0c42059a123ad3e7be5af9 +:006710d02aa129982b67bbc3d1a384bb14f24a +:0067208f925bc03216d27b283b084560dc5bfd +:00673051a02c007e14aacf7646b0661fdd07d8 +:00674058ca23b8c507371055d84e706edce211 +:0067500071336ec0e99c92abbaa8da1b45784c +:006760eea451abdb7ab0950c8fad9d4bc9cb2a +:0067705cee967697e265936110815238a082b9 +:006780fbe299547e67216e0450357521afdcdd +:006790615983998727aa9ffed517b2294e623a +:0067a0a36065cceef367edc683328cba23c1c5 +:0067b0c818706f82d45a83abaed4d7a0344f23 +:0067c07c6d59782d3ae7259cd21e95f705e661 +:0067d019153468dc0aad880006b2490b981d48 +:0067e0e95d4d9c5b5b0b5db050cea6e4492960 +:0067f0f8aa862dec52932954958dfe06f0859f +:0068005e45988bee9526de400ad85b1e143876 +:006810b5439d90db6be4f141e3c381e55d8a57 +:006820a2d475178add5175c217aec639259816 +:0068309772c49a2ebf086b86371b78493fc18a +:006840887ffd77f5c06fc3d580993325de90b9 +:006850d6a52c6c32e141af12986d18a5088e2f +:006860dcc55931c9a2e05bdf3b8604fa1c0cec +:006870132f53c707cfbf0a7da45a243bf32b2a +:006880db56e7a59b210fca666f28305ff86eb7 +:0068905c90b2f5900c645eb5a200e378c91749 +:0068a0331a7c139d76053f8f65d1b5db6fde65 +:0068b00669a5646e954ef4b0410600521e7610 +:0068c0c326433e989131446321600af9f40914 +:0068d00d347d3b72e18b8f685f730595bbe955 +:0068e0a61f88490749060b0607c528456169ef +:0068f0475dd0e68f55e3dbe66a44b4a1249f5e +:006900363b49ca22a37ac1938c65c83ea29760 +:00691058393b309f41f66cb1dbf6d313cefc7b +:0069201516671e95f6fca72c6679fd82661084 +:0069306394f6c4b3b696240fe8a5163dae6fe5 +:0069402c91b3d716d93df756593f3ee63f3729 +:0069500a2c8821acb6842856696f6156095e63 +:0069608337223dc153a497b65d32e8a681edc5 +:0069708b0767c0bff7a54cb7424e0e55839efc +:006980681130f597baa3a67c1768ce5304bf06 +:006990a208f0df1623c2b3c16710c1ab6e901e +:0069a00a99a45054557896cbf3c8d7f0ce593e +:0069b0e38dbaeba06d8de7ba41a4ffc1466a06 +:0069c05e13385463308f853d4e12264e41f48f +:0069d0f0559cf44c5f680a8cc39f036e0e99c8 +:0069e082f3c8e10c0be4ce7f7eb4248ce095e2 +:0069f0f96fbf5787d158cc3a8f8f45ebcd9b4d +:006a000c0f191ccc0713cf13cc91fb2a09fdc7 +:006a102af53f64dddb067c0b2bbd3aa95b6fdf +:006a207c2bab4bf0652ec9e8eb164d0b11c6f0 +:006a308d8c320cd4f0fdaa0b0f4ee1ffdb0d76 +:006a40eedc8ede6347a2752ce51c61556bd62c +:006a506f764a88a2cea66bb2dff5c5570d6a41 +:006a6045799353c3bd05a3aaa8b7f8d06f193b +:006a70667a84ade90925383f76fcc7aa00c540 +:006a80135c9ee62a77a06d9467c43ac252bd8f +:006a90e1fcf7f703b698f67d542b49a631f8bb +:006aa09e1a9f5fa9930a205c09e0afa33ef2b6 +:006ab048857dc8b4da2dd459b78f5fe7f29e88 +:006ac0c4e0a2b9d8dbd38c2c0893cffca6671c +:006ad08017907683822f2c54bb98f30a6d3404 +:006ae06d3bae3b4b53c2a94d74985dd93d60cb +:006af0dbd9e1e879d49ebb38b483723cef7426 +:006b0079e35f261eb3a50d82645a1675b802ba +:006b105ba95431212ab3c35600ff85ca8de2ac +:006b201526cb7610d5513e89755f608ebd530b +:006b30af6acfa0a156d7229e9e274706439ced +:006b40bd84232ee8d882769058d22524ff6aac +:006b50092c53e78f4cda9de20f28d4ffb2c53c +:006b6088396ba691efb85eb73acec7b4e466ef +:006b7034bde4215793fdec41562214c4f6c88b +:006b80b76901230d0297c88eeef1c79f077f93 +:006b90f22f56ab28be12e8afb2ecaf8516f93d +:006ba0402ffea8dcb039bef3334985b5d60404 +:006bb0689bf80ff6f946c6c54c66b4ffc881ea +:006bc028bf99dcb3a335221f610316faa1e124 +:006bd01aeaa67724172b993940ca3e24116ed8 +:006be009bd9fb9eb735c447402dbc900985512 +:006bf0dddf7033b3532b57872b29320bf10be4 +:006c0098423f579bc919e078c799e1b99feefa +:006c106e861715410780e362428584c98c2411 +:006c20624f21f6e6820878dbe8a418cbbb7f22 +:006c306380480c64b688fbdc6054a1f85171f2 +:006c40ec88fe350dce2a753cc06f646f064504 +:006c50cbc2b921a5165d7cb719412f3deabe8c +:006c600d1d0f51d6dedc527624691d5ce9315b +:006c70c4b8d5dcb8f5641fa3a01c05d98a108d +:006c80243943b91dd2265864b1637e25c8dea5 +:006c90c9b19cdb77b60bac9b18b6d7f0102d57 +:006ca0c7b8cecc69fd820885782445710a871e +:006cb0af556ea251bb11e2cff0aa085bfc04a6 +:006cc0327454537b12983881c84dedaa0225e8 +:006cd0794e227890bece7e3380038d263d6d7d +:006ce0e02d8de94f255956f3b529460098f8cf +:006cf0e46843a36e1b33de4d8466068d64a432 +:006d00a419e9171e671f74978e88b4fa0deefe +:006d10c72c68871348893f265cbcc9075ffa5e +:006d2037ba09d90aa729c188ee700fc1bf8327 +:006d3048ee1a66c6855abb273bd8dc56cae513 +:006d4035ee8af13bceaffddbb7295c64bfb7ac +:006d5089912cc80a033a2baebca77edf2457b1 +:006d60632579cf65d7cf0922a2606553060bef +:006d7035c10f769ff12ed082a65f716ad44191 +:006d805585c17b206bf4643d8bba7ebdec18d1 +:006d90c8ce7c3a685c96004cb4b6ebe313e410 +:006da08ef53a0b164f65b2eb52af08d88e9f1c +:006db01a05977af06091903c7130480533187f +:006dc0aae703b342fb5b0dc1299639acb9fd52 +:006dd095f6ea68e8915c8f05305ab6d3d4931b +:006de046771dd9ffd48695c38682c08b3234e2 +:006df02e89031cf382e96c11f4d27b2c833ff6 +:006e007c6b6edb9e6dce72371cc0a89485e717 +:006e1027b1a86ec5a01ddef0830218006ca469 +:006e20cf74f3af27347debf66c6583ff435440 +:006e30c2143aa5defff53e140ae612ffc769c7 +:006e40087e1a689bb9aba3f55e33000f8d1675 +:006e50277a0271b5e02a2cac91fea3ad2c5a91 +:006e60aa82c8ef7e1c259d330b84954efd5588 +:006e70e3e25bdcbaaf09764afd43f690c6ce08 +:006e80f0a3a886cf4f78a3accf8e7d8c563492 +:006e90e2a7d3f517f2c4ce3c4a2080b0b61285 +:006ea02de4b53256098e39e3796d4155b5b197 +:006eb0541d5bd8ed207e1be04da11f0e460d89 +:006ec0728578b5b254fdce51b998c8c20ad2ff +:006ed000d1d80afd007ebaad915d3480334274 +:006ee0406927b91f6a695bcdb6d3beffdf9e1e +:006ef0acc1095210ece79226bc84f332c34346 +:006f009c992b3fb332eb3345011796db080e4f +:006f108844589aded60eb107408f24505b8a42 +:006f20c71c45d334999b3adb5f9a7e609ff8f2 +:006f30b0f94177876f9f862243de53d023fd1b +:006f40c13b18f34721b731d5b912300f504b80 +:006f507812ae040d3f6377c40067383c99c522 +:006f605d387d1ca53606d46679e035a1486999 +:006f70a20f389d9eb953a049160560dbfe60de +:006f805d9c8776621ec71cb1748eeb5cd6cfb0 +:006f909ef327f206058f0206b82588c7a24c24 +:006fa03f1017c5ab3160fa29c322eadfacd105 +:006fb0ca0c9529eade6ed7cd8e8c96ad25939e +:006fc013b9a5999f54c59121dd63688139c6a6 +:006fd042a28c59ab9cc3307787303e5b8d27b7 +:006fe0eb9fd50b911fced981cfb467dc454ea1 +:006ff050eb83123bd264be8a72e67fe5af260a +:007000cb9250d345ce23a87c1f84aa24776b1a +:007010deadd020dddefe4811b7cd98ec59e333 +:007020d3dba7129cac7624d0cb38c0f4f70ad7 +:007030b851b8357349b06f810f2892fe9bbe68 +:0070407cf41edd38af8f39025e1d937170633c +:00705022460a69d2f24bd4ac89cc311f96e9a3 +:00706020b3b6b7901c33541cd3e0dc7b141dd1 +:007070e8aac9500e6901b8b3374ad9f8415beb +:007080126790a2aa7ecf46f65f303ccbe4eccf +:0070900b0b3a65c0a278403059200ac76c2d67 +:0070a07d45902167bec362fe2a686ea4a380b5 +:0070b041004bf2e6e06218604871442210f012 +:0070c097ddc2ce2118e13ff370e60633ed201f +:0070d014e1b8c9f481424a0ccff41243ac982d +:0070e0d43a42108bea11607c00dc40ffb70c8d +:0070f0d524538011989b22d5294276bb708ad4 +:0071006fb5bc53cb8b77b6bcb8c277e536351c +:0071106fe91155b711a83a664437a42878149d +:007120f94d365eeb2478ada67e274721592a95 +:0071304f8c73434b12725e1d4d3548ba7caceb +:00714031096844baeecb09655c20432dc376d0 +:0071501735218f5ac20227ea306fd2c3f4ddfc +:0071604f8f68b6a894063973b1a568dbf60cbd +:0071707585e4b24169d996058186c1374442b0 +:0071804b1b346fd53f7b50727e883bbc1d1863 +:0071905095143488b46e66177063075e954f41 +:0071a04c0706304bbe3f64f0305b409b5db397 +:0071b0a201a03b2d54b243e919d79af0c42a04 +:0071c078a677534b90d486ca85b1bc8413818b +:0071d0047040946e477826a8a35380bdf633ec +:0071e0fd09b9608ba97d2d22c005b454d516c3 +:0071f03e66ccca1c683864599052188a68efc1 +:007200d1cb78d8ff1da757519608a11d71b1c7 +:0072104ff41a2ee7e1ca15ba967e1018ddc3d0 +:007220be58d6a50f45f9e6f46f5e2ec20227e5 +:0072309ccf91902a18fb7b99d73443606efd69 +:0072408a49b62e8739188cb7b7a378f68b3dc2 +:00725060e2a0ec084479b59f67d3580c48bab3 +:007260399b118b1e27d0f6929dd069eb2e214f +:007270551d7afa20fd9a57963dc1d6b866b923 +:00728039274453c267d2f2cb335daf1c9a18be +:00729052bf4a081c3621c28003909e0507610e +:0072a0922fb48a246ef71322e5bda9e2ff65ab +:0072b0e96b9ea421d59a909cb4bd39bedcb9a4 +:0072c02be5878830e4bc5048a02bdcefe397c1 +:0072d0710e927f414ed31a30d6dba2ac7406ca +:0072e0eaccf03b35dd94c74c356198fddea41b +:0072f0cb0700151c987249ae6428c7f3cfd0e0 +:0073004baeed451989f2cb46c8445741abd354 +:0073105afed21991d4ef80fe90b1e54c90cab3 +:007320bd4a1512a58c13aa4a7eafb14570343d +:0073307c00cc02ca785d28fa673502e914cc43 +:007340bb21e4274b4f60d857019999197ff537 +:007350abc0af4c7d51f37b999cf520f2d2fe7b +:007360442a4d7830964e9dd5c8418cedfac32e +:007370fdf927e409b6f67e17bbbab4c8294feb +:007380fa4d331cccad84df5adf7289fd4aa0d6 +:007390d4e4bad56bf690234f5dbabb996ff2ee +:0073a024107147f479738145d71e3209e3add5 +:0073b0842b572466e52609e919b25d836ae382 +:0073c070051fd19ca806256a7795f40706d591 +:0073d0c3268f933dda17dabcf0fadca8d0e5ff +:0073e0b83b0454b88a77fd1aa6ea7af85b99d3 +:0073f0657423239dc5e39e0f3c528a32631f8a +:00740021aa73eb58198ffd56ef5b226a165d98 +:00741045ba36f03cac89c4c1756f5b15400b2e +:0074202f32748af89a31900bf7b82a5d25b84d +:007430baee5f392632f967ca1bef7d95f9804c +:007440c828d7b3613d76e12b1b017d9c96a2ac +:0074508aa6602f461e666eef213318512c9778 +:0074601b66efca46897dd2950da9dccd5d3993 +:007470c0e84991b0291729e0778277e714aece +:007480da1850841fac5d62dc048d3e7e40bf5c +:0074900a00e09ff8751036757f5c1632bf6b2d +:0074a01d35c0d717fb4e94223dd27bc1050245 +:0074b09356387d1f2719de04cb69d4dfd5df76 +:0074c05f09d3c449a313f3bb4373937d877297 +:0074d029ca29ee041b06ca621dfbf0a40800fb +:0074e0ee37f0b3adee8e97a53d524a0e42dbf7 +:0074f0fef6846c101ac358882f75dc7d0408d6 +:00750074aa0411cb533552c11a5a06b7d48a25 +:007510685030bc300d3dfc1185a7cac67f8cf1 +:007520454be6b13bf02420df3cd47279bdea63 +:0075307030a412648bf5032ff4e4219974f52f +:0075402c1f666e2cfb94ee98ca4f4390c8fc61 +:00755006203bc80137952879990d25f545c485 +:0075602a08d99474b050a38e0e7212b2b122ce +:0075707afd38b29fa2225e3b8ed61bc6950a29 +:007580f232277c50692c2d2dd7679d1ab46c8b +:007590165fbf647f808af3da6d3fc3eae1e002 +:0075a0a2f4eb4834e4cd74e431c30d84fffdb0 +:0075b08543a1e81c3fbbfadfba788842b968c9 +:0075c0ff055487cea4fd9c63ddca3c7df28d09 +:0075d000fa5a45a7982391dadb9ea3ae324b86 +:0075e0380774659ca9d7958eaddeac156f9a33 +:0075f05a113a3e58b6b6b5097a23ccc27ad0f6 +:0076006e2df1bd08ed85bf579cacee181bba65 +:00761076c88244eb81bf662979a375e4b1bbef +:00762054ecf2b8c916af514926fcab064e0e47 +:007630802ac50767a3493f0ca8ee3e1ae4701b +:00764042d02d5395be9ef9c2da0afc95f7bf8d +:007650a5ac629bada36181cbf1bc33b046cbbc +:007660980e79f84d3005f3e018badaf28cf705 +:00767015e68b733e6fa8f3c4f97bac13ffcf3c +:007680970ad7b32876192c69d404e052ba583c +:007690ffac9ab35ca9952cf282bda9c8832570 +:0076a0291aa22e5317c0e3138c379574afb322 +:0076b03af9c6acfc73423d5e8d4e84d8609b24 +:0076c0b1e0e07c060abb54b1080ee271eff9b1 +:0076d04341a43f5ffcb3248f0d907d736da556 +:0076e0b881956f512c4b09716254767862806d +:0076f003003982419f93f4c72f077df6838c6d +:007700b1097df9ddbc1e93e3295690db649d56 +:007710ecb73a19c8e67591b63b1d2ecc23e438 +:0077205736c176c86ea82a7402cc66eb46111a +:007730cd5b379f7cc8d1853963f81a08314fe0 +:007740ecc6833e6bfbabf800adb56c040f7211 +:007750730cc5861f4cd2deca2173dcdc6fcf1c +:00776014f26164268a72094f48b10d1267f596 +:007770a1ce39aee6a7efa8fb40de2811a1ea27 +:00778021e3e8f46170f46d2e50b83aee22d177 +:007790ccf938e0ffcd4a19fcd6d52515038367 +:0077a02ba9d25223a6f36d4b752c1d857c79fe +:0077b0f773183f7937ef94f42047c2a50e7e92 +:0077c0d8b79b66025dca3c631b738f7ce9a8ca +:0077d09eeb9ee946eec43de285017d5f89230c +:0077e09e557a54b4139cafb1626f875c1c6b68 +:0077f00acc5d2a42a0ffa08f8017119131234d +:007800041c6cbc0e7b56688ef22871a35bec81 +:00781072bfbd302e5b4860edfd10ee0d589730 +:0078208f405d5379660091a28c83b56d8e074d +:007830f81e027afcfe20ec4e9d2340c644074e +:0078400aaa555e577795efe77f216465cd2211 +:0078504ab4515477c7aafdfbc4a17d29ce2ecc +:0078608615cdc272a290eb35da29ac23240cdb +:0078707967fc9a6a7cd95e58322f41846e6abc +:007880304917a7d38002fbbef4721f5418ad2e +:007890c7fd0e90b3b0e6d1a69717d22144f30f +:0078a0820f0caaed7d71e6d567fd349601e8d0 +:0078b035ee8d8d17de5dad76c293f9ae0f6b03 +:0078c0e7bf4b3f00931439cc94a135db22001e +:0078d003dc6263c50b41cf8c15c6c402e15020 +:0078e0e71b94c7e3b92857eeef6dfab7cf01db +:0078f09cd82f8817e5b20acd5f89d86139c623 +:007900c5d5c008f21f9f8f91e5000cbb370175 +:0079102be84cdf90c067fcf7aecd9fc4f998af +:0079203a48ddd9c1bf7eb1fac26245ca0a7c67 +:00793023a6ad141df11edd07a64dc044dcaeed +:007940a5228cb4ff596d20bde849dc54dc3edd +:007950749a4f2e4b68e870b80bfed263e2823c +:007960f6f11213961266fc415585f256f25071 +:007970037d16490cdc9ae143a517ed4902be79 +:0079805c8616200cfb8fb371b3cb03187e3b87 +:007990efcba904a2f7196a578a904ebce5b410 +:0079a0851cb95fcba5a7a5cd86411169a50ab9 +:0079b006c59732e89212debc0fe90243efed86 +:0079c01b73b5d08326fd74d0c98fda80034a34 +:0079d0604c6b02ef8dac6c6cc74a56d408d6d3 +:0079e014c8b75cc025ef7279e608078cb40b59 +:0079f055e846577d01860b78f4dd632aefd8c0 +:007a00724e3252e208511912497cc960beacbd +:007a10b9002fe50198420abc4ef19566e2a4cf +:007a2017299cf7c746061f23c5555c71335a66 +:007a30af6c95728fbe47e036ebfe300db87d92 +:007a40a18d747edea63e4b716673f39ec6db1f +:007a50072c5ba3db31a3048bfdea36b0865fac +:007a609014c58fb337ac14319f06f75f6df7cf +:007a70ca590d1d508e71667be2a9b26bc9a080 +:007a8031d47aa73c41a9b3bd689aee79011069 +:007a9082949d9bfba907329236b51cddc225a4 +:007aa049ac27739805a9b7604a3f4d471e5a3a +:007ab0ce4e164c415900fe5f26295c104569f3 +:007ac0511e5c0a2d921172a56608541ef99e68 +:007ad064796598bf00b8994d0b5597ed7cba7d +:007ae0f055603d62b964259e98304d98784820 +:007af0fea3457a8debc3f6deaecbb59f1f18d4 +:007b00e4c38ff4e7fa8ad4f08cf1d02e75b473 +:007b101fbf4ec56c7ab460f1fe5f5270d04398 +:007b20608cdd22df756c2558f12876acd934d0 +:007b306c54b21d2842c0cdb1379421e2b2829b +:007b40ecfc26031ce49f33f1e472c555d939d8 +:007b500b98d3bdac6a3aa46cfc1e3ade393700 +:007b6012ca458c165fe88fdb88cd5c39e52b8e +:007b70d7e0592f33c18d36c8110392144656d4 +:007b8036bb30f0628310824981cda3e7a8a6bb +:007b909bf9782c2dfe50a2f60d0baaabd204ad +:007ba09be38d5e145102f68673c3b7020acb56 +:007bb0cd45f38ce5a406f3b0424d09014d12d9 +:007bc0834cad6ee3314b9e921ce26d5b86bdc6 +:007bd0c68a136a396d1e59fe606090646bc717 +:007be0216fdf90ed6d0c00ab4d76dec4c62168 +:007bf09acf6209c4d6621036aecfb7f3d4af2c +:007c0047f853f52fb6805e6a4dcb148f369528 +:007c1046a81965b2f99a4f92ec0933173c445f +:007c20150fc41350939c6b831d9be9c7c33a3c +:007c309cb8ab8159cfcbc6a6310edd9acab9b3 +:007c40c65b706d94f5c14cd6becfc166ea3ae1 +:007c5040c6ee2b12d2ffd7fe05a1367461bd2e +:007c60e41ce8f0572fb316d6adf58520d6c316 +:007c70caccb7a2bc888e34933d5261d1863d40 +:007c80a79c71f697b9bc5df0dca2f0cc96f717 +:007c90af0ef254c11af9ebc535f1d55136f0e7 +:007ca0d3f82242bc28284ce13bb5895038a3ef +:007cb0595f9fe2b6e7df5d316608e672ca6c47 +:007cc00d0d39fd1690f7298ce456b49d3f1f44 +:007cd026d8911573eff041659cdaa4beab1116 +:007ce0b531efaea832b682a31c2cff63931d69 +:007cf0c01051bfb4d18ef9b501967d57533573 +:007d00dd4960321172824a3f5e195886b280f1 +:007d1007bebc226cbffc4c25d82d6f4ae0b373 +:007d20ec0d2e1afdf5d8db96c250d720250178 +:007d30b8ed3c6d7311f204c530176e0f04dc46 +:007d40e49877b3036ca532e1a46e89a8369552 +:007d5022cf5f083832591f6ac5907afe47500d +:007d60d5c69f647a8897c7143dc0992598af3f +:007d70eaf45c921b3d1d2c18643c8e745a1333 +:007d80fb769cadb27885d4b3078434b96ca3ab +:007d90861d8be5ba997490f77b2872b8d704f6 +:007da070a2c7a1057c3fe6e64ae0653459899d +:007db0fc60d3c9d42ae081e238e4dda3a1ca71 +:007dc002741a80fc5e6c7c650b17557544c499 +:007dd06ecbfb74aaa85964b7839b6f82286bab +:007de0a7d410118075e618e1e00e7a2d0e4e59 +:007df0a053abd0a20a3b90795857149d26fc5e +:007e00cfeffe2bc5320d357403b03ff9be3212 +:007e103ffcbc8312969773250f78d82d4758d9 +:007e20a9b7f5e82594e9255ad8440add582d46 +:007e306ae4be288c4fd0f7fbe25bc27ed2b453 +:007e40a7d4fce21473a2b1339afb7478f979c0 +:007e500121cafad8502d32d94365128249a0ed +:007e606cebf19f0ba8db04d2860859e7d87832 +:007e706ec9d549720dd987043c2214573c278c +:007e80d381af5a336c3102aa41e2ed38a3ca39 +:007e90d5edf01e0dc8032d7f7338b2ed10d7e6 +:007ea067257f6b38a5a1d749e9c7a92769dbf1 +:007eb09d76279b5d966c225d054013cfc22c84 +:007ec0c6a4d4ee606ff86d7beda254618c8f05 +:007ed086c4d17a3fc4dea316e94f141cb767e5 +:007ee01be9b58ed5b17d21cf9bb2a9a7390df5 +:007ef0455d5255a237f5ed2e30f765130cddab +:007f00e03970795cecbee54b408696b60fe2de +:007f10ca79ff1cecb8d4e56a78fd6accf54887 +:007f20de884ea947785426c9878e13b8dbfb32 +:007f306c886ee08a874df7b5f985aac752f848 +:007f40a5f8cd3f293b8cc71c90acbccbf1bdee +:007f503a315c5105b8bfd86d9cd8cd19a9ff66 +:007f6008d5d6b09e757fd864866eb3303fb5b1 +:007f70e163fb416cbd08502d6d71b34f91eab0 +:007f804ca93c7ac588804a4690586df5e98730 +:007f90b5aaae8a300acd3be3519e41573b421a +:007fa0fec2d49809ee32a41eec460cc2170fc9 +:007fb06f7db5bfb274099981b3d488bd39921b +:007fc01f0b28348b7dab3152cf6402989e6b70 +:007fd047542ccfcac62e13e692ac33110ce8c5 +:007fe05a17489537348ff543af3f462964e948 +:007ff07a28293adc286a39a85f78a83823b316 +:0080003adbe07809e5d690d193d4c33a6a3007 +:008010acf1d162af76b4a6d59144296ee8266e +:008020572c58c6df11845bee39dec2d467b7aa +:008030fe8585c5cb0313051618c9e55da4f071 +:008040fbd3e49c8298b5b0aca2015a95015019 +:008050c2d666dc6651b3de14389b7f51e6ac12 +:0080607a8bdc2238d01319b2ac5f61dfe3f0e6 +:0080701bd118edb3e4a8b503d04dfbb34963d6 +:008080ad8c4e3d2c81e4b2c253369494c6521e +:008090e8cf5fd1f6690da247ff7e2905447201 +:0080a016475e4136238bb295aaf627ab4b784c +:0080b0a03fdb20b00016ee798806e2828e3cf6 +:0080c07141d611dd8b80d377e4b90d98a76a91 +:0080d06eba0c32d753f03d9a011258471865c4 +:0080e0fe153d899a9000d2bd44e03ad48af836 +:0080f0e9dd4a2c9eb73681fd2f038b316cd762 +:008100d89759d81c9a7dad5ed660b3f20ec5e1 +:0081101608d11ffe616ec0265ed3273c5807cb +:0081200b74776f2c770787dba78a02600b565b +:0081302c9ea0e6a158261f502b515a3d2bc3be +:0081400b3491752d7573d86e11addd0b20c97b +:0081509921e431e5a270f14bbfd3d21945088e +:008160d8751a1dc1ef14d636d1b45984a48327 +:008170fa6b0e08d018d2e534a3ed767dd2da07 +:00818048a692376d73af9d090ff8b0d8643a53 +:0081906fefeb5311e3baaf9243d315e360a6b4 +:0081a02ea388233a56b5da6cd4fe9cd3b667c6 +:0081b0c1ec5028bc6f7c9244f06cafa0bbda08 +:0081c06a1e9fcf99c76eeb8f2b405f63c7fb28 +:0081d088e4f7614df1cd84b7ff8055fa6b6fe8 +:0081e0e5c39ce0326ca8226d34a8f493abba12 +:0081f014c57436b9851ae2dd6b53f439fcca6f +:00820064b070d04c99d48ee5624c8aea80eeaa +:0082103ce9a5570a3a096fb048e05214ca0026 +:00822052a1058862ffad4a713f3c6e087c6e48 +:008230462628a9793471a16526766a26ed3b60 +:008240d3f427d709e8a88b0d0dce577bb2038a +:008250967933b56f82ca8c1207c55ecdef8d69 +:0082606b1ef571b0e6a457aaf6c642a0931938 +:0082700867c1cf76e3186d0e7f7bde4f04623c +:008280e932de3520c7bcd04b606d2f9c1b1a9b +:008290170201b3c8ecffb29e7fd7c4caac57a9 +:0082a0475c3d7df9e4ec62d7c25114ffc9bf9b +:0082b0f6d72e6a4433fc01765e5caafdb14aa1 +:0082c0f0d38c0e66b59d4c1178d4a50fca6ad0 +:0082d07a3940013014511d95d8d39dc84e366b +:0082e03072554a3e04b5eaf52486dc39f374dc +:0082f0f968384ffc1c86ddaeff8ab850b2e611 +:008300c7c467ebc9e467043baed238c583ac08 +:0083101f1e0a870bc4717ba47551bfd94700e4 +:008320037027f99786257eb7a1f00d68c39ab6 +:00833065be2b2a4029cf33a67b3ac4f549f94b +:008340cdc26040aef79a9c4b9d622cf10e292e +:00835048156159b5621cb52e3cd7698c1924c8 +:00836047a628fe4a44150d4a472add454aeafe +:008370fef0eeeef1777142def6eaad908a36e4 +:0083804866c11f62924f89af69ae1de225485c +:008390449929b34a3923587394a0276ef6052f +:0083a0fab7ef274fc98766e65e2cb780113252 +:0083b01cdb0cdd0ac74a5d98d80032126fc1d0 +:0083c05938a105f53ff40297badf8d9de54ad8 +:0083d0c55172611b37aaa8f384a6eadabd4ae4 +:0083e06a39f6a4bd7fb897de120a0c1b1116a1 +:0083f09a25b0cd05d6c2edf5f47efc6f0e0215 +:0084005db367b575e2cda7b7062ccdc2372f18 +:0084109495afaabc7ef575e7cf6fcc265ad73b +:00842028e6d2ef1a6e5f9015aeb24a7422ce3d +:008430d9f58dd09532b5fcbe85275b9d067d4f +:0084403dc9e163a477e7a3d16f8b0cee454c80 +:008450132e94db5e607a1f67b2e0996e70187c +:00846093357c14a8fcfc64b0c984412e1656f6 +:0084700f94c5bfdfea1a90dcd669f49a7fa203 +:00848095d6cc05583b42e4b0e3c785cd19916a +:008490147ee47a3b8756ef05286d69610dff9a +:0084a0ea7f348b55d2bde8cb6b8f0eaf77d810 +:0084b0296d505f950bd6bf771571a84af8e1ee +:0084c08d16c510856cef5bb220728a00c4e318 +:0084d002648005f43b7d308106d08edabfd8b5 +:0084e0dad5a8a1b8d17198367f4ce163e3aa71 +:0084f0fccc5bc385a7bb209194ab52744446bd +:00850027fe636350d1074f010675c87e101f66 +:008510ec77203d76584f415a3ea83bc87dda8b +:0085200433056ebcbc38102c5a0ac9fe94cb4a +:008530204f093c6c67c070b8c761f205534963 +:0085407d34d17095ade1cc5697d83c10575b00 +:008550a46a930c79aab83e5010e2d670c743d8 +:0085606117990d0dde75f394b3a27c0eff6828 +:008570c4d7c871e1ce2b67f729320821b536db +:00858051229f7f54d1192f8189f2426b9da042 +:00859022a9e924a8d34a5f8ec071ce94aef49b +:0085a0f9f563fada5aefbb0c70831f6f21a115 +:0085b04d644d9eab98ce36b386e53db04a43ab +:0085c0ce631f28af2f8118b9df96a09563f355 +:0085d03f88dcd9aabdfdc7a700617db96faf70 +:0085e0cd93623185fc2e093d21d331eaa6259c +:0085f0ec39532b2f0efb665662d7373e788470 +:008600cafe013a3715e7021ac3d73d568c759a +:008610c754fe36c53be8e2822d45419b331848 +:0086200cb9ebcc5bf9d004dee9f2d8f7ee0d2a +:0086302822643ab0472d19ccc84a0416fc7a27 +:008640f70147af8e67b9cfaf19f75b552b4edc +:0086501c85de5a0dcbf24d2722d73da3147c07 +:00866068ee64c733e8fdc7ab7c82ca8da958ad +:0086708893642b1071f87efe0d8aa3e59f8d7c +:0086806513f84afb0b50e08c444801018ba493 +:008690f9cb233d2ac3fb61d8951e111994b5fa +:0086a0c542deb79a880e03f1d57eedd3698a1b +:0086b0e992d1799a866f68e0c2b1033ec3953b +:0086c060ec84e250bc76ff5f252023ebe29c05 +:0086d09af48fc7fa941fbf98947aad181204c3 +:0086e06cc157ee5dea5b2fca56d2919dc508b9 +:0086f091b84e30127c805c1dbb92685e614a3e +:0087008d7b797a44cbe28b09fac180c33e8acc +:0087106a1ca660c03122433ef1999823417a20 +:00872050de83baccd68b642918dc0ccb40946f +:008730a35f69fcad6d827902fa2fa09399c32f +:0087404c04c2b6ffc8b5742a97055ed2d64940 +:008750f7af16f38087cd9e5ad77139a2c3c83e +:008760e3c2b2cac2e76c8f7870fbd6f6aade93 +:00877076dc12e2843637460420aeeb901c17a1 +:008780b3548361203327bf928bf78444fec685 +:0087904b42e0a33b95093ac5a5fea2a6a1bd9c +:0087a0d0793bff61e102a8e5be19c9cff8ba7a +:0087b0296e691828cf8d026db464ea0a3e8675 +:0087c056ec1cb94d5de7614882a69552c16159 +:0087d0a448c6941a51e012c8ffb4a1b0870609 +:0087e0cab8268cf8431e54fb2ec9ec78dc864e +:0087f0a30577c4d55bf0017f5bbc1492d4b017 +:008800039b4413952db6353d673e5929e7637d +:008810d0b40b69543fb569d8bb9d0938e75a80 +:0088202f43269716ee5166de291dbc402cf94f +:0088305fb9a1e20449e8a56945b019ab529897 +:00884062982f63cf5985f12f058b0112b1c60e +:0088509f7cdc088693b2e983e41af3356ca699 +:00886093ef0694a713a3e8648b954de43bf36f +:008870b60d2d42f62c2ecbf109342854986920 +:008880fcf0a7c0e9e1351981cd0f3bd515eefe +:008890a02f74c1d2cf13f0bb77a6d812b1f4b1 +:0088a0a9cfbfa77c5eeaf7ff70a960086f6251 +:0088b0f1f2580b15f77dee513955596d76f78c +:0088c0e8842e6bd94a6ca9fbf2568730cb6018 +:0088d0e0cbc8d537292a69d108be1ea8c3ef60 +:0088e090b30745bde337ab6edeeb976b86ce62 +:0088f005bdafa55cc16caae53fb82543f3121f +:0089001f378f9050e5146e3ba4d0dc55f0a1ec +:00891045fe8378bcdb96962dd77dd97bb382da +:008920465f9994e326922643b66a0abf01167e +:0089307627581dd52355e6bae27b8d075a9350 +:008940ed2da2d1c105cabec9d43fce835d2614 +:00895073fac2bf6eaaac6339b486a6236a2afa +:0089604248b5a79e89db0aa3fa09045d18d1b6 +:00897095e7c1f2087084d8db33f039f4a32fc6 +:0089803c2836c22c616c8313bcc336ddeea9f9 +:008990f66aba8e2d2c83b5011a7cb99d8b3a76 +:0089a06298afaae44aef001c0c34fbe37cf6a2 +:0089b0d594b3deff14fd1abc4b4fdf827a1313 +:0089c0a75aa10f940737607d59b5aad29a1524 +:0089d0ad3bad3cf38912d5dabdf1714e752316 +:0089e05826bb9d2fcba2cb21fded554d349334 +:0089f0fa025c4eb92986a40924ecf47458512d +:008a0035e609f9e490414c710ac28bf692a451 +:008a1028b6ec6187c1b422debe6b2dfec02eff +:008a209c61fdbacd7a1ffdf32983de61cbb671 +:008a30ff84354128c6be4f77f3a9e1fcace6d9 +:008a40ed710324109b4ef7cf2dc919b2b4e816 +:008a50962a1351d9b167fb9bdb20a9cf1e917d +:008a60c52f8c5f5bc73704b34ebed6471d2522 +:008a7078cf47ca769a127badf9618fcddd4a0f +:008a805864da43b9edc57be6d81e1bf263ee19 +:008a9013daf3d961d567bb6e4c6b69f6cfad91 +:008aa0fc1eb5c83b7998ac94dfa1fcb47eb8d4 +:008ab0adc77600cac2ae9dd5fe8297ded71cbd +:008ac04c2d783d34349e4f154152cd021cd5e2 +:008ad028db5095da1bc551d83766b33904d33f +:008ae08a24c5291928e7a6f3d2f7caad517744 +:008af08ab5d00e3bc135471773bdf5f3b8c83d +:008b00b89715064dc4e55e4ffaf971f951ea2a +:008b10e9cec824e434ccc84ed4eb3489163ce6 +:008b2053e87445c42b2fa4883736f6ec7df812 +:008b3093d0e4ecb2e303ede8c3244339a66727 +:008b409b5f536e26bda61f3cd9ca5e84daef90 +:008b50617c8976212c202b2791d3180cb11a44 +:008b60540fb1a1a21c701487cd2c2fd1799f77 +:008b704f5ceaf1285fea06b36dfaf566d30ff3 +:008b80a2d2df35ecea3341cb5a8b9a77faa1af +:008b903d4389d4fdc30f23a093168edaa6e4c5 +:008ba040db07e9e462b52e2e1ecdf8bbb8fff4 +:008bb0e46325b342c21ac3650fc09138c832d2 +:008bc0918fa1696d3176a75362cbf5e28d0188 +:008bd05d519b6d9b14d4bfefb43a8c9a12384d +:008be027e749e122b26ba3b9b00ee8dd3d466a +:008bf0fc2295575984efece2b42a2ec74fff49 +:008c0059ac8069490eb5d4553e8a5cfbddc9b6 +:008c10d4dd70f4c2b4c7caa98bd7e820e5a37f +:008c20ef1726607e4ce8e69f4bfd88cc3d22f7 +:008c30d298c61815d02daa356c3440b73744ea +:008c40778ed7ae8c6250b6b094a2a9e185a93c +:008c503197e3734184c49ab7f04b099bd5ab83 +:008c60fa31e0df41ad1d16cf24b9e5a27da7eb +:008c7010e20aad9a79b4a218f5218a562051a4 +:008c80654f4f3a3474f3901e5cf216cb03bf8a +:008c904221b982a26e76aef4a4044ab48c5c81 +:008ca03aab57cb3d5732cbcfefc3aac4399bf9 +:008cb054e2c7780aa572fd11b44c8b52289490 +:008cc08e3ce79a92e4533abb625fb0d82ae888 +:008cd01013a1bc0a6ef0d9845a10b775c184b2 +:008ce04a1d66b82e94c43c2c34898ec862ee94 +:008cf090f031b2d1bef55181a593e0b73f9403 +:008d00aebbc6f00df87d0710f0b850674db704 +:008d10cc0592877e081ab6341e4a31c4124801 +:008d2031fae77845bc4d0d562d240d7d98f591 +:008d30dc8a276e8466d6d311daa909352c19e7 +:008d4067f42215879e847e46d17cd00ece0d45 +:008d50537369e5091aae0ba76a5625a2c51ca7 +:008d60973d92e1492ae38e09968c1580253c66 +:008d708fa4ec280f282dca506a41c9451dfe87 +:008d80fadefd43c1eb903ea6b946fe128d14e1 +:008d907462e95334d9fb04896e43b7688f8f37 +:008da08214c52d5430858b57595298bce20ae2 +:008db05dc8e9b7bc5799f7c3f37c5bf516aa30 +:008dc0c9019c8f3689205f7c37d31eae2c14b6 +:008dd0335921f51956e92496604639eb8f8c40 +:008de04b2389328526e5dcd08a2b7728037bf4 +:008df0e24996b8b96b731c1cb5734437f18462 +:008e00751138098e7bd5485d671abcc2433176 +:008e10f85447585044e0a88c89de49b30a2036 +:008e20882dcfc4c4507aa923a8baf35a9d8f1a +:008e301feddc78e3ea82be93ff03e35273c854 +:008e408d82680e24a44ae7c3d4a17ec9a6fa98 +:008e509f174ae6f5281396f0c9797a1b0c4d6a +:008e60d366c4f3e3ede72522c6fb7e59364003 +:008e706da99d83e8c39709c7a56b014033f2fe +:008e80e85ecb99e97b4c369c9e637d1e5ab779 +:008e90c81af5a2a16454ca43125e999941f2fe +:008ea0c220954375f10950b6608207b2416a92 +:008eb01938ad88fc730ec6d19a27ec4349e137 +:008ec04848d5ec47492f1533089641d944ebd1 +:008ed03c1ef96f60712aeb7c0946b6905133e4 +:008ee057028b182d91e186d8dfbf4779a392a3 +:008ef0ef7b6c600d293030aa025e119ef46510 +:008f00ef2391f745c3f9ecd9a8062bc1c48803 +:008f107f5b651093723d83aecdaf63d7f0cfd5 +:008f20e9fe85ba7ca88abb2e8343fa1e9d1489 +:008f3071ef0fb9dd5c66eb1b98e3350652335b +:008f40a81c774c73f381a86507496a2c209864 +:008f50045caf215fa25c437df5d81515f5b05b +:008f60a18c26d9951787b75bdea267ec9e7d88 +:008f70e000072cafe385b8090db66fc7e128c3 +:008f80e730aac13cb38bc396a8cf16c63d09b2 +:008f90c392e36728b264420bf2093b88e25116 +:008fa0a343fc94c0261332c198e06ad9eafb52 +:008fb081ccfe7fd4e9e9aa6e129362c9f934c7 +:008fc05a3212d611c3dec2b315f8b2b89cbdcc +:008fd07bbf236ed86f6b50accf806ee4fbdcdd +:008fe0ab55a817fc591db19f81dfc66646b071 +:008ff09683c7637796668218aeac7ef7809a50 +:009000b3b6bf9b60a7fa429a3bf0df51ad3c45 +:0090107a97831ef9d94463f8c4c745c4849a1f +:00902026dd546a129117bd2804e01affbcc0ad +:009030b310d37c9fbc3e31bbd046d55ba22421 +:009040287b74bdd6db8b212deea4a3b97760ef +:009050599875ee74d5de7ed4b3e1f86038fba2 +:009060d4140d9b9e7b346d5c51265e8b5beb2c +:0090707c6f9ac34028a3f3c257c6beafafe3c1 +:00908034417878a3096c1b3fa0a298b6700f1e +:0090902cb0d2b4783aaaa464afb22c35c18839 +:0090a0c6a4b01c4ec8fd996331301fccd69c7e +:0090b07711d192f12ffd6edd2358dee20ea425 +:0090c07de07d31d05ab55b07569af2c7442100 +:0090d0a3a1d812ed05493d48fc30fb5fdac817 +:0090e0b1a1886f4c1a4881dfdfa4b389cf248f +:0090f010a60e13d485c8329ca3091cd84692ad +:009100297f5c901a0ba93422ad68c1c0587ac8 +:009110e52251702d2c5c00068942cef92cda4e +:009120238be85e824dc43cf1ad980fbcd962b9 +:009130ba6c3236f3ec1d10e6919e0c349b6a71 +:0091406d91b336234702feda4fabab85d56b0f +:0091502266a2bf17f899c201bb0983f9c5750f +:00916041139e51068014b74933938c849c12a8 +:00917014649368335ebfc1dd1272bd75dee3fd +:009180990a093ec4b0c4f865ae661e5d52d6dd +:009190ac3071cc57129c21a53e8aadfba10ced +:0091a078ebb9efcf5d9246be34bf8472e0651d +:0091b01336e9bfb8074602648d0a230fe49bd0 +:0091c0db593e65f17ae3ed4124b581066d6153 +:0091d00738e212d780026d7305b54ccf7f2018 +:0091e00dbec314f09ccbf4f78b739078c482a7 +:0091f0b7433af2817540fe83f73fe7826a8c13 +:00920032ca2e6c122a33e219e7bb54078aee76 +:00921005d6dafb294d39ad3eee936baad29d9f +:009220aaee6875f18699a71d39937ddf68d8af +:009230aefeb4c800a209420c8f77e05b1ee447 +:00924018e44881d6e5f4f3e91e1b84cad9081a +:00925018111dc4d68f4b39f3618c76aa639c74 +:0092608fa6c90c0b3dc3fb1e098fec1f823a50 +:009270d688df08e12f37069b288d57126c6e9c +:009280610c606b4ec131aa746e37914b458093 +:0092900958fc0e33417f1d56e77a86094151c5 +:0092a0253f26414e7d0c478c9ccd469541a178 +:0092b03873fba4dfb30bd8051cd906d4f1addd +:0092c07a0a9d0c39d23f28fb97b3b1d959e9ec +:0092d0f3fc363f30fcd1c09d548b774ce7932a +:0092e0284218bdb4ba1189812abca8d1626e45 +:0092f06b458beff549a1925718fe65ee7a8194 +:00930007297f6cfed2528842b2185da3173888 +:00931050b5065a8035b5b3b89c994e147c22e8 +:0093205d011d64fb64b190a2774d756185012b +:0093302805a1bb6e420feb47221ec092ba9d35 +:009340a70b7393853d5966a9e98c23da36cd92 +:009350e6557b7b4297dac24f12637d7cfed2c2 +:009360b4593f0055c7fc91586722e2e30b0d31 +:009370379f37bf0adaca6f961772bf252574fc +:009380bc715d90ae0f01e504436aa076b60494 +:009390ab26430ccc75fd86a111eabe726fdc7f +:0093a0bc9dc12fddf0d86b3005d2156278d3b0 +:0093b001d53d3ce163e067d539917d662315dd +:0093c07e0ce134a2c83f5c7e45c3cbc84b9352 +:0093d098e77395c43546c8b4977c19e4400e56 +:0093e036f7856a2580d200c934afbe21a18893 +:0093f017fa2859e922851a4658b87c499ea612 +:0094007a7dacb4ceae1693852be7070dfc2bbd +:009410eacc7808d1a00ade92db8d694c70ad1d +:00942095bcce3fd29aaac6367825fb66c215b4 +:0094309da80ed50a16be88570f9b0fbc968b9b +:0094402558161bae5cabbb6e1a4099fc1d2e53 +:009450827dc7cb965d1326e7c33e7789d93dc2 +:0094600793f665fc6abefab62058b908645abe +:009470cb8aa05b111310791f7061525fc5baf0 +:0094808296c07b8d02ecf7e52a8a5469bf4e06 +:009490041c640a916a648742559c7c078d1965 +:0094a050384c3ff2e0480076a59845afc3b274 +:0094b016fb6f137e0275fc25d00515d79ff473 +:0094c0ec46ffa8cf136d0531ba5f085dc5acfc +:0094d03f4c18f769121564b58c07dad9ab983f +:0094e06e2efc6b76a24c56fc7dae232ca8e0fa +:0094f04fb7637bd9f6a92e296096a076248537 +:009500d1481836dfc250a469c0b9bab3604d17 +:0095100105de2778ee5f820f86efe30fc61e9a +:0095201e3c01dc43868940b265282c98480b9b +:009530c0ec8f70bd995394c32a98ae4764c39c +:00954085af326b79d9438d839e8d3589e5967c +:009550008cb740d969da1aba3ab4cde7ad6c9a +:0095601941c49614ca3d65ab7a2cd770ba081d +:00957008610df61d39b828751415dbf3485988 +:0095801fdc9c7500757c2d85b76f57aa61dd03 +:0095900be6f688d352da21dbe01b65bebe1bcf +:0095a07eecaf4528dd1b27ec3f0a10127cdd4a +:0095b03003872f36669fa7ee359ff67220a40f +:0095c0015f492035533cb8c0e910929d9f6f42 +:0095d0770def83edc765b9f7a1145f3cd7e2f6 +:0095e028b65ac38d1570929c3718e61dd1a6ce +:0095f07ea202f87b76f9396f28cb25cfb1437f +:009600dfe2be5da6b54d51e9680019e230a429 +:00961021927042125ea05442a27f9fae4b79eb +:0096206755125a77f87343599c6266c235b435 +:009630b7afd57e56d93f372cf0bbf953f15992 +:009640c949f8e934c736e320a869542aa05724 +:00965053444c4c3733e4a7a8ad92e1185999f3 +:0096601b2119cc0b8da2c81ec144e55d6dd94d +:0096706ac424350a962e6197e4039e119e693d +:009680ae634739cf96c32ee899292cf175b984 +:0096903ac132fed229bc8d7a141269d1331729 +:0096a0da9e3c02cdcd09180ac4b2671b073081 +:0096b050887aabfdf1dee88e1106fa048bfcd9 +:0096c0f585f6c9377f167d4925275b0d0b3d8e +:0096d04201adebb21524011a4f2ba3546777e8 +:0096e0ef2ba75dee515b39828559a4c725f515 +:0096f03968785247b5f82d5c323add80cad1ea +:00970051239e2464588cf07ccdf0762d1d7d80 +:009710a598dc064bf7c24dec313df019562e20 +:009720fa8305b16f87ca7a961c974c618fe907 +:0097309663d344bf15c0bcf71874d1a0007767 +:00974071ca7375273537ff92db5eec745b174b +:009750779613c599a3e0e13b2bce60f04b1596 +:0097600fb51194a75325b4ef564c7d21b451a9 +:009770b891c47fb615e8445c20e642a0c4a3c8 +:009780ff8ba042171869291cf137d5a3dc0393 +:0097906795e788378d02344ee58b682b77629f +:0097a033bbbf191ad85e0fa67a642f567ceb02 +:0097b038717dbe641c811d65ab7df19be234d2 +:0097c02bb472e06b7718eee154198be37f89d9 +:0097d0120c8710463d42c7c79baf6c8080c976 +:0097e013631c1a1cb034f00dceb489f7835161 +:0097f08b4d298a7b7e3fee29da4a4e4daa3355 +:009800ff46956ddf3ec359303fcddb27e95a64 +:0098104715439e84d3e831f8c938093d62883a +:009820700c9ef200ccd52bac8b73cb4716f251 +:00983056a8849635fb5fe43851f5a6cd488bcb +:009840a3aaf6f544df4496ece89db6494d0ad5 +:009850163142a08bc66b102a184760cc074b7d +:009860a3909e79b411b3967e9b2a4c32adf3b9 +:00987027d3fbd31a023b3b939d6370f126addb +:00988013d838e3fda654ed2f43565eda7de403 +:0098905468e1a85ff6a620c4ce5c35652f54ec +:0098a053410c70e558b4fd084d2037ea16a21c +:0098b09c4420582395705494d8b1b4cf35612f +:0098c09c4581b2d90584c1c7774c6e208e4ca1 +:0098d0d503d0ebadcddab5488a988082bb8c23 +:0098e014edbe4b7004e2e411c7865198b90157 +:0098f08a7949b7dbb8c4c958b8052a6d737541 +:009900776313930441b04a3415710d8f881fe9 +:00991062e141917f60324d5b1e8aa14016efe1 +:009920a740763fb96ba00af675292dcdac4afd +:009930008cdd210b19c7d205f1eccdeb91de74 +:0099400388d5ed75ea58fd2a3734d845cac77d +:0099507d20f5a2323dff4dece230e30416ff1c +:009960f2a5ded503b1c02188cfd01b5506d4ea +:009970ceb2665b37efbd9a5beab0f801a58eac +:009980208bc5b4872225c6daa67a8ea049eeb6 +:009990be4056d62cc500071877232773b5b15f +:0099a07e675b30ac0980a09b957e820c3b56a1 +:0099b0f9bcdbcee79d9629b374d09b3d4bee10 +:0099c0dbfe40a2859edf3389532be362672235 +:0099d042bf20eefd07e4267ef269b1ad344616 +:0099e03aed878bc697428998fff6d98e8bcb1d +:0099f00ba5da4965130120b730b7a751111439 +:009a00d88b64b7b26c54e3834de8ed4e960d3d +:009a10b1be889441017ce1cb0f37bd18c07802 +:009a20f5042de46a2e7555eab050fb3c01fbb1 +:009a30eb233319397fa0e80f3f1b38e10d8aab +:009a40df09487dadb2580f7875fe5db3101842 +:009a50c88d77a36d1a61f1d3b7cf9cb718f8d9 +:009a60bd6714f324cf92b63fe2ea90d4990312 +:009a707346e69fed9128df179219a514281329 +:009a8097c8df4ea9495800fc66d501d7f1907a +:009a901617a727b5f49c7cf45c4d0fa95c5424 +:009aa0e0b2f65204b85c0c5423c1ec41de48cf +:009ab00f066e70af046233b31884e9c7486d4d +:009ac0320376ddbf2721ea20cb955f7bbe80d6 +:009ad008ea916ab6e050076840c45f4a2c90cd +:009ae023ff9e1b9c13fa5717da9bb717056267 +:009af02e0688f76ca46733e98037e1acf17c6a +:009b000f8d7c2e20f8f1316766f738b37587ae +:009b10a0b1d01970ba6435f363a8d1f83ee80a +:009b203d65fd59dc35614949dbdfa01c557463 +:009b30e6796e8129178af9af3aa591b5bec4fa +:009b4094b2ac1f15a3fd9255a08dfc6717bf9e +:009b5045d6140a946fb067e66d8c8185294e81 +:009b60ace715dd52314e93988d54e7ffef4ea8 +:009b7083015495b5eaa4cf1113c695d5cace09 +:009b80b7e6a322bf2fcc38a6e8108d28bd76d6 +:009b909fd8a4c09cbc4d36e3e83923b739b3c8 +:009ba0fc1ca03fb5e13db074649f81aecd7d22 +:009bb027dda9eb5c3dcbe8165662ee527307ec +:009bc0385c00879ba899ce2f3e356921eb75e0 +:009bd0cf9fd86b50e69ebe7e18cc695171e4e2 +:009be078ec19d976b2242b5014040e06c09fb1 +:009bf08973617cc941c871e3637996cdb9f28d +:009c00c186a5a7e351d68ff4dd7c9a61830f0f +:009c10a0078a363ad4b36bd6ecb8d4b004d3cb +:009c200b1a1e1060139edb69d52c0fe71bab01 +:009c308f055cfe669e55c4d103f0f80385aedb +:009c4029bf0e18c216575d93d49a7b45456ea8 +:009c50b1f0321f6194e9dbaef38887c2edccd6 +:009c607226bcdc6a47cc19b459c201c2de6267 +:009c70d7d8a7db5c048704a9b021cd45384ba0 +:009c8045933c84983626c04c954f3dbc632993 +:009c90c1fca75edcdd58cd446632bd15c26663 +:009ca0f91028824a7e5bb4ce36402396acc8c5 +:009cb0df20b47e7f126890a8eb0fc614a5b2f2 +:009cc04c90617c65df58622b424ece87a35bff +:009cd03906501d4ff14b4cc1e2120806992a72 +:009ce0e3e8e304102b1880f0dcdcdc742673d8 +:009cf068544ac9b2c160ce3d2c19748325d90e +:009d00326cc32aeef1eb18364590e8ffcfc4ed +:009d10971629d2bb8b67d4dfc6798a31ea08bc +:009d202a8fdbeca82068b6f32fd593f6039b6f +:009d3017cc0875224ee4dee43cf2bf2ae0bb62 +:009d40dc16440a5a663dd6ca596d9926755c38 +:009d50d65a0be74edba93f57f1fcd1e6a65958 +:009d6095570a372a5d1f405e48ae593fbc537a +:009d703385707bce603e394a375b4ffc55785a +:009d8032012f0f3beb6826f9a53a85eb5b1c64 +:009d90b212cf0607df3395741abc6ebad864a7 +:009da08fd0502eee5aaba6a973f41d750033bf +:009db0152c51d837a4404cca33b6ab016c4ae4 +:009dc0a41254c44142854d00b47ce99eb28e7e +:009dd02197d93427d43addb69e1161f0e2dde5 +:009de03f8f5eb087de28e0293938176e58cfb4 +:009df0535f382d9d1a8ebf444682f5faefae4a +:009e003cef34c6c74cf684b669104349085a07 +:009e105f029d1ab10fa31d379988d1a552b76d +:009e2052929306aafbcc49d1e5e47028fabea3 +:009e30a30bea8355e14630e713f8449e434faf +:009e402da3d6e43df237016408d2faccd6779c +:009e5025d15d582a0cf8be3494cd4f392a5f46 +:009e607facc0202d3ab75992da2bbf1f3bc894 +:009e7070ce77d1ecdeaef41031cc2de16d4084 +:009e80752fb793689944a8a2be4fb6dd7c522b +:009e9092bad5e197b956a26c19a83367126362 +:009ea0af008fede58fe087fdff73e036227baa +:009eb0f5feb2400dbad26b6ad830deaecf62ca +:009ec091e7ef83455c02bc064fd56cc1b0c9f0 +:009ed070f7d09ff423d6016d3c0fc54ad47726 +:009ee0784d2e2d1817a89e2c9ade640669c4ab +:009ef0a1f11fdf3cc53246dac17967adfcc57f +:009f00667806a33652a41f267ae807eb967aea +:009f10f4a8ac00d470e83cb585143755aa8249 +:009f2093c95c8ebb3740c9c15db99e7d723ba9 +:009f308456a57828e2e2996f80d74fd7a2807c +:009f4098ea912f748f738a50b02c89fba65a7e +:009f5019fa6be670415745213845f575b2eb1f +:009f6067f94a3b7d9937f61d68deb4f6c5ec68 +:009f7073f892c3e6911de0dfe29f37d6c17ebe +:009f80251975dea92f5c63cd3d8bf342e7e1f3 +:009f90e9c1667d8cee6c91cc251f8d11f00511 +:009fa07953cee980f9e74cbc2aabbdea29d900 +:009fb0f254bbde936d6ee31abde2d38f520c73 +:009fc0d80ba240723754c05ea71d244ebaa256 +:009fd0a34e35d8cc5bdb2d3306f22be2fe97d5 +:009fe09083832887ca3935e3e2894473751340 +:009ff0d48fa440eaf474ae4750d3b479a331f6 +:00a000e47be6d1ad25f7c72ccfc51fa76a6661 +:00a010f0c0826261d7679077fa0c5c55b2e4af +:00a020d41e0f68a0f99778764bb51ef334941a +:00a0309a1f7f8b6a10f97b9db95e7601105443 +:00a0401570a1583dbb58b7faaeb1338190b4cf +:00a05049313794a74ea11e583a3beef22e0317 +:00a06085e0f7b35e1d119f994ee7c0a12aefe9 +:00a0703f537d9e7b92ea9bca137bc90092d250 +:00a08050a4fa8c15dfc24b1f0e259183502f5a +:00a09023d43cdf59c6bd1be22db6da55f4c531 +:00a0a0deb21f55485cc52ea17e2e1dd7e05d08 +:00a0b018647468810bc33f7159c33f63f7e5e1 +:00a0c0a41cd21e54b24bc5cb1150aeeaf8a85a +:00a0d0ae4499254a82221a82ab395169b18fe1 +:00a0e0ff769c4ccd35f5f1505932ca8a1a403b +:00a0f018dbd75b0334b9b0edd7a64451c5d501 +:00a10021b48ebb5025471d173e00a2e8abb189 +:00a11069c02fe6ad62dab60f6e0f9be6d22c68 +:00a1205205b3e7c021f1a375e1776493f2af0e +:00a13088c615cd1fcfeba791fd7cf48fc3d622 +:00a140013074c7987e9e4f85bfac36ca420f6f +:00a150eeb48ca9a349f2e723689690ef7ef099 +:00a160e73f39d3ea88184f00ab650231ec0004 +:00a170043243d28518ca5fde046e96c9dfb5aa +:00a18022f4202dbea8a0e567a86fd2c62ce4da +:00a190262795e99d322483404f09dd5768d20e +:00a1a07a49a78967dfc513977ada2e5a65fd5d +:00a1b05600f2502b95b58dd3df4d2d4a40b43c +:00a1c0526c86f8aa99b12390d5bb4db4d97f33 +:00a1d0ecb2229e3c1ccb24c3fb5092a0b674b4 +:00a1e06c35049dc9446a7f3f51e62245358010 +:00a1f061d1993de2db874cde588794fe1437ef +:00a2003c7e9c32f8c39bae7c657791d34f903c +:00a210606eb0108b4ec8184f124f26b941d568 +:00a22037bc007ef1783234d8ed52c2efcced49 +:00a23014d37f4200e26534279737914c87e599 +:00a240520f17edb2b690d9d0be88af30614257 +:00a250ae15c6dbb14ca41771b96d384473fc62 +:00a26061e84898b0b71834ceba9e7bfb105641 +:00a2700de65a383f369564b89728558ea78194 +:00a2809e402919f6e9afae6ac57ccbcf26a892 +:00a29094a615b5720157df24f64dc10a0252d9 +:00a2a0090e4cd1b5f8e29f7720bbcaced46316 +:00a2b003734f3e92a680fbf9d28b22618a98d7 +:00a2c01354f8cbbdf3fe7355b4c89e659fb54d +:00a2d0f34f79a44aeda6f6514851bf48ef840f +:00a2e0c3f043d4fad8cdc1719f145834a4920b +:00a2f07abbb639ee913724f1ec64650f1f6d3f +:00a30063efe7fab6e3092757ff565df8e109ec +:00a31046ca2db099d22f109e62d74eecacc03e +:00a3200bdf46ed1679db76a37431527c8473b6 +:00a330fed94fff3a73fecdede5fb34a27cb80c +:00a340c6ba200a199eb5569756df10e90af3b1 +:00a35061d00e87c8a7a069a65dbb758789481b +:00a36099b8ce6138f4b62fbf6bec421f7d1187 +:00a3708731500c5f5a2134760bb0e33321cb82 +:00a3809d2f65fdfb2e2e7c4d3dc750f9fc2da5 +:00a3900f41582db9cd4816782885c4912a2e28 +:00a3a09700ae5aca58c7f0322fa6ca265ea644 +:00a3b098a692bfb2440948fa6c280f6a10e434 +:00a3c02c838453c4f4398c0ceb7412c6145c75 +:00a3d003d3094fd34435c04d0afd805d17b9e4 +:00a3e03dd0c52cbb06a9e310951d98ebb8923b +:00a3f0a14f7559959ffc2b29b9be80ca9f87e9 +:00a4007974951a890bb3a6e51709e8fafd0d37 +:00a4103ba2b136f1e54d577ad1c70560354211 +:00a4201050e520bda1273fe7c42b10e23f1677 +:00a430dcbd2d58add62ad766092fe81487a4ee +:00a440fad4157230ed4580d02f8d6a9624e20f +:00a450d35389e43cae8984bf2936980b7c08ac +:00a460ee96e42e6777feee4da0ccc943cdb700 +:00a4704f4c88533d459a15eb66d5a2f8d9312a +:00a4808099ad87aa87121b220f195261806c66 +:00a4909fa2e42906059967f00ac32783a52593 +:00a4a07ab50be44fb2591400b8e21527994c79 +:00a4b0818262c15371084b0618ca147ac06aeb +:00a4c016fdb05c20bd03161c6b4f95d1344b51 +:00a4d060a4015b68e1965eb0decfd970bb037b +:00a4e0d319d0b4e89d50a7fbc0f222816a86f4 +:00a4f0a02e55817bb67c2ece332f161805f42a +:00a500109e2aa717261fe0be22374498758048 +:00a510592dd6c94a98d52e19c77918334e34cc +:00a520b84a02bf0a10f580c029be57d0401be5 +:00a5309141c330566611c13f841b14029ab206 +:00a5406a5c513ba6b34c0a33266f8d28f337fd +:00a5508e8e1fb44b07657ec90b51cf0ca9af8b +:00a5605cbff1c41d890abe24f30581a9763cdb +:00a57001d96b0a499c96333bb62d2b73b1aec5 +:00a5801ec2450e6a1b60ccf3af97ba03b01dfd +:00a5907a1d1466c617920e96de1f2846ed93ce +:00a5a06bb0b793b5fa3152f471912afd38cabc +:00a5b06fecbc4b37bad37b39cc4aa35048773e +:00a5c0e4ebfdb5cacaff3be366b27241d0c0d1 +:00a5d05f46278f47f941e110e84def4cba1cea +:00a5e04016d9de360d0bbe03ae9fa7eb476ffa +:00a5f0eb280ea8e1d8302c909cbfc19df792ad +:00a60011b5e4b1db77a461cec3cc5ff671cbc1 +:00a610212d93cef44a2a338efb345bf3b8284b +:00a620f444b6c23195378617b1ab6611e5f642 +:00a6306c6a94908f96bc71523c5b19023b721c +:00a640b300a363fff42cd4107d31128f7e4cfe +:00a6502762fd25778e23178bf72dd653ee93b9 +:00a6602300155d7f22a505b28e69878fab97f3 +:00a670bd0bab09d178013394bd455fa0d92d31 +:00a6808a7ce8f15b6dc51ca6ab5a51b37a30d4 +:00a690023b12a59ca7ee8e1bd0d146da8facc7 +:00a6a0e06d1b08a227affa03e5629c6efc6b63 +:00a6b0948563acdeb606f8c3be16b27457efe2 +:00a6c04fc6374af74084f0549ddc85feec44b3 +:00a6d0eee5ad649d17e57e548172533f10e117 +:00a6e0861bdbd0e7e9d9559482e3ab2eec8bf9 +:00a6f0e29a78a91a35715ecfdc9c56415be443 +:00a700f4143db9ae50b86f0b995c5ebe31c25d +:00a7105d671c40af14c23bece2dc2bdfc6393c +:00a720b3df09fa0197944c519bb261d2793a46 +:00a7309cafbcb93a4204f8b5844018e0533a07 +:00a740ccb64317a29c17441999f995236b8d8a +:00a750ff2924a169d54648b8650e638859fc5a +:00a760c4011d888c8f264a2399d18f8023aa62 +:00a77005ea29bd2ada03e8acc2d6c7d8e6d407 +:00a7805216a0f1e3ee8dd4aedba8d8a0f54eed +:00a7905b509d312de1373aa3f6857a7afce774 +:00a7a067091206cd22f7b9df0d6a86e0662dbd +:00a7b036843b927d500b659fe2c6e1951f67cd +:00a7c0b7c7f9e72b6702abab1063d7be48d6a0 +:00a7d08b71acec4f0755a8ed30f0fde8c61eee +:00a7e07debc615d644fe27a0494db14ddb9fef +:00a7f0d9f66d94d525d435e92741e436f58ea5 +:00a800dbe0a56b33b27f257bff3b379c340a21 +:00a81064700e62a23bb6770bac2f5329f422f2 +:00a8205a84a1738bc306f39d8a962cf84acef1 +:00a8309cbbcdaf291236cdfd8bbabef4b5e540 +:00a8406a0c6f557296c735a7f073ce6c3fd50f +:00a850cafb81ecd03d643bdb1ef1abcce690c4 +:00a8604c93589505db3971696a660bd6fd9b1b +:00a8708c530aac709d732eca685e76dc65c379 +:00a880f7a2af2c24e4264963743f6b0f406512 +:00a8904604665fd0e8068c736c9835983d04bd +:00a8a07c11552839ec98a2e841dcba77e15e3c +:00a8b0eaa178ab9189b5848d4d3f71d247b1a7 +:00a8c0468b19d3426ddc3223f315c559336aae +:00a8d0d086972127f260bdad3fd40171a940c9 +:00a8e0fa0d37ffca2696219ccae3613c3db838 +:00a8f036585bad8fc974b816757b04aac643da +:00a900e4b4720b557b6ac065364d25249f5074 +:00a910cc3def97d57a695e7f5d53145a950a7a +:00a920c332a532ed1b9892669f0bd87b9b7f80 +:00a930557e41c56f4076d4d200f363af1e6aed +:00a940c47fc972aec32ba6bff12979f0e242f8 +:00a95089330bd4d7350b9f70a25b2ffaa19642 +:00a960e4aa313999019c0e84d131f6c237ed63 +:00a970f025a136daeefc80403493df0bf79c72 +:00a9803c219170734d2cd8890b0e81875f661d +:00a990e36710c5381b0b8e29bd9839c8dcbe32 +:00a9a00a828275c4d7409ff7749fd759004ce3 +:00a9b08aa32a802c8f78aef5f2bba21785c657 +:00a9c053e270edd42c0528575e3de5834fbf5a +:00a9d07da7803e8e44973f1f2a7d5aa73f7d42 +:00a9e069b0e252e6233ae33e88e3f699f70a18 +:00a9f0cfe798394c79fa6caef2c6da90bfe5a8 +:00aa00a34b567f7010cf69617bd2229c8b0d9d +:00aa10c8fb857149c1c82d70a59ea5024b65a3 +:00aa207692be91b7b8a20b5391ba4fb83b598f +:00aa3077e7917db016890b1e162dea4b8c0ad5 +:00aa4089cbe2954ea1626d27260cb33d9c7d89 +:00aa50b27429cab3292a70c984bdab8eca4c08 +:00aa601aada0628453396abac72defce240b7d +:00aa706dbc79d846fbe2b225e3352356569517 +:00aa8074a15a833225388039cee2c6b4aa10e8 +:00aa9050463648a882e5bd4c71c31ec7a65cc8 +:00aaa00ef62b191792fc651685515ca7441075 +:00aab0930e7ee8e14ba53ed7144408cf28f100 +:00aac0eb31267f71012bf61c1acd6180a45ac6 +:00aad033cc7fc59e27ac2e4998fb1e329f662f +:00aae02373d7aad2d8d62d958b5e4eb8b01757 +:00aaf0b20fbf39d13d040c7afb396272f2c8ce +:00ab0097b200a2ec25af09814aaefd3c55b9b9 +:00ab10ae77731c8380f339eb43caf9a150fe5d +:00ab20635e9bb11c345ee5433642b19e53d999 +:00ab30428d82d7184b0f846ab1f0ede9308784 +:00ab40ebb5137ee2db13f040ffef51ee140c9a +:00ab50b4c0b69e706574387bb4950b15db3a14 +:00ab60dc279e7594b1d83499c178d6abe7e976 +:00ab708ca8f853890e1630656c4b3cb560517f +:00ab80eaf9970e0c7afd8cac47f0b8ed41681a +:00ab90a0305b6cf4a67e71d730b475c2187287 +:00aba0d81c00b91a3c9dfcac61435877efb659 +:00abb086c80b24a876d4e9f5bb40a32751881f +:00abc032534b4b2453c717bf09b446dc7ef5e6 +:00abd006e4620be19be48ebdbf0e8671712ff5 +:00abe09a9b50b39a96d2bf2a7e3d2bcdef46ad +:00abf02fa8111528f1204290c9d5f8e990bb55 +:00ac007f6938d96a24b13f2c6e5fdd357a554c +:00ac10f23810bac8058b6f266f6b28b8902260 +:00ac208fd6b0ec6c49b2c8c000c905083d99df +:00ac305fdd9ad6284a21913e0438a20aced133 +:00ac406a2befd27f6caee107c3e8aed2a2053f +:00ac50782136dabcb2d2d0bc22dfb089e8409b +:00ac6000f2f17d0b84591758affebe180742fc +:00ac70d0c1ba81c6a8aff9fbd4451894566b4f +:00ac80b8c05b93a3c65bb89520ba673b7d3b3c +:00ac908a07bff3ba911414c5096af2c7710cac +:00aca0090f27d2dcde284c14f4a6b43791a720 +:00acb0f910180adf5bb96c5c1b7a27971005b2 +:00acc0f932d1b378fa4308fe77b240f0f790e6 +:00acd0c2df761f7fc97c7c3143476d64c03542 +:00ace0d53b01519d5ae859c181a8f164ee3db3 +:00acf02045198c7395d1546dd061d2598f406b +:00ad000ef21a0a24304a958ac15f5dac5c3d6b +:00ad10bcfe97a19a13d04233e31442afa0a890 +:00ad20253b04e030efea3eb029a13cea038ac2 +:00ad30974d3fa62c0137febd5c98d77a5ea002 +:00ad409846d040295b6919e26eb88e5c0a7d43 +:00ad50d6705a35a1edc35c463f79051b6eda3e +:00ad6074bf02d746fc3c390cbf26f64d0ceac4 +:00ad70681fab647b1a93c2661de6873dd6aa37 +:00ad808157f79b19ec6afc5bcda1051ab1c697 +:00ad90f385f8593097c5f83758194f58fc265a +:00ada0173b49ad689505eae2ad1be327039d29 +:00adb0307487fe29de0674f185d06adcb8b101 +:00adc0d01acc4a5e1fd490eea7152b01bbd4ef +:00add0c8e33cdfebe787f9b80463ca48a18c4b +:00ade02c8bf81c35fa1f690f87a4a5c38b770c +:00adf0a2ec5a0d19b4d51ce0492f19dc734d91 +:00ae0095a3bdcd8933058f701d29f544a425fc +:00ae108b699504cc86d067a00eb82400225d2f +:00ae206d6eafabff0eb4ef567f52a6b0f4fb0b +:00ae306f77780513515a22db83f70a15643821 +:00ae40e86da8b33daad90fee2069ad89aa5507 +:00ae50fee67e632124d3f5dc5d7404e382cfa8 +:00ae60549a38f552581988fed3ebe8830caa28 +:00ae70cb341b564234a1ddee40e7cd3027b59f +:00ae8096a0115bc141a60b71bb72995727712a +:00ae90a47d51619222a45483dd97d69ced836d +:00aea0ea4593f4ef7941510b3ef238733a2e16 +:00aeb00d54dfbde8d072ad388c59814b916128 +:00aec0052bec7d92f82f61fad68b69b9ab2a1b +:00aed0ceb5bb30764539f23415c1d632c6c2a5 +:00aee0906322b74b3ab1c828bcb07c87a2e318 +:00aef0a8f44409ecab10a411d9e090dae300fe +:00af00ac3c80c9cfe1abff16eb9a7459a3177e +:00af10a1590813a6d3e37f8c4dd0380390c1ce +:00af20cf1b0a866d76a7009d686432df3c2c8a +:00af306a23ae28912bd8ac0d844b01fca5effb +:00af40d8676c0f6cf592f7f97590ee51b5ae31 +:00af505c28030774fca0cbb28cd3c8ca99d766 +:00af6092bf598bc247b1bd7830d2d2e0d2ea66 +:00af70275d823c74daf7fa0723851b73b5d4fd +:00af807649b0c800d4d98ce600d61dd10a82c1 +:00af9027d1fb9462fa18eb613ce85cf8cf336a +:00afa05318bbb0244ceeee044b71ad77ba01b9 +:00afb04ecf1478c02766e8c87b351c248dca95 +:00afc03f0686f4597e3c8b50daa01ff2a8716d +:00afd04caf20ff2539b30f6328bb01a1187f5a +:00afe0b9c901ab1744bd35988099be45977822 +:00aff01701a5832c5957c60f2f9ce2be34d3f9 +:00b000ca137edf90bed47823cc5f918be86292 +:00b01039a1aa1ff64a4ad8d2e6092c005843e8 +:00b02073162cb4b4d86010fb2902cb0a444808 +:00b030af3d571a706cfe0a75210ac52416c7ed +:00b040194acd2812e25f44d34cce7622ddfc3b +:00b0500d75f617922bb703aa897d98ce083c4f +:00b060b728d3d472bcf93c2c29dbed2336011c +:00b0701247493628c41d694a03cdc764928460 +:00b080a9217fe62634db9eaebcfdb1111808d4 +:00b090c52cde90ef43b74396cf5a60093b0f6e +:00b0a0de9e7eab539fcc730c01d6aa381ecc87 +:00b0b004a0d21d2ab19e5332f5d26fce1d78e9 +:00b0c06d714d3147f57d96114a5696610279ff +:00b0d0859d2f017b6e578befa6257bb6eebde4 +:00b0e020ae17330e59bbac3b70b0ca92c74599 +:00b0f0ff2634d356f13b1648ef8e52ad9d662c +:00b1002f31a548cd1862aca51587cd812bfa73 +:00b110c2d815e797125cebf294b0e0f6759658 +:00b1206d1b4fb43067cd267e34d8e002deff74 +:00b130b654cbaa083c39337c521471a1946a41 +:00b1402d0a00a54b3f8b8416162270a1e14888 +:00b150365fe558db3767e3da84294c321d1a02 +:00b1608299c5b9a3aa4e5efa68715122465924 +:00b17007bb649852b426dc76d46b8e5462a3e3 +:00b1800f1f3d1e1bb03d3e50e3763a1c8f1536 +:00b190d52bc817419c52bb358a996a7b7d5c4a +:00b1a07bf733646e852bd678c755ee33137bc9 +:00b1b0de5a84b5c22994852cf358f7f760a234 +:00b1c011b57916bd493ee8e47a1e9d5825c7f7 +:00b1d001ae88ddc409c488eeded54953bac89e +:00b1e0f77ec7c1aa9e70d311cb4cd02697b01e +:00b1f04c3e635bf473ffb9eae2416a4c7283a0 +:00b20057f812bd61c9deaf2d532fca684acf4c +:00b21045d316704efa9acfc2bf11e6acaeb958 +:00b220ce25cba2e5844f0af09fe8294dbbfc56 +:00b230f6e2c87cd9831444a6a5ee058d1bfe48 +:00b2404ab648dc576150da3ebbc6f234c357d3 +:00b2500d3a05d9314a87d1c175a042ca7bb650 +:00b26091fd41097674ae2095b533c984a97416 +:00b2704f29e60f52e636f4b7bbe582e1bbda01 +:00b2808eb590435032c0573807fa702d398f43 +:00b29063baa3d4e825135ac0911e70d1a5bbef +:00b2a021c550c7259e8976f2b5dc9257ba3c23 +:00b2b0471694232cc08f59aefb96d00ab38c95 +:00b2c08e8a17115cfbde26edf7ce771accc90a +:00b2d09b49647c790cdde9559a10357c6b60f5 +:00b2e0bcc4884af8d413e9170c803cd844935d +:00b2f048706d4028323c0bca327fa8b7ab5cec +:00b300d6f7cd220c835b69864bf6ee3a831c34 +:00b3104f926353dd5328c23fd53ea3a8c0286f +:00b320c6e16c97ba867568b7d346ef28420316 +:00b330b7b6504b118142abff569715b815df19 +:00b340e95cec4aeda029ea48421b33bd8aadc4 +:00b3509be3f9e563c018fb151015f94eb0f0d4 +:00b360b6d6b071119ac7fd44ba66531f625ab8 +:00b37051aa52e1ddd1dacbb85b27207cd979a9 +:00b38046fbbb16f86426566b6a0923a55570fa +:00b390570a9e93ca1c55ff668241e83da0ea8f +:00b3a08240758f350c1d57e58d8a6c14199b37 +:00b3b056b0119a2f81729801acb26fb5a94cc3 +:00b3c0e4d4d45398bd8b19bbf9ecfb5f783d64 +:00b3d08e37a94765a9f8665e166aac26ce23b0 +:00b3e04501461f1240c01da523e7352e750bd3 +:00b3f04caa1b99a0d3fbc104cd2bcfeb3965a8 +:00b400a0a134c31bfe26ba0ece219832dffe78 +:00b410aa0ff495aa205614f98f4729cf4de476 +:00b4209c829b4518a8a064bf2047188ce57d24 +:00b4307a39046944672ea738cf98f7511674b3 +:00b440542a894848e683a98c0b21b90c785287 +:00b450fc0c583f486249379168436e6b72f360 +:00b460693b3e66598f5581896da650d27b8dae +:00b470fdf1a2062294c1eb76d571366a08d5a7 +:00b480d474cda7b90d9b1451940bcbb5ddff73 +:00b49047da9aa95f99db24fa598fc24a5c0faf +:00b4a0c5c48e341f5bf3fc3a31ed2e0ecd6036 +:00b4b0adb94cbdbc0a7bd7895fe289dd66dda1 +:00b4c08b7d5d090b14bd2c3d0ed74dd723dea2 +:00b4d039e14207b97b2c30f11d8a69205d379c +:00b4e0530da5f3b394c6dcd7e0bd4b4d75d3df +:00b4f010c25b1cd313e46c85e68f830de33beb +:00b5008dc9070c9569b5997f5970119379397a +:00b5100f69401440d1425080f36155fbe642c3 +:00b520662b1f5b3aea68b957d4a8a995ba5044 +:00b530ed9145c6d1d18f3d8c2f806be6518dab +:00b5408389c623a9735801f44c57e633e20219 +:00b550c1349cc7fb6384506852d228e5c5749e +:00b560b282b2c1bb85cfc6e274daa52203fa80 +:00b5701bc0b7278987978a2b34bb239707e4b2 +:00b58008dc426a61f22f3630ba27bd707dd296 +:00b5906beaafb0e955ea9bc5bc333013b43055 +:00b5a02120f00b70812bf7438de8a3e3d12602 +:00b5b0c6f756f2a44ba08a0c42f780e3a78caa +:00b5c01932cb034ab29c5080fb62a04fc493a4 +:00b5d0d22fd87d81c695ffd2b99baf3df6875a +:00b5e049ae13d18b979cc2718ca586c418bde7 +:00b5f08ee34a4a634a62e86c4cde3a1837395b +:00b600d5d8ab1095090da56957c47d221d92af +:00b6104fd3ae1e2cccc087ae952019f5b03afc +:00b6200bad539828115c4b1f2a20177ec4350d +:00b630f2f5dab6c40d33db05178e140b497bb7 +:00b6400450f85f54933771ff4473fe65503c8d +:00b650bdb16e69ce11fc0ab8eda78d107fb4b0 +:00b6601758074a3b2d2f1114daba4a91356502 +:00b670be7acb27324e42d7f0b0f17da1fad54f +:00b6801cf908a6afe031443fed6e854a2f9b18 +:00b6904996682a5445a6f0e46589f2fc8a95bb +:00b6a04abe529121ff8bb15627cc0c48077def +:00b6b0f670728be939ec0a7a6db724a0777ba2 +:00b6c02fc3f25480e1ff0e51964ff57b6e782c +:00b6d0fbc9e80c4222668a997eb16e4feca470 +:00b6e0b63d9587229c7ed75b71cb14684e35c8 +:00b6f0039a1557d3d333821b0203658d17a13c +:00b700dfff7c95762a352882bf72029368c2ac +:00b710deac7c219ffceb539bc6439cc311972e +:00b72042e27dd5ce800146e04edfc97c922bd3 +:00b730988ceae1401b9ad2a3981cc1588d0a40 +:00b7405c99aef872d5029bb4bcc79d9c3dddb2 +:00b7504c98268fdcf35e77fe57d7e51340741a +:00b760eb0bdf4110a735f78735e18ce56d8947 +:00b770b48c34effefb3e047b024a75cd747f0c +:00b7806d3b9bcad5fc21e73d4769b430425a5a +:00b79047693cf3d5c6c9599cb9d07323ee3e45 +:00b7a088d1742870a087ab820c24d01c74d1eb +:00b7b0c36dbbb2e0607bbe71ccd8f0f176b4e2 +:00b7c0ef127f8c9ec3db055bd6fa4b54150d81 +:00b7d093643fe8efb0891c01f0c8849500bb6e +:00b7e001c52a14cfb268c6d9f0967409258a52 +:00b7f0e35554cf56cfbc0ad44340f8b7e219a0 +:00b800e4de6bfc824ef2f447e8e4fd852685c1 +:00b810e5d5fc67c9bbd363febd740f2ce2c702 +:00b820ca215716fccded30c1f72e660809b847 +:00b830780970a131ede72a7b63cad4406adcc2 +:00b840128c6b82f69b894c56579b9a37123723 +:00b8503c33a99a805e3b71b439973887cf105b +:00b860ed6bca0f393b95469b38800559ee2c5a +:00b870701bf832a6c98bb30a4f84339fb53046 +:00b880761e807b19d5355d2f9bf8c9d6f9d305 +:00b8907454af22cdab5c20042207107ba3116c +:00b8a0365011c711d0e365aaf1676d0447cd11 +:00b8b0c316a07ec54f69b6d5e2cf10bfb3d68a +:00b8c06237d257f1a24336de919439ff6f114d +:00b8d09b8fb706fba724bbe0ba6999254286aa +:00b8e02da59c0c90e909dda5b9e9940659085f +:00b8f002107588791cd9d493c0fb030ff83d3f +:00b900c906fdd70655d136f14033e8e88b9b6a +:00b910dd6ec523174f9e646c365da2a1a8ed91 +:00b920e7e1ac40dfe0edbcd7985294a5deb2e0 +:00b9308546ccd613558ef7d1ee7f97f0325949 +:00b940b6c3d11f7fdd13f5d9e3adc94f5ce9ff +:00b9508e2cf927ef6eff4711b9808bb12e6f85 +:00b9601816f4e08b990e2a5bc0998a8df36601 +:00b970ace089510493b8bfae0b69665cd75365 +:00b98064328594d9bd2f2ee3e35a69cd5186a0 +:00b990d98c677a58b8b0e8e761c8651b6cb5d8 +:00b9a0ed4f89a11f4f4e6deaa5ef87002d68f6 +:00b9b06fc168e164a5507059fcb10fa0fd2222 +:00b9c0b4abf1ae9947d79c1b18344dfdb67348 +:00b9d0a70b0274371a398628f91f75df9cc6e9 +:00b9e0db871ab1a54d714283f9ce6d2e05691c +:00b9f0f1587fc6142a6e21e8ef20994ecda3d1 +:00ba009d2116f9a21f76bfea3d7b68c57bda45 +:00ba10e578f5925f136a1aa67eae6981352e8c +:00ba20a05df43000f1bbe913e39e9427142a27 +:00ba30016e74a031b726be5561399eabd5ac94 +:00ba409e27d5b090e40b434a302f1989ff0064 +:00ba50059e621a7801f462bf63f0bf917423f1 +:00ba608528e2b692ca002cc857b813e5203759 +:00ba70f178979b73460c11d9576a80260d9055 +:00ba80c9c2c514232f39f4e3cdda8c5ac7fc1c +:00ba90f1de0d6377529694617b4f1318dabd9f +:00baa05a677e87532b8ef5c0f63b567f4d638f +:00bab09e11a9d28e26a09b8762ee0ad5f6d4ce +:00bac08519cc649a0527e22767f3b85e4793c6 +:00bad0309bbdb42e2b5c6ebf2d6bc70a784efe +:00bae0690a777882949e9c107876c465f2afbe +:00baf04b2665648bcc3c23af262e37b26c3ad5 +:00bb00be06c5b856c52a77077c9de2e28b721e +:00bb10a59fe12581de56b64b043d9e2e00421d +:00bb2092e5ded3b5cc6157333e94313e6f8186 +:00bb30d287b3bdb36a6c7779f997ece8dc00c4 +:00bb404b67b317a7e0f658fa9a4aec9493c60d +:00bb50092d9ee28f9989e8d798f73aa83d6760 +:00bb605779ebe97e1f19dd2aedc8ed1a09cc6f +:00bb702a61f3d6a86b4631b89a7f04bc872487 +:00bb80e355f9d0cd1f529f83cb25168569762a +:00bb90cf0603fa854995e8ed8b0594d4bb197d +:00bba05599fc4693b80bf41d633ec59ab71a82 +:00bbb011e13174ed8e8957b9b813b75d0f78a2 +:00bbc0c1a2db1568909af8baea78b4f6e0136a +:00bbd09169abfad5da4b81542a795a793637a6 +:00bbe04416504d2123e43242b3581ba558b593 +:00bbf06954f96ae2d1c791ebe95f7e4c70cb3d +:00bc00c69f58501e606abcad6d9e16737f0ebb +:00bc109fb8da57726444c40731b7c08751d5e0 +:00bc205a2b276d88b40b0e8319a2d6ac0d0b53 +:00bc30c681996465510412a5732b583ddba1a3 +:00bc40b22cb2d2db0a48d970405b9210b48aa6 +:00bc506982a27d53f3151c8641a6b42ce6ca45 +:00bc607f3b82889a60f8b4e3e2b455b621c4ee +:00bc7006ae31f0051875bc8b4d678d07a2621b +:00bc80583574e87ff8087db259a5587431cc63 +:00bc902369b6847849f49cd2479e7ff0dcc4c0 +:00bca01dac1655a5098adf6abd9fa9fbff9368 +:00bcb0863b7dce0dd9e606d2f6977bb6ebbd2d +:00bcc05aa1124241de68f1da551b70e542b5a1 +:00bcd0550528fdb303cd6d925ae097d058e690 +:00bce0e40f09d73c833ad49d4103b8bdad1321 +:00bcf098f7d2e6c85af5a26ad9bd818f7aa4e0 +:00bd00c993b1ec15a59b3eb1e690ad2c545463 +:00bd10f639461fa6cf61fb2387a703e1079881 +:00bd2054eebc271ebd44f4e9e0a98ad27275b3 +:00bd30c98caeeb7f33ccd90e13586423a7b545 +:00bd401c8e1ee5e896d430c4a4fecc550230eb +:00bd50e1b5f01122e6dbd378e96f288b191baa +:00bd600412ec39c5e47c5232f25d8774b286d1 +:00bd706cdb5a4cc2a574dd999dfb676ebc5e25 +:00bd8014083e241e06e039d7d374496548cb1d +:00bd90c0e9fe7f1b23669da40780ce92210964 +:00bda02163b04ee66e9432a6819a2d9d87f392 +:00bdb0352a01c48d652de19f67643e73243663 +:00bdc07f4ce69ece404e0f185b7792001b5f0c +:00bdd0c8a347502250899e2f30ed62fb1cc110 +:00bde0c11a4195efbb27aa2446c34f94369bd7 +:00bdf0703d0a614d5c3dadddde1b47a1d55c23 +:00be00e288f756d82611f66c04ebc85a2dba6e +:00be100e676262b55a1513b85ae6a8253b737b +:00be2076cc2032d6d8788f9f317af350c94786 +:00be30531d781fefe175c92bc990b2a934ed9e +:00be409e053cc1e35abb2f97e169db74b26b17 +:00be50415ecf8f592e93359874f301ecd25fca +:00be60e996d3028405dd69e35ea62d9374343e +:00be702c8be9243050df0f8e94b73fff77dce3 +:00be80cb7919baab0f9f723be025ca7eb6b580 +:00be90020499a9be6f5958fd27833069d4154e +:00bea0ecb206b381bd4a499a87ec4ee361a656 +:00beb05eef2b48be31196ff427abc447c52a49 +:00bec0258937a281b8a499bd86edc5a5ca23af +:00bed02e59f68c10c8e826993be0a139962ead +:00bee033af8df4c8e7bed19126b5bf46c734bf +:00bef03097c80ad702189f08b853b4bfef6f7e +:00bf003d7214c70049679d7ab569abcccb1a0d +:00bf10f47532fa4da4d1003e2258e0faf24169 +:00bf20f403c00c515cc66e6efe3ec773d11e08 +:00bf306d93b90eb994210f906baa95bebbed0c +:00bf40ab5b224a54f8c242a68bfff47bd2c479 +:00bf5016111d5b74e5b0b74837e43a53f935c0 +:00bf60895caf98d5f0c77e336220338565adab +:00bf70a741a65b3ee23c8746952d0896ca7233 +:00bf80fbc68560b718278a13c626734cff5f6a +:00bf901012345d93964d5e3a7018a663aa2051 +:00bfa075d02968a67c34804c3faf01b17220f1 +:00bfb00f8049ae754a2a67e2a33e9523711a5a +:00bfc0958cf0b7cbf8d7a002c3c2a064d79ece +:00bfd0072ba72e004d360b53d113b64329ad8f +:00bfe032dd81030e6c956c5d04fe9bc18c3d0d +:00bff07bbc4ffb4d0911fa4d27f1e2992e6ba2 +:00c000313116d7466aaf4041404927cf72cbc1 +:00c0104c1b4fd4f359223e160ca900143cc5fe +:00c020972dd9231a01799d3606606032965021 +:00c030e4375b2ecff392ee531acda4be03b95b +:00c040081bccdae7769dffd090829cafa3481d +:00c05054d78527c60870ce9f642d79f37c2124 +:00c0600c2fbefaf94ec368813b42f57f4db80d +:00c070504820384a55e16f517d5e2b97c22d38 +:00c080bc86da8cba53af6886231e9e96e0dffa +:00c0903292c77af098a45477f72f0c0dd6ac59 +:00c0a02cba1afe331d892e981b6c796b65a824 +:00c0b0faf5c6774afade23b3b6fe8cc848e260 +:00c0c006127be0356ce92c8b9166a6e8946944 +:00c0d007463ac5602b45956f8a669d20da4a4f +:00c0e0e96257e89c47151b28a34ea6debbe3c3 +:00c0f0b6b9dde2df4339a336674157b3a9eff9 +:00c100df90852d5792d711d9a7b682a1a1c47e +:00c11037906fa91e1f87bc426f5a55b97a350f +:00c120cb538322c56fc724cbc75e6264382d11 +:00c13064010b81187f0c4a143d5b50d7104240 +:00c140bf8976a70b873e60f7958a77fd4785b7 +:00c1507efe8f484330c09f5e2576a484e07def +:00c160c431ea809c0bab460627b6be60abf978 +:00c170c72d532a80e8e84f3e49322ff50384bd +:00c180029c56348571d8f9cc42088c449c6d1e +:00c190f103b88344c0732ae94ae26bce3e5767 +:00c1a014f29c2b3d0cf904bc1d8f3ebd8545f8 +:00c1b06ea8dcd410f05a57098618d6ef9e28e6 +:00c1c09fe04618c66fdd2b202dea980d57b507 +:00c1d029a6ee542799250124daf74f3065e254 +:00c1e097b8717b641edb6a8a05d4749e63e0d3 +:00c1f07a16083650c9b1670f1a91277883a6d8 +:00c200b12c31952e522c108b3a18b125c4e77f +:00c210be51fe63de8aac3728ba59fb6abc33a9 +:00c2207b6c7dd9e998967b1e78a249546952d9 +:00c230b379a3a1a0bbccbdba9dc94123511aa2 +:00c2408901d830360b7f55a0b20811496fb2b2 +:00c25016b0ddb8b29ee48fc99e94b57d5ca7ca +:00c26046ff9fb81caa2741f53f7024fc15f42a +:00c2700b4286293eda40f5a985f8d9de777c88 +:00c280385a19d7c9c8533aec0f81701125fe2f +:00c2903acc8aafc8efc0b18a7aca3100181fde +:00c2a0ca0812f62ca6f46722d6ab0fa8e03fba +:00c2b0687121c822f201abd57e72f7e8bcf9d2 +:00c2c059f77d5215468029109db2b5a1fa0467 +:00c2d017a0011018cf6d063d2e0fc26c4b30c3 +:00c2e0f2c8e7dcb50dda4b6679323bdd5aec98 +:00c2f0173000b2f264e09e6291e17e6524a349 +:00c3004e5e6335c64df08804094325eaa5f428 +:00c310af1ce821222cb59efb153fa3ef752656 +:00c3204e9315688240f008819c128177cdaa58 +:00c3306355be45fbff5a4993b390cdadd0f585 +:00c3404fc57d6bca4f112959584cd460a1993d +:00c350cb7077b2083f864d3708629f3180fac8 +:00c360990df55c17f8be740f50e27558dd068b +:00c37058f8f2b1988fe84ab480aa4f0bbf9a6f +:00c380ce099d45478de035b06f5efa0d9ef4c6 +:00c3904b966278819d3efc95ea16f8324f44ef +:00c3a0c4969f24fc6a2125d0111a3f2925f0ec +:00c3b0e6d94a6b59b7be16d295d48c3dd1a68d +:00c3c06deb27afa9e157efef856407ed120d7f +:00c3d0b85d8a2f88e4c5765a0657d86ba6e9e4 +:00c3e0afb1aa56a84f3450660257bf25672755 +:00c3f0e20dcb821f582b7f0ab619e0b19248fe +:00c40078dd428f2356c652f315a19da4058f19 +:00c410d55149a1e316167e82c9b4b402f156cd +:00c420f9f22ca639fc58673c455263664b62ab +:00c430c18803e6110a18c35af87dc950b144e9 +:00c440204dc052f305aaa2aabaf6a070a3d432 +:00c450ca57377abbaf1af4e9c3449d64d0ba70 +:00c460066f1bfb8f67f4f43fd9fe0e87f19e84 +:00c470d8e3204e6453b28ab289e622d4fad756 +:00c48006b355b61e1d6fedc57dda3f3e6fbf4d +:00c490a048288ffadf95d5d2aac21a4ad61196 +:00c4a0dec4ac18b3e34b1d23642b424bffbd87 +:00c4b005622d832e0338999bb24cd63542e436 +:00c4c0b55b883dcc42c4026a70ff08b5a702d3 +:00c4d08a808ba650d238114da817fdc6f85f8b +:00c4e026d77118bee2857618aa4528b60d7385 +:00c4f0689f9244b661009a35713f5c97461192 +:00c500e92b56427564f6d85af294b81b2da729 +:00c5101cd945e0f1b958f0649ee2957848ee20 +:00c52097df7638230991461912f9ba0bbe1c70 +:00c530511b1aec3922fe034c96f6cfecd56db6 +:00c54002b8a98afd0398f9df5e12db9b168363 +:00c550ec4aac42a5ff87b6ec70348213393737 +:00c560fa1d61cbe98bbf26eb666f1a3b58f6e3 +:00c570acad46f5195affe5d748d5ced7a783ee +:00c580fd6c8a190f0bca817db11a7ee759c6a8 +:00c590ac7878072825bb3a3b58469b33607979 +:00c5a0cbfceec66ced06bf4606d30e415b8eb6 +:00c5b07aa501785ab9c681defbc172617026e1 +:00c5c08646ab968ade0f2c15580373d4787ad5 +:00c5d0e1df73573cd394f12579ac424fb77d07 +:00c5e01c8fba5e3606cba707b0cfb990f7b1f2 +:00c5f0f8c6dfb0fec391d127c81752dbfbb04b +:00c600e0f48b5eed0df6e226fe717763cefad9 +:00c610a0f825a5705c57082145199321474570 +:00c6207f15a3a68c312b5bf242a354dd4badb2 +:00c630d51e4573ce65ee5fbdce301315242485 +:00c640656ee8a182e224c282335ac8d0ceaf0b +:00c650dc7b22b82b3a5f684adcd88f569fb504 +:00c66096ade7e80a6d13c23567b3ae363d624a +:00c67005d25c3ea696298f0a8e46eae99c6867 +:00c680d835413885ec5103bd4cf3942ec082eb +:00c690b8755300208d780ad303f1c4af2e09fb +:00c6a0c6d762dc68e71f21daaabc439d2609f8 +:00c6b0e2a2351d6dc02f625b1865e7832338ab +:00c6c0dff57553ef71380f255c0fbac08a1a7a +:00c6d09c53b8d6f95b946ec21d067f28dbbab4 +:00c6e0d811ea098c004285a455f4841ac29784 +:00c6f03ec76345c2da0f57290dedd509ff9b45 +:00c700039722767c786bfea9d809a85222513b +:00c7109d7a67e07f3820dcdd9ab8a9bebc0b35 +:00c72086dd414d75a9e1821eb45671c7348c18 +:00c730a0e8161ab578e665e81b40485abdc002 +:00c7401be865dd14f4c857d26338c9cecfa551 +:00c75077c4319b205235eb6fd6d91733fd5ec6 +:00c76004264b4e4d171f8deda7c193775b391d +:00c770205b0f8b089af2cef8e3e182755d6910 +:00c7805cb138a6cc93fafb92ca20f720fd82b6 +:00c79057fbae880a31fd4f6396e712ff427268 +:00c7a0d8ca5e90d6c41dd559e0c7b80028d5e5 +:00c7b02ed348a7b940980e59b7901ff7f5194b +:00c7c022ec9c5e714053a160c5fae353d50e2a +:00c7d01bf7f36ce5855cb1074fca379f47e234 +:00c7e0ec91a91576facc8f6c68a5024d4777c8 +:00c7f0eb82e57c9a8b8dc11691ab8ca6f78eff +:00c8005ddf99733b671d273c3d590f844b4f74 +:00c8105d11d66bac94ff099169a5ac21c61fe9 +:00c820c6a64d412ae50467d0e560aef85f6ac3 +:00c8305baa4755937bf70b91975e8c06d04c8c +:00c840960918972bf07829c01876986a17541b +:00c8507165037f0f8a2f486992836c5d90318c +:00c86075df3d3f5fd5c63da2f50a7fb8f9920e +:00c87005cc5e5be90a19319a8fd01b0a62ee0c +:00c8802989052d00e5ed726aca84e241dbf095 +:00c8906d467ba2b440de1c5285bda07b5458d7 +:00c8a05cff6d64975962c416181b1285238e19 +:00c8b01e9c0dfa9562f91192432382d9f52095 +:00c8c04e6826fbf3a66c7aa440b21539d1aafb +:00c8d093b459fe079c35d2bf7cbdea327c783f +:00c8e03deef7270a74b576dc6f99422f66ee3b +:00c8f092de8110fa07662b3142d0edf066422e +:00c900ec417bfba49842d2bb7bf7261fbc8148 +:00c9105d5f7a0a5465c1dbe27f705e498235cd +:00c920f971654317527f4850cf506ea8ec3ca6 +:00c93008eb4eba10af175a0a4167aa2dafc596 +:00c94080b1a198a459baef114ab62c145541b6 +:00c950ad4b32bc2029fa42e34752c6319ae3db +:00c960857474b97436414fea28b6ddb553f7d9 +:00c970bfee4835c5245027bd5303af9616686c +:00c980939c92ce1f3996e52a7c3ed5b9f79203 +:00c990fd1e0449ac229c44bee3f942e6ae7aa9 +:00c9a075cdd959abf4079e77fe1b3854398f6a +:00c9b0ef3a0e335933880a5d38e0be2da45d48 +:00c9c0f7bcfa25ef9cf98a166dfec01d9a10d1 +:00c9d050f6fda123aeb9915d3e77c409fc3876 +:00c9e088522bdebcaebf72a2a499fe875a5103 +:00c9f06810e952d4b41732659cb6948995f72c +:00ca001e3afef7a2004d67bcc00721e9a60620 +:00ca10fcd66fa0ca20ff9524cda229e25162bd +:00ca20c76ed8bf257fb7fac6cb63193ffd86fb +:00ca3092ec3cc52e85a0697c6e653024edd914 +:00ca40e564d5cb776ebb3b2a9374cf8dc84966 +:00ca50852d9a25e3aaa5fa2a1244e475533b39 +:00ca606f3d0648b660c5cc91834b3d997c2653 +:00ca702987937adac07beaa6c0e820f37fb9ac +:00ca80ccb13a67f3368fa621fd59923fec7c77 +:00ca90a0fa2c3e0c430243d081fe7459abb634 +:00caa03576f8c44c2b4611fbff4a1c6a9d0d99 +:00cab07443fca4cac90cb8c3c43cd269c48df5 +:00cac08f62b9c6a8edb2829305818dc56fd79b +:00cad01d8ba90c77db83ec0d4ae5598dbb3922 +:00cae06f3b6d50ba1b426244ec31eebf9f14e4 +:00caf06ee54df7b14e0a0e0495abda54c60dac +:00cb004f17134f45f80410993528a62db94db4 +:00cb10c1dff7c60f34c9bbaf7cf0cb9b0ff458 +:00cb20be0fc8ca74eb2e64bc7a88b6226167b6 +:00cb30ec077238c1c1be47645d84ccf27bcbb9 +:00cb40468cb1dfc03e4c6f160dfd3c20b3381f +:00cb508c1ab97896d491a7c386cb7e63816bbb +:00cb601df79560e5ebcfd2d15c4f80b4f1d62e +:00cb709e8f14eeabf3645f3abc17eb1cddc696 +:00cb80cd30a2f0bb7f0cf6481fde8fe6ace263 +:00cb90c847a4906a0a77ad1224b11d984b51d8 +:00cba032a56430f6c03e640e281ba194296676 +:00cbb07f47399a99e72e614d6c220225446945 +:00cbc0b889c8a9ccf54d97dc0aea9081019da4 +:00cbd0a0b642e818727ff7f003cf307ebdc80c +:00cbe0bd8353667c0588d8f319ff1e02d84e3c +:00cbf017050eb44383e27a6ff8760285904c22 +:00cc000eefbe2687238acd03ccbba28e0e0f93 +:00cc1098cd9ebad618fcda32b5c6bf91e7110b +:00cc20e9d6dcab6fea5731dea553865dfaae2a +:00cc30a491aaca32d5ac1a991508a9701c98ce +:00cc4016692c614a7d6c5c80edfb151627b0b4 +:00cc50bc4b19fd5f2383b496abcd6f828a28d1 +:00cc6052eda1d79d7f9a965489c9adea9d3042 +:00cc70d5135c35aec3bfb7cc6ea8ea7f3db599 +:00cc80e21ba8b2cc5707b8b97d81260c7ea72a +:00cc902de7416847e2d3d2195e1356126d9af6 +:00cca026529e38d8fa4b2129b069c8893d3f89 +:00ccb052fcd662a1bbe53c04c3d43e20c56054 +:00ccc08d86766dc5c7c8b1a6ca3d368cc5760e +:00ccd04003845a1e25b2913d490ad4004b054d +:00cce0d8a27760b75cbae6a3bc4171e0a96c4a +:00ccf00bb97cfc791c100486f65f9107faf71a +:00cd0014bf93bcc23581da6542d86c4b7519e2 +:00cd10fc6f4dc57b695dc0c51ef7a462638e74 +:00cd2020ed902696c7739fb6a5567723110a8d +:00cd303fb7b14450517cb043615b7a1596ebc7 +:00cd40e144fcf44cd53cef03ce74018fa7207e +:00cd5015e27647e8e7b112274c399146e01e43 +:00cd602475886544cf5d20c1a87e36584618d5 +:00cd70351fe0aaad1964613632ebacf33153f3 +:00cd804af57dcf84bb2ff6085a8b74cbdf96f6 +:00cd90d156592908f02170b1b638bd6afb518f +:00cda0e02460ff6461094cf2696f2a1bfc0269 +:00cdb09146817be3c3424117c7fe0b69909a1e +:00cdc0a748b3185973403b068f4dabb9835aa9 +:00cdd03d05a45ee7f3c0451bc43235bb596386 +:00cde0d641ebff149a892f05fde962af750560 +:00cdf000192ef2ec6468224f034c67b8fbc732 +:00ce00c6856018cd3d9074e43c3653828f095a +:00ce10c2567d137b136679e2233edbcdaf41fa +:00ce200858bda4126eb440a1330dc2ec08f6ed +:00ce30aeb74a595bc96f121f7c53839456199e +:00ce40c2b7fbb417548ea326f75ab6c8ad1e41 +:00ce50dac52dc692ca9fcbc8ae58c23850de3e +:00ce6011e78ba3b2cf2f8ca380d3b12d2948ed +:00ce70f2beec003da58104b7a175c7b825717f +:00ce800f076311c0c198d85e0c344a2b805a82 +:00ce90aee64d32b4c6ea56c3a60701a026e62a +:00cea0aced052034bc6e6f9ff882c3c94b3679 +:00ceb0debf69785c8b909d0a6d78b827636568 +:00cec06eb2665bf133ec424db2272035699551 +:00ced0fd6217f649113c28ed34f7b155d186cc +:00cee0ef2502a4ee8d5cb2a6af8c2e2d6cbcc0 +:00cef0788c6c002194aef1b04f01337f6ccd50 +:00cf003e40a83d36a9c3fd7c2fcaabc40bb4f2 +:00cf108291d40acbe99ac65e33bca59298ac24 +:00cf202f9ba53ebc69bdda398cd44523f8a3a1 +:00cf304823f1615adc86746ebe61e55be14858 +:00cf40a3cd741cc43d28755a7896aa1621a0d2 +:00cf50c9f23119797c6d6e75075a37ea63d383 +:00cf6089b44af03d787aee4da13177fead18b2 +:00cf7077d11b57199867058686708d46de056e +:00cf80f3116caa678434662e092562960f359a +:00cf908c1a2b12137f394885c73bde45b07c14 +:00cfa013b95ff240e5a9b5a506a03712cfd353 +:00cfb03dc291266c5c152446675888da062c5c +:00cfc05288bff8e0771d96bb949549233cc699 +:00cfd02bc06ff783745ff1b5fc2107bc177fcd +:00cfe08acef1d32284ea43cd275461e7891d40 +:00cff03a47c662f54aa7131cfa17fb8774dbec +:00d00019b886e11d62ed74ce439ea00978d4fe +:00d010522ad00276e6fe52d1de4fbac6ed70f2 +:00d020aeab12aed9c3a122454c55dde7eba825 +:00d0300d90196b7fedd650941956b14b0c81e3 +:00d040e2c1de71b11e55bc2dc8cfcce178ae65 +:00d050a2a0d2e48925d1c5c5c60efd9e724bd2 +:00d06017d3659ba5f098cbedcb4294bdb9c57f +:00d070b8777673e7823bb93452d899b26d2ad2 +:00d0808170e9fa000286ea2104cb82f773b91f +:00d0900d01749db2afa66a0f799d7559c67f5e +:00d0a0d29b567650b6f8060ace97bff6c762d0 +:00d0b0db3fca225bdda62cb4148ac1741cc576 +:00d0c0a669c0e357cc99888584d36d1a188587 +:00d0d0b54008b724e8263c138682cbe87fa50f +:00d0e0aa59a61a31b4a2cef2d58ee4f5654c06 +:00d0f09374c1cdd28fda3d1e80702a9be13de1 +:00d100a73da203d8fbb51503cc8d88e3f92c23 +:00d1102beb45cb271be4e0dd0e50b83693d247 +:00d12082bb74725a2cf5f09d7d1afd51e69c2c +:00d130657c323bf13da65b9f83c8dce209a2a1 +:00d1406d3ea6b2391bf33ece1fca1a15dada0b +:00d15009ca34d9d7c80001b519796e3e0626ee +:00d16094b8c4e9b3cd668f2b2b517a5fd72f7a +:00d170db0e44adf88e3eea482cf4af695bf5a9 +:00d1807924f5f50a5946527138ce679590699d +:00d1903241d97e66475e1fbf26e96d611df024 +:00d1a086e1d5c6c2fb185fc1e2313d6528ea4a +:00d1b0864da554e6e0ead99e1abcd092ed69fc +:00d1c04f78672b203fd76e2e20b299b1f09972 +:00d1d065a5d320b9b4b7a10f3bdefdc95375df +:00d1e05ab7f07b91b3dcd56533819424b4109c +:00d1f05ba8133b2620e2af85c101240603f0f5 +:00d200b2dc164549eb4daf475309b026adbb82 +:00d2103aa51f123c485ae628f5cec5252bb715 +:00d220b60d36e10a9eff369ed3efd4394a6261 +:00d23048d09e1190b2b1ff86af17b58c87bf2f +:00d240dfba98a55db42e4c745249dd6fa0d6f2 +:00d2505cd5fee03ee0185f92c04dba1b3eb09c +:00d26029cf6fc9858642f605da7dc6f9a8ee38 +:00d2709698522b6e35412a6b0b503a0be8b972 +:00d28098b3eaf5e566bd8712821152b1ff61de +:00d2903999a6d04f94ca4aaaef6b59c61c3695 +:00d2a0721f737d7eb94fb0ab93089a34bcdbcc +:00d2b04e7051b830c25407594277fa284d7813 +:00d2c023126dee8f20a37d2b3290a80ee22215 +:00d2d0f7bc0e8c789948ac74d09b82c0000430 +:00d2e018c633892dfaa101a43d7a0efd9e2c1c +:00d2f09808e35e7fdae3d0364df057ceb14035 +:00d3009cbfe3b2e9efdfeefede7da5d7bef28a +:00d3103ef452c417fd9629ad4cd2d0174700ba +:00d32073f28867290056215c6c09c030552745 +:00d330209cb3436a1d4a6bef670614e72f073d +:00d340b000797451379b8f166feeb6223adadb +:00d350844db31454b28ba3bef2af4daff0b9bd +:00d36089880a36f01696d269f849710eea47e8 +:00d37003de229ac4a75ccac1fdccc89c0da057 +:00d380dade1b8a704cded17c5df6aab4bea578 +:00d39089304dc784a890efdf12883e2784487c +:00d3a0c1ab7c5480d651d002216b1d7324fbd5 +:00d3b01edde00117d5643dd2426d4d3c923c3b +:00d3c0898aafcdc9544032bcac3b842ca4d582 +:00d3d0cdd8f5ad70f0c8373b6a64573f91da38 +:00d3e00f0bb2dc88bd7560ee705566b0dd5b13 +:00d3f06c529d0cd900f613ee3ab78168cbe0df +:00d4007425d03fd9fb558cb83f6758fb228c92 +:00d41004989afd6a688d2d276ea1257649556c +:00d420122bdd0e5f0eb496f648c664037b8671 +:00d430e11297881e7a56fcf28a64a7b006a5cc +:00d44053b5cb99efb169b59aa1e79196600765 +:00d450647282df6c06d40bdf8cd8789e0338fd +:00d460a8eca0f6204c97ad2f96b05f1537c20f +:00d47049036bc3b5413c734e9d17b903e5b60c +:00d48070e000e838bf875e3a0cca5bcfdb9c5d +:00d490530a0f4384acf14633530c49fe01129d +:00d4a0a12af313ff4e044dd28d320b772e83da +:00d4b05bb2ea22c43f656afc14307b63d86008 +:00d4c0e263c61e4b808af24d0513a21e07b3d7 +:00d4d00a50d16dc29cfd70fbe9405fc964bed6 +:00d4e0b506e2774ac80cd45a72d882efaa49d8 +:00d4f00f84111f6f7c60dde7fbcf6fd7045565 +:00d500c9fb1b8f33af1fab7957a43896a0effe +:00d510812cf69f6567e49318257ee83158a94e +:00d5201abce87b0538edbc33ffdd55167eb553 +:00d530964c29f0c5edf607083603577a875ed9 +:00d5403b977d488d03fd8e9bd5e194b1cd619e +:00d550095188122ca2183dca0442def76118a3 +:00d56084db63adb171e2edc8e5067d2c730f4c +:00d5709359d00b6dd99202b5b69bcf6c70da68 +:00d580b1d2eea9aa46c11c947886d1d60be6a8 +:00d5903435b6acbc81d31acba7c3d8ca8d9c06 +:00d5a029d469eff8fa3622a28c957c883128c0 +:00d5b0b7122a69652154f6b8cd0d9b189d5458 +:00d5c0dc293546eede212b81da842613183466 +:00d5d049871c5f6dd80f3bb05d97180243bbe8 +:00d5e03fe21f4fe23294a4b802aa1d5e077d2a +:00d5f04de1137f578f001b66d5d97e3ca8283a +:00d6003a2600736c3e1269e03c22b067ac3be9 +:00d610824804a1a2cdac775afbbc3c2f09a92e +:00d62098f01153d1f692deaab613d6e44f8a59 +:00d6304398a4e546be3072b2c3ab31312556c9 +:00d64024d4d962e14c3b6a7f5b6fa76e216368 +:00d65027075241500ec92b46794ea0a269551b +:00d660f00d565b096d18dcaefb2827aaba5d80 +:00d670185cf0729c7727565772fd9303590a90 +:00d680b132c7378abd7c3dcf80154ba7f33336 +:00d690b99f920835b1f6795fc7e5a67b7ef5f8 +:00d6a0092ce0a7848f4181a45c1866f563f939 +:00d6b063416e557d612fcba365c69e963cf685 +:00d6c01376135d135bed5a6d125b5c1f5e8495 +:00d6d02f57a08eee1d034b09a9838b9f814d1d +:00d6e0787fba5b4a2c4e8dd9a8b447701f8985 +:00d6f0a6998d90da860b0b7112212174ddc152 +:00d70089be41f583c15571ce781be93fe37dbf +:00d71034fb7d2ce5b233b52171abbfe842c012 +:00d7207f726bc409e02742da0bb2be61056594 +:00d730395f786b7fa2ac64f11f471c92a791a4 +:00d7409f7388d0daa4ff8fc527fb53c41ce6af +:00d7502f64a776bd3012c9e99915a56f4f6a0b +:00d7609cb8758c4c8246ec22fdb05e3a1a1e78 +:00d770e04561228186b4c61bdd63ce08bfdf73 +:00d78014b82c445bb29f65c76fab4b28115f66 +:00d790f6472d735f9176e30f0be6e8d1299a93 +:00d7a02fda2d3bf86975e03a8caf467c392729 +:00d7b06e81496fab9ed7122b89ab5d036e4b0f +:00d7c024a9005c4336fc42cf08541df88c1bd9 +:00d7d0373b9a9e91f21303a18775e6d1b3c2f0 +:00d7e09b678cf097c403d087d2b64f418f71b1 +:00d7f01531cb48994afdbe1ecfc6352e193aad +:00d8004d7e3516247c014e9a5a3c4fb10d5e42 +:00d81017bacdf9e0067766d61babd35a0470c0 +:00d820ee15fc6ff25f6357d1dc2c70bbc4ba2f +:00d830a2b33d0f29ed61fa10c6d828235fe605 +:00d84080438f6f9dd79973f6af29547bcd4ea8 +:00d850cdcc01c634ba043b7da1cd0d3e6eda7b +:00d86099a882a874378d50b77fef5f56fef76a +:00d8702e24ba26fc379a47b5d0dc5b08f6fa6b +:00d880b3af369ed509f7c6f1d2eac9563d3d52 +:00d890292a4f0c090597d79a85dacb28a8aef8 +:00d8a026dfc0cf6cf80a7eb2399ab97e05e921 +:00d8b0b79eda5d128824d011c65f10cdba1100 +:00d8c0ac858d4298b225f0031096b342c9a92b +:00d8d0c0a748911e4759e11f8d56a40a439177 +:00d8e0b8eaee8e8616378f18435197a4d90c8a +:00d8f09dfde283105e03a38ba5f2600800fe58 +:00d900959908fb8d128f60173b0e7e63d55801 +:00d9105db39a6713d35febdb6652eada05bd79 +:00d920f4250e03b89019b65532b24bffded9fb +:00d930c018035a1e41f8bfb1a344a0a62bc735 +:00d94017f48432f00fbbbdabaa483d3a7b10e4 +:00d950764be45979c8c8b881a6eed1cf6199a9 +:00d9607e858a616e1b90935bb5463e85fa118f +:00d9701e904acd285fc7f8732a4ed8fb2ca2b1 +:00d980028fa18dd4819949f76463331aba7e02 +:00d990058c83ef7521064e8f376cb2e42ed156 +:00d9a0c83739ae53eafc493b425a5e8df1dd6f +:00d9b0e86ebe2688edf0dafb22dda88d72f494 +:00d9c025be14a3cdd04b6bc672f698f8c223d1 +:00d9d0c1cd308555ab0dbc295246c0dab91052 +:00d9e074c4b146e07d2748992c9fa2dc5952b2 +:00d9f0ab72c8de3928c0b2dd2ee596d863fc3b +:00da0083450178a1706af4f8f6cb871c901015 +:00da10b51fb19ae8c4faf9888c27a59b8a108e +:00da2080aeb9eda938efbe031337993fea5472 +:00da30accdba7bd3f747d8fff0ed3c35b1e3bf +:00da40e9de0e3098947e4460269a5b0b79ee44 +:00da50572eed0963731a1f197438e1e794bde4 +:00da604b9faa26a83eace5f7c7fda723d6f388 +:00da7096f527136fc7c9514e6f288490ef7400 +:00da80c60a7afe93dd45e0400c30471d7b2c38 +:00da90ec502f92f4069e10ecf9617a08f3a1ef +:00daa014a7431ad982702bbcb6dc4a602b3401 +:00dab00ecd52b7009a201945299872d16e0737 +:00dac0f0011519fc3ea543ae7013cb32e44b5b +:00dad08c298e060320bf5501639a21334007d4 +:00dae0ded2d3b61da688e966c830b5e50269f4 +:00daf0ada65b7b622c6561504bbde6159e5fda +:00db00adf1e27521e016bffa5f6a47b40b0234 +:00db10bbb923cd3fe81bf93ea93a416e01b773 +:00db20cfc61319a4a731eaaadb656838ec2f93 +:00db3006fffe0b64504fa86122a6d31cbb7e4c +:00db4062c049585459b93e12617d881f6d6e84 +:00db5095c7b2088fc7a81a822cc23b473d8741 +:00db60c5a3763e492504bb7469f72b8bc73973 +:00db70f52ccdc9c56565175789ddf47f8c0056 +:00db80ace74d9e7f74e4865e600b497738e883 +:00db9013f23e60c060a8d599f3bed104054014 +:00dba0e4758e7fb3d8219064838081034c92e7 +:00dbb0c9a630ac56f9a7a76fcada2eedf0c7b1 +:00dbc0b90c9dcb0f64d426c41800a43a1e8024 +:00dbd0e638b2f60a24d7e1d17d9fe9d9ae0d91 +:00dbe0e97ca52ba8575ecdeeac43b1542e19ae +:00dbf0de289d1b46c91a02260758cb015b465a +:00dc00998f3b94d52eab5e40c65651553492c9 +:00dc1029baa9099f29d3dc6b4785d4ad23ac8a +:00dc2004ed6757693bb11cf112ba662cafbb3e +:00dc30bd5cb921fef5ddf283028937b8c7d54a +:00dc40382d4ec08d2a5231f47c6b654ff8634f +:00dc504afc909a3206abe700730a700168f03e +:00dc604a74c659bad96d65068d7c701b07b814 +:00dc7081f9e62a43c9c23a5f965209d6a4ee53 +:00dc801c627b488a74b8efe1bc974d6e506766 +:00dc9083f0ef2e21e769d677e6b598152e0b4b +:00dca0aa382a4320f0054a6a393a743750f0d5 +:00dcb0ae09b3256bf561088b69a99c560195f7 +:00dcc04d0e5382d493ece0ed04e9b982695808 +:00dcd048ec1fa10a6f16929a811f7e23da1fde +:00dce0cc7b510fb34d8821d836ceff090e977e +:00dcf08fea430fa98d10dd37b186447a686d7e +:00dd0012abbcfbd2b7af376b5673f4c6446cca +:00dd10e175b61d554fba8e3410c0c0db8a81ff +:00dd2082a618ff8ed6f3809d8f655bb00f7aa1 +:00dd30211b7dbbaeab60277694ad5d4f77313f +:00dd4014277c3fafb5a1ac3067ec672507d38e +:00dd50c76093dec6b2d27f47613704aa22d363 +:00dd603fb99b92029830a202bba9608a460690 +:00dd7048e27b7c30d0df4ea9716671b1cedc1e +:00dd80cfd7620198be5fa8d842eeb8938b3168 +:00dd9001490cf7278d872a91a43a5dd832ed9f +:00dda00ec725cc27d296833aea14977dee244d +:00ddb0b3611c9edb0a1c1767c6830bf3f3b0c9 +:00ddc0ee22817b1fba7a0a1fe3f49eb8c5dd88 +:00ddd0e694415dda917b6f1e8b956c21b7af4e +:00dde093c216fadf2e1c5ae624fbe5e9007cef +:00ddf09b110ef4bb589b6b116be7f2299fb1dd +:00de000914a9a2b1243efbce1da80360951032 +:00de1050828b570b6181b0568f591ef7338438 +:00de2099d50bf18652ca05c5996ab17c47ad03 +:00de30f921389ac17e4fc3afd26f46854828da +:00de40b2569999d95a696ec06626ae73bcc0f9 +:00de5008613e15ccdb7ba16d167ee310690488 +:00de60798052ca66fed3d304bd212f74c23b8d +:00de703bfaef0e66deda06dc906da7f65efe76 +:00de8046b1f2ba49b00cb63dee8a33e8caa4f2 +:00de90df130d3871b7c8e79614d4bb7ccbac67 +:00dea02b8af7ad5d1dc8d090e97c68f62255e6 +:00deb03f619548b66ac15d64f3642f04481d4c +:00dec0e8133e71792aa3e285c676abf614559a +:00ded0b75dc5c7973bee8c46b344ead9a76d7d +:00dee0ac269ad1604b1d257da90124d33cd472 +:00def06ea0382d913191e387e2350d60f980e3 +:00df00425e0943aee7d477fe0db980486a4ebc +:00df1035d7badb12f9f842d69392c1df6b6aa1 +:00df209e5f2c79d775f14ad88e6f2d2e651fe8 +:00df3081e520885dba8fe27808fcad659e0216 +:00df4002f2afbacac43ce68cd1330b851fb4b1 +:00df50e30c889ddc60523bdd3acdd874aa6d35 +:00df60c5b1e2114d56497d11e6baa56484757a +:00df7081f496e49a89794050e3ce08c2ff97d8 +:00df808c0cca3f32e33a03f46230406daddd9b +:00df906db2d0d9a38a2f1c9026ecb3ecbfb0a8 +:00dfa051947eba4ec72f88e1a0833b0fe1af4d +:00dfb0b1714292f15ce66920c90173f3f33cf0 +:00dfc0484a64edd7cbc39f96634295bbacfca0 +:00dfd0c2470e90c7bf3810979029fae2fd3aed +:00dfe0e8bd71ac5cc16c6c4bb0bef03031d715 +:00dff01a162a653a40e18cdca196282db089de +:00e0005bc83fd47e2871ed2e7145200141ceb3 +:00e0104c84ae91dc4468c8d27524d644fa2e88 +:00e0209ae8dbfea5e991405fbbeb7fc566ac27 +:00e030e64fff3f6dc56bc019f15a6dcbcbf84d +:00e040f32f2effe035d97f71aeaab11be55a50 +:00e050cc76db6b88899c6954329c08d2500dce +:00e060093bcf3919568e0b39fead2d5f92e74d +:00e070f141502e40adbefe100c6a65e63904d5 +:00e0804eec3ad3eb8d797f38ebcdfb15763a6b +:00e0904667309e7cc18fcffb256557e75ec3a7 +:00e0a0fc71c6232dc763890cdb635caa1bae3b +:00e0b0af88a3b70f046166bc05a765f1325853 +:00e0c0cab56dadec651dd62aba7f8f5ca81410 +:00e0d0c01c3bf8896786b8c7338f2476dcd169 +:00e0e08b554c7b8ca80f8332588a96e7ddd95d +:00e0f0f0a4bb549148b9b17553cde93c8ba274 +:00e100778d1700a35f9a40a4891584cd19d437 +:00e110dafc96cee69e2117462dede987f7a5f9 +:00e120cc192830983afbf0f2e643ce1b59c5ce +:00e130558c366da1c877c331b5b8ea59116679 +:00e140c8785391f898903c7a35dcafbf45e60d +:00e150db2787cb9fbc14897549531373598b92 +:00e1604367ed31ef993d0295e28524539bdc16 +:00e170692ad84141b6d24a7e28b0a152125ebe +:00e1808a8417327968e9a0b3857be84227189f +:00e1905baf863d213fcdcacb86b7737fda0101 +:00e1a06033d207da9efdb08ba1013521804a67 +:00e1b0eb790642cf5e2b4ef9dc8ac32bd59a60 +:00e1c0455bcca02bcb4916d19ce3e790f1401e +:00e1d08bf586603a619a9fd405598228d26d27 +:00e1e0bbfbd605dd613d18ec37d354bc03ede4 +:00e1f01c86b84beeb73711a6ac962e32ec27c8 +:00e2001db6037c14f504f53a421c4f5d800f37 +:00e210424761ae1145820047838ea2f03cae49 +:00e2202b507d92907ba3c8611f343fb2951bf3 +:00e2308060dc1f59934664fc5a0f12dbaecdfe +:00e240351f5d4399a82256c9bf12002e874bdf +:00e25085a5e2aaa7723c7500f2f46b1605594f +:00e2606cd62a590867e9b61929eb04f0a7f370 +:00e2709d9b1424e795f74f0758b866560c3f93 +:00e2800a1981529e5201c2350e28a0d377b054 +:00e290adeb3356d788f0f82337ded707f86962 +:00e2a09682fc4aa570811462759e09dae002a5 +:00e2b053a03dbc72b67ef4bb88e35ac97d3b8a +:00e2c0331adfa1094f39ef9edaa90a4c2ebbf7 +:00e2d08bab7e00faaeb9675fbbcb93e5bfc9d6 +:00e2e0a2b36c7655e962f44dc2ac4d49d0aa8f +:00e2f02b13586d197f313898567018cf24ad11 +:00e300c7a467839b3b3a78946849ca6fbd62ba +:00e3104d9238d977f2671dd78908da5b44fecc +:00e3206c8601d8905ce96112dda5c2aa50485f +:00e33044600aa6d2ddec77550b080be3d6ed75 +:00e34091d40716f634215c8fc4a452b4e57097 +:00e350d0b15cf5000b0c93953ded951c63edf5 +:00e36082abe0c11e9eb2c968f724afcbfd27a9 +:00e37026e7d21cb843f719a56aa67ebe7f724e +:00e3803281d93d3c22eb601e2f95f6b0c8faf6 +:00e390b08d79563646dc174702a1dec4da3fde +:00e3a07aec0b0e8ff57032472d7d3e19d6359d +:00e3b0b11c86a5a620aecaf5792e826861c0d9 +:00e3c0f5b382d4810a5ddd26711fb6f57dcfdc +:00e3d066258b855fca637212a04bc8e4ac450c +:00e3e064714fd5b3840df5ff54acf85796a5f2 +:00e3f0be7875c28c556154bab0a4008a0b988d +:00e400ff9f5b0d6d7f741730346a291d0325bc +:00e410675ab03f61d8800fff93a7baaaf21427 +:00e4202c6422789866bf803ec3b49dec0d391b +:00e430246f189d83a166ef7d336376c8ef4ca2 +:00e4408b4177a2e1914c54d3e6bc823b612b06 +:00e450d1887758b31c2406dc6ef04ebcd80f6b +:00e4609d895334f72bfb5d29d23bcee7ce5d35 +:00e4703463785304ced01cdaf320b3ebf28359 +:00e4808bb22270b16d209306191a7af076fa12 +:00e49020ffa1f1bbae737c5bec51a9a33c71fb +:00e4a038317d2aa1130739dc0a7cc235dfa424 +:00e4b0249a8bbb22cf11ce51452b6da7d609bf +:00e4c0ecf9bebaa2bc174e82b918333d8e26bb +:00e4d0f56adf38a806c22d4f347eaef09502c6 +:00e4e003e42ebc1610c8f70609c839bc337508 +:00e4f05bf89c96f51950c5add14a5f94074fb3 +:00e500ee5c3b98b31216099d4d40361c9c62ff +:00e5103f8bda110d99dcde872eaa10c0b8b0f2 +:00e520eb07d7984f63e2754a49e70e54ad9f93 +:00e53091a8992802f58723825e18f60b35aeca +:00e540057d9e2c4beee2691f0a59d72db7bdf1 +:00e5508a087e3f14510384f74d371901b0d490 +:00e5609b69ac1bb9a7df01eeab561e91e42a44 +:00e570d33371964c980d4194a542f864e5f982 +:00e5800afd6e287317e4be0e7d6e519150b60f +:00e59052828ef1bf21e3130284b2a9b7952d0e +:00e5a001ec400671d8a44ab76f6504bab2a54d +:00e5b06a8ac0b9af0b1d8ee0efe503df4ec08c +:00e5c01f345328c47c7ef1eb64db07a50244eb +:00e5d02f461d223206897fa75e85def46ff6e7 +:00e5e071f8f1518e599f55a7891596ebfc8f38 +:00e5f0bc19409976343e835faf4139b1d07353 +:00e6007bc17c4f4e07c813264d5624fc2e9bf1 +:00e610ff80d484f564f80b57f659c2222a546c +:00e620987b18615d1b5eee11cbe7b69ca8ff56 +:00e6300661d51280cdf603c7b7e968056f4796 +:00e640defa7a51360c2af0e5be48af892656d8 +:00e6502d9869e4432e345cdd721be7f7d85cd8 +:00e66017cede863852bf45f2202d3e9cdc3e1f +:00e6704b6c338fa03a60d443ae4eb6d77122db +:00e68092befac8f3556f508161ad7d8e8df38b +:00e6906e7f278860d4c84bf23f64c42a59e142 +:00e6a097469c15701e415668307ac765900d72 +:00e6b02395f33940c45ae3bfe0e8eed9b0da13 +:00e6c001f545761a279e30c425cdcc728611fa +:00e6d044e22c5179b7b85c511e5cd9bf611cfe +:00e6e0f25f441d72cdc57013cb371c1beca967 +:00e6f0376fbd2b630ee09d9857c8971ec5e9d4 +:00e700720f840565572b7f4c0d7a46763755ba +:00e71044f166a49af92386bbbb9b83ff5f614f +:00e7207d078d15b9f565706c135143070e63dc +:00e73079e37c29aef6c88e65e3a64b7c87948d +:00e74021878bdb70931b72cd7769eae1340b0c +:00e75051bae55c7bba3382e062cddf54c768ee +:00e760ccf756e67e999785df122c49c20f657c +:00e77017a2e529346decd3b571da260157eb6f +:00e780922bf492c7289de78252bd44e871575d +:00e790b19398413368eb99fd457c3cebc6e244 +:00e7a0233d3e1c57865aca74e210c0c877bb20 +:00e7b007dc35f5484d7844caf6b79d0d1ce0a5 +:00e7c0465768d7785686827f1d77730ee8ab1d +:00e7d0a2a884db1acd4be536be119fd9f7e69c +:00e7e0807a9374cbc0121f9cf8022f809c7c19 +:00e7f047a7ccb862493091ae147f982fafcf19 +:00e800f92e03367d61eb02f503ba4f920cdbbd +:00e810af07138a5faa01c1a3568fdfceaf8d96 +:00e8200afe4e8578cfed57d6cfa7c5138c2a19 +:00e830200d7e2a1bbc5fb026d0a62b82cdaf3c +:00e8400a07ba761c8eb005fd6074df507bd8c7 +:00e850de800e4262618492949f876108fa07ae +:00e8601216b7bbd84602e7ad7d4c1616beddb9 +:00e8701ec77560e4396c5f482f1fbfc1d22745 +:00e880f4597a6949615c3e7f173752359065bd +:00e8907c4f8234ab2f4fd36ecd788e07602ea9 +:00e8a03bffe38a5f2fb2276709b2ac05b51388 +:00e8b03d47d4aa8b7cbc50bb59fadc5071dd3c +:00e8c0142078d388605780294737e95c16bd8a +:00e8d0bea800b1aaaeeebecd1beb5b79eaeeda +:00e8e024fc1e7806522ee9b56556df39f15fd9 +:00e8f0b80a3c3f923bb8661b0fdcaf9936e0f7 +:00e900d81e19ed0d1dae9fb24c6182dedce49a +:00e9101bf0c454b934dcc28be52f2f8a5866ea +:00e92067886cc735bdffa3dc9155f71e439fab +:00e9303c94b866d46ab561670cfe99c6ed224b +:00e940ba4a2e34922b2adcf2f47053bf0d6ab3 +:00e950e8f31debde6e8bebce30a98813b64576 +:00e960667f2661383548f2f100cfb735daa2b1 +:00e970dd8e034583eae7bda95cc26076116c27 +:00e980d86eeb5156b1e323232752cad181b8a7 +:00e9908bc3bbb682e6fc56f4bb7fe222718d2a +:00e9a02757e21792e0f4580054701fe302bd77 +:00e9b01f46db8698a83916a460e7478f5758ec +:00e9c018014c426ee45544a35463cc2fc5557a +:00e9d05428d8d22d4cc8d243c82cecfada4811 +:00e9e08103b0d669b502f3525155f567d4aad5 +:00e9f0b258088c861ac03d0612a5616c5ae5fc +:00ea00284e3eb1fe60bed17fb06d723b66763b +:00ea1035e3171ff3a4cf5155bd5a8bd36eaa66 +:00ea20b7c37d1b80307a097b16d49c2e67e78d +:00ea30ab8f173d1595132da6f8125be72a9098 +:00ea409a1080d1fae9bbc3dde9c14f7a90658e +:00ea505fe763321c65f5a4d059cd59acf9dfac +:00ea605d246cc1048f9e5ebaed76e97495ce0f +:00ea70c86e3e031ad788e2a13e1c05000da77b +:00ea802ff4691f2c69511a55a92a0e709774a5 +:00ea902c379397c679c0064e3995a90156ec00 +:00eaa00634fd706e325e586412c16633516801 +:00eab0f55f225dd1d3d16e87db1cc39b351e2f +:00eac005fef2dade6881fae8123670b3c456d7 +:00ead0fe76d2ed90c0678895c4952639046ecb +:00eae08adca8a18d0268762e8416a47e2ea73a +:00eaf031f0a25a03d496538f7912f920b7110f +:00eb00726a13fd92cd7cf9600b0c5dcf111613 +:00eb10a38e58856a3f0172629f128fa0ce5f5e +:00eb20066ea23d8d3e9efa7d8a5eb875df10fe +:00eb302cfddb3c1835a2bbcdfe5796b165654e +:00eb4035008404a26d08ca95d9157f1c97228b +:00eb50bd16da191cc5403bb7c62cc400b4f362 +:00eb60d1a53fe5481c3f6001e5700996db90ce +:00eb709ff0a7549ec7f6277ec5c94ac7a2acb4 +:00eb80944e5339c1a76f7c44541131ce72fbb5 +:00eb90eb71a658955fbbb1f59036632992aa35 +:00eba07aff221ae254e0b0b5a2f157f0ce8415 +:00ebb05828e5acd1150aa6deeed9a6678fed9f +:00ebc0a9736efc0324b7920d1fdd3c8164fd9a +:00ebd05a2c4e1532a1448824c40a8a5d19c2ac +:00ebe00bd1990b4177cfa11f69116ebad4d87e +:00ebf050e6b71905b019f07d144d2fed55be5a +:00ec0028282a64d8725ea1b0a5e8fe984481d2 +:00ec1056c0b83d21a3221a27479d15e00d74f4 +:00ec204d0cc607413de90f92a3b6ee92afe443 +:00ec30f00fe08bce8e2c395a7d709609838681 +:00ec4026c2ff9cd5ddf332b538b7f6037c74cf +:00ec50c8a90a8512be741633c66502d70a9448 +:00ec60e42ce8f00381beb864624bd4e75c311f +:00ec70e5cc8b72ac7bf5273e8696f5789d4320 +:00ec804d971c0c0b180236eb640dbac013e493 +:00ec9089b07f8cdc53a091f00f64e4fa5f2491 +:00eca070d27b1db722f2995f010d21d736b223 +:00ecb0a5e0c76775dfc03fd880cc70679af864 +:00ecc0cb27bac99d95606e64cfe19fe3976bf3 +:00ecd05e27d78d26a1f299dca99b6f6c45ef9b +:00ece0fdc42555ffdd1f5d37290c85d5a749f6 +:00ecf0ea967ed37583a9d8193402dcd7a6ca7a +:00ed004a239bc5348328215c781fd830ae26cd +:00ed10e16d02ee7833f6ab8a372fb0d6b40ff8 +:00ed2098c72d69fbb2f1ca0506d50ab6357e64 +:00ed301c1729f454775c239b09fbea73afe4b7 +:00ed40ab20159e0a01eb3570a9a02d9d460a8b +:00ed50be63d2d0257199193704a7af6d68631f +:00ed605d383fce50b77f20f2a63c5f90435735 +:00ed70b2a8fb003b61118a278f4e1bdd3c08b3 +:00ed80adca251406542d0bb47a064a6a160bec +:00ed903354943221fc7c50bf6603850e89db4d +:00eda0f17ba81f6139e2b1b29c46a24e2ef906 +:00edb0de415938fac4aa9e79c34af5d7fcf08b +:00edc00d7de63be3356df032c40348d42792cf +:00edd0dd28a5d74e4474c880667dbd95be9412 +:00ede06fb036a13c30dbc0ae52aba06c7aaf84 +:00edf04be5fcae1cb5547c4c1c1ce02584a84a +:00ee007f6f1b9a754c9c89ef68669b7c415cc3 +:00ee10791307541dec8aaa5be9a0f232478030 +:00ee209fe6627697dff50f1e7687e9a82ea8ca +:00ee3051c351ed8740a8ab1721c31b019279f2 +:00ee40cd283d4376727a3153eb89969a2f1540 +:00ee507e35812a8e3b5f0e36a17b8d2ea03de1 +:00ee60c2a45841744ee0177297d2ca5878be78 +:00ee70a7261ed33ee71c36d6b6cee5b409129b +:00ee8065b40161a028e8d665dd88f918088e19 +:00ee90d0815dd5619b8edfdde21331d5b24287 +:00eea023976800e9b49774833335b975b907d2 +:00eeb084be3fc262f404c66fd32486b52884c0 +:00eec0da8be31957feada6b57afaca46195a01 +:00eed028e81f40d5bbb6510d44f94c1c96cfc2 +:00eee02620849eb90cbbd3f213d740a413e126 +:00eef0b72e17013e09b694270a6745ca74ffd4 +:00ef00db9677f53e4fb140862950fe25f973f0 +:00ef1041773a6f1949230a8f6b573a5b150bc8 +:00ef20043ee9f4be55ce808bafcc101652c850 +:00ef30a913f0513a0e08c2e1c0cc7bb4f208c4 +:00ef40e70d405195ca24f5f0b2b352499a7920 +:00ef50998b01153f9253eaded3cf2047f10832 +:00ef60a78f7f4b70e30d2cd95be65b65ffc703 +:00ef70c70a7d84d3250eefe03344a488e8e0b1 +:00ef801eb57a08a9010710d7f3c36f1e375b67 +:00ef90096fcc4c67031a40aaaf0dea09b3df96 +:00efa0bed3d9b64ffac304eb4bedaf0e51727d +:00efb0cdb8889fb674f42a72d282f852e16eb7 +:00efc0ca3fa8c945bc20ad821dc0db9ca71743 +:00efd0d8e0760aa7ef5033954f98f162044482 +:00efe0b7575f61ba9572b46912ea0feb6aa157 +:00eff059f7b8483d8b6fea8edaf9d0dbe9d904 +:00f0003361645687d5c93e1abf626c05c90604 +:00f01035b8113287edbb8b399ecb8a3db01739 +:00f020edf637430b321783c0b8b05e7a981dea +:00f0306a50064c9a36a4b6373423f6393dc2e2 +:00f040bec1a35e19e1815a8857800c68b98e07 +:00f05011b4e0cd08b1b5657b712a38e7297613 +:00f060855d26b66d4ea3ae17dd6988d6edca00 +:00f070b9ea641cd0bf8d055f4bd1f7987f8e66 +:00f080621ae9ede4f4ff05181e92075340e491 +:00f090a848149f34083c10f2675ab55b9abe65 +:00f0a0402e8112077230a5d720cc18a28b0b45 +:00f0b02c407f3904edfd9d4a9aa12cc6e9496c +:00f0c0a416734b96998391d3e2e59142a869a5 +:00f0d0fe05360fa68f92a22d012d68db4e18db +:00f0e056d8df88a0e83724b5e51f94046cc652 +:00f0f0ce28942e42066db7ddd500a0db727d35 +:00f10022356b924be6bc0e22a339da99bc5794 +:00f1108aab0c0bbb85da8fc2f560dff37dc25d +:00f120ef3c581361209e26e5921d7fdf659263 +:00f130f7ae30b3e845b539f3e48be1d2e86511 +:00f1402b3641641328e33dccc2b0bbf79c005d +:00f15094943b0d41bebe0b4e1d5c86e84fc966 +:00f160e9ba9318f43c192f8d5e3d6fa828bfeb +:00f17057ff260ef5d065a36326c7b82d77d1a8 +:00f1804aeea614e9c3b6e325a37b194b898c7f +:00f1901109b3e5d000b5441bc41aaeb29e813d +:00f1a0971ae932393c54cbe6ecd09e0d5f8c30 +:00f1b0b4a38d030356b2f6a61469998e5f8a74 +:00f1c005129cb0b5a340d5b0a9e36189c30fa7 +:00f1d05f66eaca3ca2805f7c31e23fe0e2f8c7 +:00f1e0223c4f39f5786a369ee1153cd8cd143d +:00f1f0184e622307458c6700723865b8b402d6 +:00f2006a1228a0cc1d0c2d661d535c913c5f05 +:00f210098f539d07afd5253bee73ecf16da56b +:00f22085b74bd190b84214c41e6d6c6d9a771e +:00f230d1204b93c46e6d994bf76934c68882d9 +:00f240660c2168425820c36883ff1993f69b4e +:00f2500801e5eb9f76113b5b24f3dee602e4f0 +:00f260f00478626a527c26764b2d25bff5de53 +:00f2704f81ce4d2fa6296ba28a855319356c71 +:00f280c4f25abd55d5785a6d81e0e64e309a25 +:00f29049adb190336e621c8fd5a319d6319661 +:00f2a015206b3c3b4527e789819b8ca1098656 +:00f2b0f898098e46822e040a3506ff96559889 +:00f2c04a1de18620117bf8005624e7a936d1bf +:00f2d0bfc594324102e00db4b136e2a9f21961 +:00f2e016df498295ca849eb661a3200aab1225 +:00f2f0f8276aec90978a27b6b34cda039ce10b +:00f300fe0f473ca19e4e989c9bfa438f06dde2 +:00f310b4a36fc4df40618cbd54ca4370fc1ec7 +:00f320fbd9f2880f39e6724ef71c47e9439f14 +:00f3305c9c3eb53d7d0c77024f79e69d6f5f5d +:00f3404964805372885279da7c4c8db3cb27e4 +:00f350fa2ecd2f870918ea210b9ab949695ccf +:00f360090ed2faac35e22a5ad21feae7a44a60 +:00f370c7da273205095d3c274e5235e872ffd3 +:00f380ec521c8c1c8e0fb98f949c81c087b459 +:00f390351f61df8830775e793f52a7dd8b486f +:00f3a0bdcf6a2dc046bebca17b7f65edc88a78 +:00f3b06ae896d1e5ace87980e05fdae324d708 +:00f3c05b054b3c64b272963ac676260d813570 +:00f3d075e50e4b7bf23154b735d3db536a91d5 +:00f3e0085994f47afc83879ea64102aad9ce1c +:00f3f00017d5d309db5e743f32a6eff8e62065 +:00f40013fb4b799cf1af826777f906b242848c +:00f410b1f88f40bd5ec855ead1f154973316a3 +:00f4209044104df152fc704e9b57b2d28aa356 +:00f430c93c0083f1acd1a7027744d236d87b37 +:00f440a6962fdcf94d2d789e2b1fd5df3bc6e5 +:00f450afef5b0c54b90f545c35aa3bf481d64b +:00f46041e38a235e017263561a29bc320fd37a +:00f4709b0395fa93b6c2620c97a14654429064 +:00f480ab7b35776a798b7d5b48ecd91d1dea0a +:00f490da4e19c7fa1901130c4e5b57a84390de +:00f4a074ed32155f8c73a4284aaea6ab0e468b +:00f4b0a74601c293d95abd066e47c1fee1a27f +:00f4c0ab499feef2247eda1e8bb697e423cd19 +:00f4d056a0e1e4fa97dbe7d6e58e55b832f870 +:00f4e0ed74969c027e6a0d7a1748987fb0e94e +:00f4f09d7da3b9116bd1e7dabd9e29551da908 +:00f500a61114ce7d419effaa472476fee71d3e +:00f5105cedd38ddb9022fbb00eba6cd2349a18 +:00f5205a2ac6aff7777fde7ff38812d063f7e1 +:00f530f8b089b1a5dd0292f61fc3dc191625d0 +:00f540e338c58d2c5e43c02a47d41c740a504b +:00f55068661c0c8c0a9cbae52bf6679484b5ca +:00f560fabb633dc33d36299dda9259e273ff91 +:00f570b7bb039d0f5dd37a88d0dd41750bc23b +:00f58067ac672997f34ecc120c3d2ca2417046 +:00f59085e173225c7e4619b00f5976bc33be79 +:00f5a019491afacf99ee4d2ef3f3d844064838 +:00f5b04b2b19370072cc6d39421f864a119ca7 +:00f5c0ea229728cd4526f9f87c31fb4ceae832 +:00f5d0e750d919de813979bec736e485c8b59c +:00f5e07ee4fcb67ba781297a94ea30b014cbff +:00f5f0d90d4a69e678a6a3dc076d7b8118cf0e +:00f600f69de8c30d08f62702b997ebfde7ba8e +:00f6108ce623ec248497732b1ccb6b4ac5727e +:00f6208b35d6b5962de9eaac5bc8b4fcc39f93 +:00f630ee5a619b0c24f3cb06259a9a35052f80 +:00f640b4f873dc8f261d17403bca83b9f3753c +:00f650ada637fc96a3fc1530a416b584e811db +:00f66001b00299f9b9e32c187d707a1bc430ad +:00f670c37d7f8d82e42d9415cf5afa976f7e4b +:00f6800c43b46ed6e4c62439b7c0998d0d20c3 +:00f690fbbf01b8e40693b1aaa471686080fc8d +:00f6a0b53c1c8f8044beba7b9ece4a1d8ea99b +:00f6b08b186413be016c3c6cb9de5d8ba0872d +:00f6c0c3ce09e00b58ad8744cc3a37f200d3b6 +:00f6d0815e55c26da4c8419cd376391a5f580d +:00f6e0ef2f83e68509cc657460a86f032b8592 +:00f6f065c79f622d8c215ed566d7960e5d85ea +:00f700ed8906249b17119ec843342181bf4abf +:00f7101f4183dd82dcbce0dbbe45d1c2f0ec60 +:00f72036374a1bd5e73a3e9e1eccdf8a21cdbd +:00f730198db82a691f89b24c795f21d2c474df +:00f74045f6f8e0b25810c9f2d9dec86c04013b +:00f750662174648c95375dfa4a2b18d7711aeb +:00f7604046be3e38d0952bf55ee33f66635e68 +:00f7700ac8987bf9050b302f66d60fae0fbcab +:00f7806a748b65f6b5913e8d4249f06db55d62 +:00f79003786005517796f721dd7967c76f027c +:00f7a071ca06bde4ef63eb05b9efc1cc0838a6 +:00f7b00e52d98771382f34c1146334c770c73c +:00f7c02cb45bfdf7acf0d79ca7bf4be1706d02 +:00f7d0c4dd5b966d6aaf4bbd5a6fcc7851dd3b +:00f7e0559871e95f3b9b86c9f31b8c4f15e9cb +:00f7f065c4815cd2aa3128c0901573d6dfe3ba +:00f80018fddccf7e4308c40452e201d26fd20d +:00f8102562a5ef963f0b76977f7941c983ff4e +:00f820a54af04c2b40597ae916b55f2f73f7cb +:00f830fde5ee54296a6d9085fe7738a0c7a7d6 +:00f840e6a997d9550d42e47f0675cf27e3fd90 +:00f8500020010aec1f69e8a818114f5ba0df6d +:00f860592504fa8fdf79878464d3d77a660dfd +:00f870906b3c7924393dad0be5623d1cce628f +:00f88095c01a15091825df9edb5f69d9da2141 +:00f89002e0cdca814a04f83bfd68f5e0369886 +:00f8a0584520b5d7993238c5381e6ec959a927 +:00f8b0db02e7e67ff01493785b88e7389af173 +:00f8c0a08e0c859ec615cc64bc33fec3c1a23c +:00f8d0e8262247015155e589a70cde8a68c924 +:00f8e0d96c7b2e8a9836b3f64027bd096b6e0f +:00f8f01b6b9ede9bad7d559605ead2a03f52e2 +:00f900ee20ed46b463772270c54eb2722df29c +:00f910fa0e4b08752bf10b7e6ce2eb1574430c +:00f9203412ef8dac101cce4df320b8ea67eec3 +:00f930cafb1e5da43a926883b4ccdde2b80d0d +:00f9401ec94aa2ddbc58690f3ffff28b4e5ab2 +:00f9502fa2c529eb2383fdf8cc8946d4610183 +:00f960625f45c17909dfef576621ccc062acbd +:00f9706e16ce30f41083d9ef9d94e7e6d5437f +:00f980de9416993967e31d9957651370b83776 +:00f9907373e7606fa02a75c6f7e9782a1d6033 +:00f9a08c86659573e3f54e055b179a34fc1664 +:00f9b0f538170ad33700298935ba453a2afc13 +:00f9c078906efba85a923aa8aab14b9b84582b +:00f9d05a8624b3e30d6726c6c52efa9b80e119 +:00f9e03e3c486507cdc2b2825d311c9ffc0b7c +:00f9f087bff6384abff17296f57a1fc9385f4c +:00fa00cc60927d072ea14d397196cc459f8df5 +:00fa105b7836d4a74e09b8874e1136a3e2c3f4 +:00fa207839d321ae3c8e529d61ef0435b2994a +:00fa3064cee306a227a43e44ae2fe508f2cd6d +:00fa406fd3fd993f25c8cdad9d1965ddd19487 +:00fa507d01d05445e06b3b3f5a5bfabfe8ec47 +:00fa608b4aa047c5f99618ada0f3f8fc3c0db5 +:00fa70512657f01abf4f084f3d08d4037dbc1f +:00fa802b5efd665d7d45072b50390ce326ff8b +:00fa902e7611330714e1e10f4e09074e1ce3fc +:00faa05009a192ac7cd498748161ad20efc02a +:00fab0406173e1ac4b715a7377b6904b60bfc5 +:00fac0f3f4ffcd335f5b200a55b09698deb9fe +:00fad092b89a4698ed516f2b7fc3ecacd92860 +:00fae0818cc0e1a4c98a8523eab27d2fb80b8c +:00faf0c867342e64fe158810e321dc54a12720 +:00fb00cd428556033d8738de48535e12d4450e +:00fb10606100e549088af47a33116f98da4845 +:00fb2008b7329e56a2a5ae539f3122b6848f1d +:00fb30b9624fe3f0e52191c1541c0da87a015c +:00fb4088fe3ac1e8f8d0751fa8ee4841eebc0a +:00fb50fe2bf23ff81630a6878d0006d1ec0b84 +:00fb6020789038637956cf79f85376efdef384 +:00fb70371749d3c84adad187daec92900f1fd4 +:00fb80735452ec05702c9f876c65cc84b7112e +:00fb90bb355d3c6138f6f00258e878bfe2fc6e +:00fba0b921f15e342ba246a7119cb4a271b062 +:00fbb0d546f4c07927fc3c3098034e0ebf90c7 +:00fbc0c81f5c9cbca26b5125ab20ce4bfd01b5 +:00fbd0d0ef89db0c87826c91fad257997bf380 +:00fbe0f987a9796024dc095cc3757bdbed8f4e +:00fbf0f9dbf8b94d70eaf98eae09a293273d49 +:00fc00211a00f250f2c4d434c3d229943124b5 +:00fc107f301079b00c76a2642a413ca785c86a +:00fc200d525c6a6bf5f2a031b43f3226d1e3da +:00fc300c109cc0386e35ac5682b39ce3e13ec9 +:00fc407129cd9fc988aee44e892345d48d2d95 +:00fc507d3bedc7e71df55731500124403e71a4 +:00fc60a0ed37b31e387ec7059869c2602cd8c2 +:00fc7063cb16e891d3b4241473f8ea604286e9 +:00fc8072a3c4711f0e342225c10e6cd970d720 +:00fc9089b204f6143ac5a1888d08c0645d2dbe +:00fca0bf3d16534ef9214b4427803b4fa15f9d +:00fcb081c889bcc46481171a25c39c971dde51 +:00fcc0134f9dc6e5d54fbd67f5ff5e40ba216f +:00fcd0de7ca3a9c0423ed1b18e517e0c60eeef +:00fce07a65af7e43cae5ebe825762961f5a504 +:00fcf0e841b6b1b7fcd177b12c3960668c59c2 +:00fd00346c1d49143e794adcc59adb32b5527c +:00fd107de0d71a63f0430b973c5575daa36e6d +:00fd20ec8143210c4b470696cf0019992612b4 +:00fd308d4853328dd226092396fb7b2d6b3ce3 +:00fd40a4ba66170ea385193449070e1e1ba44f +:00fd5055b115de31c95b2561cba3512ee5d02b +:00fd60377ba54db17176d63d2c6f96d94167a0 +:00fd702412dc018d3266c1868e3635af927f6c +:00fd80e6dfb6f496e17d61ed2def1dd7598e8d +:00fd902678f2eab4daad010a879e49f52dee8b +:00fda0195e93ceff11fc108cc782a837eb6591 +:00fdb05c3f44cc3a43707357b5f17617a085b4 +:00fdc000b7b5cde0cdb727bb000f9398e7b975 +:00fdd04a1f3fc36cc253e8700fb8c72c7a1c43 +:00fde0f7f756442cf3f3a001ad2fac4dfa54aa +:00fdf02828989be89d933fc1cfb440e409d0e9 +:00fe00249aede7366f358a90cf0269341d1822 +:00fe1043de1c8ab5d14a0d581006d9bfd52114 +:00fe20a9bb05894eeb6b331ed0c62436f22a4b +:00fe30ce904b2fc98186f165b1734a042b1281 +:00fe40edef8b9f328fafaa2cae4a7872ae3cd4 +:00fe50ad470a1c99d5e68ee2f5936d3d6a2a4a +:00fe6048be9b4ea53f44063c18020a107c8126 +:00fe70d3d166bc96ae517dd01ea75b1c5670fe +:00fe80ecc7556af6a87c51ad3994885021b9cd +:00fe9071ba2cc7b5c286de2c36e20205605ac4 +:00fea006395019b1552c2b11589db26b5f0dee +:00feb08f9deea82f2de9cdfad06e1e8d164ef6 +:00fec036631e626e2d63cc88f42eb66e14e3af +:00fed0d34ba1ddd4c9b764066c7ba52b3721f2 +:00fee007e1f1780a23eb058a5029036e99d33d +:00fef0f683724c51adb20251156f2ae7c7567d +:00ff0048dd751e1646075690371cb920d1bdea +:00ff10a88b6830fbff3eeff082a608cf1ae7bf +:00ff20e63af429d9b0cefd9faf41dbb2c1904f +:00ff30295b1cf6ae63a59b83cca30ff986ad38 +:00ff408e0e10386a4de6625f7adef271bc3ca0 +:00ff50be5cd6ab2aee451d75bf1ce0632fc12e +:00ff60a129d9a09dc72dc7556bd882bfee9855 +:00ff70852dc0afd3e5a5f67285efd8e12664ea +:00ff8012675e1c1d7e7c2a54f5f49fc88a5ae4 +:00ff90c7db9af92077fe2d94ce07e58c0cb92a +:00ffa0487c0ed2cf7b31d3c658c5bd1741d1d2 +:00ffb0fc31387804010fa9a481af1005552814 +:00ffc0bbc71701de7d58d7a37907daf6bf9393 +:00ffd01f5e274e5b6fd6b264ed804f211d2e6b +:00ffe0e1e83a979308d789c8033d81777f5909 +:00fff05737d2edc5d3e7326d58f874a484cd67 +:010000f1be19bd0483d83463e1b4a4bd4ea887 +:0100106cfff3e603b89cb5c642499ab2fea46b +:010020488546708d4f0ddd2069d69bd7db41dc +:0100301d67614ca27ca5ea596dac1ee50e6dfd +:01004003659a881b87ca509c81e7b2f42f3cd4 +:010050c7187ea48b5f437935d2db0bc755584b +:010060aefa80cee6b777c97150c48229cdce21 +:01007045715c5daebf1f71ce6a86cef3c10c45 +:010080326911c6541a620d9b550ca69f068053 +:010090811c195fcdd2e747c5af5826f90429e1 +:0100a02a01c263208184d8498c938d11c5bfce +:0100b0dc31a4c48cb641d667e8844713a7e67d +:0100c0cd9c3d57fd04c8e9b097437c6996b5f3 +:0100d051d22a16f3c02c064e50af0bd9092519 +:0100e09f8a18cfa42a79703deb3a816fbf09c6 +:0100f0e969dc6d0f3a0208b6c510f74381275c +:010100309fdd43874d411599289f9194f3d5df +:010110f8cd70d645404b3882f3935a59b870da +:01012069e4fb211cd6282c2fc5756d7019ddbd +:01013061f8665f505200a69d9ee3c9a598a5be +:010140b8321bc14204d9c7acec4dabd48f5ff0 +:01015010910dcc208f3023032909068ed05021 +:010160448764f9bc56b7535c7eac053700b481 +:010170428c50d108de6197fdc60bd41588964d +:010180ea3bdef8598e195c8c11bfa90466ea1d +:01019033686b5f37ecd10108eb66cfd6807fdc +:0101a04fea9a0230bc243c1c036c46238f841e +:0101b00ded71069960e9b3ea0da22e8f10c343 +:0101c08733efb8e989a83690af28fc49b18516 +:0101d02dc8249693b5e83b07a2fba8e8accac5 +:0101e0313a1d09b73393629ed4815140feb153 +:0101f063e0f6699e84c7bfab71096689fec09f +:010200e9c3f55ea76c1b0d59f678ee6b62979d +:010210bacf18b3c6d471e9e3eb30655cbd45fc +:010220723b2e6ae9e13cf7283d0eaf84bb0d46 +:01023006282817070cc546d17a0c5450b5cce9 +:010240808c477f9545ccf35f8b7fbf8b0143fb +:010250a4154085c839375ce115394606431d35 +:010260c6da52512603509750a0bd91cb841ca7 +:010270bc658643a223dae7c0f7cf3136a0736e +:0102805e70781d4b1ac217349aec98021bed48 +:01029013d9c7a8619ea46637906b3080f67d0c +:0102a0e0c0ed864b3a30d954a439b9212b9797 +:0102b0b9e5e529bc5ce219c5252eec3d68a0e4 +:0102c0cc880e5559bd22f950b5d516baa26111 +:0102d0a05122ec9943f49ce336e47c04a73f77 +:0102e0fcaeaa78f39b05292c0589940ad954f6 +:0102f0fc0ac7e5d8c65a28ef85f9e32558e2ff +:01030071da6218f8ec9bf92694d24ce214f5db +:010310357f96921b16fddc086d2013c6e351c1 +:010320b6bb98352aa74fb00635b76d230e6a47 +:010330879685533742bfe89928ca6d9ff53d05 +:0103409b8664fcdb57a8cb10eb246a24e49f8f +:010350a1fb4bc157661784191d56d9c2afe2fc +:010360ab21cb494d0c2284efc0db276fc88c13 +:010370a2c22e683806e8d3de46075eaf83a452 +:01038028b23e72dbb05d059aa7cbb0feb40e03 +:010390e54eb6f119b944f890c6a262183c83cb +:0103a040a8b624087a4280cfb75554477bf87a +:0103b099dbfc53d783382530ae3a0fa3e91b00 +:0103c04468ea91e88c0efb6a4a1ffd2a910aaa +:0103d04c0a97bd2079d8da416adf07650cd178 +:0103e0e6913f6113e2ae9b151d91d67ae56a76 +:0103f00d6ec30911487c3729a590ab0c5ef223 +:010400c880ee034536ed64734d7ac30037de84 +:0104101009103089a9fe81661c186ba7b25aca +:010420474904c6d49c6bef9477553f90a5d5f5 +:0104304276709016d6bda9db48d632b5a86582 +:01044097d30c33bf2ee01c698af1c655fb430d +:010450cb1b2f51f6c78154130151bce4e08213 +:010460c248b049d22816d32160b1657ceb3f45 +:01047066e44ec3ab98c97358086ad3fd4b76bc +:0104807533b24cdee60dfbf8650d99bb52e5a1 +:0104904248230c3b883a0afc3490b0922db532 +:0104a07bf6743adb2e06dbe2c2c5c5263973d6 +:0104b01eb4a441e4120701335a7d669dc30f11 +:0104c083bcdc8e12bfb25025cb9424accd5e97 +:0104d0c065abb6d5e7c4d9d94d025cb0e7915e +:0104e0ec4b2ce75c7817e076cd1e0455ddd9b3 +:0104f098883b6c513daee812a5806d757a0547 +:01050004827277681a23596e7029211c690003 +:010510f8a8c1ab939ed9b0aa3ce271a7354578 +:0105200b6158abb5ddf607734051d40d5b2e4a +:0105301eac677376d96dd6020e7bb9b669200a +:010540559b43b2b74dd61cf0f813c28be6a341 +:0105507158a367ba2b5351563801945f06a9bd +:010560c8c7ff2774b658f44ef1b06e0e808bbc +:01057022db03b453f8b4d9a3cea10b10e17334 +:0105807988790c79312799d00484574b6ce760 +:010590a9eb30808f728500afd4687709eb0bef +:0105a0ae9f137b21e992cb766b86453afddb4b +:0105b0474237835764f7423f6050d087170119 +:0105c0d0db1a2484317d073657c0433b1692ad +:0105d042ada8cad9eed905957b6340dad96efa +:0105e0ea701f8b36cbd1b263b9b19b521f0664 +:0105f08728f506453e1e7d5bea1a2c773b24f8 +:0106000ada2aad8375b4a5107f5eef9db4ab48 +:0106102020cc461f443afe6795631e4e31c7a0 +:0106200772e6cec6e9caee5f97d16229f73681 +:010630042b5bd22d2eb13e70f4f379e224f269 +:01064026954f897f10b2e5d8aad39c0408f2bb +:010650668609cc094deb5a4c58a7d045563826 +:010660d6757df17b8f6cadd3d1ff7899a16292 +:01067034e092588c175c9a91cf5a8133e563ef +:010680c5e543f4394b21baeb66133d9483939f +:010690f6313c1dc0dc4804c2fafa5230360389 +:0106a00fef37c2da5e688a4bea71a32f88e3cc +:0106b0c80202c73cecf62482b6ed2f54740ef2 +:0106c07de3788a950d55f407b851ed73a9fa40 +:0106d079da547386c2abec3b4ff73ff247d3d5 +:0106e06d685bebb3e9f8c74b4ecc3cc6f20b96 +:0106f00832d1201abbe4833db7c0e0f6a69e25 +:0107006b455982be18e2942ac8ef254dda6257 +:0107104e215df7b0bb83900849c28db78b1c4b +:0107204af7834ae61c9a4fa20d481d2d187d88 +:010730dce349edf89d4b1b5b370492083b49ce +:010740e6486a8ba64b7733352d546f83c56d4f +:0107503c6e0484b5c32143532f8a27ebe81c88 +:010760ac4e2a2c72edc538b5413b72cae7a163 +:010770e1b552dfee1e3e48376deee659a88651 +:010780260156278a38ac192d356b022cd44630 +:010790490f764fb7fa79685af565d01797efe5 +:0107a0de990ea6f7dea20ec80c1429256e8df9 +:0107b04389d1ad45cbf5eca694b27e6418baae +:0107c0597db44599c01d95ca10cfd4ff059079 +:0107d0961aa6884c89e66ccbf6bfe8880457a4 +:0107e0335f8a7248ac8040b6e30d7f8cc7ba0e +:0107f028f8b9118834effc2c3414676c4b296e +:010800b3c4b5a8edd867fb5d03bbddb7fdff39 +:01081062446c5b36d697735455e02ac9aeb995 +:010820524a3da2130223084368ed3a27a8a402 +:01083083aef419b0d411b1406ed7111b5e2f0c +:010840129879cea611e608d59f3a0f85cd30f5 +:0108502d636238620c0541fe7aa4fd79182a00 +:01086078f30ecc63edf3d6440fc27f0f74fa52 +:010870bfc4963a69b2bacc3e5bd6800c7d8650 +:0108803ef2fa5a21f2c51ec28a4ca4a3f25466 +:010890e6e4b46081b225916c6ce98c71186b15 +:0108a051e4b94be5c31ce220b0af17151d0e7f +:0108b06b9204026df08f704965b0d54edf9069 +:0108c08acba8188fe267785eb100f0087d3d5c +:0108d007018b010b4054978366d9e55bf48cf4 +:0108e018d3cd5b7814f535c2afa3a0c8e54988 +:0108f02fb28d96ad72b5e211b5f2030b2fafc1 +:010900a41ad5baf2ad79f47b8919dc142165a7 +:010910627034dfafc0d187d11fd9a8caac8358 +:01092047840eab9f7cb8c4534b52ae72068774 +:010930474975aa54a1ad22e6e8472617a41835 +:010940d859f7f6d15bc83402f1590e2d4bc003 +:010950d64c57bbe6fb97845a811431f71dbd04 +:0109608e607e15f90f5c92be3210760bd03311 +:0109706e9897b315ab519e6d7d8f904c152865 +:010980d0254ddee12a4c6c8c16d4810d893d90 +:010990ceb5a405dc52b3277452962d39070d45 +:0109a0cd5d61b3fed85efb474856836472bed2 +:0109b04bfa0604e14ae54db53c40f879a66400 +:0109c0a2e2f856e660147f861fb320e74a23f8 +:0109d07b0f6fed1ca60d7a7732ca381c676215 +:0109e0b96d18ffd60f94302479a05b0bf2f330 +:0109f082995b3a1fcb0bf32288c9ca125a4910 +:010a000a0400d88e0b858d7d9ff51892ce56e5 +:010a10c44f3285a25db7931d1683201db3ac2b +:010a20700eb0cd824965a51a990180423752bd +:010a303bef19e436c80e482b15a7d4287fcd19 +:010a4070458ba5b9692b6743702ba56bde2d5a +:010a503d72aa19171e2e8c9e9771773a482f6e +:010a60460ecb00c40b366f83053d22722ecbc0 +:010a70ad4e59d58ba6ce602109e80482db571f +:010a804070c5f7a41775134740f2fc350dbe65 +:010a90330d41aa0d6cc5542839f76eb8001e74 +:010aa050f777a4cd1f3f4fa613f99465d5ae1d +:010ab09837cb59301c76c4842ab6b111f4f2e0 +:010ac04043a8ce83e6b86ecb2396326c7e36cb +:010ad013c78dc134a9a705a53a661eeb888d0f +:010ae0b5995c3b772a10a95ddabbc5964fce4a +:010af03cdb72bdb7f87e7342e069d9011b3f83 +:010b001183859f05ea2d5ed0a8f2b4cd0d13a5 +:010b104790aa7f0431d33405599f955350925f +:010b20ff1e29b928e791287e61bd2ee3f26505 +:010b300bb90c83f255972ceb9cfcb56c327f75 +:010b40b55eccd26ce80d69707bd249a3626fe9 +:010b505c4674bd6e8c97efb1b070b70cb5c8ce +:010b60c9e8858a6b7e7cb1d036f68e29f5ffb4 +:010b7047579be17ba2d4067d868d61220acc24 +:010b8085197042a2a6169f08904bd7e827ccd6 +:010b9097b1a940dd9950ac212bae8617390e78 +:010ba020b8bc870ea293018f602c8a853a1d00 +:010bb010d8a35839f6fb8e1177c5b66acb3f74 +:010bc00c8393ccc2a5bf4b154144e019de0482 +:010bd0e883a62ac54b5b7bdd8ed9b79a5bc151 +:010be03a049a67a851bc0a82d95603335d7339 +:010bf01e7cb94a17cd0d4768b6b8f35db709c8 +:010c0059196b218d76f847574b0dab13e44023 +:010c108be59ee0ecff9e3de913a6114b2606c2 +:010c205be91b17fcaa2b26fab18ffc02b75ed2 +:010c30d14d94d969c92f89b34ef356700e3d4c +:010c4068cd40f4ede76d8065a5f29d2896cf34 +:010c505a9936be40705fc786625888cd3e2e77 +:010c60b159833e3def8b228116b69f762fb690 +:010c702740767f6dc54df83620799746610a03 +:010c8056c35f0f803a9d6bb618fbf8dfbadbda +:010c9011b0979070390b91eed4d8dd916a3b2c +:010ca0a9ee7f5595922d8c9be468abd065a97b +:010cb0ce98099ce4f7c797c2755091479bc2e0 +:010cc0ad191a805b943f33eb29cccf69a6c670 +:010cd07b24a8d2f9d88366387cb6d7ca2f9139 +:010ce032a703137acd84919f5cc8b0cea641f6 +:010cf0e396c87e47fb9b480e90d6f64ea0415e +:010d001916ad7293c9c8445076831da1a4a595 +:010d109187606c1daa347d349dd60ba10dfa24 +:010d2035c3683cb1dd0825e356d617ad6f1eb8 +:010d30ba0b4fdeb638f9acad1fc78ee58630d9 +:010d405fb54f1b5e7e9962b42071cc7bc8b58c +:010d5022d9001683ba673309a9c1c2338644cd +:010d601dd64517d62fbe9a2dec6d14a0b73b90 +:010d70a5ea8e1dde5bae60c71fbe81f92c6485 +:010d8063ae89cea20ed94b4cd28cb2284720b2 +:010d908d501f626838f3d8b7aa2cf894bb149f +:010da0f5fc64e6bb5ae58e465ef0eb0787ff2b +:010db032afa3c22ce503838d22dfa81803bab5 +:010dc07272cb354db836767ce38f47d506b6ca +:010dd0c7395d23553872276fa81a7e2b10d012 +:010de0bfb9abcca46770806246c12245512d7f +:010df0b5cacc96ab6affab4b0c36ea3916c3ee +:010e009642d164dc84b2240cf326bcbef12186 +:010e103c9b53ddccf092bf08d6b91256001144 +:010e2019e84567b7c2e73369ee91e8bd3629d5 +:010e3019fb0d8a5f57ac6cfb2cc3aeb523b83a +:010e40729bdbb3ead96e543e5abfcc952a3ac9 +:010e508cabc38c944f55d1d89fb43f364cd462 +:010e606f8cd526033f56ce89508ce9889938b4 +:010e70319a3fa06ad70115df8e38e041a740c3 +:010e8056183eea88b92f7c4deb5253f0ef9cfd +:010e901776e085c09bfc6c8209dc1e0a26e902 +:010ea0d8f73a6d0f1a0dc9cd359ef1ebdb4e2a +:010eb08f77db2c4e13b06e0f9cc10465587f7c +:010ec046e8bb39f9ec6473cab3002d77dd3c33 +:010ed05ae45e6ca4cfcd68ab9f9c59217c3e13 +:010ee0d7cd61d13ad2cac4f7a8e4a25b703dc7 +:010ef08439956c4fe3be60a6fe878e86e6e27a +:010f004345ba65af9cdf9f9bd39d591ce9e5a5 +:010f10c7cc3c6c8aa64f5e5ea34cf2812b5422 +:010f20b403c2e3ea017dbf5705aa4b400a03fe +:010f3024d9d5bbc26bb5e59a0270b1360cf752 +:010f4063a9467e8ab7e8f0f9d6072924a05e81 +:010f50eb547422defb77855adc8fd12de040a7 +:010f600147235423893597700ce674c139480c +:010f707ef393ea7686a02f5b635d4fec9cb4de +:010f8097b65b6ae8f093ff9172a10470b2f2f5 +:010f90077858c5c8d7b80d947186213c05e817 +:010fa0cde7adb39032a55b12d0ec2d6942fe08 +:010fb0c3b70d957e5018cf0f7c4baf52a051c2 +:010fc06d39fdf9990454b79960e3a6460cba35 +:010fd0ba0e433e3512aa6083c03fa1e7e7b459 +:010fe092cea6e2add694da2cc2034d11031c94 +:010ff0063a41348366be5d028c34a52b397b27 +:01100000de41e7e93e5cdcacf1c1e4029cf61a +:01101079375533486bdab261626f973c9007d5 +:011020c43dfe2a825fac4dcede6f7a6094054a +:0110305dcf16ed30160f5442a866080bf7fc52 +:0110404842782f980de07a2c1c1fd1252a6092 +:0110503d73a8c94a48899361ae3c91abe1be18 +:011060bd5b47b4c8cd9502bf90ab91394e8372 +:0110705847073d78fb869cf284ee74c98548cc +:011080fdc165286ec4c6422035ea4d2afda990 +:0110908866819582f1e8e1335ceeca33fe41b8 +:0110a0e0719de86ded51424f478cd5cd7a9157 +:0110b0b61b7199144b35c2ae3daf6de970c3e7 +:0110c0ed7623b204c7249cabdb6a8a1dc81f26 +:0110d083d6369e16625dce94a61e1ef1873d36 +:0110e01aa0b7a8f74d0e7d4254955239e0290f +:0110f05d7dcfde42cdf1267afad19c96b54e83 +:0111007dc6dc3c067f90f8a87511f55093ac75 +:011110b34653af8cb02beb1a4c6ebf3178ae20 +:01112092ef54f3383ae1b397da4daa49c9374e +:011130249be7666690ba9edd005f079ce6a124 +:0111408bb62d2052535f40a9d1838a8fce72e2 +:0111508c57103666546f29ca59bf7dcca22f90 +:011160bf50172c063e293cd99bf6c688410f7a +:011170b2f523cec3580942fb2d573a37b1a759 +:0111801e0950bbd526ee68f284c64493ad14fa +:011190cffd29281f9732480e8b34c296c5113f +:0111a04c8609becd3b418467a71104e8229bf1 +:0111b0c89642c85703d5f6eb5f552511e8ef7a +:0111c03193e7156d00381cfac0273a7b9ac9cd +:0111d0395c19c12a05be29ffd4f7221f2891f5 +:0111e04ea93bfc662a69cb7f41b05b4bcdedb9 +:0111f06827f9cce98ba512d07ea7431b47cf8d +:011200cf426c6670371d7660c0abc517a67675 +:011210d78095fb2d74dfe10a74ae61dfe70a1b +:011220d653e6ca10fa83ddc9010465fc984508 +:01123076095c1e4cde063b2b4aa9e97ee5a853 +:0112406c2062a9956ef49789e95d3b99d0dc43 +:011250295f9c807a1d167a3c21790dec7698c1 +:011260a005fc3b77025a1ea0ffed5cd76c2038 +:0112701ca4144122a2024d40eab0ccd3ee8907 +:011280a6c40f105188370e2ed1d7157c7c305c +:011290492928e9aac0668ae993d90b870176e3 +:0112a0a85987777d00acd604a990f505c51122 +:0112b0c78a50137d19534b7260346d353aba43 +:0112c07247cc1a29643d9c9171592227eaafe1 +:0112d04993f101d1f83c0e21c871f24dbf013e +:0112e0ee85b2418700a6d100ab8a70b056aa60 +:0112f01fc9651916b4be6063b98831efa00b31 +:0113000dc8c750de9fe7607880d53c30802541 +:0113100e924715137c5a3ca86f7a076148413c +:0113206c9d079acd2580a9c216f5e5322f29f7 +:011330499853e75d90455e84a21f1e189bcafb +:01134076b9d0a5f6a3794a1cbb4a15c624cd17 +:0113504d80293083863e7840066138a66cca5c +:01136080ee5bf1add4fc38178a157de7658a73 +:0113700b93928e3a8f7f1d341365a213c387bd +:0113803ea5676d7b2a70a911083f11fa0faa80 +:011390419db888cd489686c843e5c344fb855f +:0113a0ed72d1207fd3c08f48b0e217b22df392 +:0113b0d916c55160cb30ba391118e8aea41153 +:0113c0ce8ab1c3dd3bc661fd08df07ccbdd3d6 +:0113d02d94a084a62b570cd4533eaec26905dc +:0113e02cb87d7ada09e47a24991a4a51821ddd +:0113f0ce923dd5c2c717c7bf5d5f678878bdad +:011400047f0e99641cc05d5ff67ceec1c1aa9a +:01141000dadc41d5ca1189bb5c91046780babd +:01142016dc8739bc7f9f1c9dbfe3bc44996670 +:011430bdf2f51b8b7f4c1408f4f1347c139b19 +:0114409b329c710fc748b9c64ac0bb551652a0 +:011450b4ffad87f97073a3830c5aec26430728 +:0114608adba6be6cbf6f5820c9be1dbc0d99c6 +:01147085b431dd325a944588d9996576d86824 +:011480cd8136e2d9c69136b89ae05d776ff198 +:011490fc2d61e3ba57862dfe36cd4a8282d0ea +:0114a04b286244eb737257233cc8b201382a60 +:0114b0d10a30aec5041d833737d4c499740777 +:0114c048637a4e2cea951e4b0d6f13f8247c90 +:0114d0a29a5dfcaefb898767070cc302e31771 +:0114e050cf28912427ee082747bfd29babc4d9 +:0114f09e8db3d96d7fe0dab68802f76a434b37 +:011500e8ae0daecdf2114433b418946538c656 +:011510e5db4dd98ff80a0f19befc5c240009a6 +:011520ba2c4f44d701b128ab59d17eb672183d +:011530da85a29e1ae53788b2b7cb618cb3d35b +:011540afa2d6ac49f6fdbcd0f974fcb54e3827 +:011550cf6efe8382fd82e9e973f22e6512769f +:011560422cfd9875f57b80ed5451274e8fdd7a +:011570c3e6f426d4d8bde31085bc3d3b599705 +:0115801e46221112dc0a307a587ed173583e54 +:0115903212c91f47d2e6c5a4076239fd7f3409 +:0115a0ab20277d495149e2be020cb34c900648 +:0115b0cff93b8391260c0c2713f2c44ea4d93b +:0115c0fcf173f9a5125e84d270c0b9ede0bb5f +:0115d0452174d1efae14c24e567843aab55e12 +:0115e0a997fb2b301cdf35cccdb9ea1d2990b1 +:0115f09ef691d6813810e05c916a7d9799412f +:011600aa14944402bce28d046bf17a7c9348b2 +:0116103ffdfae0add60d4f423a68f54a27e7c9 +:0116203ebec48683700dc2f3252f3f44a7c48c +:011630666e3e9948cc73ddd0d9b3b0c9965475 +:0116407bc3a470838404b44bd0e4a4b4592171 +:0116501857b61d8c0f3ce80b901daa615409ec +:011660ed8372bec325f98f6628b0d6ed08e76f +:0116706f2c2e5ef2b24127630b9fcae246cc0f +:0116801387d7936ca51f5e27e89b78138dab0a +:011690aff80d110e8b9c059871384c67f435e8 +:0116a01c3453490b3fd40f3b16d931b150dd04 +:0116b039cff5bc725bc7d87b96a79d0e7ed1f1 +:0116c0e99923826ffe5e3ebb068e90f79589f8 +:0116d06d13b8efee740c5ec15e5a1fdcffe4bd +:0116e038cc8b1b43a8e9ec1e56a68ce208eaff +:0116f070c0839df84f51d16c8c8de34a499a49 +:0117000072fa328fb736f02895db3e8e07d44e +:011710f7c1f9e8e6c1429a35d31722e8a847aa +:01172013a8afb78e46178a5111b7725936d0d2 +:011730648a792e1bec36dcdb75148432153b73 +:0117403db8a618b34de97782fc7c12c893be62 +:011750ea821a3a6558d36034098bbf8bff0297 +:0117608c3d3f51e2e40cd74bad4ed9cf2415b5 +:0117703dbd3218cf29e6a6dc96975f45e9f980 +:011780516694cdffd7da908bfc97227d198463 +:0117901b3887a6a9cd4d0196f9acfbac1ea210 +:0117a0a2842fc393e6306920820476ad8cfe4a +:0117b00f00e94e848493a0acb45c9a2bee54d6 +:0117c0db4be3d4091eda3baa88fc334e94428c +:0117d0847e79cebe5565d28eea6ee7c3b93ec0 +:0117e0718e852a8a4132afb83e7e1ae747116d +:0117f052c95c20cb79508abfbdfbb566908b56 +:01180037b1eb19569aedbd0116764b39963be4 +:011810a07aaaff3a3d736ea0ca631aac397b74 +:011820c3f87a34b2a70fe2785ce8e80b117e7f +:011830b254ce8fd6a0d04e08c4fdd6e972f6a0 +:0118407dc9fa48d44327959677cea02abcf4a6 +:0118500873ed9171343f6d1fcc3cc69dc2948c +:011860a0f8824ee9d32267dabdc7cf6438b665 +:0118705b3a591362b1de93f3eac8ac452776fc +:011880f39952a5f03dcdb4add98c823a9ef96b +:0118905681f7729db30049598d3915e6619995 +:0118a004d7a37f72863f11311bbd443ba0057f +:0118b08d613975ffac551673c775dabd272c27 +:0118c0b5c7466460f28682542ec7d0175e94c0 +:0118d05f9452304c0d57c8a9a53a2871d9f666 +:0118e08a467f10be33815b5e6526b9a9a66a97 +:0118f09b589debbe66e85b185c06f1555ab02e +:0119006f2c398f7febce6a1c3e617d7f771179 +:011910c88b4b736f598f9017246431b65b548a +:011920b2e42ac8016060d95d9c545ad455ec32 +:011930c12204300a2a9fe3efcdf134e1bc1486 +:011940e1818c3b2e9235644d7349b432d90116 +:011950ca66a3fa56cd4552acdd9345cff554e9 +:011960ad09dc797829cce7b0c75e1ad94112f1 +:0119703b02b982c225f6d775398cfde1355cbd +:0119805972e31b9dec1f23bfe80a956b29a96c +:0119909ed668f3b779ff328aca2212c9bc3d6d +:0119a06b2c8ea6d34e5bdb5fe3c0fc452f9953 +:0119b0df66e6d2f27842e942b653565bf88de2 +:0119c089ab29fa71d6b0a441dc448b54fccb38 +:0119d0d081c9aa45cbdd229dee05ff7a6430e7 +:0119e0b2e7123cfc1a75e652703db2bc8731b0 +:0119f00677305c012708ef286c1df5078bb6a5 +:011a00d79c4c8fa3769087816dfda3c311c650 +:011a108f5257feb98c8c33824697a7e3e41ed7 +:011a201710b142a82316df54ee0686b3fe0127 +:011a30fa68541c32d7c37455de5460a0585438 +:011a4042b7d9ea8d05ffe98422c37ef6a0e9fe +:011a5035c00c665b22519b53d4dbcf033b1e1a +:011a60e439eef9757e4639248fdb38eff29fe4 +:011a7053fddee8b81566e470049e5796ff8e3a +:011a80bc9ec840da56d887979a84c373f6aac8 +:011a90c352fc24f1054b53a4f07b9d6e5812b6 +:011aa04d0895c42e65a05771734a44a7c1f828 +:011ab0df9fb3435fee3d9c7a02e3fb7b179a92 +:011ac0933b37fd2d4f22f4c0393dd06206dfb5 +:011ad05b090c2f1352487d508a3d583059ef54 +:011ae05b9a1d4dcae9d824b6e0518e5f785c5f +:011af0aa7d1a9de02a5fc56652d9620b21f26c +:011b00fccacd056082f749d0c83dca535d130b +:011b10063763c2cb42baceb300c41f59f9599d +:011b209de3d8cda1d6b9a18d53e4791e406c99 +:011b30dfa4efe7a47ad790e4e383f160fd7d37 +:011b4022fa914cf68a463d629b77e7941f0e6f +:011b50124465a87163a6a29bf0f9c7fc8be122 +:011b601c598361bfcaad8e5ddbdfa7c4a0e703 +:011b70874c2ba26c31120b0db758ea9cacc945 +:011b800c1ee7922db7c4ebe64e337aae5ab718 +:011b903275dc9e3001dc8f7564942517310be7 +:011ba0c37dd1af5a283f0db0d2d277f1547d20 +:011bb01ce10e310982eb520718ef510bf45b9d +:011bc042cb9705717b39643992c642b532cea0 +:011bd0bf3cc1f3ee3e91a8a9303280822b21da +:011be0cc5becf57a306998ee05a953aa9fbf37 +:011bf029611ad839e9cccd5a860ecbb4eb6b32 +:011c00afb836c54d8e55255df31e310134ae4d +:011c101e3328871adfc0c30751abd9ce6355a2 +:011c20a9f1ce29ed7531330845f5f7cb700bad +:011c300e6f0169057b80d04fd4a572bfa1a4db +:011c409c7f22da036f43ab77befcf5a0e0e506 +:011c50a700a87c287934e2f8f772e49227484f +:011c6028600dc6ccb23957404368542ce36671 +:011c70c6106a3b52fb878c7c1428e930906b87 +:011c800f0e6ca2b58bb394c8f0ab2c3dad0953 +:011c90277f6d9a7c55da507c9374bcff317b4d +:011ca02858df9962f3435824bfe92d5f50f423 +:011cb0b516485afc855453fc8a2565ff267022 +:011cc0b3e2ec3ea98a53a83b7a2b8803d8c48b +:011cd0c33f89576a3a91c846349e7b5a9be635 +:011ce063d1d56799b7e58a653e3ac3a785eb02 +:011cf0c7c0f2a63d3b841478434508bd3cccd9 +:011d0061c1c7dd32a9b60d188ad527aeaffb5c +:011d10bf470c8365f420528ef427009d7a31e6 +:011d2025c32fa0ce7dcc048a774b729c0c91d2 +:011d307ca43122c77e3858e776dd93929548dc +:011d40f2c31846a98e7580e1bc0c78e3791e98 +:011d50615c3f79ffa816bf21516cd0f0230082 +:011d60f8ebd303e3a7b7719ab3c138b5e598ff +:011d70670f7ff9dfaba3b563a0120a0ba50b0f +:011d80ddc17bd97f68ed6a1ef7fa9833d65e14 +:011d900ab159ba715222bdbb68d8e16f4e9313 +:011da0f23f53835f2fdac351f4b35c9ab87d85 +:011db0e916e8c03157e6ccad781484e8e43bbc +:011dc0aa055cc1621cd5c2092160992de10ff0 +:011dd0a4d61ee17e6741eaf79b556d90ecb361 +:011de0ff01b79a1267836985f7c4cbb9619f59 +:011df024a252588422cd588965cc7df6cbff03 +:011e00ccbbe1c3f949ade7246dddfcfbea05bf +:011e10daea0e58838292e6ba02da4030b19fe4 +:011e206ff282a74a94b87b01e69929811575ad +:011e306d46d69038f54fc4cffe21df7bc3dbf1 +:011e403e973026cd99795be366e7bc159214e8 +:011e50075fa9e30255aaaa3c2170dec86566d9 +:011e601671a5143ed2df9b94961b8b73109856 +:011e7086c99477e789e222be86c213acbf0608 +:011e809d4625a98c52ea3b0d63ef1f0b19188a +:011e90912e530022f6f9bf090eca618e1038a0 +:011ea018bad99c7738c842685c80532a681be2 +:011eb0d619247f2f0cede7cceda77908a8ff58 +:011ec078fa76a4817e76afcf914e052f39b842 +:011ed0e6037deb3851b2fc4622b70184678402 +:011ee0dd87994f44986da160d0065224dd9371 +:011ef0b3a8c40447607f55dbd5a62e34fee587 +:011f00744bc8b26938e144bc40a53859c8a38e +:011f103e37649994d811d036959af88a970912 +:011f20a8f7d6348690e5cf8e7b37b5db967bd1 +:011f30b07c570ffef66851660112ea09ed4160 +:011f40f76025c0425d81d27c51f59f0e01f2cc +:011f5017b4211a8eb1b995bf5b1e9dcd8a2c7b +:011f60eaab0577d44ac0a02936d1a601b0d416 +:011f700b14f034ef55e8d8552a337359f153ea +:011f8008ca0e066ed998e958e4f97d58ccb8e4 +:011f904ff0a9ee0cb4a6745ba5f82b6b486059 +:011fa039c13396b210b53b383c45d9a286bd2e +:011fb018c57e43ccca2a4e1202f6755aa02b8e +:011fc0db56252054ecad3e7b4a3185888231c0 +:011fd041a4faf6257246f767be0674bdebec09 +:011fe03223341cf2cef9ef52335aa382cc2705 +:011ff021cbb6f3f4de918e58a54a59b2e59b0e +:01200066d173db04b2fb29bac4b304f1dcc943 +:012010ea02f265eecbe4f5e0b6aba12069043e +:0120204a9c24210e7011f5f1b433cd34e32d6d +:01203014575b3cdeebbe4ccbd71abbb60b1779 +:01204056e0af538e9f1bac53361702fce6ac4b +:0120508d5de6b584f9ec483ecd18715a5eb708 +:01206094ce6a17058077f9e225f338f3ad58b0 +:012070cda21c67a88ad8ccfabb58335275a733 +:012080b75040277f4cced0ecd3ebab7f08c7e7 +:01209037f07cde876f8f4506415cb87ff87e41 +:0120a0e22c205e5e8273df66774003c506b001 +:0120b0bedd8897d39566415f261884a5269fce +:0120c05761a98ff3b989495540ce4a60514bed +:0120d0fa97eea776181c77246afa39e2dd1343 +:0120e02c505f92e70fd90e28782d61bce17d54 +:0120f0196ebd24738aeca4e4ddf60000f0b268 +:012100a5f86ad54d6b39c301c555e30fe6509c +:012110e5e3477ed564690ab16bbaac7911603f +:01212024d4ebfea42955c784901121a5144a1f +:012130b2a42fabbcd4e7a6d4b0ad454c0c3f2a +:0121406e286eb668065edf2eecab11b40ae0e2 +:01215004ecbaf65700704c2f7b9c4dea5de712 +:01216055fbc05246ab7c9fc1812810d228591d +:012170b44ab9c2829fff85561e57e15454a7f0 +:0121800a06f128f16b6eec2ed066974adb1fd6 +:0121906671440e11b944e134fb76ffae40a7b4 +:0121a0ae0018d9fd9c88b119826f8c6405eeb7 +:0121b030b04f34ebc6cb1b83aabd1845778af2 +:0121c0aaad80e59d82427a10b2de4a54216742 +:0121d056c12d8f16b62f4603fb60d20ca0f0c3 +:0121e076dd3568cd0142280a2048169aae2bdc +:0121f028f368efdb08a76cea50df6753da4a3b +:0122003f16d55988c90ef65940df74fcc456a1 +:012210fce5f01bf73e09913c6b98e381cf4f1e +:01222069ca7abd5acc8f5c510edd3a08428a40 +:012230eb8210729afc9d058f10739645f9989b +:012240f746495fab9df2c3a2e37616440e68fc +:01225008000d0745a72a11e9495dfbc8e1c467 +:01226011f4be7168221ebd46b1aa49e632a303 +:0122703ac21572494d05ac99234d0205c09b2d +:01228066fe5a53b37c211caf7bc7337c8916d7 +:012290431e9af9319672b495c3e9d9bc130ceb +:0122a01ef71bb46579a5fd0055384608c26f15 +:0122b0b987dc9a5cf93446de8ca0a68a89acbd +:0122c036692ce6ba3f8ab79e4d53ec3eb8c622 +:0122d0e65671bcda430ebff4aeecddbedd09d5 +:0122e04ce280e26eb5cee7934918fdd942a064 +:0122f01a08f21ed87a1b1efa1f8ac733a60e12 +:01230083905fff508b8e85a4d67a1cc1b608b0 +:0123102a20e7d98385d5d86cdb083ab5adc75d +:01232089c9c982f17d3681e9d8171bddc18be8 +:012330ceaf3e24d6772571d27c7808f7b30676 +:012340621e51981ee353b7ee2ec3fea9d0b253 +:0123509b211bad51bb8d935ae7fee49979f494 +:012360acbbe5a691757e4d45e9b83d2d913132 +:01237060c44be68a139a0906be3870e256f33c +:012380ee1a07f32279280e58a02d703f7bd424 +:0123908f2ea8dbab4d708a47c471c7841b4422 +:0123a0bcf44e433ce584aae4a3940716e0cc4f +:0123b055dca9988a75e575c42067882495120f +:0123c058617a3d6aab4580ca6975b9f856cb7f +:0123d07ee820c625e9ceeca061661322ba0ead +:0123e0cf7d65fbbda538ecde6070362463a940 +:0123f0c6477273b8e722218f0eeaa1148d5360 +:012400ee18bca37b8441021b452c4d1dfda1ac +:012410ebfe7cea9db7a9a7e401ac3671ba51df +:012420b9afee5d8f0d39ff169f47f6028679a7 +:0124301bad01ed9f71ad6790e407aadbf51c6c +:012440ce768a32e507245952e0a0456f644d76 +:012450217bfc93babdf43977c4c044e9d82dfc +:01246074d04bf2b04e2bdc30d5f2cd560d671a +:0124701e570cf502acafbee1393fcfe9bedea1 +:012480078426995ca8088c678f61378b64a498 +:012490a7616d4589636f03f15470096863d91d +:0124a0e862f1cb1f0b07ca353b725c15c91dea +:0124b06273555dce4bd3fe6f1804c9a3fc5910 +:0124c0af946fefb0c164843783715994c41254 +:0124d0cbfb34a921f334be7aace08ea8151ac2 +:0124e01d3bebf6fe7eb0310793df1fbab166bf +:0124f0038db2d0380d354be8da0e631f891b64 +:0125000e0f39d282e704014d129b2d3de2fab7 +:012510eb079226159053c9cf7137e05f7ba418 +:0125200379b1118356626183920ca43043ed78 +:0125308a52ed556f9cb45147176a3ba22606b2 +:012540406bd39e09ee7aad551bd27da217763b +:012550b8ce73a69c38183935edf4be279b7642 +:01256082486852c86a9689cea155986144abe2 +:0125703d7ce2d7355e2cd28a3447b2198f4968 +:012580153f40892fee81f81e31c4ae2a9ef490 +:01259066832dca0327f88eeda977915e34cc1b +:0125a0a4a3190ab20589ca6413ca321def92ae +:0125b0a8e203b0d047b1cd23ddc3cdcd23aaa5 +:0125c06d2e003df4dccb89d0a7e96ea5ae1cc0 +:0125d0ad3772c84b4e79c68f0f32a79587ae2a +:0125e0c607e3bf68d3e14516eec3ec92d1614f +:0125f00111868d570a4497456079412ed67e1f +:0126002b2a375e44b367f19ec0f76855bb62de +:0126104992b964d8ae66dd133c2d3e53d2a300 +:01262050fa9cb037d212fd2b03f5b0e3fb4046 +:012630b30b7876b45284f5a4a3eb1d805e764a +:012640404ca795c4a1c64e4346473cb7ca95a9 +:01265008f17cb633d511ffb940bae4a7b2e953 +:012660a39af6313ea6b748f1956f093c91919a +:01267069d92fd0830dee5dc3420043dea45c57 +:012680916ba698d373428a5bccf39267bebaa9 +:012690d17a3a12293a3a99ad078e8888b38d04 +:0126a00e71f3f78891dbc506ae881fc17f7eb0 +:0126b01c9489b98dfcec9df39a0d49c6a62d2a +:0126c072913c1df807785755c3160fc2a92f6e +:0126d02def9748cfa3101811dfcfd10b060220 +:0126e0f0273ec44e0d00bad432c172b6830dfc +:0126f0a360106eca1d75f4af553de96f8b6509 +:012700c40a32bf67259ed573640e29bd5c75c6 +:01271043904d54cf70d1ec78e0e8e5e12e7dd2 +:012720d7e53ddd6691fd9554859a8859a25068 +:0127305e1ff615e9089a1b5114eeab1f634973 +:0127407e5c852c1017710bf2b0ac084d90ef13 +:0127506c2fb1d0d08d088393670a2a67f8af12 +:0127602134184892947d8caba6517024585a00 +:012770dcdaf8df467f58f22f0499db645b080d +:012780b25824b896c4ce5fa424247fe28bdb8d +:012790ed87ef75463d9befa0103a4d57949d9d +:0127a0b5fef6ff7add495d4acc50b285f4d22e +:0127b0903b750a77bc57c6ae0c975d8eddfe14 +:0127c0c3914c764c5aba0f0a4361301e8485a9 +:0127d06451656aef6222a30f34d8e6bab3ba59 +:0127e00e51f324425f27f4c287541b6c63957f +:0127f04ee9519a12daffe25e4e003f649d7b1b +:012800598534a268121a3cc7b17e494437a376 +:01281074e400fdfe03a1f1504f60268f602f43 +:01282059fad1a547246fe010ea3a6a861c574d +:0128306ce0ef37412d11f01f2f1fdc0ad3e00c +:012840771e0afd95fabed19018ef683a8a6a35 +:01285032e120d21208dd3b9fb9cf2e456c19b4 +:0128600eef4e6c8e8781a6530f777d55240add +:0128703d4e652a388409128ec08eb289624bf4 +:012880c6bb1e0d93d2c644daa25e1069ce2521 +:0128900134650263d74047825defbbfefca074 +:0128a0b1c7af1ae635d38bab1cd68e5c71483e +:0128b06270ff2a9675a3d6426f2a65af420430 +:0128c06405851878879bd4a1d0540e48d67e80 +:0128d09cc7c56ba7067cdb0820c5ba0f0fdc79 +:0128e047525300fed3d629a025d3e0feadf7bd +:0128f042a00a11bcc7de1c11da2d58b0087747 +:012900acd3390b3142cf2c5ad7c09b39aa1054 +:0129105f83cbc295e42b1710353501ac3a1293 +:0129200d42dd5476d912cebde1d3529aae095a +:012930fd6e9891bf41f0f159c51dbfab9f74a0 +:0129404b7118fafa1d60e8853834e4fd6edcd5 +:01295017de47583e7c0ba36fea7d2bee84ccba +:012960213812a1e061b8b2f975d5ca3a0d10a7 +:012970860b6f74b898161b2683fd941520cf15 +:0129802816f99e6266f8fb24bd186cd1451398 +:012990b49a4de1eb438ad4d5e7f5e41e61f08c +:0129a0d8124139004b840b844b2de492978b6f +:0129b070c1f48911f4fdaedb6a83581766f876 +:0129c0b0bd456c917572d4a107fddc456f1601 +:0129d05f9bb9ce6fd13ac0c40b15eeb3b2fecd +:0129e08f40aedc09b86b8a3f5e0818a72a6dae +:0129f00ee5da1cbc53862f0693f76c10194e50 +:012a0081792f156e3527be7fbb71a03372ed4f +:012a10a9c308abffb4da376d1e0caa90b75a96 +:012a20392a6539daaed5bbd84ca59ec6e85f26 +:012a3026ea3955fcb6bc3bac23fa60fc3a33c2 +:012a40af079412d9d97999aa83615ef20d6845 +:012a5062a5e3cad841bce2f7e8a84ae67b74fa +:012a60bac912b0d83655b9c771a730e24ab841 +:012a708f44bf22e191505ec6e055a5b1ffe5c8 +:012a80396725273121d66e7221ab97ce507c70 +:012a90fa84f3cba96bb17980c02d5cc2dab02f +:012aa0868c0fbfa0550e6459af3c2a2daf576e +:012ab024fe6c75fe963d29cd5168ede3f9e88f +:012ac01bfda89f894f82464905452ed1a90543 +:012ad0b9dd289e1fb3ba054b04b63090fd2349 +:012ae03b929901c1d70f0787c56192465f5315 +:012af03d17821db6417f44f3115fa01fe62cdc +:012b00084879293a9fdb69628260bdd7e491b1 +:012b10be8e8b35a96cf28408910d7be51a083d +:012b20a5c72381b20c7216a1a11f0741eb9e37 +:012b3046fc5f0360700acfe1690f35f6da10e9 +:012b4083cbf22621de556da4cc9c6dcff5b129 +:012b50c6a46bc4582bfd758b3e25fbbbba37ef +:012b60fc623f2d1f0b327711e922946273c4a2 +:012b70581ccb7d6003ea355eb62b0838511c75 +:012b801a30ca55226f263f001acf86e7dcc8d2 +:012b90d656e28fcf6c41fd7f1be016ad5c346b +:012ba066dac87c987f6528433fc4adb97d0c85 +:012bb0cfca9ada1417393563733b1415631493 +:012bc0793b97f0be0d6a146c51f682af5c7eaf +:012bd0e7766b817c9b5d598fdaab0d04c017ef +:012be047a829f750757414aa1db994ae41af80 +:012bf0c64658534ae969249dbd88e9aed83a6f +:012c0076e8640a9d482841de1846b16f871554 +:012c10bba3677831d3e32d0a5f8e7e53ccb1e3 +:012c20b1f94f1d03f78d7ee5ba7c5db8c2d02a +:012c30f5012de22a4c89b53b54803474c73db6 +:012c4083b8c45d4e43af226a68ef8093390d94 +:012c5065d666da223f142fa703e3f74e5b27de +:012c60a3c8180059d8066e732ee3d7fa2b4763 +:012c70836b966d7c7a60e0bb46ce928ab47573 +:012c809fcfdc0315546bbd8160f468305deb6b +:012c9065c73c453fd43708f00de167793112ed +:012ca07a81c6a93033f4f064d60706b1e04b9a +:012cb0a3bcb8bb71ab7bdc9ba3d1c1a5f15205 +:012cc0b16730a8ef960d1a4c2f52a73b434d64 +:012cd08919b286d2aa5e1f478f83a9a9e9fb01 +:012ce0cd70e5c72d857a302c15383392a37f75 +:012cf0e1e47339a63d9ed18142520144ebdb71 +:012d00ceb0b67d14e5100c6a0745ff96ac3563 +:012d107b934bd1f59680faac1656dc69e95b62 +:012d200b79b95a39693738576b2ca42aa529f1 +:012d30f35d0d571a7c3d52c52f4719cfe93b43 +:012d40b2f0f6eff3c0b84e2705d6bbfd2a24b3 +:012d50a0013927dab1f97ccd0cad5186166d84 +:012d60513f80d8d46b0398864d637eb323fbe2 +:012d70156fb1044ff218c461f153701824e979 +:012d808d09f7bf535f1ce769cc97791542a276 +:012d90564596dd121ca36c8397b5fd9983ad36 +:012da041078b555b5eff3e7c03fe6db8ef89d8 +:012db0bd74ab37e2b47ac2499fc963843bf75e +:012dc0bb329a3e4e65012d518c5f6bb2d40856 +:012dd0add12a7ff17a788e523b9bae49edb60b +:012de0f81e1ccbca871fe067184308276300a5 +:012df00bbe9986c4959fe74979fdf2ba0c180c +:012e00a050c5320e0157b7dec9a96bb68908cd +:012e1056515646f12259d80dc36c22fa177495 +:012e20098152275db3a48d8f5ff66f94d89f97 +:012e3074793b8494f73f423eabceef224c162c +:012e40f847b9c9f3596557c4eee3f2fbbcaf0a +:012e5071a39e56a008d652db2aac7dd6cbea73 +:012e60f3e0f3fbe52696363c02f49f90a017af +:012e7009dcede01b427fc542e12a4dc41bf7be +:012e803ec1214bf1b6f89caafacba37512c0d5 +:012e903b9b5594561cdf9781f4af0e372041a1 +:012ea04512ff6825b2f590dd95c71228988fd4 +:012eb06a3819ef50c6b943847a37d578f70b68 +:012ec05c5d00100ac15a0d1439939d46f4b6c7 +:012ed0bbdd5b120100e67fb6b170f97a942b9f +:012ee08097109bcb2c8210048a50042a62f4c1 +:012ef0f8a9022aacefd81222e39f72c873081d +:012f00a27da22c139cef21d2a2d8ab09f4cb8e +:012f10df4fc7761fad46b23c823941437a9acf +:012f2024baaf8a696de5373f68ec8b4c9b03f3 +:012f3059e0e7b9d63380b3fd9dd4bea23d3f4c +:012f406c2a31ddbfa0c78b5adc840bf2c9ca8c +:012f50a6a7dbb692077dd6ecbf0555781fc7b0 +:012f60e30d09f96bcd82a82a6adc1a286aa9f8 +:012f70465d1004e567221d4aa6c8fb5c9c75b3 +:012f80fef8425041f6ad060770ab19f52cf033 +:012f904b3da9dabf40bafd4f061f5ff34edd0e +:012fa041038a9fea9743cce62500e88b7110d9 +:012fb019ecd990e320f595a1d467c643ece006 +:012fc081dc149d5f467ab047500a891db310f7 +:012fd0b34fb4ad9ef1d86f13581dfaa1dd85a5 +:012fe0e8775dce23806d351bddda29c8b79496 +:012ff092354ed6b0fbd6d324f9b79fb9a590c5 +:013000087c76043fa4daa590cdd7ccbed7dcb9 +:013010ab58f695710f6a778ae7c5f43827f005 +:013020b19ddcdec3d7c1e4f5ed79092f4dc30d +:01303045f0533ba9fb9e17d97f34b4ecb9491b +:01304006ec866d4d04e7c415f9efdaf3ba191e +:013050bdcf5500f7fcbd84f8596fe01e106962 +:013060d0078d85797445926e6d9bfa30eaad68 +:0130704b9777a161077586e6eed704cda489fc +:0130808efde6d6a872894c03814ac9ca17a499 +:0130908305d2de27047c5f9d4fa140c8780c1a +:0130a0bde270209252e1e5e2d312e68770f615 +:0130b0c76751612a47bc50d4cc3192d92a8716 +:0130c0958d1f1897391379cecbd845d103ec6a +:0130d083ae13a89df68fe0c40a2fa93c02aa40 +:0130e0c3fc6ab8273d1a90112d17e5bc1706dc +:0130f07559f1d11ec889c60ab96ac2da9da141 +:0131002d910e9b45ec0244de188b57dad826bf +:013110528fa81de2a895f94daacf2912beb963 +:0131200b29288c93b03c9a000a19ba9bfde32a +:013130d48f6501501965747310775c5bda59c4 +:013140fff1610e03288bbcd8401cdcc803c6ab +:0131507b3c3136c34183c23bde7fa679629433 +:01316025bff0759949361ac10beb0a98d02ed3 +:01317020d5cbab1f0c1c3e6a7086ee10332d02 +:013180c8002576fec3103c6f0517f25f4a1364 +:0131906cb2db7443587f899f62efcb1f33e625 +:0131a06c5080641e2d262952def7967a102bed +:0131b0168858d6e63082f678f66715ff53b442 +:0131c01fbf7ff84778d01f9475b610dd66ed93 +:0131d0d41fa0057f052937a21e15c9ad1b5411 +:0131e09ab9d125f0a6d07bda1be210c8f24ae4 +:0131f0b7a568495e165c95689bc9fc842080c2 +:0132008f531eace5d1ce9087f6d2a8d8626357 +:0132107ec332b4974d80218d099eee01b88145 +:01322013089a5f4b70078f3547318e97257cd0 +:013230f610797ddddcbf2a071a3d32279da06d +:013240623052398adba99d0c8b320f72ae7087 +:01325082c3fd805fcd5819091039bec2ba2c44 +:0132607bb0abf71f3b3036e42c708fa614a593 +:013270a0f9906b618bf5cd3c881dcf293dc256 +:01328038ab1e11fa605b7b7a2dcf17645172a1 +:013290c405d446cb4e832f308ee9f300b5b7cf +:0132a0761920e695cf1344458cd59c6cd4e434 +:0132b0332200890ce3a93f5730524a72b51d0c +:0132c0fd773bd0e1509422cc337134fd3d7f15 +:0132d0a5b179bb8edf768a379614b32384674a +:0132e05175919f3c46c870a6e48302f33f1503 +:0132f04e3a52fbc276ea5422ecc59d8484ab09 +:013300bd93a3ac5e9a8eb19431696678fed354 +:01331082eb7fef77ee656fade533dfb2139a55 +:0133205d6fe805d5bc625b8bca4f5ddeb3dc2d +:013330b7ecc94eba40b8cef3585fa1f95aa34e +:0133409fd0cb711cf51fc6f9643c20d286b786 +:013350471409a64a95f9d10c3d62368e9e84ef +:013360cc1f492fa3734db325d7617ab5f58fc1 +:0133701900afbf0611e6bf8269c16c9ddea286 +:0133804128a9996578c55aa2ab2ee0bed7a6c4 +:01339008186ba72eb3f70508c049e623cbc29d +:0133a0f934d024d2ab3c5dc09f1fd706904de5 +:0133b0449e25056750625c4ba9c8c44be4eb89 +:0133c03c4b32ae8aa799a5f59869604ee337ef +:0133d0836bbc300a07f75497c827a1c39bd0a0 +:0133e017396c45c068641d16c296de2cf87ab2 +:0133f01837830901d75f78fd703dd505e6d18b +:0134009aa242c3d2ee8e40f9d28a5ecc88b94e +:013410aeef16d88f25d60bd62602533643e0e0 +:01342047d77178ef47c22eb109bcc7a1a518a0 +:013430d093a622063811a659368b12f0e94c2e +:0134403771a503dbde85c402ac9b4a2ee37d14 +:0134509054e994f7951a31bb3abcf27a3aed23 +:013460acbc3abaeee9f19aec408923e9260684 +:013470968f882b2d653885c177b87e16bf9738 +:013480a28b8388c52d3dff98a3746030b183bb +:013490b7d547227f4ceca0f859af0bf2e30bbd +:0134a05852f0c2ed44b2440166aeb75907a7fa +:0134b0df0996ba7098193969a8cae841d967ab +:0134c0b9dc6742fc1ffb2568acb0cea469663b +:0134d0a5f4d000ba0ac32328b6925219f28077 +:0134e025c2f0518ed76118a65b3e5fbfaefcf4 +:0134f0ad6c8513d484452669dca1d4ec6092d6 +:013500ec97ff03d5a4606a5efaad53d817398a +:013510fb0a361b775ce72604a1763531bac1ec +:0135204f54355170a7847527d2b5d2294747e4 +:013530da3abf57f4f49c9015831bf0d5611799 +:01354097ac089353af0ebf4b4dafe15e12129b +:013550bd6ae01feea4c6873d151b9a09e101e1 +:013560acb0f9480c7a659acd8ec63e26f135ba +:013570c51f9a26127797ab92e2df7796e0914b +:01358016e0d8173919e74500169e8de9d2091c +:0135909c3f667ed63b63802fcb5c5377d082c5 +:0135a07433f99e5922de84099675659165d273 +:0135b0e2ea7b95685199f211229c81e6f7a94c +:0135c0c6aaf28effa4e6a65e111daf1b36c885 +:0135d09cec514c2df82a9d8363a043ba06ccbe +:0135e07e551083aae0fe4b96a5f6bb87f73204 +:0135f00fc632860c892106cc11de8d8726bf00 +:013600e887a57262814e690b93a1a040894100 +:0136105d27749573c0d4c0addedf7f43fe53a6 +:0136203e9ec577afadb7ca09e66a186b0607da +:013630d1d2b3e08063d270a29e433e202c5894 +:0136402fa378c5a5e59a019bab17f726601768 +:01365078e531d9967e28d4130d749540d9d612 +:013660da618aaa66b2bb5f35ad6dce7fc86497 +:013670fb1d4db46815a1734430b0c514170f48 +:013680fd702fd2f91d8abba2c931c1b8d63a60 +:013690c124ec49dfd981fe9bc32622bb5029e9 +:0136a0c1b8368fa7e82ddd0c92e69c86910efd +:0136b0e99db0b38f8b45ea6570b1224b0fa228 +:0136c08658cd7a650096c42f3ff21619420b8a +:0136d00b7533a3b2eef619187c15c3d9829d65 +:0136e031963136fcf5536ab55266c8ce153d87 +:0136f01dd43daeb2f303c1e38083c6837af470 +:013700126174b68d95e49eb8cca32b96c8a86b +:013710c9d3cfff7e0c85c17b9935494d6cd9d1 +:0137209fe6de525e546b13687901bc84c5993e +:013730c8f741f15ecba43f0a725bfc66b68a18 +:013740909f9c3cf7293d7216956eedec8bbbd5 +:01375070092d57b3a86dff452972557be2af2c +:01376067df0cd2f80e4a6f0b80d4df139fe0c6 +:013770feaefffabadfef93223a75f761db62f7 +:0137802e0ed88c4332c90b051630a385aac6af +:0137900b4dcc55c90d08a741680557e2c3438d +:0137a08f6ac9329fed3654893b166e6640fb92 +:0137b0965f87285f79af839825ab9fcd2d369d +:0137c04be4538f4a5a2c5e18e376756c670417 +:0137d0bbf9d90fecf430f881cb7933609ce4e7 +:0137e0d934e235285017acc61f66850881b17f +:0137f0fb557d153bb670d139920c5ee679fb0b +:013800aeb12e9b8790c722385e163830caffab +:013810814db78c954bb914404e07e044646b91 +:013820843ca223de8eae6a7fb4f910ab2b4ee7 +:0138302af38907d3ccf2a08d2334a549296aa5 +:013840f715644202647138728332afee12f1d8 +:013850a855479a2c04e9b46af5aaab9b2a1058 +:01386003e12255ba1c5d2ea74a5d50e88169f8 +:013870d6651b82f3d59637c4b725d5d31e5ee5 +:01388080f334451871d0dcbc4722d76fac273d +:01389065220d9e5fa3b218edf1b06704b2f1a6 +:0138a05b18a807a47b41bc6cd0e8efd1d2da44 +:0138b09870ecc4a21e98c8a43b24e87113fd2e +:0138c008e4411265ae1fe9f65eeb5982b1b9b6 +:0138d0655f7cb73661e22db2fc46c94518d9c1 +:0138e027bf87b45dd7693ede2dd050f73b7380 +:0138f027f340a1c7d768253a7db17f8fd28a69 +:013900817f9008f23649733aa5fc54e0da5f16 +:013910a30c6b18bae45bb115e8e2d5cc5fad97 +:01392018bfd4c1e08b62f614b7e5b8d8e94bc7 +:01393040100c67d9f83eb274e57c720ba8f5c7 +:01394002f12f21ee5d9e7241f1439bf6deb3d6 +:0139500f0af0d6b5c237ef429c6d165d915de1 +:013960bf21174edd68cf51466335e608e7c022 +:01397053aafd6b96f88fc528800101f186dcf7 +:013980dc489133b695591223b6f7996b134b1c +:01399010bfb9f43cad8a027739a62034bef5d1 +:0139a0bade5d4704aac4979e9f50aebb8cd342 +:0139b09b2409858702e3917e8787976879c0b3 +:0139c03df137a65c2c4d2783cd59d50c665869 +:0139d099f62a37d28373219d739f4b3fc62975 +:0139e04f804b94beaaa666350d683c3b860003 +:0139f0f8916893237342f97deb55c5f788c705 +:013a00611a6f66f81f4fa04273e98966e93328 +:013a10030522581660e5e02dad06425b8c9bb9 +:013a20b216693a997d08b28b5fa9ee63a19172 +:013a30012bac1442089fa00c6cdba0b53eeb25 +:013a408955a5c6f3446d92f15f0cd320c780e9 +:013a506136278f07010c265989e11ab94b4aef +:013a60b07ebdf7e4257b7260e83a2a5a4c09be +:013a70cbf4b638eadaada94cad0e0f001fec73 +:013a80949b558599ed50c8a79bb3a4ffb3681d +:013a901781c0d6fa5e69d5c813aa854309a25b +:013aa019ab7a7b3ed865ab12d0a2152282b859 +:013ab02e43519104320589af5f0e135631aca9 +:013ac09d9ce5250b77280efcf4cb0ad2179ea9 +:013ad0239b13a1181feef9150af19d2b774e21 +:013ae0e85a8c5c83a03a126d7c7e9e2fe3e76a +:013af0c0554ca757a9bab60bf546770963cac5 +:013b000268269626a88c98b195de8a459a423c +:013b102504aa0c788f6d4fe036aa1f9644bb43 +:013b2008ec13052df5ec972f2c9f29ddb01926 +:013b307103b24003693b52b5d928a66355695c +:013b407dffc51ef2862ed0346f161405eab2bd +:013b50233a783d9117d33ca413b292005c74db +:013b6090678b29f093993c32f708628dad97e0 +:013b70b6b5ffe8348f5037ee041e5dd03e9c56 +:013b808c84bc2a44ce3680c4da9ee4abc64eef +:013b90bbfc1664216c9c01f4fd7c072754c68b +:013ba07abba7f907226ac946ebdd67b395cedf +:013bb01ddc7a741a42a947a0b29c013c691625 +:013bc059fe9a7e574a054b7489a729ff0a90e6 +:013bd0e414fa01d074380cd065cc9d0c5c1765 +:013be0f4e1d9b001a593e4001c39aa15dce18b +:013bf06579ec4abae0edb720c886f33fa88b33 +:013c0025e59b9eb24cca6ea3d0899d762ea90a +:013c10b97be374dea5f97d3ef5e28359cbf52c +:013c20d1c41685554e383f8accaa9a2f5985b9 +:013c30c517dc0261366833d4fba8fdfa04cb2a +:013c40acf159d3e5cdb1ea5c71c56d9ae8a91d +:013c50bf327d623d7c03bf531695d7a7ca1338 +:013c6007102909744b7c0758b53f4e7c2cb206 +:013c705502c144c14ba4845a6f131344b87607 +:013c800397de38efabd8c82c4fd4298a296f7f +:013c90bba73f95b043472b36b2cedc1b17a641 +:013ca00e6aa948392ad5d2e4628e88eb80e3e8 +:013cb0f989d0c5a580ecb31b6b51d085954bbb +:013cc07b143a823e29c06345f4f9dcd60e0dc2 +:013cd0e34d4d61472ec3dbf8d2d650b656b6c5 +:013ce0cc207ef5d64ccc2e104d3ceeb8ce04df +:013cf07d3fd1e6ae526d672222ac740c88d3f2 +:013d00cae2524427421e7aa9e404b9a6bcda8e +:013d10c5f75a6af6f5b4186005f37ff655b417 +:013d203d981119bb90c6d0229c71bbc3f6320d +:013d30772becfd4748815fa48689c9833cbe97 +:013d4006f5755d24839ae9490ebf95ad5bf530 +:013d5035e9a206616cad568535a3e6272a818f +:013d6043106445978d70a42d0f05395da34b02 +:013d70c8bbdda72769078b3f1696e4c19034c9 +:013d808dd2f288fbab6d40c784dbaf3c4fe2ab +:013d90c596abaf374a55e5ff4f0493f53f48ed +:013da07af238b6fae520f1c5a8013445963790 +:013db03f856781b6b0a99b3c32d021e3a5caa2 +:013dc02e929fe0e2d8b321d6dd57324eda6615 +:013dd0420492d2451984ed9fffa1beb8f0b179 +:013de0a7b5666898688f8e9e60ae54feb0d6cb +:013df0c0e572af110608d8d032171ceea4f36f +:013e005253d5693377adaec77799e72f98697d +:013e10f4c7d3cbc0100749686433efb8037ad9 +:013e201bd20a37507ce4db888eaf5d34b4ebb6 +:013e307f906fbab705c95a9b882f601288dd45 +:013e407288dbb11af1e6937dc20ff89357a43c +:013e505be12532e9b93e48355c8313d8661f21 +:013e6054817956f16f908bd83ac29c8d9d1a4e +:013e70f41232f40218a699e0daf71578da8cf2 +:013e802fbec9167664ea4cd1b8c5fbfe2dd16c +:013e90acf4c82412d3929b23cfe6c1cfd5e403 +:013ea0fc2433bfc5c5a190af55317e34fcc914 +:013eb04039c32a6a6ad5029f78f1ce44e8d7c4 +:013ec06b7487d8a831865cd4efcf73aaa65fbe +:013ed0a403c65db780fd53331a4dfaea939684 +:013ee0de32a99b16097e28ee28f99731c824d7 +:013ef01dc32ff838b4b1026ab7a0d9692f7285 +:013f00665b1e17e1797a38310c3a82d9e9f0e6 +:013f1077583e71a54bcd687c37b8b202a61430 +:013f20553f1271c69119682773983b9c36c30b +:013f3015acd540800f9b85aad386b2f7928f39 +:013f402aa98516653eb7ed4f3d44d7eb21d036 +:013f5004691e0b8aaee71dd948acbac0c399e7 +:013f6096eae342c2656d80f52f66f258e81556 +:013f707d49fda819cdd21df4bec8f2b26fe7f1 +:013f80b294698ed7943193852724fbcab48fd2 +:013f909faf32c7c420e273539af8c5b0ce6532 +:013fa030b8d2a708951fa3a09a46be6cb7279e +:013fb017b0f004696a35a14edff99ef7121855 +:013fc08d384aea161b4859a0fbdc3fabf44adb +:013fd03221adab314ef89964715a607c4181e1 +:013fe09d38d0a534524c1d7e656d5435ad2d63 +:013ff0468db35e539f980782d5c14ea8f35eff +:014000d67811ef3b045c37a9096eb857ba1591 +:014010b33b579244262b06a3f23b6a878cf5ad +:014020114b3986d65a761adf5b6c069727b1d1 +:01403066eef1267c4bd2513b0106d98fd66f70 +:014040f83e135bf62326b1363d357336e12163 +:014050e7e8919d6d568cf9ff39d2d056718de2 +:0140600684cdd644865a481e92689cd2b40e0f +:01407081fd6355931a3335cf88642aea2f0c0b +:0140804966331405a1bc391c83ac032d3b1258 +:014090691b14995579dfc586efbeb647197502 +:0140a0e7091a4d4886015d7ecd988f675ae916 +:0140b0c73fa1b8bda9ed7355dcd773b3286505 +:0140c09b92019f05de153aeddfaf6b9b00418e +:0140d0d4ca0e74c3415f1072f2f70f7d7a1371 +:0140e08a797672dd1935f1c4850ff2215c75da +:0140f03a77a85c363b5c7ecaa7c94bfafa3b81 +:014100f1c57a76579838208b55a4d26a0c21d9 +:0141105bc6702a17f5bf4c0f5e5262c0b8747c +:01412052d64a37912f0222bf5ddcff4b624dbf +:014130e66ef2b974f981d7c1b158cd1521f088 +:014140c3b02b9a86305136aa5712de212fd8f4 +:0141508c1844ba1867f1e5c97c9bc8e83dd531 +:014160f665b26cd682372dea9541a15cdc50bc +:0141707e00d9706ee85b674297723f06f58506 +:014180d254caa84047cdb027685d0a216e1dda +:01419070eba21b7150f6ea3d95bcc0840e3118 +:0141a0f4975a8435f49dfa56dc7734f9d01ebf +:0141b0c00697ccc7fd890ccc3122865346a2bf +:0141c0f857f312dcdb5cd52e15be04e3d6a8d0 +:0141d075c262eda180bc0a086c420e94ce001c +:0141e09a48c725307d1cd56f820a09d50e2c6b +:0141f0005ff92d7dc330c907a83c619da54ef7 +:014200011fa4e612789bb590e5de200825ec13 +:01421061992f5e0465623ca5db4e2a1b9ca244 +:0142209c2a6dc41f30c296160000c6dfa1988c +:0142309dc356d67340d8a5c273a0de70143fa3 +:0142404672bec95291895d7349778b93895a51 +:01425061326ac9ff05171ec133cdee79459bc8 +:014260328e61c8f5d54b1e7dd17aa8c5b6679d +:01427022a8b6349e3579c4ffeddf4c6c5c21db +:0142803468cd47eed4befc016f83d619ea8b53 +:014290a978feb9024040677bcdaa4188cea575 +:0142a0660c05308511be589759a2a49aa1e53e +:0142b0fd39faa832678e031359dc4fc945b95e +:0142c06e085c8ac93296d8b3ab4ec99e18b515 +:0142d01ee020237edcb96fb79b65ef13b979f8 +:0142e0ab0e90ca6cec37a7637727eea6a7642f +:0142f0e0e413113af5be75ce89f901b9aa9035 +:014300f15df67801f63899672269cba03b6b28 +:01431073ba920fac13f48c1dfa3ed342919808 +:014320a7664ad4586394c78a6eed760d30e67f +:0143302737e020954074809b462efd459ceb97 +:014340b9dfb2234f83a13747b83787786936b5 +:01435046ea14282c10a1a91a407b647a3348a0 +:014360eedff0650bfbcc3f81164f0851d6580e +:0143709bf15383e2bc51025f3b3e884fecefd7 +:014380adee99c095697f7ff2ecc6ecf63cc959 +:014390393937e19def04a38229ecd912d40ad7 +:0143a0fb6e440c9fd6e2cc1b5ff7c418b776dc +:0143b0b953de32e7872be04aea9e5eeba7c743 +:0143c0685d77d6f9b5098f402dad3dad476e74 +:0143d0e4045718bcefc28d394c8b86b10ef29c +:0143e0f39f17c3cfc218a659fbbeca6f71feca +:0143f0b8b2d72d29b02a9c2849aee9d91ce15b +:014400d750e87b1b313d51393a1943aa5b1c7c +:014410b0a4795289bf807d65bb4be81629fb3e +:0144205d280a630f84167c4dadee6210460bd4 +:01443035e8985c2711e4f6ea59c970d1312919 +:014440889bdfa1648a918fccafe3ebe124955f +:01445082bcc300e64b42ab4c6ae78daf4fb582 +:01446053ceecdcf64bfeeeb17ad592b486a9a8 +:0144704415c8f5db1805651fe8f387035d0c93 +:01448029081f886bc9f3a2c722d8f3abeef63e +:014490abb417d74d1738f4f30853bfa4469520 +:0144a09a65713e6e9ff48df1d28a5957457a9f +:0144b0b702126183d1418c505699ae3a76c25e +:0144c000b79c93149c37a9d6b577e47bc2a20a +:0144d007539dbeb5780eddb9bc26c5e2e05645 +:0144e0f7e2ecb8dca7cd99548f3c9cefa79987 +:0144f013566cbc7a424440058d673805753cac +:0145001b1d84b38a2d723c6736f7ca92cc658d +:0145103fad357be87a84bc299a0ff4d8d28f3b +:014520a1680f7354ad4217cfcde167032a4ae5 +:01453089c8c451f3dac6339443c472f7563e0f +:0145407d59fff63147b74896138e58274f26a6 +:01455057dd12614a2edc222ef4fcace27270d4 +:014560137f10d84726a24d742292e43f766109 +:014570ac97335b633818f075f17d0ecb3b2b14 +:0145803ae14444f2d64c7a4575d565da85a790 +:01459029d6d5f93ec0e7381cd8b9e162f93b58 +:0145a01aa3330be590ef1a22dd099b3fab47aa +:0145b069811528828d245f6929c8f19fc28047 +:0145c03694aa1108a43c0254b8eefcd7a8bbde +:0145d098b3f44282003ea5f7f6e22b4bcc83fd +:0145e01b2b1845b023acc2cfc1d5865d1f6daf +:0145f0255c2aa134a930eeb78c39e15a542ae0 +:014600ccfdc4c1432336459a796925605c07db +:014610ff8a7e7a981f5ef0e1d98259db782959 +:01462048b7626912a88552a78df8544921f1d3 +:014630040adafc558b9a8798787401a3986c1e +:014640f2d019ae72a4f2ce7561a3408c1fe2fd +:0146507f7ec854361381eb1356671873b94024 +:014660119cee38eb228f4c0c1d41762e576b59 +:0146700b21c6171df97d872d9cf0285243b9db +:014680e80edb8d46c5a8da163ef8e182dd0d14 +:014690995564a397202d04b1051eeeca0100fc +:0146a06499deb6d7d19b715d0879884fdedfb9 +:0146b09edf50fc02e8873880c8721fb74c146a +:0146c05489a12e67d7a5dd995b41ea5831c09e +:0146d0e47e0588c878a8d24b153ac615221f07 +:0146e0cdef07eadf7081065af0903306fd08e1 +:0146f0a566e76a9f342a189f9fc20d3ca1ed5e +:014700709a4f97f241a0004d2f87482431f479 +:0147108f3dfd60fb0144676c4caa00f156d125 +:014720e513f3b8171b91a5f8dccbc3828a4e31 +:0147300edd8289cb7369b891ea9aab8abc9500 +:014740f9d20048f6211621b43398a7975e1ded +:014750d4438ba1ab3a3fdff3b10895060ce1a1 +:014760708f257cbba6b8aa233ccd3ff0db1d3b +:014770dc171e792685143e77d7c007e4093b93 +:0147809e3487169999495026d6cb98f4e4fd08 +:0147906a1c1c5293dc76ae43b05a139e99a5eb +:0147a02a903f604b621d45317c0802642f90d7 +:0147b08d4714eb804d7ac5ad8359dc4659cbc3 +:0147c0d87732721dc4bd22ae54581cc2501355 +:0147d0753cf1302373631f351eaba03032f969 +:0147e0e07c691cb9b87e27223776be23fb892f +:0147f0e9a78606ff392fdf8c09a5b01e85fada +:014800d3647f77f04c48b6eb22dd2d93174830 +:014810563212692d03705d6a019982271f0e30 +:014820caed03fbaa8055d92117a8c26930c3fb +:01483068898cf703ec3e1184a90d066fe896b4 +:0148402be1fb8783b92f64ff1e3884d728e753 +:0148503936224bacb079e6d20ae3de6ed2f24d +:0148609275493cd728f37e867aacb5e08fdc53 +:0148705caf504b136f19032430c40d91131eba +:0148808bdcc739d3f36b85212edee944ad4460 +:014890c0dc6a6527e06cc7c2c163736533af77 +:0148a0b6c3a772b99b5bec061b36ddf8620d2a +:0148b0f3245e18c9e34e24fad45ef7365aa24f +:0148c0a609ab717daa09862a1a4c3d332e4d01 +:0148d0ce8b163f41f3f5049752373dcfa813c0 +:0148e0f82d456f9cce843fc57ca60f79b24bea +:0148f026f2562a7683bfe3b0686684ed6df49f +:014900d55a0d98616ddcf93bdabee8ae7c4286 +:014910441bfdd96d64fd5cbb8bf83dc854a21e +:0149200e2086e87bf080e158d997d05049b185 +:014930bebeedfa15efb322532ab9c95e9736f9 +:014940294f504b27fccd2bb4844030bf8ffc20 +:014950cb6eeb241896b04fbb30ac0fd6590d6a +:01496024b94380381a306932b2c08bbaa390f0 +:0149701ead2dba66d4b90258244ddc8cba8737 +:014980439feedfd675609d3c5ec4246a1ce2cc +:014990b24ee6c074f6fea1f710d6012b1f29f8 +:0149a01e1392cb9b10c0bdf61d94f0c489aeca +:0149b0ba52d1d6da73a8734c533f0721e7b75e +:0149c0874af6a9f7d46b287337268ebed1c4b3 +:0149d0429ce246f55498fcbe6d60955986d85c +:0149e0466a41ef138c67fc40f4d5e4db4436d1 +:0149f0512efcd40d7ec2517b2ca6da6d35b360 +:014a002604f56e21d8619f91e2cf7c065bde99 +:014a10702eb02654c909ae1da42e073f9ed00f +:014a20ffeaf229dce14b074731044ae16210bd +:014a30c9d0150755bfddb1c63fe2d3265a2296 +:014a40a7100041460b093b007301fd9685278c +:014a50d6b4f482082d6027f137b1ed2e489b26 +:014a6056b645c69cfe86253aa1ce7461eb8151 +:014a705d7abb9acb059bd503bda74576a4fb7b +:014a809f815a2e158a58a45702efe4339368c6 +:014a90c0ea93866895156bb803b08c52ce405e +:014aa0e0d66d0912108cda90a2f68d289d27ac +:014ab0a0d9309ecd23950dd52a3b0364343145 +:014ac0de2d6cfbb962ef58f3be68f3ccbf407b +:014ad01dea27e6fc3d6b1bed6f6206987df083 +:014ae03b1aad4a69d8ffd0b07e9a6e435f9d7f +:014af03d8866ea45271a156f870cfc1f449c19 +:014b00c800ebdf35572459ba3d349987ae0a3c +:014b10c271c87a11336d1f21b3ad12185304e0 +:014b20ed8b77ac514ff19f237455a886376c47 +:014b30ca7e3adb66b0ed7ce5dd0c248bef22ed +:014b40a7ba4c1ad82ae6147532e1daa1422354 +:014b501585ce0eed8382b508c1d3852909bdaa +:014b606157034ad3dfaeee46557145689664d2 +:014b705e75289e5551dda92237060f7fe1dc64 +:014b80b71f257f5a5e60eca07f2ea51d7afcf5 +:014b90443e4ac2098d41e80d3321518a94fb95 +:014ba03f5cfa80cfd0b6a39755511c4c022022 +:014bb01879833cc58dfaa7d8cb90f4fb8ca278 +:014bc0c61e9918288e04e77ef21d3796deb6c7 +:014bd026c5e5b746dca78c279d9c3e5b9312fc +:014be009e6ad973d14ebd45df58eeab2fcfdca +:014bf066ad314f6838c38cd34a6ef60b391995 +:014c0081fd311dbec8989ce291bbce8b2dae81 +:014c10e8b0125a57e0ced071086e4be0759838 +:014c201a6c526c79bb18c4df3099653678f400 +:014c3020fada8dd91a4bdcfceef8ab2deea6b5 +:014c40ed93ee48002cc2d94472fabb59155286 +:014c50ee8be4af6198887a0f8aced2eea13bde +:014c60c6495b2c2e5db568dcd71f6ff8631ec3 +:014c703b1c3ba2746182ac962edcfb929b0815 +:014c80bdee742eb48cf6453359ecaa3026f7e6 +:014c907ca784f53b7acf47584710600e12fcec +:014ca06f9737d2c48ae4dfa147e8f8875a75e3 +:014cb0378b815534e2c993d3ff3a8afceb2536 +:014cc0b93fed90d7b7f188560ef3927de0d6f1 +:014cd0b92d4683686520075137c5eb38a01156 +:014ce0e9860ae640dff64bd37a973f4d7516b3 +:014cf0df68db43c1869255a7cd648bc62c1df7 +:014d008fbcb3d6624959cb83bf29ede242a3b2 +:014d10b95e986f89453532166de55cc8b1ebab +:014d20c08c51c7c5e93ee7e548c6c3a1a207f5 +:014d30ba7d3b6c8d8c21ac81de6d39843d476a +:014d40b8ed6ca21ad68f04fcee2acc846e1f0a +:014d50d8c1ac0fbb61f09b9f1d23c56ee69f81 +:014d60d00d57f3d6eb049ea9bcd71d7cd91688 +:014d7082d6248f5cb262fd7f228e9b10005ff9 +:014d80a146aa81f403e7f5a4b0734b69ce266c +:014d906e11378e0c91ad6391962921cc81316f +:014da0d1e17f138eefca3d9471a84cc5c6c18e +:014db019e4eaa8c31bb8b6a2153976219fc92a +:014dc0d5644475ac1c9bcf6abd5d1e647a5498 +:014dd0a923f8ad8b2f7967ab44a559be11ab2f +:014de05804d6d1f4252e26c6cbccadf7000dea +:014df0694c22b7f2ec6116b7ea64209a598f11 +:014e002cffa527e393c5fe1082cf1430bf73f5 +:014e1059654cab150b461bd189168a898df03a +:014e200bc6cdf1a0aa79dad71203a82662e2dc +:014e305e363b4f0d443696125e60816f47b838 +:014e40a6972fe1c8ee409584de532da7b6e504 +:014e5027bc3d935d1ff5fd8c668a86f1aedc25 +:014e607058af0dabca6eb44545d79bdce2c5f8 +:014e707185392f2240427802f378e52cf631c1 +:014e80a8e35d8f9d7aadb895f1a2ff77f8e3b4 +:014e90c31a2e968d07cca361d9c9549d8854b6 +:014ea0065291f687188a0d3492e7c1ef456296 +:014eb0ff34b52d388765de0f304e191229cd68 +:014ec0cfcf499a57f591c2c5c9310e751264ca +:014ed0a4b98fdf2e6006531af1ea4186b9a034 +:014ee03f8a2451a8d04cddcfb86d4599c5a117 +:014ef03ff77b0dc7cd68c76b5714d102db151c +:014f001ef97000f971dc3c053fb1adf5b12360 +:014f101196466e568cd1ce3e0115eba40597dd +:014f20ba12840548fbb0cdd1de358c7a85fbf8 +:014f30c7058f6880a638e65b0fe54019041425 +:014f40cb6d9d9ef6ebf8d9749cfce42a7b7851 +:014f50d6684cb42709e9a4f6df3ba384170085 +:014f60198dc272bbb2bc239f214d29bbf1f5b8 +:014f70b7a03bfd30ded330800de1ceec3e79cf +:014f809a5c52e5d7186682b415043e62eab396 +:014f90842e386ca7380b03c75adf0946a36fc9 +:014fa02cabb6f657efd6a9d4c8e92e3fc2a0cc +:014fb0b7479df83fb4d027c0c7e43833861b1a +:014fc0ec64ef41d5e9cfeab181a424697161d1 +:014fd0d6173f3902fe0f28685ca2307397447e +:014fe0e0c46407af66e6566d6c18cfb1d343e7 +:014ff054a05fc3590c8f51179b6a244812803e +:0150002eceb98b2fde1d4956248d310a16e460 +:015010654f5bd6510b8ff3faa38013e6c59408 +:0150203ca3fb19b1f3fa1caa2ce68d2264659e +:01503029dfef8a2de01dcf01ff987153492733 +:01504084d4e6da21ade83c9b10f33b9206b806 +:0150506330447597a5a3a953842db536617bc9 +:01506054c3720f05a2929b006578567a322170 +:0150706c79f53a93f257453d77bc3a9f7a99ce +:015080f3975cbca6552518aaf049170110c658 +:0150909fbd843a2cd90ab8259268b971f755db +:0150a028cff5d1532bcc7f809508711db8211b +:0150b0e5e0d792a74a9b2c53cfef3cb16fa49a +:0150c0d60e89f428efd7343f230251a999dd86 +:0150d01d3e15d516279ab3c57157955b841afe +:0150e0016ff9e9ce490907ac7cb5b269f23bc3 +:0150f0cbb37d45237d8595a52c1413b176c75b +:015100c2ce2314cb6610dca41d06083e5cb461 +:015110d493179e58632330bc7f09f31c09a6e3 +:015120ceda673560c6d57ee8261f3184ed7e5f +:0151305479342d383afdb5495b2019901791b8 +:015140fe9f9421bfa16e465df765125fcc3d46 +:015150a3870f521385ffe642552e1c14ee2edb +:015160920f39704596169133a23183f0e85dd1 +:01517090a3260d678f823b11bea789f1758613 +:015180dd89162035aa29deee9c61b2d202c56d +:015190627a82a841d789813cbba97029f442c4 +:0151a0527086063408a8efa585fb0e0ef35364 +:0151b003e8b85a90c3c0214dd390365ebb4084 +:0151c0fc21b725cfa4eb8477d450df14b4f475 +:0151d00ea7e96dc3bf53000516aaad39f7a910 +:0151e0f8f0f92ea9dfe73e2021c336a4ec8a90 +:0151f00e85e41e62ddb43c4a8a0ce2a57b729c +:01520088c32e9b7d02542b89c2960e02ec37bd +:015210f19d48ac94f82aa0e34ff0d6ddbf420e +:015220974befee50fb89032cf901910077eefd +:015230927e4cdb9e5739491eeec81527d0b571 +:0152405d7eae2d55a70a238bfaf863a56eba7a +:01525051a2f4fb9e510ef7fbfc02b8cc236d5e +:0152603538634ebd937958890a51de652620e1 +:01527072ad2ce6fde58634535ada610aeeb9b5 +:0152800cda969be857bd82fd99d693a39667b3 +:01529095f1e37714b58cf254c56c489d5beec0 +:0152a01f8d4bd2caf9c0486c7f2b0016a35581 +:0152b0449613fe45a716a23c925436f55c377e +:0152c0f5ddd7719dc548916827003294f110fc +:0152d0ee8c46be8a7bf5d8989007558ab65ea7 +:0152e084d9ace2a8b5375fd52a8b267805b7ec +:0152f005257e95feb011cc1e0db1ecf00f9723 +:0153007df699c15360599a56c55d0b43386077 +:015310fa37d8f42ed5f5364acd566bb00b2b3f +:01532063643fcef070be05d8d05b3ef81f7117 +:015330975ed2834019bb47aa85580c24c5797f +:015340a6db6497ebbc061b700733a9eadd93b8 +:0153509e7c6f4e040c8e4946a79a95db87b0d3 +:01536059e14e256af539494c7ce24c534077b0 +:015370fa0441837eac547f7bc174f789b738a6 +:0153803f08139d04efce2cf6e5502a0041ecad +:015390f6d6c9f7ff49e7d2fccb9e3500cd5d13 +:0153a052222952ecc1b87f09d231c0714b3adf +:0153b0eca829871617355545a03f0a10a95ff3 +:0153c00ebb1c66d90583d14c00b9f2f503d96c +:0153d0fd7e2e48bb1cd5857b098bf1ef212000 +:0153e050c85f2c7941517c592f6d0ee40e20c8 +:0153f05e1ce2ab6dcea6dacb1b66dcb4215440 +:015400e552e4e550b012fc10aee70833883bf8 +:01541057bcfa6d821675e77682b7f4d9d5d69d +:0154208ddd1623301be1481a359eedb20120cd +:0154300bfdf51f90d7d1dd262e93bf4f6df8c9 +:0154401806703a66f76c3e27eee1743ecd0d99 +:0154500535fd2b1ac42485bae4c58c228352ac +:015460d5fdd5888a739c30a02a2002a5ab2b0d +:015470ed59b8b7f7714ee08cb6d2beea2fbb1d +:015480ee489d5d9e1b85063d2a1c9571b56eaf +:0154907503a180f2f14dc957c0b5c663c1e457 +:0154a0c604f42c8a17f3c2ae2a4fa4a2b07268 +:0154b0298121439d24f44ef4e3aff59ac850cb +:0154c0a03255bf673fc5bc7cea00b3f5471954 +:0154d0fff9d2d326889f3bba53baaea5eb690a +:0154e04f98f41dea3a927a73017edb347e973e +:0154f05c49f09002a7fb14fcc0ff97b2e956b6 +:0155003a1caa20b7bb1b22304d078f6db4b3dd +:0155105daf088e6acad35df0928513eb7de8fe +:015520b53bbc47b991a327fcde7d46ce0d838a +:015530b827164d081cce7d0b7291ea409230c7 +:015540ae6dc188c73f951eda8ea734ca565c75 +:0155500ada69c3a1ad816d71e7914d63e425f7 +:0155604347f89a8976ad5f528f846d020e84b9 +:0155701a64db4fd3e818dc2ed3aa4e37e7e5a8 +:0155805158abc61cd0bd51a477b3cd4039c25a +:0155900955e17a1851016132b087537e4899c7 +:0155a0a47a84b702ef8cdf6da30b00aba64327 +:0155b0bef52c33f07216e87c4d6e54c4279826 +:0155c0054be52a0b2d09076727fb18c0d17ecb +:0155d034a8113ca8c55a4f69af7f6048f443ec +:0155e0bad8e8c06f788dcc4d91493d777469bc +:0155f052181923a4a7442bc8a7a422c2807ee5 +:0156002cf2ef5a987eeeb7b7b33cc94e62cc27 +:0156102d9fff39ee5578db1bbdf373522e7bf7 +:0156206e9edab0d9a94c21c76312415a14e332 +:0156308613553fc4093b69773be9d715b8b2fe +:01564037d2218e1e774b440b4cefbfbafb15ba +:015650d56a218384d225e9f9f7ccb91e1b75a5 +:01566001c0d2cc72106f24caa8dca9bf560aa6 +:01567045b16e494e094e2388a989541312e9be +:015680095389759feca2ab40f1e99baf18a830 +:0156909393d3bddeba4a27757b3102fcdafe11 +:0156a0b244055759054490f1a6e0fb97767a1b +:0156b0a2c4cbe438c9db95a21fd773e8a9728f +:0156c033409125ab334eb6fa52705d48c0e511 +:0156d0d4344dc6229c16f0bbbfa8379ad20deb +:0156e03b11131a0266f82b5b0f8eb810f0b717 +:0156f07147cfcfbaf20c90d87aef83b0dad1ab +:015700fa277a10a7bf3743781bd567617e6065 +:015710a40053196f33c2d9de74e3d738310f8b +:0157201e6d8483caf33bb32edeeb44c6498b16 +:0157301874e678da23cc6ceb569b4a5f07f2ff +:015740bd05729afb6cbf438fe9cd0960308251 +:015750ff4c9fa7fc1573ab3c9fd1ad797617fb +:015760a624d35b43d6a3b3fe1faef60951365e +:01577040ceafd83ae9f47118b4d8bd7650b7fd +:01578086463cf731b98d832c6581f4b876329d +:015790797c6cf34bb51a6fde8290fd10961398 +:0157a0983b3cfd7fc3013cabb923c37840cf52 +:0157b066db0f9f279a95b66c6f33c1470c7100 +:0157c0972edcb4a7f85e19a04a62f237796589 +:0157d0275ec2f0f9713178c0cad62cd5fc2d91 +:0157e0fc75683321f9a50db8ef218fd40bbe20 +:0157f03760e1a6e6a0acaa115b3466955a424e +:015800624210cb0471f24bdd687526f4f960ad +:0158107e736e6f32cc1e28f1a676802fc12724 +:015820d32e20cda5789138eeaa8318182c7150 +:0158305b6ac89fe94e5c992690d3835987756e +:015840652b1067a46f3d3c3b17481520112724 +:01585083ad3ba87f7e8341140c5f4d472233fd +:0158602ee7bb6c7151286383eb675e34f3592a +:01587039e50ea8aa3bf95e00ba29358c238898 +:0158807c49bef14586717693385804917bcbf7 +:015890f965fcb3765ea5079da0238bfc031a1c +:0158a0805b6bbe30d67ae319179687e66c8a50 +:0158b0cfbbc046f91d0cec9c59dce1ae3b2574 +:0158c0bdd5510c616fd12f12692c87d6c7e6e7 +:0158d0fbf4e0984a4da6fa8df4d8e8f5519290 +:0158e0b84fcbb647c61667510a145cc0fe2f43 +:0158f02488623fdf1fa9d0437481351741760c +:015900930a36f29f59bf4fc97eaf450ab88ba7 +:015910639f98e2ac09e3f916a711f1ffe49f09 +:01592097f8c6e43f9a0ea05d6a2e6cc822ab47 +:015930e29d399deeee791aea2e1fc724601866 +:015940ac0bcf236c68fa224b99b83b1a8315ef +:01595061c78513941307e028c10c4919dc1727 +:01596033f4768f6ebada5ab3ca6aa714a61ea3 +:0159700827a00f46bf0c11f853f6462caab214 +:01598035ffeda10c560b602b8d82f7082ec4c0 +:01599056c52a449fe0827dd987e9791bca123c +:0159a0a252f4c674130f68d362c284c2fee22c +:0159b0f3d0c12e0a41644b2ac4225d3aa584e9 +:0159c08c2f5a5301f67f5d57ac174c615fb4fe +:0159d0d928bd05c2fc5dacb3c8651b050ee6ef +:0159e03e8482695d014d29bea16086de88726b +:0159f063f9673ee5db5b57c3ae74a1aa3ce8f0 +:015a00f77f90e2d286ed91e1b798ef93c49a39 +:015a103badd919f7dc56c2940b506771059c29 +:015a202898b6329ffc181331248f2de08d00f0 +:015a309f0452c8a363db0386e5fb9ff8cf50b4 +:015a40f056851930e93b08e402637dba6acbd3 +:015a504166dcbbf3d0d587b0dab2eefddbe5fb +:015a609af54d4aa39d1e532d5eb9e2cd3afdf7 +:015a703a9f2bee264f0056f99562203d740fcd +:015a800d9ff6be36501e43c350506e36ef1eda +:015a90eec69bb398e078341a9403fbad37709d +:015aa0d5f523ae0b274013551c82f7aabdea62 +:015ab039b8313c897c9037c13f3c58cb8edeb4 +:015ac0d2beae39893b12c47aaa88b037b7f479 +:015ad00ead5080159f0ef93bcd0313053cb10b +:015ae0dfe16a550356965413d73237d0431260 +:015af04c847dc920ce78d228f85ff3c42bca26 +:015b00301afb722f7eff418a0ff2fa22ee8ec4 +:015b10886ca685436ed90c43c9a600ec2a1de9 +:015b20b5118abd7b211dc2ad2046da0fb51372 +:015b301470c7a071997e071c0715e70a62373e +:015b408470d1f46ddaf0c5ee597685da3c08a4 +:015b504ca0f84eca2a2bd3f08b51741cd11b8c +:015b6069ccab12b6653d1363d845fdeb6df42e +:015b70c29ed2b6c20e9b01d530c4e78fad8675 +:015b800a0e6814b2c91e35e1d8b0c22074fcfa +:015b90ceeaf16721562e3d862d2765d506086d +:015ba054b588355f4a29530f2432a4274fb0c6 +:015bb0ec0d82b4a924f3f308cd6104968cf781 +:015bc080239a8b8547b27afb9b935aac653275 +:015bd0fe9d30068cfbcc54777f56c56764c6ea +:015be0324d7f7232b54032856bcea5808ea27f +:015bf0dac559890413eafced82ce847f841f3b +:015c00a51eb023935b9ef83f4f67b8a450e3f1 +:015c100ebf868de2a7db5ec4fd3022e4c907c0 +:015c2095d76547d068fe99590aeed742c828c3 +:015c309f45c344b05fb3575e1df4ab15ece53f +:015c40ef327015ef1135af2a3c37607cb7f16b +:015c50ae0f07a16ea81bd3044939bb5fa44c59 +:015c60c95be847832c2ee0d26a31f56e88eb2c +:015c701fce8c4691870a804556ffbd6f03485c +:015c80f56e8c2c17534ae35ceab433771b54c1 +:015c90b365f6f2702a354be4b56436b8ba9c09 +:015ca0688771147a58f5546691fa9b6b8149e9 +:015cb0cf39b703f87c1431b6ec3fad33934d5c +:015cc0246e0fee52c67b54fc4feaf39fbceaa5 +:015cd07f496fc892e156bfe5da675659bc8c4a +:015ce0120d6e1ca122540a8d85a79e87434a28 +:015cf0d74b8d8ea87c2b8833fe8e88b4c50ffd +:015d00d181aa79660d6f76e1e4ecb0c791170f +:015d109aa4a7c2be8d602e6e5da8ab40bd5220 +:015d20ba4866bc226e5e324b987902205490bf +:015d3088cf34c2fa61729a53a337930b7d23fa +:015d409fbdfa5695338d758183514a38920bed +:015d50c064672b066225e39a42c927fc126d0a +:015d60d1acbb06631f65d905c976f5d9cc7a03 +:015d70a306ff4f35c4038ad51b79a70d96d18a +:015d80f5674fad3eb7a142c82147a530072a69 +:015d9008482ba665658740a8fa45235e49e282 +:015da0348055bbd93f78b6559d9acc64ee0055 +:015db0dcffe48f6df6fe398a2ab14fbc2d68dc +:015dc0b9c5870663810bd7b65b1178cf5f38c2 +:015dd05877b338b7e429b743591cb45c3f7074 +:015de042ef14b2d972d2dd66748367b9cba9bf +:015df03e0488cd95ae6861c06a7ae74d605b8d +:015e008e3f01a564da90ee96c8c27d9c811158 +:015e1066dcdef6bd92987e47a64b818db69319 +:015e20a99a27c02d8de45e99a913094551a176 +:015e30cb0829fed12d9a70eebca1ab95af581f +:015e403a8b379104b233e425821954f083e7cc +:015e504b7bb4bcef3192035f76d2ce1ae984ae +:015e60c56ea0572df6951d5f10a5ab0eda1c9d +:015e7026d0dc471ea64421b9d319f1462b9c5b +:015e8080dfff44f8558fe33be1c1cf94378158 +:015e9019a0bfa6e18e1db87547e041aa342a19 +:015ea0e563ce266ca71dea5d48efed416d57aa +:015eb03421341a0c1809617e613e4fe59090c0 +:015ec0eb407fe7ebaffe23322fdd0291307ca3 +:015ed04f0b0ebda8319ef80d76f3f05d45a140 +:015ee01d391a3e91d4470ca8581a88a5974163 +:015ef01fe9aa9d5d7c3dd94c053b8eac3b71b1 +:015f00e7cb84762ad286a13c59550ae233ad89 +:015f10dbfc07ab41f438cfd9b0836677f3a0de +:015f203f2159abd51e7fefdb14f3d4e3ebc996 +:015f3071ad4492943e1b6534e1aceb69a9b655 +:015f40395abfaf3b7a80d7227e70129876fc1c +:015f502862b9befcad260622488daf95184fed +:015f601d114daf545dbf80084d6a128869a95f +:015f70eb10966de0c2fe80f1e56af920f5d57c +:015f80c2e20ec4407e554929bd1f3a001ee09f +:015f906f4e344fbf81e0102f93cdc12a31c248 +:015fa08aa4a6f1fcd5a099ad8941a0ac9dbbec +:015fb07cdb72ff73b5039a857223bd95291efb +:015fc00953f2c59833a20dcc74eb48be9fb615 +:015fd01f9bf1fdb7c1458e9aaa3512c8233c05 +:015fe0a2792ba402132f9ede259be12d4afd69 +:015ff0e555acb2dc083bcefd32b207261ea58d +:016000424932e92cf77ae1ac18c8aeaee8c713 +:016010ba9e714e004fbb1209b54b6e22b1b97e +:016020d87c56d68afd5b48031349fdfffed33f +:0160306734ae04963db209205925279da55139 +:016040603bed7135590415c84364b147b8574d +:016050407980697b44c0078d6618e9d4674c6b +:016060240b2d4bfc167a5e50d4857b8fb9bc78 +:0160700de0a1184175f769c310f99d03fe751f +:01608070ffccb04e79d1808366975d070bec3c +:016090c488d0dfec0d0399f605ac3e52ebe431 +:0160a025210195759e11d6cf43e5baaf5c5c72 +:0160b03f0db715b986c45bb271d701f414be35 +:0160c07c7ce7f437dea1b9cfee2a343cc02922 +:0160d04626919b72e5e7305f46ceee641b17cb +:0160e0f81ba26f20ac5a18330c9122d67fddc4 +:0160f0169cde2d22cb6a29b02edd5e07825280 +:01610092a35f27615f408c2eae90d028c9e6cf +:01611093830fad07a12ce360ed2309dd1e00db +:016120c55bb6ee791cffa549373f69c28a2988 +:01613039930854354a10301d677ab27aa97119 +:016140c191ee4eea5a42067d661c5619237298 +:0161503420609e411db76e44dd67b0f21d2e67 +:01616046107e876bca564ed21863add53175d8 +:016170c32197782e4a693d08c32b34bc0ad8be +:016180beb7a6f1d5b3c1b6e0dcd57bf3cf6458 +:0161906fc3f47e937dae9dacb58c376a6fa302 +:0161a02d5a970e79fa85402cbab8f124283b04 +:0161b02d8115bf50c07cfc8ace181287fbd507 +:0161c0218beb576c64402e356fc8d7d08e0adf +:0161d047ff26751808e3fe0edd66223f237baf +:0161e01e1ab1e7a1bd56298530507bbca13afd +:0161f002372511a9ed17467bdcab0d82d9dc7d +:016200be2d705d802858c186216183a2ca82ac +:0162102921e110e158b9ae294ac7f97d01ed37 +:016220913771d9f00e5305f0c4f2c4be4a6dd7 +:016230eab5502e26a30f7f2ec39a942801ca71 +:016240a1fd469d1f8977cea14dc2d3605a2e3c +:016250237875b615ff815e32fff89b7e333ded +:0162607d4003e0ba5bf094d6c41a6ea463f45d +:01627092468e746d35a0593699563c7083d7e0 +:016280c5a8a1599385d591eb0e68fa212788b2 +:01629074478616ac4f40699de05ce1592556d2 +:0162a0a00a70757a7552b669870279ba4ed7b9 +:0162b081ef2bf7a5ca70a50bbd90a24ca55834 +:0162c01bd9050e5f8127662eec83af51f30e04 +:0162d025d51a9143f0eaf056c4bf552a845209 +:0162e042ee11b85d2b71a0b9d003571922baed +:0162f0777277813a48f42fc79dbe20c40bc94f +:01630029e28dbe920585a7a8aae431e76400b6 +:01631041ca0749d8c19e70d07a1b60697d3407 +:01632080f53d7ff66c71a9bee42392647efd5f +:016330220eafe3c2929b8cd197eba9149d2d21 +:01634096b9a60591579af0fc534b5b91221a22 +:016350b8816a5571372ef418f2c9c2159599d5 +:016360cfe5f78f8c53d1e6cd4b7e7e5588414e +:0163700180fcea003f0e9862fdf934ea357491 +:0163801dbf23fcfa16ddbd2d8f9731d4c536b8 +:0163900f3a31fa99129af14f7e775e040e2239 +:0163a0f009ae0c0bf043077a68074bdf35a2bb +:0163b0e7aab6897c347a74701a2d8c013e6321 +:0163c0d15da401544248a39572eaea2c09cbb4 +:0163d0433ccb67d4efb014be4699b2a62a2a3b +:0163e0f67f5768324368a241862ec1c4f90974 +:0163f062934a98757bf1dfba8bdbf29210dc56 +:0164004a78a269f0ac61cc27813256dc063a6d +:01641044d4de4ad8f54c804b76e44e39a2c3be +:016420b647c378c0ad5249f9a36008332cdd2f +:01643040a201a2b46a9eeb2a928a731969ce78 +:0164401b8fbe9aca08b1aa3d35cbd9d7aebc9e +:0164506c51f649164d8a4b459a078260b678eb +:0164603e51f218010558c5a6a13bb581919d90 +:01647077ce1ec1ff4ed7a9a564ab1a8ba505d1 +:016480b0abf4d42b60140b81a024ac0b28663f +:01649003a36feadc0d9d886b007da1f3c9f1f1 +:0164a0143ffe6542563242a2e4cf9d364ea973 +:0164b07c991bb989c3286a3ca8c69d5f50eb53 +:0164c0d491982dedc300dbd8ca89ec34a90dfd +:0164d05be6b43abc93ae203cb48ea02ad113bb +:0164e0abb40e8f101fe98b005caffa2150ef44 +:0164f0714d4e5b06caea9e09d5cb66a2a569b7 +:016500ed3aca257facb82d7f4b90ff22de48bb +:0165109c103a43b8834ec1b582b543d7bd5f3f +:0165208597bd3697c59af59888ef70a12e49d6 +:0165307ddeea8545146a263d0a745fc51ee9a0 +:01654017b455d2c233381e5d0cd9132b7cfcf6 +:016550b4a6abcac67d85f319a0f3a24edc79af +:01656010f1dfa0c6a729c110fb00b51c17b414 +:01657002df968abe7b634b78d00278991a5fd4 +:016580d40e1361273e6d32f0d882de2319da7c +:0165908db493e69b9056907c101bdd8e41e774 +:0165a0b7f6657c9908e9cab4d33678cc2c2084 +:0165b090b0dfc7988aca78360dd7fc1260c1f1 +:0165c0b49fdc621eb54ab3250e9a50bf54ca54 +:0165d0edd52f84fe6362787336eefcf35a6443 +:0165e07f0ff4b5cfe51915437532cc0f9240df +:0165f05168a758c0822f27c2733417e8960fe0 +:0166009891c623aa5797373d16af85bd02f9c7 +:01661085d354de1b2137def65428c85158f652 +:0166209a2c70d7b082cac89e04a05c3591c740 +:01663020752ab30558203578a98ee361ddfe4f +:0166402a77f1b6df1123eb03eb9085351b0cf5 +:016650055fbbeeac56fbd36bb00a6bd3f48acf +:0166609b149147c5de677604e169a9415d38c7 +:0166706ea48ab9cb51c74c4641f10aab748321 +:016680f366a986952a1d5316ce53b2771a4f1f +:016690da6d55a173f871af27a1e2f431246281 +:0166a00bc2ac2b45cda10c07e0025c9ded93de +:0166b0c7e07e504f96a11fb9d981ff5e486d91 +:0166c0d7fb35975f876f190344bc4c209449dd +:0166d0a3b2280689ba041e6cdf01b6e9a144e9 +:0166e067ca4420f3492cf5c6bf3d13c0a1b507 +:0166f0af7dbfe041269ce1f9aec6320ab6bde8 +:016700f5cd586042344acd726607b507dc5f45 +:016710bfbfecb6514a0474fc74ff23d876bbf7 +:01672043b8dc5eace71ff5e8259f6c88104fe5 +:01673039bc531ebad00a70c4eb8b22f1f13219 +:016740d300ea9d2494e2f710778056722ee259 +:0167507d2b30ec0a32f8c0efa93ea085e5a3ca +:01676056ae1f5b54def124d916e29dbbc1cd96 +:01677080c64cd0fcc60b866dc0407ee182db06 +:01678093c05be2e39f8cd8c79fec96c9f626b7 +:01679000d64deef2863a941265c92f31ce2cea +:0167a09f793e89cc1a82358318d27676cd95d0 +:0167b0a4f24b11733d9f793cf77c1e71aba5ed +:0167c0c8133381571bcb1f78ea9810ca50238a +:0167d06c69df3c70eb2a2a7deaca7064b5f12a +:0167e0aca6ab0182434432e93905c185ff292d +:0167f0b30698e5de0060a5ccb16f02e1f0293b +:016800bdbe1b03d51c715630c5ca75df0bcd71 +:01681095281e3fc9864314c43302f9c11e324f +:0168202b08f2b7128df9e486218718b76f97a5 +:01683088e9123eb60cff3161951a564799800f +:0168402c0ddf2929b680e4fd98e92080fdd0ea +:016850610d9dfe17b64eb291660f53a187fa25 +:016860faee3e0e7407bf67befe2d53476bea5b +:016870f388d5f0bc5f84ec8f9bc03035dd31c0 +:0168807d015f1a446a7d1e2ef3ad2b02916fd0 +:016890d928b4bfe7eb1153e457ebac10f86bff +:0168a094189c4cef938f4286d178416acd6baf +:0168b039415ffc05d62f97261779060e483ae8 +:0168c08d709dec5db7b0f1b1ca0a9e0b2ace7e +:0168d011b800b439835e029685e0c7ae211d1f +:0168e0710fd6c163345f8b803e1d500cb09be3 +:0168f043ef7dee50795fe1f17e554df802d4a7 +:0169005a54821e187775fa2856f12bf66d39b5 +:016910c6e6d90f7e554aae083783095e51c14f +:016920e3b4cb7e78c663a6f7444f985ac30553 +:0169301f70264e8fb9c626cc266a5395ed9f70 +:016940fdc481901b7ee9e3a40f2e045c621290 +:016950986cccc0b37034540bf45a15531050f9 +:0169606e16c3fa97c368ebc48a38cbaa600674 +:01697035e241dd75a89006f2ab7917a8172d5f +:016980e113512e580e96a7efbefaf7e0e59440 +:016990b052f9ea98edac15e2dd8f3e59fee031 +:0169a0a0e6140eaeca4c187bc2b337fd038251 +:0169b0ca7c19875c02c67e777ea88879c22aa4 +:0169c01c939cd6ca98afb54d0b6f8a50596e71 +:0169d090b5b20edd13d8685ab40163ba343e88 +:0169e08186c7c4f0875970e4a06f05a5baa1ce +:0169f09de670b5dc84acd5bbd2752b2e41ab57 +:016a008e780eb1473e7393cae98834be09184c +:016a10b6e281cd929210f23a566917d42cf65c +:016a20309e7f890b8768fb6b66719269dbdf41 +:016a300899203408d40e5a699e0012a7928ace +:016a4015f3037c8f1878ded2b7ee76a9e2194b +:016a50f79d8f8862af59594e8cc34b343daf9f +:016a6042bb36e6b2fddf90d981ec1c9c39e927 +:016a704e98af16022616c0de74d0b158b3ebc4 +:016a806d19f28f3f50d8019738cd1119ab4671 +:016a9074b24905434fd4ec138fd0bc50bcfb4a +:016aa0df62248059e8dea17a1dbdf907f4a2b9 +:016ab0c5ec57ec9eb3a97d9c1b6d650843e00f +:016ac0bca7eec658f37257e49ebb873420e2ad +:016ad01b840f74d5561f2e5cf27a68bb7dd92c +:016ae0a51681ba22f28a6a8e9143f95fc39471 +:016af09d38907cd65b3ebeba2ddd986694872b +:016b00d06e048ffc6b696b9bacab7b72f4af86 +:016b10c81b34ce01c2bdc8cfb411bb08f9619f +:016b20ba03f92bc68bb50c26ae0259da0031e9 +:016b30b37f46d6dc94679d6367ddee7c1c6332 +:016b40a9ec3f619b087ba34a12cfef3bcc10b7 +:016b50e1c2a8dbadc63e28ccdd2f161140a2f0 +:016b60208b2f338769b34dec9fcccac1cb2fa4 +:016b706e06a8f8e21f61efbf5015df47698a68 +:016b805acb5e5b19bfe65b075c4dd6ec1a3e81 +:016b9076b27b63bd7a5774163047893b342327 +:016ba072a6c315fda48479c58c10e44ce014a8 +:016bb03834421063c0a7a01a803078e090b30a +:016bc0cda4d123df28f201ddaf949c3c12bb9d +:016bd050ce90269390a949bb74231db06cb53f +:016be06b7072d3bfcbb3fd404994cb81b5fa10 +:016bf041c0aeb543b050ebc39d2b8c3f1d4dbb +:016c00e1f811345a4c6fc0f21944e7444fa1aa +:016c101559af06557c7e3d6395e3e811ff9c47 +:016c2074062d54b969b16f0b7183b6596a6e0b +:016c30b9a065f71d21e7b95d8bd60d981d1dfd +:016c4092653dc7ea02db9aec1b82754bd760a1 +:016c50a05b5cef0c4c60b4ec317e772d6fc9cc +:016c60c2001e5787628417a4740d3363e1dbf6 +:016c70862377cfdf61a8b2d7b789e5edd9a966 +:016c8090feaa235e9126fe83a297027ae0594e +:016c90c98b0b055b33f6cdd6b0ce60a8036013 +:016ca0155c977f96b1b224dcd2717202fa7744 +:016cb00871bbf22fb11d50aa9158478ba9ec89 +:016cc0b39b7b7375ed80ae840eda9868726656 +:016cd06d91524fde04d728e2764b812214481a +:016ce034dcb9608677a1a9365dcc5129c19e3f +:016cf0f258ed8b8a49bbae3f7eb355c660d88b +:016d00ecefd526a64ad2ed1479be5a5f17790e +:016d10e2d225b68745ec8b13e02f8f64943a82 +:016d205fb79d373a6e5753e69b7d97dd9ed7df +:016d30e5c04b76c0c18d7bfc4c6da4955f6f65 +:016d40207a2a594fb786437d6f1565a6e23c87 +:016d506e5233b683a661d69a19816ce913f4b9 +:016d60a75d931b3216b6b6a43895aeeb7bc2ca +:016d708dc16d20873555cee94e7469f395fc94 +:016d80a67fe440988ec1d363bcabbc48099f5b +:016d906b486ae8e3e01dbbc9db98bf28ac19b1 +:016da0393951ab5adc7e50170120c012d0c7cd +:016db076bc592ca94d38868f77884df78ea4e4 +:016dc0593281520b4c274fe0fe185cb5da0bb2 +:016dd047c6733f2789d6a550ce4b1abb679198 +:016de032295b6e9c31369f61c558ae7e851d84 +:016df0d2d899cd9c82ef06735178e64b54c295 +:016e00cf2e62601b50c1fd42ab3b5518d0bf5d +:016e10f0f1d1c044bb55048d4a5335a91f6bef +:016e20185b3ebb2213784945062b5b7e88bb06 +:016e300dd49ed37e1c4d2b4118a7416829ed65 +:016e405c2305cc800e71aef6a3c4a87b50f2ee +:016e50651cb2c7cc5e874803a92a21f2180cbb +:016e608ec59a40eafee83c33b84327ee9fac40 +:016e70866352b1e4abb500a003d0c0d6ccd314 +:016e803f6cfcd94ad6659b523261746f4f021e +:016e908d17b7a5437e2c3aa298d7126af48358 +:016ea0ab5a92c15878650f133934c322285d69 +:016eb01932773edc7abf6e990a273a9d7ee8d2 +:016ec0d09b6399b71fe0fa19ade91eda733d3b +:016ed06e4b36cdf7ce38219a9bf14cc55a488a +:016ee06e938bf722dfdedd6a674127f8157287 +:016ef05a3f81971027e0e20f59ec13756fb60f +:016f0082f03df62020111443e91f757a98caed +:016f10dec3428f77f47efb9fa400b3cb4bc767 +:016f205aaff5628e0387e0e7fc302e06343636 +:016f30b312d4e45a27204649f5ae1be87598c4 +:016f4040315215321035ea3cec40c157017c23 +:016f50bbaabe0958f89d9539ed15231fd479f8 +:016f6047353fba3b2cfa2fba1a4b5007fdf744 +:016f70c581b61dbf5920337ef3d6369ab7c55b +:016f8022ce13f876ef154691e4f408ef8494ff +:016f908445e1962e15493917c2374003c91e65 +:016fa045bedab04673df9aea0fbcf062dccb68 +:016fb0e4bde87b79c52c5cdd7ed1760f046c05 +:016fc037ed43f577d318e57fae10fb7b0af862 +:016fd03fd139e8432b628a8c5fad5ef6830932 +:016fe09aa6715165b8ebea5f8a21052b072d5d +:016ff0c9f0f3bcc5049e2a3549b067b2b7f896 +:0170000ffe70629223cc9b554b193d6cd8afe1 +:01701070cd72c2c5bed2662cdc45160497b683 +:017020dbd62bf13b5da3617b0d9ce59789be86 +:017030a32c36f7989273f08a36cd84009b3a6e +:017040a2ada1100f5846a0c96d65c5a789be0b +:017050f1560703c3eeea932f7bcabff6ff2672 +:017060e66a64fc5c9b4606e026d6f2f5cc3b3f +:017070b9b8fe99f156e6ea24b022aa8f0203f6 +:017080a72692a93d9dff42384e5f89a1dadeee +:017090af9826281dd8972847a300548a24b983 +:0170a0fa2718475db660d1cb55d6276242247a +:0170b040ddd23c6b73ba006d7559861584a1e0 +:0170c0d488140b9c9db3a242af6cfc014b10a4 +:0170d0c642a4a7c99fa07d401083da43238b4b +:0170e07d27800693e5efe8eaf9f4c5461cb4ff +:0170f05e005d49eb81635bb56574be93d74543 +:017100920d16c000bcdbb8888b92de66167d1f +:0171106461daa24c56747ca1069f52c38aadcf +:0171205dbf732f78a10ba18d6d75f80fdfa448 +:01713000c2879ce59493381db96c544029dc39 +:0171400054b461d22a3a5a082dfb24443554a5 +:017150ccea2611f6962d840a9af730a401735c +:017160d122635fcd77b85e74ce1d80401830fe +:0171700d3d86c26985f73b5f25c01c055fb3ff +:017180e533b0a45148498d53a1489f789caf61 +:017190429053d9f118f812b4c6bc510a6f69f6 +:0171a0f385ba6cfbca838c0adb15541ff16fa3 +:0171b0658c58b29fb5dbb853c6e993d5359eff +:0171c05493c5070d8a59c78319a7c606edfeb9 +:0171d0dc0a7e980a358a9447f34c40d1ea8b0e +:0171e0a249534973fc75aa8cbc4ff3fbed12a5 +:0171f0dd3292b2bf8bf722708dd757c3ecba68 +:01720011abceb4334707b63c211bb68570641a +:01721022e580a6f46555921d69bf13f4d04ca3 +:0172204c8e5c49950214a5f89f0238c6a9afc9 +:017230bd637b9ce6f83fe363fb28b264a4c717 +:017240c0e1c95dd6626aa83fb23ea5332ebf11 +:0172509cd5b7085f2dbbb24caa1504aab5c78c +:0172603e3aff4af9f0fbe10550be6c141f534e +:01727059ed8c1fc3e279a0fb928a20ec8610c9 +:017280a1d245e16dfc686e859f2a4328e3281d +:01729020754ee2e082a8f7cd1f9ea137e12ef5 +:0172a097cfef1cae86ed22a19b3285eb16ec54 +:0172b0a8e2937dfa63fdcb08334890ed9af59f +:0172c03147ebe4f451b2307fb610f91f0aff12 +:0172d09ff3c67dd80d393b0736188939a9b02b +:0172e01f63e0ff6b7e7a31a0c0c82ca112be88 +:0172f09c4cae1bfe3d6ec6f661da9bc27cce58 +:017300f666f3bc11d1f862703aafd40959bedc +:01731080f5d44ec01fa311b94a23c6880d0f9f +:0173201610700cec907848fd034323cd601acf +:017330393599a353cfdab6bee9fdd025ce44d0 +:0173403355130609ad89423add4a12c5cf3318 +:017350ad21c4bb0d85cd976456ff0825bdc8a0 +:017360b4ed2f44d87f3e6589d71cae7f2d196a +:01737041e82fa3cf195462af346611ce929c1b +:01738092907b8fc28ae91426e2d8df9ae20379 +:0173901fb07eda5974f32ad93dbf39500b5c38 +:0173a0314fef5ce5194e9e99357f14ab0b78bf +:0173b0f2357dcf8f6f8032f251bdcfc7a9869a +:0173c0f63155726ddff1ae0ec81b849c6028be +:0173d0a1a0a86137b1f74e25bc5ceaa782e159 +:0173e00ad15dcda5695fc8f2b94b76b2b0658f +:0173f0d4d3826e06e7203518f728161c9534b4 +:017400eb31afd7fee0296a1a6ba0e87d6431ae +:017410f153f140810802bf24e0643ca5c25d48 +:017420fb44aee92202192b485e9dd53868556d +:017430b7ce37ad2c3c493e63a31b62f0bbbfca +:017440e063afc3703be1f237868e67b9a9e81c +:01745069daff20df0606ffd7b9b642f52db8be +:017460df8e8fa60ee5df7cbe931853e15eaa95 +:0174705fe448e3b0aa727d94b60cd57d6a45fd +:0174804cdc66d117393870328d3a640d16e25e +:017490c13acb46fa868f567a181dfcf8311f05 +:0174a0f1db410b8ef0bd97db5810a0e9b6fd7d +:0174b074171a4504b3dfd9273b302eaf30100a +:0174c0e093fa8c5657074f3b9f66a3b044a4d0 +:0174d01b9f2a89a031276f5e1c492a87bbe863 +:0174e09adf1a28ebdacf65dccc32e4688d496e +:0174f059171eb5cf7996b4bb1f481569ecd8ce +:0175004cf04562f14c36df5008fd9407d6a99a +:017510f0a9bd339498c7589f53d8cad27a1472 +:0175206be41facefd7532d7022442e2a30f9e3 +:01753056794757e3d5173026be1774864b4ae1 +:0175400dda60f909c62e0cfcad75c2cde6fe53 +:017550134af90f5fadc402f96662ae4d68fd73 +:0175603fd2c55df5d396a2389edfee3ad00264 +:017570ecc7aae86f6b25c0c4c971ac2de352e7 +:01758087a1e92cd1c54143646354864053db8a +:017590707c2cf308966a10873c96198fdc6d13 +:0175a032a214ddf82455b05493ece3558ad65a +:0175b0d4afdd3f8ad343616fc4ed14a4cf6e62 +:0175c04736f59bf3fee035108ad81a743fe5c1 +:0175d0ebfc17b15c6db4a3d434bced34f876e2 +:0175e0eeb07f2473dfa2e01b8497a830608418 +:0175f0af9352fbf99f94c900f150bac2c36b22 +:01760025be1e398281c4424c5956d5e19fb4b7 +:017610bc32a5540238891eee7143829221f41a +:01762076074f764e6daf11536686f902a02305 +:0176305dabd622c3378b02a813655b64e26f78 +:01764057c42440feb3a04615bb6685013d9fbe +:01765045f1a84cbd4a6ad366bcb56099514e02 +:017660089ee2934ed753465db43ede15762064 +:017670deb23cdf0cddac4a098d492ef3a7e304 +:017680020dd8439b742e61f94f1959939500bb +:0176906d1ceb53cb084c1dde09aaba42f03924 +:0176a090df8599e39ba0f3783fe00dde8f1c3f +:0176b09a391878823b9e938d8f868bb9f0cc16 +:0176c07cbdce1fa6d86c3a2adb2b1ea1c116ff +:0176d0867065a23b1a4d82709e6afc53aea959 +:0176e0fe6733a0a238f44e0f319e88fc84177d +:0176f035445bd172ee147a94314c7b50ee1cd5 +:017700588d5de23e71341414bd79836262761b +:0177104e316226b56e7d89892b6215ddd9e18f +:017720dd44a6524a25f7e22081a9cc011029b9 +:0177305905cfa7882b9011998a1152b558b676 +:017740d9cdd47b4afda57d056a2a5d870881eb +:017750b04dc90b099d24f2860b002129c943a4 +:0177600c59c2ebcfa988aacfb4825af0bd100b +:017770932576fcba95901ffdd7a989fad03877 +:0177806b42570c13a3c0240d12354c74e6f578 +:017790436dbcda85144f9c69876387d2e3da9c +:0177a0757f05774260dbc540d3af171f0cb84a +:0177b02135f901f12035929e2e04b41ae0275d +:0177c04c2dcc5e2d4adab0406ca6b7334ad88a +:0177d0354acd97b465c81f2848b76236a97076 +:0177e070b7bade4778d9581b62edb53ec68982 +:0177f0e1f6f90dbc077a4b931d08ca610d44d6 +:0178006d4a43e4a4098adacbfd20d4a676a2f5 +:017810b05edae6b0836721268dd8cc17416e5f +:017820c8b756f7b6c01734767a890f5f2d5e84 +:0178302547f2a73297d0a91787a50af82539c8 +:017840def49a697269b5cec223abedd6e5d6dc +:017850aa2a525fd7763b6be1c7a6187a74297a +:0178606d6ad392c34911f959dda8d9b7e0fefa +:0178705f5aebb2c47f10199d99508be7a1fb87 +:017880eb5401ca08dba67ac97dc48cc8489cbc +:017890f972a98138dbeaac18c0339dceb4899f +:0178a058e5ce48170b2cdd19484746feafea36 +:0178b0d376645936921c537b2ea7b4fe586cb4 +:0178c0c09d155ef26ff4e917b7a7e2930648e6 +:0178d0d3b207f4e0473315aba79b0ca3fa32b1 +:0178e03833b8bb839ff6f2ea785b3f7133f225 +:0178f02ff9faf1084f25618c771b16f0675783 +:01790014af5dcbb65fbaee83d60da0174484e2 +:017910f1dd159c9cebae38ebf16d1d63ef4232 +:0179209f9eb3a55ed5be367aef73900c43c6ad +:01793017129807bde4019826b86f16ed3de7ed +:0179403c66fdb5fdf89a10bec3d9427b514610 +:017950164870d7647a3662fda412e9a7d9ddd7 +:017960c9f57af1118daaabf30ea4edb79332fa +:0179703d11312ec677353dc73c15ac87dd87e4 +:01798089944d7ed9b7113b60161cb690c9d4cc +:017990bd8c4de535d0cfcc93c78ca87e7a3ef6 +:0179a06bb1d8d099e6fe84d294b2b77499583f +:0179b03a99973ecd2ce567885a04d65efdcd15 +:0179c0cd8c422fb27f1ec2c37317b88b815bed +:0179d08052c9c86701a2b875fd23dd16847fbf +:0179e076541aeb17c7b3ac1ee5c875ce5573d5 +:0179f033dea6d067a49db954222ba0650d3b55 +:017a00f9e68f468bc335d533582332b8837036 +:017a10e2b152d9bdd5d762fb5bb5566b4486bc +:017a208d0d7a084f3f2522360fea87aec1c4f5 +:017a3074cf5cecbc8bd68c2ffa561c3f76a9fa +:017a4093761149f6f53bda66dc8bf46dec3faf +:017a507e950c362f1002b9676ce42456e708d5 +:017a60da654a82042963cfa2bdfd2475c377cb +:017a703f05a2ea327edbc29eb49a68258264a2 +:017a80dc0d198c33026bfafe2cc71dae0d1c97 +:017a90808ce37eaf041f531196b533c35806f9 +:017aa0009ed03981d678fdff668b8f76953051 +:017ab09c72c0a00101617894e119548c0dccb7 +:017ac060154ef30404b7d441b4898100385530 +:017ad03baf0ff7e12ebf8e936d9063ca2c9166 +:017ae012b57decc861c6816a80bfbd85584797 +:017af044e92bfd2f706fa664fbfd3ecec9a85d +:017b0047d608be77880cdcfff0bc7a3a0408d1 +:017b1089a5a29123ec8c7d2571548e03345e74 +:017b20c61af68cc0ebe55c4cd7c0f43d5a5cb9 +:017b305515e2e8e5cf1ad1be9666895a105341 +:017b40b4a1a22671b704da958a7236c28b3356 +:017b500b930139b98229a4b401ecab4efc20c4 +:017b6015b333560ffe45b1c1c24e00e6816ee9 +:017b70d95657c2362afbfb8b9a748e6c0ee6e8 +:017b80d9bf8744569171a969fc3da8188c99ae +:017b901a30197327b29c661575c525f1be395a +:017ba0c98b24b202560466355e1d0394392824 +:017bb06df84184be3708f4b7c6ef77cbf582fc +:017bc0cc54988fd26251cfe05adea32658f113 +:017bd03db3f1d634d973fb629080cbc77607f5 +:017be03f43aac9399b934d51055533ad8a4b86 +:017bf0eedfb79493de85f5c161baabe8db7bf4 +:017c009666ac1ed4f97365a770555758e53739 +:017c101d076a411aa3a6e31ba3a82707eb4606 +:017c20483feb3b693fb0839f175193c40c6ef4 +:017c30038791241b8b8e6b2379a8bf896793e8 +:017c406e10dffc9d85046feda5e31ee0c4dc50 +:017c50fd2d078fbef928bb1ab585beac1ae22e +:017c6042f4e04117e2a929d5053ba8a3c700b1 +:017c706551cabc4bde1010446cd35dd4d17ee3 +:017c801b2ab04e568dcfb0f515a3f0171069ce +:017c903b64ddc2a10e59cd69703915a9dbf695 +:017ca0b439826889d87450d6b1e6892ba776bc +:017cb0a73292c488aae22865e2a404b86f89ed +:017cc0308275be1c2836e45a7ff666a15b335b +:017cd00a77eed87d2f17d88fb1b98c4ac18591 +:017ce00527bbfa07ac2187e3c7b33f0e9039fd +:017cf0606d421aa1be5bd252f6273790339569 +:017d0065d97182b26a8d5ecd72950a3b0dc846 +:017d10015690ec24015d4c28dbfdcaa002ebe3 +:017d20ae04f0757b7ac3fd4c1d1aa8f22cdb99 +:017d302c550ab85d5186a01b7647cd9b31ea64 +:017d404db4eea9fea38b79009d53a0f5d936f6 +:017d500595ad5ddb50e68291a8e47ec0d15e24 +:017d606931c621463d2089cfbed78a745bedd5 +:017d706c5b8361b5dc1496a106dcf214ae9941 +:017d8074d08a43898a3c062b1454825f535149 +:017d90f9cb70cd65d6c6a50eb300b5c0cb3aef +:017da000d70b0d92949c52ebf29bbe4a3e4f7d +:017db097a6e79f861f637ac92c35a53260452a +:017dc03c7e50685c279f74196cbc5f8f16ce1d +:017dd04095b366f3dabde6af17afa0dc06a8c8 +:017de0c7e8f38c7710e5728a6f586b1058a07a +:017df0f046ef2bf9deae04bd6b0f375be545c7 +:017e00f01a1feb14e9248961edd7be9c2665fd +:017e1045532aa3172b83361cfed4b767311d77 +:017e20b644b57f9943642743395e146d89c99d +:017e301d28a2c4e941a40b5b6034b515c9bdc5 +:017e40708522026454be035196ca4bc9db2a37 +:017e503c444c7cd53fef67d67c05982fcca544 +:017e60c89e5d50d8e72c1c96d51e2cb3e9465a +:017e705dac3fbf081d6ca31df0ec1313f334a9 +:017e80d0e33ae58a0bae8b75f2ed6ecccb1c75 +:017e90498baa67c2f2ad28aab70a01859284e4 +:017ea0302c67b82e290df65e96e4e8a5a4ce22 +:017eb04029f77a0430f4077f5783116a6c6b9a +:017ec0f6333ebfb19d9181e5494ac9f16a4378 +:017ed0d9e52fa64f9e838fe63824ca0dadf7cd +:017ee0feb19004a0a21e9c1efe7d153cdd6382 +:017ef01348bee0fd081f44f772267bf7b66272 +:017f00abe8bbcde9a0fbb70104cf0daa8c4539 +:017f10d7ee218d70091a941d42f37c13ca57b5 +:017f20fb0dc961358ec383849fcf80a2574f2b +:017f30024ec6cbde1b617b583cbc88b92454e5 +:017f402c135416b1d3caaae1eb4a6a27288f52 +:017f507eb061b3a5dbb283f1a01b05d50cc372 +:017f6059c2828cb9a1d596283cd86e158b0ed4 +:017f706fac6226c01c35a6633664aa68d43bbb +:017f80849a1c71b9ad60864ecdf8430e653fdf +:017f90a56cdd9d8a1797f5ca0a2d527f327d2f +:017fa073e3f00eeb47f74381f0d8e604eda2c2 +:017fb0607f685233b5b0e3b38af3ce89f073c7 +:017fc009bce1782bf932dc69ea1d60230d5262 +:017fd0e9b8b6791f1f1dd71d7ac35ed1987692 +:017fe08df66860b0f907dda9a45d586fe57da3 +:017ff01d939ed6649019ae9398418dc20dda2e +:0180003faef089facdd8ccfa196b23bec8f3d6 +:0180103d687a055d7ef2028eb2765ae9cbbe9a +:018020c0432c636b08ca4fd9452a4fce96a168 +:01803038fb80326f2e2ccbb14a57f84f345bf2 +:0180403b346a2268d96641625846d058cfeffe +:01805083746eb81c450d65aabf39c3594565e7 +:01806000d0fbf9d3fa26ed80eec3f1d41109b1 +:018070fea5a26fc551a3eb9c969e6bde105e4f +:018080cbe1655be6f2c37b0aa0c1ffc1c7d052 +:0180908cd3cc7472e38ad9882738a8f272497d +:0180a03b97a80289ea9370a69525edd5edd2da +:0180b0a7ad51fcec22ed1d62b9c74b99e7a98f +:0180c0d0bf1246fa33eab47706b03131a30b58 +:0180d01880ff603d55ef4f9d97dc02637152e7 +:0180e07f142e915be4cea2dff7cbf6dd15deb8 +:0180f0d03d61eb5368c33910eedd0b51d78132 +:018100a9238c077a7d08e4316d7a6f7f34bf46 +:018110873c64602038d5a27e4d546b9950e246 +:018120b868b36b8ec2c20723aa5363e3f9e3cf +:01813090ec167c5f7e34993abd29ac804f9566 +:01814027636a07ddb86338a20a785e19519809 +:018150464c32776a4852bfdd14470c4a4c0939 +:018160074c67805fc29a742426a37d13486dcd +:01817095005f481fb4be37073f5e3a062e743a +:018180d5b364e9201a8441c623e7dba8d65103 +:018190691a4d308f2eedcfaf07857557233864 +:0181a0c47bb421c08a6bea9c32b5995d50fda5 +:0181b0b78d0a6f209564d5ee2a9fcdf6be2f57 +:0181c054e3a77abc93bd7b631d7f368b1b4f60 +:0181d02373ca9e04db1e0c9b1d702a1ce89444 +:0181e00b7e64a7e9057e8e50fa8cb23af21c60 +:0181f039f10afa1618f27b5814fe19ed6cd249 +:0182000d6d65cf2209fb3213fd8a558ffe7407 +:018210efea6c7c44a83f0203e9edae5ec3e632 +:0182209d1bc2626bda22a966978c4382422124 +:0182301216f74c6c58c27627d08aba7d044148 +:018240e92639f06f444c435367490b589298df +:01825015769eb1e7f649a4c78c91117f891507 +:018260768326cc6dfd44e1a3cb6a4ecbd54bf3 +:01827072b036815a3097633dd42e826e178453 +:01828080dbc743e7abdb0d87a972f2bef6c6ea +:018290f9abc210fd3dd83bd2a6c73226c33149 +:0182a097109c915c7989302dcb754ef0b70b32 +:0182b087fdda967ba7e57840c42dd0387491f3 +:0182c0997480e0923d30c5a9e09f28ef12c625 +:0182d0843a86bc3e5313660142bbd26d9e024a +:0182e0ca85896f0889e0c73ea9483254eb2c8c +:0182f0fdeb2ca6c81c482b35e692342f51a2c6 +:01830068ba4436705c1004c8a2c44f27582afc +:018310fb98fa19852cae3a39978e3d11bae707 +:018320594922fde852a77b3dbc626e2fc7dd56 +:018330e30d2c815fe8844917e63993ebe23b4f +:018340960fe8a93ff06c63bed0214607c96f80 +:018350e1cfcb7fe40297a21ddc7bc814bfbaa4 +:018360df9838012df6c2adda11f2778bd3536c +:018370ecc61ed4c013462583757635059e5f42 +:018380ce5d4c7470572ca3ef38a03697a536b7 +:018390bbc5cb6c9b3d99ac0caf8ad323f49e95 +:0183a0b308ebb1cb968a89e2b0d7768c0ff104 +:0183b0928fdca64e2e329d02e60a6448581378 +:0183c0f03aba32a1d7928fb753f84c13d2a9f0 +:0183d0339546fedc70744df35675d4761ad932 +:0183e0b2849545b1ff8de7c0b6d4b769446ea7 +:0183f09a5bc5131c6ac97ee6b68dba9471f5a6 +:018400d9bfbaa5b3914afca31adc418b74990c +:018410a32d71eb80f5f4357cee66843ac45718 +:01842058b8e47756c6a3348e8381946d010410 +:018430344820bc7220e1f5a10aac637b208a0b +:0184405487a7506fbdd8c0ca874bea682d93b7 +:018450d7dba8cfbb11010f07e6dc35ce2af15e +:018460f48b9395be4b61d2d49c13fab4ae3a72 +:018470d519c187b9714cfdc959a1eb3140bea9 +:018480882648bf3bb577ba759773492e3fd701 +:0184906e4713db5fe60cf93e1acf5d18af015d +:0184a0b9e7f6e22f9eb0a8d46f4789eee2664d +:0184b05c84e922dd31cd89ca785b8da2e1e617 +:0184c0a423f8b2459e6af5fbd1cb4a00637e9f +:0184d0fe70e8f28c6a06403c1dbaff39753f78 +:0184e0b54e1af8dbccf05058f41ecb2d48adf5 +:0184f018c3ec5a88a282288bd839d6bf1e1719 +:0185004377e0ca92c4b866040796532759d46f +:0185107874166f886ffc5a302b795eb444a8e5 +:0185201681764bb45bf6f43b7d6efbd3e433e2 +:0185309ed745a62a8dc1f86f712fe880973b8f +:018540dfa2e7b60d9ea02868e937888e5e3ca2 +:01855048bce477ec886e94b517885c86e33c1b +:0185608c58f39f0486cfeaf13701263bc6f59b +:0185701b01d0f399fc731e3fad99c834c61195 +:01858060cd8671bb267b3c9b35d3a30a8cf8a5 +:0185902586fda888c9721523081f900f6e37bf +:0185a04693657edde89213853f5342483deb62 +:0185b02deaf76b91ebfb6deefc56da99688340 +:0185c02b25c5b815765adec88ee99e9240741e +:0185d003b58ab86a609189e55a95290b0b98bc +:0185e0558e0f00d8cdc799dad300e796e3dbac +:0185f05c0fcfd0a9316ad55c0c7b524e99abef +:01860063a6b36c21ea80c6a0e04d99b9d632ea +:0186104de2f6f31edb8bafb40248a5debffaec +:0186208c5394b44937253c9e00986e985f479c +:0186308cc6d21bd2f2a49f9e5d36a9e27e6e1f +:018640d829e85db00b322bf0c06f245e8d48e7 +:01865029e0a8ed75879ecf1dd82d2d62bec1e9 +:018660429af48f976434a8d4ade26407c33ff2 +:018670ef2bcafc786eaa201fd76f079396ac3a +:018680f1d35a8dbb3114e4adacd9dfa5f420dc +:018690e5dce1d0793dc9abdd0c0d7c0e5bf77b +:0186a0cff74b31bfc5c488ad671378f416819c +:0186b05e7450a855a6fc00ac7aa358a7952815 +:0186c08f6436422553619cab25fe935f3f2879 +:0186d0ccd39bd2781e51ed0d2131af967b535c +:0186e04cb0bc33a96bc29c3491b8ae55ec3b21 +:0186f0f2cefd8e5fb0281abe19c65293892228 +:01870097713f3d701d79d22e7b9e3326f547c5 +:018710935737671225ff769ee832fb6e676220 +:01872066f1d72d6816d04ac8ac32a83aae5739 +:018730ee00fbb063930fc8bcd94a588d49ff77 +:018740d2993d2d7a535af1d4f80a9487150c72 +:0187500841688b26b84aa20bb4da10f3794689 +:01876033a86f20203cf19b952fc83cdc61ecd3 +:0187701dd4ddb3c4ea5f76fe00d037cbcc083e +:018780a71cfa8a17ac5ab8099bc0f4a63c8a51 +:0187909f244594e4e1d1b1aeb0211b57fc4aaa +:0187a0823f85f010dc635d8bc9a5370d2885ff +:0187b034865a2fe80078e2ff0f56dad723f761 +:0187c0f2b475aef6014990226a4290486dc3c9 +:0187d08f641ef8069c460df5beeb322b9d4941 +:0187e0974ff71736526ba40018672f9cbc2782 +:0187f057e16672f592dea47daafb640fd2282c +:018800ed2fffd96b6dbeb19708bbdb5b3ad44f +:0188107521a78c0252cf55283564e408fa1a76 +:0188201f2131fc0bf598c1c3dc8d63be43ad11 +:018830dda8378e3b4a1f26952bafe243c419ad +:018840b6115c314cecae4edb1d7497bba40693 +:0188502c4ad535ffbf65db0e488b695b2daf7e +:018860562712b912a01acee8bbda69a15cc5f4 +:0188700873b73f0e2e647f53852bc1802cc4ba +:0188802c995d2aa5c953b1d20eb473663dbe68 +:01889002e360403c1eec8025db9e64f720f56f +:0188a07ac53f9c3fad3a8480c6e67ad37ca26e +:0188b01396dd772a2474ee383d3556b26382f8 +:0188c067e9b7317d09262ee9234c4fd1a1231d +:0188d049f0d553f20181474da9700d56fbddbe +:0188e0753b8fe480fb0435c825448c48fe21cc +:0188f0eb207be342af113c7b40e87fee6faeb5 +:018900ca4813385ad57e2e315e3aba35473dcf +:018910b9b90b83680984da55aba312308a0ce7 +:01892071739fbb98406bbb85bc0f4dd2b519b9 +:018930b7b4314aec06e610a16ad31c4f1e094c +:01894037ff8ae0263f1c18ec19c3d9c3aa14c1 +:018950853d1e9f55286c83bab25a4b24a99e78 +:018960d6b8d2578ecd7696737c97c4caa10648 +:018970e647de422a73f3f99a920cfd446cafeb +:0189802d326b79729624865d724d4c9cb22da2 +:0189900644ea926db60cb1738855791be3e2fb +:0189a00500d2af964732cb02544c3900980674 +:0189b06f66fcf8c652d2817609786daad83016 +:0189c0c6a3f87c3ebdce9bf8e7b210431a769b +:0189d023f755c31193dac1c0a8251702fb589f +:0189e0e61b14bcf51ca108cff9cdaa722249e8 +:0189f06895c8bb246f1e7ce0518d7d29a41177 +:018a00bcbc7d5b6760955af56e5f375d41ff17 +:018a103d088f879ce8d4e8266ba8e32be36487 +:018a20049d836daa24cff06012fe516ac4d4aa +:018a3025ec48184a7107f7dd5703fa66e69181 +:018a40319eacf31b9b2e152c5e4a919933b4e1 +:018a5014fd4ece4bb4ca4e2cc74ec6ebcde22a +:018a6001f19a9f78dada1921066a1a42dc1ce2 +:018a706d0daea5d1f3d343f91ac3d0b69744f0 +:018a80e5922d8a5ddd2d0e467b562a0b436487 +:018a90170b691014dfebab237d32fd7a8e3146 +:018aa0c396fb2eb0e53e3e1563449f787d3e23 +:018ab0c1043d05cfe1e9bb530233353dfbb296 +:018ac012d3ddc4755fa99a1cc23d3496ac4a41 +:018ad0590cf7ba8dcdf03223644604b1e2e5d5 +:018ae0d570c7429867794a1113739a921d4f40 +:018af0c3a9c84f47cbbd1253c74cd9b0e4e5bb +:018b00df956e8283f7dabc72defc782d998c50 +:018b102ce4230b9f5dda1278f8e7c65ddbb29c +:018b20c3431ea056c203c9a352dc7a1e056723 +:018b30ca367954d82570be59dea2da5aafed35 +:018b407e001b9aa7155df8ea39f49bf69f6a2f +:018b50fdbc1e7a7b2b852d725c78b84308775f +:018b60191d5005e037221576f423a04e76ba99 +:018b70393381483925615d533a6b8f0cfdb8a0 +:018b80506b783784acbb8658104950441896c5 +:018b903173362e85e9c3851d0beba2efe55a92 +:018ba01ecd35c6c1c920483c4fe9db95c378dc +:018bb0f00c2ab11d932957536a700498bd1b41 +:018bc05826005bf26dda35772ff0f8b17fd6b3 +:018bd03c78ebf88cff097058259ed04eecc595 +:018be05f3cdbd982bbf313957744c6590eabf0 +:018bf06ff5ecda7caa08391791f04c30d78a59 +:018c00ba089486763166cd46942e74b815b64f +:018c10c2547d4457b8e6e631719428988a79a9 +:018c20b3caab636143e714b8af75ca58439cb6 +:018c3057f31b17a7de5ce8f234c0d7757c0019 +:018c40387fc516c6a5c754a36d21fe8bee1adf +:018c505ef65ade46bcdbb6e91e58aa8646e622 +:018c60ac7a8be56ffd4860141f65ad5633c0d1 +:018c70d9a5c6e49c353e70f80bb7a9df2dd4e8 +:018c80d23d6e84431c25b52a23d81ed2bb3ba4 +:018c90446e6685e18cfae0b28866a10ae94bdf +:018ca024e04f39683fc0d37ee2723097f42407 +:018cb02e114571737ad4e429e643bcea5b8b2f +:018cc0252b448748249f0036906cbb07761b20 +:018cd0386b9da59342b605576916d5e551bb00 +:018ce0e747d829fad954a8070a3122866ffc1a +:018cf02989c924457ba94307fedb4435a0229f +:018d004083d4603afaedef3aa5011cba641a85 +:018d10ddf602894f9958700f192adf160c81a4 +:018d2039eee54bc4d660bc6f7b1b6d880760af +:018d30978fe099fbb01ee00efc75ae75f037e1 +:018d400f2d42c8148ac492d8284ddd4346ad67 +:018d50819f6f92799e447b9acff04c277d3b5a +:018d60e1e8da14a0abc26a24be80608271eebb +:018d70d223905b0ad38574bf26c95b8f83c272 +:018d8085a001d4e2f809bc89be4b872df056d6 +:018d901a30e0949041c91b127fb62fdb67d8f0 +:018da04808f4bfb4b02b7778b3b1e2102b01ff +:018db0c6f00902cc65d60a757cb686314966da +:018dc037bf2397080f8facea8d3cb537f00300 +:018dd06ef888eb4818e791f6f153bfe50fe211 +:018de0b78a8d283f79f8ac6d050b4d9f0ce297 +:018df0981ce5c006ff118b1ad8ecde4a39a075 +:018e00f7c5866baac3a8cccd94c5c3d16a8e58 +:018e10d66a0d784d0eb549f8674544b621fc16 +:018e20b5909f4d72c9421db8dbc482b06d38ee +:018e308a3257c6f8f07c7e24b1b03693707c3e +:018e4071910fbcfb5cb546f09d558d24f5f5d9 +:018e50ef23580d10cece6ffaf533522c304521 +:018e607425b92f9f431972ca57b06b9b8c62ef +:018e706abbdcb34d564f1ca0e66ef183cfc6b8 +:018e80e927c81f7ffb80e7107c12a19b65e7a8 +:018e90598f8bf12b953d6096eea4978922f1d0 +:018ea0ed8311bd2e906a581947ae54ac525ce1 +:018eb0716cb85e1eeb98483dc4a2dbd91b2dc8 +:018ec071aa3149b1afce83acaac1993245f96d +:018ed086ed27bca12d838c2120bbb5440f6a37 +:018ee09b1f3fe6db9cd61e0ae49e9c5824c0b0 +:018ef0d5377153ac9099dcb1308f2139563f40 +:018f00ad0bdedb186d26cb85a85cfc5036f205 +:018f10047e9717ed5396e5191dc0b90830b13a +:018f204f5808679528d972e005e7dd84e39de6 +:018f30c3628fb307ce5ecae12e88a5e4f61f69 +:018f40f0fcabd0756ef40a5d4393e98e303fe0 +:018f50f20535f160a8cee9a50b48b6b88a3115 +:018f60d2dc67042568ef2b476c2873a558c2ad +:018f7060c5aeb118bda3c81e5f343e14edf725 +:018f8016d9e46f0c50a3bd7b09184ba0549ad0 +:018f903212be9c4b844fb000458ac20af377d3 +:018fa072edac421be137cdaaf5aad16fb71d7e +:018fb0139bf11116b17cbaeaf1a2ac3d2cc87d +:018fc025bd59a7c2a34ae978b2012c4d11e28d +:018fd0f06cc91af136f06de2cd4994b05c34b0 +:018fe0e16a2b8885cab7fdc1b831a79d27d868 +:018ff0f4748110939af548010a5347049ed42e +:019000959d4a5e3d308c983e67477d2e24b727 +:019010bea157a45079a656153fabc4ffa65929 +:01902042daa97afe122579630b10b2b8f5d9e6 +:0190300a593fe454b0ba5f5af764ffbe9827dd +:0190404053a8d0d6b2559f6db474a6e9e5589e +:019050e5e5c2434805fc5b9c8c2f7bb19db0be +:0190600476cc9d36c03e4bc81e6047c410c2f8 +:019070954a06c3cd37f886a88bc8d5f9b48316 +:01908084c3eed45ec9d701a7d922a66f28db0f +:01909050005d543391744a6807e4c76d632e78 +:0190a07148f610ee880ed484290d19d57740a4 +:0190b07e218ccdfcc2f83ff373955c1ae76f1c +:0190c060dc3c7d3e855d0e011fc9dcd07333e0 +:0190d0865c0370d2a928e1451a4ca4b291b2fd +:0190e04a2d26b96ba241b6c7478df66fca3712 +:0190f0128998cf7356fe291960579ade065ce6 +:019100a1b25c1cf560efb076e2200a65529311 +:019110b174ee5e2a4bf6f901ebdd7541f7b74d +:0191202d8fbdbfe809bce8a13edec1af3e3382 +:01913023a9319c1dcf987b6d02adab5a186b88 +:0191405cba0a4f48243d21cf0a1a9455c98a33 +:01915064a10a5120dde84aa0051f9e7c657000 +:0191604e7fb3c10b37198136d0b0e8e79ca940 +:0191708210c1a13fd2600000e8d7db16e0d037 +:019180ac8154385906233f915417f852c95921 +:019190d205c700d007cd4c7a58663dc8f03492 +:0191a0a5b989d7e1dd9194453bdc6d0bddd9df +:0191b0bd3ecc4541e8c41faa4c64df04702643 +:0191c0a200b3baff83b889ed1677f85f19a86a +:0191d00d60dd684f5b7c6dc7dc4667405c94bb +:0191e00fa104e9d895f6f560225b4244af0789 +:0191f0358db77e1f95f2c1ca6c438f73cfce01 +:0192001d6ff500549b3c49659967795afea02a +:019210633939fb5b4a5eddac0b0271662a836e +:0192202f47f063c289fb9a122862e0b7459a23 +:0192304f857041bf4652404e55f4ccddcb357a +:01924000f6df55116c8337a92158d99e54371b +:0192501dd2ac0f9faf34445f5a952cc28198b7 +:0192602eb27a287085402235700ead01968990 +:01927023cdb89389ac95bd63c5e472d4b054b3 +:019280120c28b0b5d1bd8237c26b1a0dd0d107 +:019290296e6991bbfdcdfaa4c69085df0d4b37 +:0192a0af9dcb627740101efb2b4728a48b815e +:0192b026c298ce1487bead6b682839b63d2641 +:0192c0dbb4ac38c8b1c966346bfa7e59a22a3c +:0192d096cfcf72b685e19c0d6063beb7bdd146 +:0192e020e8b6d65ddf26c4143b9a30c7012479 +:0192f0ef69296fb1f865e5de0a44c4a82a56e2 +:019300a08490d1dc5fe26c5435e9a2164eca37 +:0193100ce638739537076883445e8e200feedd +:0193208d3847fba5a58de612b8a2292c87b158 +:0193302dc3c10dcc72b813e544113c01a6874b +:019340e6e68dd5b3cf8edd162e9c1b7a89a888 +:01935042cb0ec9726a55d4a6a7d6f11d1a4a17 +:0193604da6a9675308fddd18a4fc7c38a49594 +:019370e74f08966ac3b46d458072f25ee417fa +:01938031f867334413d0f5e61ddc13958d9523 +:01939007f0d8af768678d40bc168c17acb473c +:0193a03ee11d69162673299162501019f86cad +:0193b0b29d95b5dcb95c9b215d45d9bbc96cd3 +:0193c02c563185775399cdb4184f429fa82b97 +:0193d0fe9ef8dccd5efa8fab8dcefe485d06b8 +:0193e03919bdb965eaafe08f764ab5244dbd06 +:0193f052b21d19ae6d74dd239f8cea67197340 +:0194006b6a04dd340dbd32179d01a8ba023972 +:019410c8ac3ad3cdd73f9d218b34a0a0223641 +:0194200e801b25448a66c7ac40dc01dc5e61bf +:0194307b98bd68293ed74422deb70fff83312b +:0194403fee5160fcabfdf02ab5638b2510775e +:019450471342c95597df3f0c45a4165a7513d4 +:019460ce5dc96fede9693d095e320c60f1d95a +:01947083347e4620aafdb1a391cabcabb9e928 +:01948068d59bb435b6d2c2c1ca0f112c6bf4c2 +:0194904ccc947aad2aee8289e36e9dcb4c6070 +:0194a04302de8e42bb3d88b732d0017672f300 +:0194b08a4c6623bd6b8d81adbf0f8727e1d6d5 +:0194c02507eb85e390340e8641b840b42e35ce +:0194d046cfe8935658b72edfb60a339c337b4c +:0194e0c084096685da625c8c7d5c94eb86c374 +:0194f068b68a09a9ebaa2bd17789b5ea78d32b +:019500c7a9e491c172162d7c339020cff50873 +:019510c54d5720872605d0492f2340b5ba2d66 +:0195205efb538a34dee1ee44318939fbcde868 +:01953030cd01afdaedd767e201a9884ff18718 +:019540dfaf2b936666fcefb2e8f3c8348319c0 +:01955098f96fa89c5ff37091079c87b257f370 +:0195603714d174fba30c3a1efed22f6b91086a +:01957004f11e182aa1020166045457848d1aca +:0195805f97b249aba94a6205e671d88c07c590 +:01959031e80c9689e1f25a64e2298408db7b60 +:0195a079889883776c3828beac230d10fd5588 +:0195b0482122ba60ee7c6915f43609421344b6 +:0195c0c50a937c9931984e18aa74aca4e0321d +:0195d094851a771836db48b0ef47c0809f4de4 +:0195e05cb93120e4a3856b80f71b18ac183568 +:0195f0b9c06db826d35621ae3fad8620e39c1a +:0196008c739eeef73e3532a85ef112e92e09c3 +:0196103bdffa8518d7a8eb999be419edd0760a +:0196202f03204c32407da6f04d875dca4eb1f0 +:01963025a3a0ac2aa96d237314856e020ed7e4 +:019640977e1e7b0845fdcecd2879c2b32f30e4 +:0196506d154f9d2000c2fbbeb344e913db1525 +:019660b0cc470fa006519d7ee31bf435a5e212 +:019670a5b499684b51ae65db05891f9bdfe61b +:019680551e4a4dab5c28218e0223fe0d5657ec +:019690815b6e9962c925084e86027e3e022ba4 +:0196a041ceffbe13e35a140ca61ed4b5223a9a +:0196b0a3e152fad87fbd709792e2db7673bcf1 +:0196c064796dc6b0e97ec2d1535a0774535508 +:0196d0a307b031105d21d0863d3de874bbd788 +:0196e0eda8cbc123fd48b47ee2b57a2661fec8 +:0196f0b45a6dbfe059791c555d498ca23646a4 +:0197008f9f1911700f7e51484472487db5aa27 +:019710df1fe80ccd006e6c3240fdd2f8c3f75e +:019720a0f54b4298f74261d8911cbbebc37a58 +:01973004394a65cd8ce1c7deb373353313d389 +:019740ffa8efeb2bc37f324383a2e0832d0b8d +:0197504c839011e466133966717adfa06e7ddd +:0197605c2eb09521bc41592f95d42b04dbe3d5 +:01977002ad73cded229cd2d1f537714aa46903 +:01978042ec7b6cdcfb4c95ccb486d9914a2339 +:019790654825d8467ddf47d94a1b4332164b79 +:0197a07887cbefe44e3ac3f3a016efdba4a4df +:0197b0b0977d2292dcd5954d4b5695a033c6cc +:0197c030fdbd74cd4587033887caad5344622c +:0197d01daf3d9bb1c373815a3c141a1b087c1f +:0197e0df7261f267f01c1e5ff41b89c508506b +:0197f091d3cf37014e878eb709db414d142e8e +:0198008025ac103227fa5ca1f7042a36ab4e5f +:019810116838f10e90d14eae1284721a0396c2 +:01982099af68e97ee02931480a48a9d562addb +:01983041da53b1c8c629218d4be4975f296f8e +:019840628fc730bc1b17bfa083eafe3bf79e34 +:01985080af7e99e6505b5a176cb4726ef1c20f +:019860b02634b614bc8eb27cd57b9f87c0ade0 +:01987034c214da554b13e75fa5179dc093688f +:01988016f8a559a1caee7a5ef04b3b82bd1478 +:0198907811c968e211142694f1937ddce27ad9 +:0198a041e220bc742e08fdf1fafe0fee16f1d0 +:0198b0b20936420ea6142c430bbb7be2496444 +:0198c069b1a188a27c84aa953c10ba298e9753 +:0198d0655f59ab7bad576133dfbde8d150a0ba +:0198e0a3a8b3e47fd9882ed12a5a5a2b2feec4 +:0198f07b2f239065bcde05a51f8682d9ba3722 +:019900223771d9cdc3c4b34e5d6d07a8970126 +:0199102ac03e081ef6a45d00873dbc98275b2a +:01992075663241389c1187e1d26a89f51febc1 +:0199306e53e576cda53c365d627a1609023979 +:01994098931afb2056c02850ecad4c669a3613 +:0199502d1639b5267a34f4845361c90ba70d08 +:0199606af386ad0d2e1dc29041b4c456a2ad46 +:019970222f2d1689801f9f127c9faa34f8a205 +:01998044610aaef08e2cada2683f81b9eb372d +:019990ad8f521386d7003003767b178f3dea58 +:0199a0646d7016cebf157af8c0092e7e88e71d +:0199b06accd214b1efdab07d21bb839ffd9bc7 +:0199c0bc1630094cf49bf75bb93faf2441f5b1 +:0199d034e31f691c0a8f2f23078912207f0575 +:0199e0b242c2f1f721f8c06ae0571cdcf1b22c +:0199f0e078ba134327a9f2d422ba4bcfd4a5d6 +:019a009c55554a7d9504637e81ae7511e687e2 +:019a10b3bf1367437d7e5249e138bd0fd31d1a +:019a20596fed3d6e3479a91068e18a997a1fa9 +:019a3080c76159c3e8b7f7d6b723c6fa44cc22 +:019a4018ec885b5f54cf400154d386f1f8ee1f +:019a50b05812b4ed6a442b5638f484988b06ef +:019a605a43ee77fb5b21f7b725f9101f5e0f7c +:019a709f25e010ba81aca2445f04d5b7060ef6 +:019a807ef1827c9ed0aa95dd3fd5e4c5f4420d +:019a9079e386429671db69fa617086c76a561b +:019aa09f8d17b7ce30b66468f38ed8ba91c0b8 +:019ab069715f7f2085dc9ecb7f7ceadd236e4a +:019ac0e3bd292163e0b84baae4ffc382d41dc2 +:019ad0c517d2c2eaea0b5d5cfa041c1a3d8d87 +:019ae044a4aa4d4cd665b649f1bb1c973ae6c2 +:019af0f9f00b048e133f84bd2f59987ec24169 +:019b00cf60c023538f8d70b711035fd90de10c +:019b10824e160bf01449d61b5d2b1728c19e3c +:019b20722f947a917ea680fa4ff50524127d6e +:019b3054ef60ae7a3112cf8b52a675d656b80e +:019b40c6ed94949307257b15e50fe68f3e99cc +:019b504cde6dc25e886f3367b041bb5f823bd8 +:019b600d2bad4d8036737d88eb3f4afe352ba3 +:019b70d920c0f5f24ad65e652637c80553e68e +:019b8030007bd2ab599a5e1106d447a6d8d00f +:019b90d0f6b3b79b341d732c1ff424a03ce34e +:019ba0d44319a51963d548b226f48d3e4bfc91 +:019bb060d8b537a056e844bcf622b4e22df193 +:019bc0e7798ec08f85d068c93767e63e4af2a8 +:019bd057eef4f7d8120d8008c4795d8242c184 +:019be0e8068f7b8457930ae274dc4a2db33279 +:019bf0ac3e555fc97884b269b181f7d82b9383 +:019c00e9090ec8f4b9cdf97e6ae838c3448f56 +:019c108d8a2dd3d6d9afb302cb7d5cab96a159 +:019c2090b4aed1084b5914a5a0967e88b2105a +:019c30a1067a89850748c1552d86b9a1b0f937 +:019c4003fc432d51a511c64455fb61cd8f8204 +:019c506bfec954110326103ad90e283767a055 +:019c601e9963717a74aea843ae6e52c0934ae1 +:019c70a3e9fa9d5b29053232770b25817f037d +:019c80fd2eeb1c25c7fa23e3c6d660830c8eae +:019c9006ce5ae1e6badd16f048f77e830287ab +:019ca0dc7ba08fa89cdc42791e4a89b659acb0 +:019cb06cafb335edd8ce56e9846d65d6200b41 +:019cc0e7d0fcb4a4e4dcbcda43e5dd27c6aa2e +:019cd01b656580d105059ccd0c1f14f245b73f +:019ce057bf282dd283f605fd88adf16e1af94f +:019cf0c8eae93838993be644dfbde1d6dcb469 +:019d0013d369f3603aa15484161fed1ff9f399 +:019d1099ef40c071eda559c5ad80381f510322 +:019d20356dab7933e0262d512b5cfca7f2e107 +:019d3013a0b9d64320a3690236447f184f2e35 +:019d40c2e2c1fa54a6417c6b911139377c2bfd +:019d501bca9c3b39a43af2a18bd4c7d399111d +:019d60073b3907aca3248ce3dfc55e062d9ff0 +:019d702b4f9ef4d763ff7a26dd1cb67e615ea1 +:019d80736d380836b6073cbc5cb74b602eb8e6 +:019d90045e87ad1d6f384526551cd3d4e844f8 +:019da01e0fb45d0f15961606cb4cd8cb207e2f +:019db01b24c3242f7aba2785e86f698a4e43f3 +:019dc093d2694b2f81072c4952898cede30da1 +:019dd0e07e06a1c4db850c1d4ec4565d5ca247 +:019de0535c6efa6ae89f21bcdf52ad2993641a +:019df0f18aaf75d9203bce9aab2b8a6a51ea92 +:019e00a78a4cd640b1f842f2496df505c59abc +:019e10300aecb5460c09589b420d42f1e8a7c1 +:019e204b3abff33f9307ea7db0f5962d02cc55 +:019e30af998a006873f193999e47e726d5b7cc +:019e40d40398b5d0dea8ab9157056cbe883e15 +:019e50b88cc7aca0f8bf092c0dfde342b04e6c +:019e60c35a41e16167759c1f80e9c6348d4734 +:019e70e2b19a5c33afd4c5a236b2fee840a767 +:019e8029560ecfe2ccbf9e76b709589a314ce9 +:019e905f29385c3f32a330d6d2cc6ac34200e0 +:019ea0f4132a9395263e6ba7106f00d8d27721 +:019eb0f05e21bacc0bcc76f0584a2f32686d96 +:019ec077ce47f86ce0b50452c69dfe8f4d5514 +:019ed0309a2f9a0e90d8de8e0a0587df2e6cd5 +:019ee04be24e3807d0696b7c402b00f2651d77 +:019ef07ddcf16fd148e20c1966cef336ca001d +:019f003b0a10d76b9f363b63b6b66c6bee3265 +:019f108a5652bfb9cfde613f5904ea1ec22bd1 +:019f20257e6d35ad6be976ff33ecfe2041f8cd +:019f30b70f677a658be91883bae417e28534c0 +:019f4090d5067b249ff28ac0f520ed56d6d25e +:019f50049faf775008d885fc0160111daa96f2 +:019f60055744fe674b0f2e45a697442096a773 +:019f70ca388a73df3a0569ad763c1ab076f973 +:019f8097051de68e6053364337c5b896c537db +:019f90686dd6028274ec6920641ab556d50326 +:019fa08209eab7d49a5dbffdd7dc74bd37ef42 +:019fb0c02962da9de8d936fffe839d139555f6 +:019fc098d72f9ca1a2caf6913f39fc86571eef +:019fd0084f868fcd83e01dd5a5e5722c3b5a12 +:019fe0a458f973a39a206c73afda21e2f13ac0 +:019ff02730587be8048e46c5c0f1d75a098161 +:01a000b8c3519fced78aacbc2614d560c4a645 +:01a010b023700caea82093d951680df46623b5 +:01a02068a14fbbd0c0a72b799f6133aa1f7865 +:01a030cc53143ac299db53c855c29404d4f332 +:01a040d8a220bed57a9551429fab602a2f0eff +:01a050a165008ebefb58c7eb26e8b2b8bd9529 +:01a06025c6a17085acd07fe7e6feec12589ec6 +:01a070a92c47f8f44d7cf749463c2cd38986c5 +:01a080af820f8d7c975f14ba32223293c30b4e +:01a090a508a4ec66fa3ca45f0d3abc436d7d73 +:01a0a03cba261e0aa4a10d8772e5a7a1a23700 +:01a0b0febd907a2c42e8a2df2d963686ce18f2 +:01a0c0baba8245b982cee086d662ee2e4f47cb +:01a0d0c38d69bb02a216848d6ccb44dfb9b7da +:01a0e019f6ab69e8e7b7e6e71f8a8d3f91aeb6 +:01a0f06911b29af27658be67c62adce58c6ead +:01a100f602b0e2e49401244a17586b68936423 +:01a11027120b5b2f0fa70ba5a327b329a4cc67 +:01a120344ef5b5825ad4c93bff4f185c341d66 +:01a1302d7a63563433b7b7a20ca8e1c17e96e6 +:01a140b287d3acdfedf5481a1477ab5289027f +:01a1505ab9919c6d2f51e78762133c2b61b93c +:01a1606c68ca581942e2e0106bc40101706804 +:01a1701f287d62d13cd88e5b82da5744a39db1 +:01a180a6f225b0232b09f0d2eb33f88425e0ba +:01a1904ecafd4867a90d26b61372b74eb14cd6 +:01a1a0aed48dd0c8603e6fe01737858a1e6872 +:01a1b0650ea76cc44a3ff16fdc18c8b8d56929 +:01a1c06e104b21ba25b15e1fec6c3a7388e8f9 +:01a1d038bcfe4fd2365d8e6bbb5645315ce834 +:01a1e0008ff5a1c95921f7ef0f4a4239cacd28 +:01a1f0bdcd69a0e1c750758805f05c222799f7 +:01a200029f8eeb43ea96725ebfe3abbbde1b8b +:01a210d56e31be65edcff2928a2dc2e29bf81e +:01a220cccf15a79bb5fa684392d37912096119 +:01a230ede24afa1e2f1d1ae6865a6b5f75c461 +:01a2403f51c92fe5d2df657459773c0d007a5d +:01a250d62851b429278253729c1701c979b69f +:01a260051f2f4b41353f6b77bf16cabde4c57e +:01a2704d7b92597bbd48abfe64dacc053acda8 +:01a2807c6e72b6b06a7ddd743e1a131a452e63 +:01a290b6127a09e4d75e630bfb0b0de1d2e587 +:01a2a02570e6d868836dca167e47ab0bfea170 +:01a2b0af06d84c7df3f3c6fe0633d900bf130e +:01a2c0eb1f16fc037d76286c2846272bdfa8d9 +:01a2d0a40c170288d47e6ba8df799a659eeec8 +:01a2e08b811fd8feba854fbc039e6bacda9ebc +:01a2f0b1db33e679d5eefc6956165818db9834 +:01a3003808c4b1b93be992ab0304b4972a4a8d +:01a310d4ee202b9440699d64b3237302d69da0 +:01a3200fe564734b4e18e413832093c82d770b +:01a330cfc65f2f3fd9bef4e3b5340521ff5c8f +:01a3409e23fc799bc05575fc5e466adb909b3f +:01a35071049eb19935a776d02047e7581e924a +:01a36091c27dc73185b42deca233a024a4b8c2 +:01a370c9278f906c305983074da2bb15e1f414 +:01a380746978ff5ea9aaf65d2d4c1c2f4ca600 +:01a3901a2e63cbb6dc0e3d635403b50725a039 +:01a3a01159236a84dfcf802ef13204decba042 +:01a3b0d954bacc07a777ffc6017e4f030f8341 +:01a3c0d6a0c0c83e17eb4fde0361e6d1b0fe9e +:01a3d06cafc5a8b2d456ec7becdc7bdbb9a952 +:01a3e026705cb7f41faecd393e2ecc37fe8bb8 +:01a3f0839685170506196ca221bd6451d176c1 +:01a400833a1b90544088ecd07cb56b204ec114 +:01a410af51105e912deaed0d08893b04dc42f3 +:01a420de5f1f9b177d2ec5862ad4bcc2fec7fd +:01a430ee60204c285c04f704cf7227a53fdce2 +:01a44086f1b30c06e2c41d7e12dd6631d90068 +:01a450439ba87954568e72d6096552284ffb3e +:01a460ba11ecc1e8b47f015bcc9f5563708d94 +:01a4705b5ae0213c171a124a4e961c617bcb4b +:01a4804d4670b42dfdd060ba80e2c38b6609d9 +:01a49062dd2e3d0939588290b62515f47cb97e +:01a4a0d376415a5012ddcdc1165f6ce2c91a16 +:01a4b05f830043238d8af76a7d4d91ff656f66 +:01a4c0692f8144105b00b112d7959e5591e364 +:01a4d07b48ca15170ab308397d96a0eff405ee +:01a4e0c5bb296119805973281905faf79a1586 +:01a4f08d50096f9c630a5bedd8b42f90932ddd +:01a500fe5e90f147c167464fcb32b0fffca556 +:01a510b2fa5614fb551b477d767f94b3a49735 +:01a52003ada0a1f267d1c32ce3bf5ec30171f7 +:01a530402b31f4e4501884eebd8b28ded31e2a +:01a540c366d61c06ce949de09c8f58046676b1 +:01a55060e97ec580fe8e61099d7fae67a2aac0 +:01a5607c6364eeb8eb0b83945ae909787598ea +:01a570fc4bbb9f81032a55077fbe6305b86f10 +:01a580ad62b7238379ad38f13f6332e15c7330 +:01a590d02ad80e1791c7cfafd1307cb1101d89 +:01a5a0c56ca4eacc1f129555973df0f15c5b38 +:01a5b00e21d8f968a591f9483c0ecdebb8fda6 +:01a5c0b2cde98d6cc604b82236c3fb5dcb759d +:01a5d07183bec9b9fc4e903caa5d3478acc3d9 +:01a5e0fe28ee151180cccd248d1b1bcf0b9c75 +:01a5f0166dafee0cc6906e5343993805897dd1 +:01a600edd147bb300cf41c21f0181635578df0 +:01a6107ed97aed303592a3ec7a7aebdb23b61b +:01a620f5f221b955b29b347b2d5f7f334a4093 +:01a630cae816f9f9a6e70724f89d3f25c5ab0f +:01a6409768676a7b71fca9492adbaf0f10e8a4 +:01a650dfa124255a43ec1a36e956e21c7fa97c +:01a66077de4631c7725e849b6851f582479f62 +:01a6709e37146fd6a5f4f51c5c25acd12c95af +:01a68066848c97e640f833661e5a1db0c2368a +:01a690f7b71d5086d84e89bdd37464ec88bf55 +:01a6a0d0635062f7843d5e786265f7aea880f2 +:01a6b0c847c0d90f0b4368b85e64d904c08748 +:01a6c0afd4fcf951895478799617418ba6889d +:01a6d01f264922acf5220c3a13222f528b4b18 +:01a6e0a6ffa383c29d8734196c200db978c774 +:01a6f00da66e931d56c683a1221f775a76b21b +:01a70024e46c1b6611adc63d6e0c6c79536d31 +:01a710b9dc830a4c565e345e557bb481f744fa +:01a720c3bc7111b0519f30d5f6c185d2f0c9c0 +:01a730f2ab0d5e83f8cb9c52e68b46b8a42364 +:01a7409965219be05b8a70323c9f7d2571d28c +:01a7508adbbf588e0edc64869c220e6d10f249 +:01a7606b693a9e0d0dfce326f525d06634f743 +:01a7707173ffe3fbad88fc4e906d41720a2016 +:01a780e735bb816e5e56dcd5ffd5bccb0dff4d +:01a790b938583cbbd07429f040214d09661dd7 +:01a7a0f8ea263cdc9c48f099e57bcaf597b482 +:01a7b00cb16135dc24b878d7f7101edf431d44 +:01a7c06a015d070ebced1cf29cb233a8acc918 +:01a7d0cd9946ec1ffbaccae456396e271689b7 +:01a7e0e7a4e3c5d8fa0abe940e576daaed6da9 +:01a7f0da2fd3cd730a0a4e8b239b916ce6f009 +:01a800b3fa724fd88a072196bae5837116710a +:01a810a4ad2296a25a3f038051e979985f2a37 +:01a820970fdf2420659dfdd4d8dae9ee2baf21 +:01a830fa350afba807cabe411de567e0ddf103 +:01a840c1cb067d4c54e7426eb490399b7344ef +:01a85008a23994f8b94bfa99f79163d6f73134 +:01a860eb7dc0ea5c2d2d38c72da3455acdf517 +:01a870a1b5ce0e80fc27b950ce13092bd6ddc2 +:01a8808ac3243ad0f4490ee1a23c3dabab3c76 +:01a89041d3f2e9d97deac148f20977c4d3c3ca +:01a8a07d74fb8026f43022370d2e51593161d3 +:01a8b003a4fbb0648bf50fc581d5e1bb6a1fa8 +:01a8c085555e0f789047b600b4ebbae558910a +:01a8d0651064f2eb3f73a42b72d9c54900eba0 +:01a8e008a4677ae156d478188c10094c246a90 +:01a8f0202758b60c2b624383b9cbf0f20e1cc9 +:01a900e8ef935ff326a691b3db6b771313bf2d +:01a9101a4c308099a5044fdabf7247e91258af +:01a920047969063490f84f676c521a37834a1f +:01a930f2fcd7a05216cf3a82248d801216f5c2 +:01a9406e5b2ef32b870e06d75c66a0e4e6fdd8 +:01a95024d3b47a9c2c880dca3026d472101e74 +:01a960a18fb4867386a6c6c38ff6b2f305af65 +:01a9700b5bc0e132c28d9a5e608508d480ea80 +:01a980fb67b38fb7c37524a6846e45985f4270 +:01a990a47eef960200660d87a24509e0a98f1d +:01a9a04715d6673b98dd1b86095a748eba6676 +:01a9b0ffa5a30126e779a0616ea6a0e92ea7a6 +:01a9c0631e2d1e7bd6389169a414bd37cac178 +:01a9d01e0c3ea692f1832d5379466ef4bee74f +:01a9e04f39cfa8702d037b33210086764e25e2 +:01a9f0b931fd3e609a3e9d9eea796b594fedd5 +:01aa000dc2c5cd803158741323eb35357d5e50 +:01aa1098b91b36f095edb06497d628972aabdf +:01aa203b471d941dc5acade79ccc1a17f77fbc +:01aa3065c399a09debe3d153931b04fd6895ec +:01aa403c733b34fdc476e0cafab66ac10d9d67 +:01aa5053812fb8ee0ba26594f3742039d22a72 +:01aa6060c0bb6027bdfdf93c5c967d20a40f0d +:01aa7076eeb3559cecb2d548789d8a825231bf +:01aa8022d09afdefed47e8cfd22e9ea0322efd +:01aa90a9ee8c51986493a248fe1296ed714e0e +:01aaa06b78e848538e845b5f428e44cf54fc9d +:01aab0323241df4804c2e05d00f5dc1edf6f59 +:01aac0fbd4e12faa6e124d403c445fc1add69a +:01aad078993b8e0d6c92490e67761ec6cf9bae +:01aae0c698745b17a9367f24b7496667ecd4dc +:01aaf047e290b05ca649fae358a1d9e85e2bb4 +:01ab00f5ec219d8190bd8466c5fba93206a9b9 +:01ab102c5548114cc49889b853a4cd5c789943 +:01ab20b55be59a61516ce6ea9a54b8d0ceb3be +:01ab30d2355bb75213e9318a820163a0b6ce84 +:01ab40869f0d83a2beb51905422ad90cec5b51 +:01ab5064608bc7fc4825d7f4cab6fe3eaa0cec +:01ab6055f0c467541c5a8b22a0e6b93b567617 +:01ab70417b11cdd03951ee81f2a7082572ecdd +:01ab803049e3c1f1c46e13b488cb3a5abd7460 +:01ab90f86468c16867369a11965f4169c2dc64 +:01aba073a7b68a964aea34089578b6018d298e +:01abb0ba698217f7a32be23166d19f495e9d08 +:01abc0237fa80c6d5a55fcff1d20dd38546c61 +:01abd06daddf66c3020e67ad7ef954513d51de +:01abe0a6f44b56448d4f64ba05ed6b903bf947 +:01abf00e00dc50e018b97113286d6a9f79ba70 +:01ac006ce250abe3a1653d4eb2dd5b9561b2a2 +:01ac10875d5c43ca9ace7bcbcc59d342e486a6 +:01ac20944215e8e95da14a1d6097efab4be1f6 +:01ac3007c4991ea514ee2fb0943be6be6434a8 +:01ac4092f05f06994c219c1d052eba1f5dd4d7 +:01ac5072f3607e31ebf5d225c0a3f465b992fa +:01ac60061e02932b7100aaf9289a9409434291 +:01ac707b3137f70baa9a004e05f2f3b58c1d38 +:01ac80c867d856c6cea3db46741541706700aa +:01ac90bb17c78f3cc9c0420f806d719eb23c7a +:01aca03e4c4f03781fa2fa892e91ba190192fa +:01acb0353f601b548bb9827adfd2d7fe28a805 +:01acc09c7f91a1bd8064ad3156e56a3ea96ee6 +:01acd047fdc885b3cea93de0645d9191810732 +:01ace04f73f468491c71fc82eb8fa42a55a87c +:01acf0506f9c6f17d89d0fe6c6c3fdfcfe0dc0 +:01ad0084bdd8a13effca7c3a5e9761eff60967 +:01ad100bd30026a5a62acdb236aa06d0ab185e +:01ad2079d35a9e2faac5f3084de21c4cc83bd5 +:01ad303acbeae371dff4801937acba55a80a8c +:01ad40fdffa71e90855d37afcd18d5620df2d0 +:01ad50b01c41406ec8c1b48e6e642fb7118fb2 +:01ad60d3f9fd8fbba7693b6449ffadab7790d1 +:01ad70b1e3eacc8a146c5a3b841ceeb3cec6b3 +:01ad80727708648b3de18476ce37375471b085 +:01ad90c74b4825f7bc25ff86f1746e0b13ad6f +:01ada013f5c2d680015918650645e993ef3358 +:01adb0fff6be46acee6e2a4804587d34f45bb9 +:01adc06ff74e9fd89450b6c9c88e8b490cdc2d +:01add08e0bda4e334fe64bcc2eea704c09abd3 +:01ade07af65d377f4152af2c85864398ef92ac +:01adf0dc9f153bd828cd61c4cb85638862a3ee +:01ae006b54db4bed25c5b56eef9645f4316dce +:01ae10a6be268cb4761b56aa6b072e2ea0cff3 +:01ae206bd0ee969ba9aa3495e3629b3489e842 +:01ae30fd7712cf353871e7eef4afba3af26a9f +:01ae40d4deb40050d06ff7a8219d60b18c111c +:01ae5064df5f62ea14d720162c5d849b136435 +:01ae60b32bc54e69cb86c134cee8905997e0c4 +:01ae70a709b88b89dd81eb77afaa21e29b4caf +:01ae80e0f8f3d3d18c222988856ed8dc4bde86 +:01ae9038150fbe6aad323a7c296f6f7fb6a4f0 +:01aea081ce1a5ff0447ce0c01cb5cbcbf27dda +:01aeb068085e8241d530d53f1521654ddf26a8 +:01aec098988ee2a8010df7bce8791f72370623 +:01aed0b73f1234dcc99bb979ecac1b0c857844 +:01aee03dab44ded97601aa703fa65c8f889397 +:01aef029a538e7927c4fb1f5e32f214be6ae19 +:01af00cd20ec767c37d76364db50994d295087 +:01af100fbca2421d06459df6da9d25bad33e94 +:01af203ebf9cda4a98fb617870d14fb0162e6b +:01af302376e311b51ea561ff50e1b827aca339 +:01af40b643ee5923cbcbd6b553b1b8720f67f3 +:01af50e59c46a248bc02d7034cfdf12a796a0a +:01af60f1544d0002c8ed81387843fcf714372a +:01af7079ed7c2a2bc37d4f6f97a294b344ec92 +:01af8020a48629f3b1286dd466ed9eea647e3c +:01af908a715915f8508562b323cf91c71deda2 +:01afa0d93e83ed622f54fef3450c18ac95d149 +:01afb07c0872c5c0cc4d1b2e6b1668c36b01ff +:01afc09ba75f011791710a47fa6fb5969ab0bd +:01afd0c11278e466af0aa7940b4f113c5f4c69 +:01afe0623467b4e4b9c84d7c3ddab7467ef9d1 +:01aff00cdf9f00e69d26eae73e2119595086a3 +:01b000d05e811a3f208e47fbd1d96e4e750ea4 +:01b010c8ec15d7924b9af89565d8ceaed5d0b4 +:01b020d0138ae23e34fa5772d0278a592248c6 +:01b0305fa530abd65ec90f2b59373ce5eec613 +:01b040fd345cf77fae304792218da63ccec79a +:01b05053ad5dc43895971b5cfbca36ee130a23 +:01b060c6830039b37d7dd23b454e5dfd1bf441 +:01b07032f24cd73e6c20823761f0a1463f9c19 +:01b08098902c2c768e78a9661c0f4608f7c199 +:01b090212227dcc5e65078a7ce8a7880424f26 +:01b0a05dff1df118399f546ff5744bd0783ede +:01b0b035400d6f67cf6e3359b2b44df72954a7 +:01b0c075d07d94211ac254e24b3d790583ccc6 +:01b0d079ff5771525dd4a49fec08d4ffa05f89 +:01b0e061dc89365d73be1659f1de7b65760b58 +:01b0f09f36ae28096a49cee3cbef5ec39a56d9 +:01b1009155dfe77ed7eb2acb86c649ffbde6fe +:01b1102ddfbe077c5c0819a11646285681fb82 +:01b120e3b92a9d25cdf8da48ec3f051bd02dd5 +:01b1308450c06911cb024416739b4e99b91ba8 +:01b1400473bc8203b40ecfa550c710047283d2 +:01b1500313a63a7efcb47cd00996066027b64f +:01b160350d906c079a70eca4f74dde8ee496da +:01b170f3662704ea9fc0abc4f88d35337b0e4d +:01b18035f6fe847c3f71b6d0f95470487e3252 +:01b190cdcc7d5e2b21893469eef5ab4ecc5ca8 +:01b1a054d0ba3e4652959ea0c9645936067989 +:01b1b0a32f22531dcdd96cc842a229f9ec0d27 +:01b1c0496d483f344b3d2b6710e21cf941365d +:01b1d08ac23d79b0f15060374c9f13ce6654ed +:01b1e01a66a618706f9cbca6b02c3cd41b5180 +:01b1f0727a9e32068e6a74b6262754d228b2e0 +:01b200a895cd973244e676028ef686c1f1577f +:01b21020482b84bff186dcdf2f8b4ee11de5b1 +:01b220d0fcf8929f4a17207c615b458a9698d7 +:01b230d7f48246c02cb92cd13deaff9a35de19 +:01b2401ee16dabfc0dcaa317b446a0fe5c2448 +:01b250d05266797be188fe118ae4338b0c8035 +:01b260253123cff8b7c71ff06e58749f4a8267 +:01b27024f6bb4b2bb368a4a30e8aad6b400eb9 +:01b2803ed1d8da93f6c88eab9559c1fe719784 +:01b290989780c8a4fbeca24ca0d4c37abf0cb1 +:01b2a00a8829c781ca569fe10f96f2739082bc +:01b2b0f3223565877484aeaab791a2ade22c1d +:01b2c0e05cdea51ded58afe2a6724aec44b963 +:01b2d08a589a20f88fdd3a3027c4843aa51b51 +:01b2e017c317ce347980b55544b1e34792fee0 +:01b2f082ab7b0798f47afb19e791eb1eba2096 +:01b300054b73f2e170a1ba04babb07b8fdc8e3 +:01b310dbccefa757d805aeeab6f7f22a0130e7 +:01b32094236063cb059b41f8c5afb9535b5821 +:01b3305ac795631601c15b2093a4c0f80164a8 +:01b34009dabe9a6c9203bb9ca811f1b1e34201 +:01b35058a30da5e14ef22818ce30a4bb8a28ed +:01b3601c1fab85c836d7251c2d16e6172d9898 +:01b370e93ed2688ab0c6ee3874bce643d59aa7 +:01b3800fbc18ad3c529a680bb2df083afb83e2 +:01b3905c0d2ed449c01c03ec86f9d39f8f059d +:01b3a0b9a43ff9a76623636a4cd8b859e3579a +:01b3b0f093622e63a509f7eb479f6fa11b1bbe +:01b3c0e2b8bc09694eaab395bf0904edcaa57d +:01b3d028d46b0afeea92e4ee464a3a32dbfc75 +:01b3e00ae5397dbf9c829b8bf39cf1cb6eb237 +:01b3f05874cecd3aef94c105801ba9c6348831 +:01b4002e0831fc2fe2e624029ec48eb6d962ff +:01b4100e34a889d037dbe885d06d96fe65d1a2 +:01b4203d359fd06b364b38dd1c6c2374285b77 +:01b430010f7a11b0e66cb7a1f74ba0bb338713 +:01b4402a4ba2c21dbf564377870d09e5fee1ad +:01b450f85932784843cbca8951f196d0d6849c +:01b460d770339354605af7339f276f20cdce3c +:01b47012572d4aa33136134562a9dece3df83b +:01b480e396be0cab90abd1d63e10be89fa032b +:01b490bb39fbf3c48d0424f1ead2b2399a43d6 +:01b4a076718008967240fb2b07d2ff09c4562d +:01b4b0edd5e28da15dec5b96e1148c11dd6db5 +:01b4c0f9579fcff0517dbf22ab97f63510ffa4 +:01b4d006bc54c2c7faa06fb7b475b4d1eab2eb +:01b4e0d5573674a031418bb88d6bc31bb138ba +:01b4f03d5b7f093e980be78133d904993ab57b +:01b50065752af9a84a8c0dbac5ebcc990e2573 +:01b510c9814a850fe890678ceeccc89f0a07e8 +:01b520203f3d53ae36fda2cf34afd4baaa07eb +:01b5303f6b6d5f061aac967a8e541d5c4c8d69 +:01b54023ebebcdc7f22b07cd01dd03b570f8d8 +:01b550e5ead7cd021a5ad71bbb10826d72c2c3 +:01b5606d4b56cc61d1ab14212b1f88cf0bf167 +:01b57099f2779e399a7dc7d0b1966d3b6d9ef4 +:01b580abc97ddb0ed3c9e540ec6d8d8ebc3fb7 +:01b59017801ca1a2fca5e7bdc5805b5ee66407 +:01b5a08616c25fbe697819bae68a69ddef0479 +:01b5b00b268bd2b1640f8a5e101e9428f7795e +:01b5c08951270ea053aa0770a9ee19f6aefe22 +:01b5d0c55ec3d8b8e4e16bc5d4146810d00d4a +:01b5e0ba601930a71e4fa017451692413e591a +:01b5f079e9a9f0f4f9b918fa1708ef422769bc +:01b600c943056179cc1db7d955d863d2461a1e +:01b610207987b4ec31fe4755dacb03b4ba1b78 +:01b6208e2e18a0b2d5f9ba7933d047a1bbf1ea +:01b6304835fb8412b1a18ad023b79e67bb5da2 +:01b640f537270a6df5990d92910f904ea7a7c0 +:01b6509a0a41c1acf2d8dc8ff29a9fc5d285a3 +:01b66077b90476989ee727f458272f52c9383b +:01b6703735c129527d8198ce6503f83cd7b6ab +:01b6808dd11c1478fd5148c0cedf4abd216bd7 +:01b6908ee19e78c50391fcd5a3b2e4e590b8ef +:01b6a0fb10d1b41c2d125b572c3c544ec27af4 +:01b6b0ca182f22e526ecb9f686d9c7dd86c22d +:01b6c0294d7545305bbf3694700f3761eb9927 +:01b6d0f3bd09dfb6ece6fc44a43af6f5a02dcf +:01b6e0e6213a2e3f62b48f284246dd705e3101 +:01b6f0222ec4719b481a4504d635bfacbe5e2a +:01b7009c2958ecd339f6e7cc18a31fd06c0c1f +:01b7108b8bd37a14306157b491a25a4dec12ea +:01b7208dec85a15fe3476bf7cc773dd6b73344 +:01b730db102336296fc98d6076291ba4736c1e +:01b740b2dd433e125d47d3faf608d015378c48 +:01b75043915143639b0b83db4fd6f30df86f87 +:01b7604408b38b9fa5f6b0a69609e1e139123e +:01b770a55d984df855aa6296d5bcb3321cbdd1 +:01b780610be30a7d14c17eda7105bce7723356 +:01b790903cd586a335f02968b5f3124c56ae6e +:01b7a06b4e833551ced476e47e99708fcecf63 +:01b7b0b5d1c5277503d2d7dd01d6dbd2609ed2 +:01b7c064cb22e2bbfe312398c314c57635461b +:01b7d0605d2ce0ae4969fe67eabe3d54f19660 +:01b7e010f3f816069071ffbc22eae97bac59ef +:01b7f0a9f9a71e767e7662da742833cd6572f7 +:01b800dcc253c796fc0c6307dfe4bd6fc479ea +:01b81060338990c15689b56b5c9eab72c35ea5 +:01b8202425e7d1c5d95f761e49c921e0fc23e7 +:01b830f82c91e44edf614df0e626347266df08 +:01b840e6f73342966dc84676981c1e89614a5d +:01b8509fe0355a858d0c1cadbf8425f26516ac +:01b860ce1e5d9c511b0e966860c94e3a9bafa8 +:01b870a86faad87c5c20380b34b117eca95e64 +:01b880699c5949ba0e57152af009d6e0c72e5f +:01b890f76d968363cc66240555f852c8016e5e +:01b8a0e6c820f08da25dd5daaab6416b1f627a +:01b8b055e7816ed643e407607878c2cbc2ac5e +:01b8c09e53bd9edade95cac4f52f90ba3daaaf +:01b8d03ec9916a8e93a5f4ab51524a0c3ba48e +:01b8e09fabd27f31ccf55f08a973d1df751f38 +:01b8f0daa90e1185cb83fae55f4e2a352cb0b4 +:01b90047b86f86b1f398686ccb3a0f056f7f53 +:01b9109eb344c2f58330df269c366833f29994 +:01b920ab077f09bdda65eb8fbef3b710e4836c +:01b930c522922d181358aba1bcab1789579488 +:01b9405b9cddd261b81e738e2ef573df7bda38 +:01b950b7b9402b2c3b12261bbad7a2ad0063c4 +:01b96082715adb3b244429397528b50c49f28c +:01b97049594e248cef63642dc0cdec34b20022 +:01b980a327bf0ff7639561e185de9b4b02ffc4 +:01b99063a1e02e68a5c84664b2af62c9f63888 +:01b9a08bd14c3cec16a451ee49bda146e63140 +:01b9b0f9db159c80fd6ea5735374d2f8159b47 +:01b9c017f9389e74e74a9e17c0180701b7c2a8 +:01b9d00daed4c622a276f0e356811de4f33f50 +:01b9e005b9834d6cbe2ec274383e1b6a7fb0be +:01b9f0cdc01d85c5ca2c3977c7a0344c97ab2c +:01ba006f9c3c189858cc375160ff21c34ede74 +:01ba101959acd678b2b78244787543ddde3bc2 +:01ba209b0e735b2ae55d0e68eb039d528c6e6e +:01ba307934d0d72282b69f35ae57259858774d +:01ba400b366ec7444f517454a60d4c1367bae9 +:01ba50dc44f6340e59119224125bc3dc175dd7 +:01ba60d90d9c803b0fff0f3f1cda7db4974c8d +:01ba70080ed86bcb29c250d6c6da33219bda87 +:01ba808296fee8bac7261ba26fcf0f0af41ac8 +:01ba90cf1e4d8068c54a7fb7cf5b425e7ca0b3 +:01baa0d6a8d9d30de716e01351e6cf964ee69b +:01bab0a8b237313d14a2663311fcf242fc0acc +:01bac05dfdea5fe62741e29822eb708b4cb38c +:01bad0f1a9f2b50feb2f80aeac7f182e5dd2cf +:01bae0b6e5132f415a89dfcc2fbce6ee1079b6 +:01baf024f8f147973fce18954966b0afd5cc78 +:01bb00706c3c5530715b299f5850dba2ec97c7 +:01bb1049490362e26549a699ce4098c261f0c1 +:01bb207a1555e76f33134204a9aec35227f508 +:01bb305d2ddc22bb093982b0c72fd6f88220d8 +:01bb400b0ef2d5e19ccca526dd5b060775e23e +:01bb50534aa0a577b6a9d1677a9381c14d18a1 +:01bb60e3a64788535d2a5dce72d1c8e5601656 +:01bb70aa01317a4d1de2bc3ed2bd84a3611848 +:01bb807286e476fc4b3a5938445639f537a43b +:01bb902ddcedee6daa5722b826ac5075f269a7 +:01bba00f17584752be001b77e3497654fba238 +:01bbb0366636502639aa56d6d613d1fb6db8ca +:01bbc0f9b1477ac627a6128370a7aa2aca9760 +:01bbd0b87a2a50377111e9739acf5a327e65c2 +:01bbe0c41ec5d6a6ec203f2543d1e7798f17e8 +:01bbf0308b937ad972d6bc22f752acf25c51c7 +:01bc001f5b4b0a76d85d9484b7c2167babc910 +:01bc10adbb326c3cddb656a3f79f7f787e3027 +:01bc204954e69537b0d98f3ce3aa5ac3a5e8f0 +:01bc30f5a14a3be1f489ee12ea15cfb191c111 +:01bc40462fec21901c002aab6269118c766790 +:01bc5044964bbf5b910418d816115962bf457e +:01bc60fe88e1fbbf9be38285a56a5921ad785a +:01bc70ea89771abcc874aa97a2c1de6bf85269 +:01bc80b551f441018cd97e17a328238329bd2b +:01bc90560e3ff05045ea33fcd8127f4d579b43 +:01bca07325bdf615838dd024ff6e5989d37e0b +:01bcb089fda92080bd097bec8ca8453f7e9659 +:01bcc094acde65e2f96d239f6015ebead79139 +:01bcd05d15bcd9336ad93306850842d236af5b +:01bce0f090cf80ab930844f63866dd14b89a29 +:01bcf031a291b3dadcc5bc509ea0b197e07ae4 +:01bd00abc39b09a445915abfcaf2976646b25e +:01bd10fdeb379661ff4b3c7fd23151fa0f1fb3 +:01bd20d1ae60f2d33a25d5e4604d0f9947ec49 +:01bd30a8e04bdf0530a63965549032edeec0ff +:01bd40f8a130b216f183f7fe0292ed0282431a +:01bd50699e345aab866253645cf8dbf876e13a +:01bd60cbb3d2999a514d1ddf0ce2699511c8fd +:01bd7050ba9f2edc5deb08e9fa811a38c32ed2 +:01bd80e02beba30f5a79d59ecafdf5d623c10b +:01bd908fb998483e238f2b7f639a7bd9d04321 +:01bda07413a3aa0c40d71556748bcfd18d9431 +:01bdb06bf51b6bf5c2e952ca7f81aa8671711a +:01bdc05441e3a078d37034d7a28a8ae31a96ee +:01bdd00a80408b08f0b55fe2f15e34a319bd45 +:01bde09c0fd32f3764959cb5bdca38d7012a4b +:01bdf09267c1056b21051839053445e8115697 +:01be007a7787dc26d5eafc00148433b940f282 +:01be103a5aab58d75190e3bcccdb9c41a50f54 +:01be201f01892ffa9e0e1dfeb297ef88f6c245 +:01be30a64bdd5a6932209471ca36576a612b5e +:01be40a31c31b519d95f6d45e79d3499f48bcb +:01be505aac988cae1f3d2c9fdc9857309a615d +:01be6077431f3e24dbb94d422dff0b89a116c7 +:01be70aed4840b80cb3226bd888387794b38dd +:01be80c28f858311d3cde736d5cd85f856385c +:01be906fb542095f1882c034bec05228cc77a2 +:01bea0a1529c846cbce91637ae2b06c11d2ece +:01beb07c50d0c938f8aadb5f718dde647afa1c +:01bec0e3ac90c9cb5af8982f5a37072aba2f4b +:01bed0e3521e777d4683d08290de9873639102 +:01bee0e6a2d30383e8f6ed049415ae3b0829ef +:01bef01d32f80e07017b7da0c7f20851a57da1 +:01bf009374b1274f288cd954e4ad35ee0bf3d3 +:01bf10e60e3db26d3ebda12c2c68486f4ec487 +:01bf20db71985f5f332aab9d0cb45ac30fc52b +:01bf308bdabb70b86c5769f30986c2d164dbba +:01bf402f94b1a2e80420600848290ea43d0ae4 +:01bf50f212f6655be79ff907dc8ea930bc9dcd +:01bf604ad4ba984eef20752e5ae2b019bba3d1 +:01bf70820d9f0197e9a56562967fd8e3391da9 +:01bf80e821fb86d55039304206ede2d63b0a08 +:01bf90e5bf170d5baa81d0e06d1096f2f16231 +:01bfa053124d83799838778c56d88316150d60 +:01bfb08fb4fe031544e09663c4d5fba28b38ae +:01bfc000738ce0224223514bd63aeea2d50cbc +:01bfd04af136e9d2b759f9837bf2f44da419a3 +:01bfe0f51f639377e756e15ff1ccd6e6a5b3ba +:01bff0b37d8548ce063fd5f103dd9b264c865c +:01c000fd7c3e8ffd7c2234385d54d5259277a6 +:01c0105a7eb40e105a02b9b3962fe22b133447 +:01c0202a8d254b85a60579230b2c7f9db0eb5d +:01c03049da6c5a8368d659ae22d8b58c8f4a11 +:01c040f751e7836be958ead2dc6ed9045a7f5d +:01c050dc9aea6d1747da646f360e1af53f472d +:01c06016f8bf9efa16961aff86596d1891964f +:01c070cd0d338f60e5899b1cf02c30dd47bbb3 +:01c080121710fd08552bb844d67cdcab024920 +:01c0905252733eba674f0aeffd5b35784f1def +:01c0a0c7572a4f762dec23b572e459aa441b92 +:01c0b01fbf42b25dd33721531eebc6d164e995 +:01c0c09c786325820471ca7e11c0c551ca3d6a +:01c0d07fef3ff69f7f597ff7d105efbe10fc87 +:01c0e07098952ee9814439966fea04e2b4823d +:01c0f06e1d5308296b1b0dd12ec0d2109cc705 +:01c1009cba1bbebcd19f719ecc63aae876f373 +:01c11070ba2e66507718f08db627ecf657b5f9 +:01c1207e0f65c0d4b3c62ab9d3f654c8c5539b +:01c1300e1f12129b1a5605224e0db4e7037622 +:01c14065fa6c56683b05a6af1ea0d6a3b39820 +:01c1504df82149c05740fc864eda10ebb5f9d1 +:01c16030fbfe8ab90d5565b8005cf01281c794 +:01c1702a987111ce7e9b2dd9fba7d12b11854c +:01c18049b23705eff20cb60f98630a6b82a47d +:01c1903a7f95f9864a1a5be863618ca49de223 +:01c1a0f4c7a87e4022726830ef189d5a48f04f +:01c1b040cf7ab462f352ddb5b7a41d9a85419e +:01c1c0a18a30e6cacd803c57381f2da187a423 +:01c1d077c9f35082c91ae88a07d501d9292ead +:01c1e0b013ab03aa108b0b286e025857607ed1 +:01c1f0ba7cd02793315495db4dc6e9314bb900 +:01c2000db072a058958bb640dca4edcae3d3bc +:01c210f08d7944011c1bf1689733485ba06100 +:01c220ad88f9e369b2cfb56363401ecac1969e +:01c230989073047ce8ff5d01c42dc24308166f +:01c24006cd6e2fbdc55e001a5fa869e974a380 +:01c2502763ad1dc8bbc1a86c3221e7c859d51a +:01c260e83f9a3ec18f7ed0d30f9e9fee7a48bd +:01c270a7765e8ef5f870c6ef928702f705349b +:01c2805a80948438d660d43a70949638e12873 +:01c290f47913b75751b873b8d2c8edd8a5b1ce +:01c2a06fe885068411f8ed6b63a85223e88a72 +:01c2b0946aa3fb9b8f6736c93057c529c268ce +:01c2c01b6b767771986db605007ecd0354082c +:01c2d05eedd5d1007ce6646e4852956bd219da +:01c2e04160b63f73ff34d4b9f7100d93027f9f +:01c2f0ed9e4f5ec7b89038f3172cd67c4b282c +:01c300710fa7ad7b3db4562129d805c13e2150 +:01c310f240ed1a34facb896c430c87d2ad8a65 +:01c320e482deb3494c61870353a95727b943c7 +:01c3303a72a7e73481fda54bcec6fb4852985d +:01c34042a6f17133515d26ac7bbdb877f6a06a +:01c350bca34a7dec57e9ae9d788b9638adfdea +:01c3603622a8492e04de9db737e9550250a7df +:01c37052fc63240e33a010de1b4f1995cb2353 +:01c380244cc9887e190a8d7bd6e239cd0f48b1 +:01c390be22900847ea32077ec21fbde454f5dc +:01c3a04e299ee9f8181b3dc7387f47d390e772 +:01c3b00a3917ca076b4acc868de341215e4308 +:01c3c08a4a57e31548d3ec13beb59290361baa +:01c3d042ce4e3c1a1f770cf231af8babcfaf5b +:01c3e0a5f64ddb643e604dd5760cf2fc8ffad6 +:01c3f0a7567667a4420ea81006b5ed4ed79f23 +:01c400c2c4aca9d0efb40b78f0e31ffbf8156f +:01c41035b8525d82dd4b1b1fe1fb99ecf1ad48 +:01c4207a9aab4d41f0e778d2f98aeebe6e0365 +:01c430059c5ed8265a6455e9aa6656d02f3d45 +:01c440d20d89d420cfc4775e58ea91ffc4d81c +:01c450244b5603307a40c97a10827732a3b544 +:01c46009bcb115a0ec6855591aa8b6a10537e9 +:01c470b4046eba191ef393434a71e44ccc2794 +:01c48068b20752d4f8865482a13da901d796df +:01c490fae97b0a3fad2d20a4a1f3dbc7c4db5e +:01c4a09e2d8653f86865fa3d5b1c5e875fd103 +:01c4b0c69f23cef6a63d7927da54d4d62e2765 +:01c4c01cc0ac5418714f1505a88de7bac27d68 +:01c4d03d6f346ad26bea8d793be0384ff61826 +:01c4e0ed932a49dbec425f2584f082bb94f315 +:01c4f08217636af1c552e34239a2e5623f1dbd +:01c50065bb8f44da607bf525c37590e228486a +:01c51034ba415f357eba561142c7ec6ad8e9b2 +:01c520af4c787f7072babc9613dbb46bf7dc90 +:01c530c434727d36e083991e19e12589dffa94 +:01c540eba78356150feaf70868686ad1b019e9 +:01c5506a9c492f1618cba881a4c88de2dd099f +:01c56046fb28a9d940f233058aaa78498955e9 +:01c570ca3ddc183d68663f91bbc7dfefda09b5 +:01c580117989a265716411c375f33a8167a142 +:01c5905a897e2e2ed62c19b4c0823758669fe4 +:01c5a006fb8d6c6c0a1940d50a93d2421964b4 +:01c5b051643bff5fcb0d8bf271ecf6fdf961fb +:01c5c0374a9ed6891327f8cdc26aee5bb49a10 +:01c5d0bd7d8a5901794ec4496c7304417ebce3 +:01c5e0e2f25e27683ff199b65e47d1d5907d17 +:01c5f05e335f2329d61595e52fa1535f6a1a8a +:01c600ef8910e829a9715e44a0625b42e6eea2 +:01c61002f364655050514a8a15d2686b0e7c72 +:01c620b0927b9bd22ebbdf306e5efeec1a6268 +:01c6308ba8cd19779839edb66053ab45942a9c +:01c640e2f33fcf81b2598d70cce90a69dc209c +:01c650fb3f71762647ad4f8cdfeabd45e3f9f5 +:01c66067dd59f8ad93893eb1bb5e3769bb1e92 +:01c670f758fa5dd38851bd0f3e691f1cd1c650 +:01c680832fcad5c125b719c5866e2207b810fb +:01c690ee43c9cea1b6bb509515401b73c0e991 +:01c6a056702d9fc3b5562551ec70434e1f18ec +:01c6b0f29606e87ad6b848f197ca8479da6fb7 +:01c6c03bd765b4ebbcb469d1dff73b54d6d0cc +:01c6d06e93a06c886aef866ff5b2983b12a663 +:01c6e0e619285236838be0818b43c4b08f1e8f +:01c6f021231ed4723321b92a6b4e5dcbd59d65 +:01c700da4715eba6c100f3134385b3904d3453 +:01c710fcb82b5bfd44e3b859e73e4c2f42d625 +:01c720a6c95a950a8264899996c85e5fa554ae +:01c730a4781cde4ed3f857be199315be0a565a +:01c740c05ab3233ddd6582cc95ac5c5de7fcf0 +:01c750f2619845973364970a3421c73e48e4cd +:01c7604dbcd049f4602377eaa2d1c47cb5b1d4 +:01c77024f276861cbcc81acfaf040673569c71 +:01c780cb678e31cf7998bdf4c4c14c78c9a81d +:01c79030d34dc7e930df8c3ec81cf32beb16dc +:01c7a0acf48c5515f1d70f6bef81eb0f14abd2 +:01c7b024980ee23e25f1dc733a83f720503367 +:01c7c0430833d5de88fb53b6cd06810d40a8fd +:01c7d03351b0401a0039f544e2bd88e50e9bce +:01c7e09095683ffb590aef7336b26a1653c387 +:01c7f0d2e242fb2472d32c0c043c1dd7a40682 +:01c800167435a0fe48d192e73432ecbcc189c1 +:01c81020249d70f65228b3ed741e2a63b8228f +:01c8202f2a1b973307e9582d58964b31e8af8a +:01c830f680a632e0b31d330e3fd9565504420e +:01c840c3e1b62e6ec5cfc8cf370bbfa5376032 +:01c850dfc9b9db85837b0604586fa644f74c18 +:01c860298c2de2f94cae2992071558fea43e48 +:01c8704dc853cab8ca5e51b71b9a7add90f14a +:01c8805100b75ca7965ada670e53d989a5fa9f +:01c890505f7366c6e3762eca67587a169f21c3 +:01c8a0f0c1977070e99b823a746909e5ca0ac8 +:01c8b07093826246a689f212ac6eba1fa02857 +:01c8c0f94c91d30a12f8683903f9a149300748 +:01c8d02f9e1e4b5c7c15f861f359fefeccafc4 +:01c8e0565f7fd16c4cf7441570123261495d42 +:01c8f0c6898be83b9808bf479d59198d1267e1 +:01c90025aff8adef36ca6dea15dd531f2ab60b +:01c91069943db889451f9342ff8fce9ccfaa12 +:01c92082d187ad5cfa5d22a7431297fc898342 +:01c9302c81a3d417e9ff068e211623ca303b8c +:01c94017be11b0de3d8792515b91c23ba86ad1 +:01c950ec61e175b0322cc0c41a89923509cb4c +:01c9603868d56c4ff5b18241455cc77ad6fd07 +:01c97010a5b848953123b7bdbdc9fc09a24048 +:01c980a53eb7cbc399c2e00fcf7173f7903877 +:01c990a1920d68b9cb07cfcb559cd03598e3ad +:01c9a020b964012f1af4324f135ce076179a82 +:01c9b0aca581d2e918cf203839baf87f410f25 +:01c9c0f1820bb47527d500830e2dabb1bb81cc +:01c9d04acf1016a73b970897f92a65bcf042f5 +:01c9e00e39ff26ee39893152dbc381679a40b2 +:01c9f0460f16b891b221c2eec3af54f8f49e9f +:01ca004a66a17718b87b419bc9fb34d1b843f3 +:01ca100adb2ece7425d3529177ec471b3813fb +:01ca208a815994653ab5e3a511d8f08f8361d7 +:01ca306229038afe4ed65b36276fadc2d8ac74 +:01ca401a0072fceeee51c0f6d506bddcdc2357 +:01ca501adcd6ab99e75e1ef5c73e48875c2141 +:01ca607ea73f18cd315579bbc6afb3a9fd247a +:01ca708db574f311d85bf85cb06c68dcea7b90 +:01ca805f8d88b8d4788822ae6f13d56fae950c +:01ca90605dbb0160864061069b42e4d45f79e2 +:01caa06c32ad1c7898ae5cb4e80d4463438176 +:01cab0aeddf01a2d16ba972178df735672f295 +:01cac0b9a8da0efe72013a4514765d54ed1f43 +:01cad09bccd6b2f084c3406ca472285542d0e7 +:01cae0f5d4a672d10f0656cd01f0bdf2040aed +:01caf0d9ffbf61d89c27d098ad9b80746e0e6b +:01cb0093065d7e3c542093979cd669bc8b12c8 +:01cb10fd2c7f633eaa3cb50ca0f2f503191e3d +:01cb20e07240ffcb19fe643891811a5a4d11ec +:01cb302ca36c3d453a545ca56e79f4aeb9e8cf +:01cb408ee84e1d9debb60919d6edb6a583f5cf +:01cb50cbde6d0c92f59578e49ac6b87dfb47e0 +:01cb60b84e338d20eff865a99f3beb025509e2 +:01cb70057dfa15bd0bb17f0cc509a14933d14b +:01cb809601faba334a9dea5aaf59a484abb71a +:01cb907de82fa7c76bf6267ede200e2a9ffce7 +:01cba0ea3b27eba9af7a1d936541ae1a7b596e +:01cbb0c50b9a838cffce646aa2bab001ad08a1 +:01cbc0d1018da5ebef9e3fd5dd3d94506d5c16 +:01cbd0765d9767e88df84b2fcf43a1d390aa7a +:01cbe069988685d6bee62be94e125be30fe5fa +:01cbf0c75f94f21e268dc804510d01d6e8a00e +:01cc00e69ed8962e9dfb20e0c76fe5c337b447 +:01cc10fb52cf93bb1a544afe8a6d4cf20ba95c +:01cc202a6629061f754d9149ceef0124e391d7 +:01cc30a51d724424afb03987262c707dacc3ca +:01cc407ac285861b9a24cff618efa722220a17 +:01cc50d10e53f20b6ac5e8f4f144f74556b51f +:01cc60be5bedec64bf52b70062efea86f26d8d +:01cc70345bc3b00e5741ecefa54bad63e62953 +:01cc80d9e7c97311edbb9ee1548537bc80591a +:01cc905f9845a1828392219743339ea36ceadc +:01cca03bf257cb4a313de9b2f818519e8d6f44 +:01ccb04ee20776d6cf7af3cdba2373463af49c +:01ccc04fe4daa81ddb265ae2fbc2796378b984 +:01ccd002fc26267df6631f69f72c560e728b41 +:01cce02604e9886f2d3ab165bec1a505d8e8b4 +:01ccf0908349b45421f4b06bcd41cf4e51402c +:01cd007983994d77abb53964aa14bbd389ceb3 +:01cd107f8384a1685d7983be779277f75c3709 +:01cd2014224873dec08de052fe21f7e87434bd +:01cd303f89dcd97658883fa4a711c88540945c +:01cd40c07f6f6d1d565518a651099fc2cf1546 +:01cd50873316a11c2f58ae62821a4d70f0987e +:01cd602ee3109d8b7fb706690169ff782869d1 +:01cd7081e0c51e92326ee7da28ee371c5d04b3 +:01cd800985df4fc20b2b91098c6baeb10100ba +:01cd9001a59ccbbf410c956fade8dfce2f07b9 +:01cda0b58af465e6bb1235f0e2403f677ff4a7 +:01cdb07b8bfe9fce0a2cea25107d29c39e9ff8 +:01cdc08333b7f0f82ec32163f91b39420d215a +:01cdd0b8209c3039213fc74f130011d3cd1c59 +:01cde02e553a9f38cace7b6758da0afa42786e +:01cdf0f601dc632e0dd3ad2df2932d0ee0fbac +:01ce00dfdbfb609680fd33361def9f66881ba5 +:01ce10ea2e4b8fb7e8d3ba4d7151fc3c5a6e3a +:01ce204ef1bd8020392718ef2486e28099b4e4 +:01ce30e8f36304d952b329de72085a3876e102 +:01ce40e06d421d79e46b7fd9adf5ca403fe545 +:01ce50996ca7e90f8eed29bd85efc2c2d45d52 +:01ce60539b6fab5ecfae277b3d344aaa5323d9 +:01ce70a2308a2a9844506fd8a37a6b58f5a3ce +:01ce80605a543a4439e78c28b795f9f8fb5f8f +:01ce9027b272107362e0c1a9083319fdf8229f +:01cea0e3e6a0766c593dc4c05173408199c598 +:01ceb03bccc845b5bc2213eccf188b4cb0aa92 +:01cec07f6b5cd8cc381f3d2d4fc8d5f67f5eb2 +:01ced0c1c7c264b7cb4dd85d5e1a69f2b75837 +:01cee0c2107332453b28de41d3cca814b5114d +:01cef01d1b53cf43c999c118f85f842088a0c7 +:01cf00c1534420b0ab92680bd770ad9aedbf2b +:01cf10d002ee888474de9f806c57572fff52ad +:01cf209eda558ac513e728f38cfb3223f8deed +:01cf3077a665a2c28b99dc178165dfef506185 +:01cf401911d64e6b083194e7ac5f560cf6dae6 +:01cf509a4df1309e522499f040e3facc302f24 +:01cf607f97280ca65a82d62b04ca9bf212c110 +:01cf707a6e092709ecb806135b78e0ded9888d +:01cf8036ec01ee725ebc00e4a0ad63a0d174b4 +:01cf90747a02fb76e4d3cb0e2b4904c19bddaf +:01cfa052c54972701e4ad33e2f200538ea45c2 +:01cfb0c7a122158aa81c70439be20d72c6622f +:01cfc02af272b07ab96da0d58f4e1b5b3e1791 +:01cfd0aaa5fc13d76dc8bbaaada3baaed69dd6 +:01cfe0f6e6569e586d379b573ac12508e2b58c +:01cff0068fb42af22ef42ccbd6e0008d1e356e +:01d000e10472c699817d3febcac9561e3c965c +:01d010d7b06348659561ff7acda110f113d618 +:01d02005c545afde99f49e95973aa89ed7d139 +:01d03011761d08a8fe49d1f2cb7b10d90999e3 +:01d0401232943e5d068055045e60b574861e69 +:01d050c545199e079f5978609152ab493d2694 +:01d060089b3394f9cfdc1652aed70a11a4c703 +:01d0700d06a0c7e57c276711c077fe6a9b060d +:01d080025a596b71b026c64ecf67d90c893b3c +:01d090a56b53919022a1f8ee70427575c10991 +:01d0a09d0483ff91f60e65c0c406f4511548a0 +:01d0b0d49c6c160f64061ce2d0725e64b2f7fb +:01d0c09033dacee3793356c9d3a7546c2fd934 +:01d0d085329789b4a500f616bdabc9eb1e16d7 +:01d0e07d133f23019501893d6057a062b2bb38 +:01d0f0d0f69fff011643d6b69fbffa26145022 +:01d10076abfc67c89a0437dfc119492d8b897d +:01d110b523be8d96e67813a4d17e2eba3b1feb +:01d120595f7e172cd11faeaff62537e411da2a +:01d1308cdf35130664104ea7e02939ff49bb00 +:01d140461340c6b66fd57dc1039aa293ae337f +:01d1507a2b18bbd392148c373e70fa1d1e82cb +:01d160bda37c737d44a3e3279af2e4f22307df +:01d170c25bc1652d02043b2003507115123eec +:01d180956b9fe2824d7580156adccba6d969c6 +:01d19025a792346c3a7cb71e3a5ddc0f211925 +:01d1a008e91a269d39cfb6e2631dc46383b535 +:01d1b04225214edd7aa640c0e8d34d1f7758ce +:01d1c0ffe2aef687a90624c41ea7213937d2a3 +:01d1d014e10d7454f32d9b48eab724537dede6 +:01d1e02c6b55063652160090006d3c3e0baee9 +:01d1f0b5eb6e163a94772f9ca6f73db981913b +:01d2008fadbc187a2d9373ada22784680ca3d4 +:01d210ec0b1ab680b937a17b0887d488ea3ba2 +:01d220c079116641a7a1eaacf22c39178944e1 +:01d230b41665574cf65c1b6d5d07df7fc12b33 +:01d240f3c6d3b8fd0d264b65eabc8d176b1c4f +:01d250ae05933a49dbc4667d695bce36add6c8 +:01d26093803cefaed2a0423c41681268999177 +:01d270900d73c7624cf23dd3c6a54f2bea67aa +:01d28069412eaf332db9566c015e8bb688ab86 +:01d29095a23ad7241b4fd819cc958c0fdb4412 +:01d2a04f2e8129c56ae00e47968bc08eef3c92 +:01d2b05ede231407d178ff1444c1a9ca449ece +:01d2c0eae087750b83d7744e89fab94588eb94 +:01d2d0c1a2c00668f993b51ff9565805a511da +:01d2e06e17c5e6d0b72ee4a36b1d0b2588e4c7 +:01d2f0c575370ffcff2bda46be376404809039 +:01d30028075a36cb5a850dcc07528c26450b9a +:01d3104963f9a2930dc209ad6f65baf97deb09 +:01d320209403c01343029a65d8b5a7894dfc74 +:01d330929b51185790a7b6195b75e57d6bf023 +:01d3407bd8b8c22122be679f3fcfe53d937b92 +:01d350701a001450c00fcd75a5ee9277ef0bdc +:01d360818420ace7208c919bc7c6deb73e514a +:01d370b48e207a231e4ead2ed3e67c62606451 +:01d38001798117339e1b87753db9b8947d1540 +:01d390685d37558486254abbd0076c2317f6f8 +:01d3a0e9c599b7c4d27c57ad5e70d90d838883 +:01d3b0e3e8c667543855834b940bb2d9dedb2e +:01d3c0ae86503f5e252f3b7726ab79dd0b1630 +:01d3d048553c52b34d7b7b07a7aaf2bb5dd73b +:01d3e0d42065927d2560ae5bf9e64f26460d4b +:01d3f03828f4771ffff1b5411b2f6bad8f43bb +:01d400760ced3416d872133a07254062097ea9 +:01d4103c47671a7e374f9134ab3f2ead1bcb4b +:01d420c55033e41f926994f4754d6f2c81eaa4 +:01d430212feb67d2f6f283d9b48270d4effa70 +:01d440859103a6b22d29d0fc6d7ea8b0667473 +:01d45050511435c2f4666feccfea85876d54a8 +:01d460c1a37c259c3b8352e1438c2425215376 +:01d470e60c4fa23171f74f8df62beda798b921 +:01d480aa550a23ca46a9b7b61db3cc28a35a14 +:01d490b22d8ed986f52515599df9b81d9c2acd +:01d4a08b9997cc89aa86e81f15cc072577813a +:01d4b02fb3cebc8cae5355c8552361c0973b0f +:01d4c072639ed69db20a14a654fa360f0df0fb +:01d4d049501f53ab8c0915df65632531d7e0c6 +:01d4e04acc91f25e1c9330dabd1a1984e3fe22 +:01d4f09e8ec5efa4b7bce3e68b20ecda7b48ef +:01d500a45be65638392e5390d594e797ef49fe +:01d51037db3dab0915b9e5aeecfd1ad7415ad2 +:01d5201785c5ed016ac252c5fecadd94196a98 +:01d5305aa5ef858be2d4fc8f474030a75f099d +:01d54003ab81341439dffe0c27516c73707b54 +:01d55097c4e19b36388062532d5ce58d94e199 +:01d56051eb8f5a09d912365d1b3f1a3a5a0cd4 +:01d57032859ef37dd7004512b4eaec1c69c320 +:01d5809d73abf855da2e06d41c05234188b100 +:01d5907a573ced403a75cf71265060a4bfce3f +:01d5a011e68db564246e6b492d3ce4ea28d045 +:01d5b08f562c862f1b1c381c830d9bcd5f7166 +:01d5c0ca12460bd9e0c629accf0ef24197a7d9 +:01d5d08c295e5a8389d25b732fb28b9e8eac13 +:01d5e0738c538666e7abc5a0d69ed0a0dee839 +:01d5f0cdb17f56d2bfaeaa56b2db556f796349 +:01d600f876b60e6e6b2726596edcf667a4f62e +:01d6103d275117b261875b9264cbb370855cdd +:01d6208f1dfa7634c7cd2c052a0feb43cb4115 +:01d63004c61f2a0801b29740fdd00742c8bf8b +:01d640763f1f12eb59eb18a41b252dcca249a4 +:01d650ed17df7fa1700161ef40fc6dc1f87dad +:01d6609b989e60a64e715fbe7fca6821b0f9d8 +:01d670ccc7800c5ec9c98796f6fce63dc0db38 +:01d680080a1af6b7fe25cfd749a41df4415961 +:01d69054444a2919f662162b851c3ce49db2c8 +:01d6a097f7618aec624bbbed60ee6a850210be +:01d6b0f13fcb71543206d2df7c5843c4b7956e +:01d6c05e3dd2f1b4750442634c25f88a28ac36 +:01d6d039fb769e3742119a88dd2e52e4a9cd46 +:01d6e019763fd87e059206fce585d5e9eb2547 +:01d6f0e04b72ae5884b0cf2831f09502b7a19b +:01d700cf870b67bbc9aae93c6b5c136583fa11 +:01d71089afd18e1209709b25e3f380f287ad3d +:01d72091366b154ca4b0b13c6843d370000474 +:01d730d28e1d76e5a0e40e3f962c6b2517d98c +:01d7408d612ba0006dc60457c96296edc65053 +:01d750e002926f5c4a02e4ddf751a75b0fbbfa +:01d760927afdf5f379499fa7bd8447a9729d79 +:01d7707a29ec368aa75ee9a4f1242b445615fe +:01d7806064a15abc3f9f429cd064417ea79e7e +:01d79049ad12f34c90567fc7a516f7114ca1f9 +:01d7a04f7175eae99b481e627fe0baacfadbe7 +:01d7b0c24330a8aa7dadde28e1b40c8019d431 +:01d7c040dbdaa9f67d4ef435ca4776278f00de +:01d7d0d21467fe9181b25ce56f2911d6ab2b48 +:01d7e06b111c3cee1c49b44a49d7bb81cb6529 +:01d7f0352b03b0b920efca62b58789248686d7 +:01d8000697a9c5b02fb93f748493e830ce46e5 +:01d8101fdcbf6817dcc91d624f1a6292dfdda8 +:01d820ef6670d04e574b5dc6b33edaaf6fb3c2 +:01d83064c50985b78f01e262cef56fb2234968 +:01d840c533c42c7587c496742c8a97a43e2792 +:01d8506400dde4b8a341b4eabd4f651ce52170 +:01d86026eca6500d7ac70112b33ffef690dae9 +:01d87033d8f72b9753de6ab83465c3d65c383e +:01d8808b38268687ce6a12e4b288ab036c7e9d +:01d890c0a1353166377ebc98281abdfca40c11 +:01d8a06b05a5265195efa394f4683503952b2a +:01d8b01fb0998f800b9069991fb409dd506322 +:01d8c0b277459ea8d612200cf29795a654f5c6 +:01d8d04cc50febe1d91b60534a309b5ef6bd7e +:01d8e075ba9f8b21eb999bdb75f5434c91a1e1 +:01d8f03ec5cedfa1910b38ef396b8fb5508184 +:01d9000fd8122400a56deaec650fd7b561a307 +:01d910515b8a41d8375efd909ea3502bb6ce55 +:01d9206d80c2011a46d38f943dbfafa5b15950 +:01d930be621ab112c03b08b164d978ae18fbe5 +:01d940274d6da1407c0e5dc338585b40102cc5 +:01d9506ee4738937ae29f1ff32b61a65927779 +:01d9607a767ac8a73cdea4efb809941e491ece +:01d970925ec1ab52fa35174cfc0fed89078dbd +:01d98036ca71f017846070c94c9f8157e3c27a +:01d9901b5931bbd6b2aebd0cff449f94f76b2b +:01d9a064e3410ded6a08b2bfa8e20db8e656ac +:01d9b076fb130fd50938da08447eac381ebebb +:01d9c0753eb077e012471d4818b8667e594e67 +:01d9d0df265e3815f3e15e3a7b52695b87381c +:01d9e061715e556b3533ca97789506f2433251 +:01d9f0b5d353dbead3f4b0dc152f239bfc1afc +:01da004ae32835f486c92b118add18a2ddf60b +:01da10c901f77bdefbbdc8b9552560fa193b6d +:01da208314fe0bb1457cbbba3619f595431e64 +:01da304125a4810c94c6393c70a1bfbcd5d9ab +:01da40f53758efdd5cd98d088be69cee60d4af +:01da50098f3644db07be9f3ff10dee7df1a5a4 +:01da6045d9b1b888b8f778b5cec202a212250f +:01da70509f50521f6e7e584a0606b1616da33c +:01da806996782b3f0338bf4e59cad2193fbf51 +:01da907f21ce1d942f5d981d0fe9795f16d8e6 +:01daa0f0da6a36df4cd297283e567f3286beb5 +:01dab049e9c1479bf333e0dca894b260742b03 +:01dac0cf07a56111f6244feb52158409cde33b +:01dad05eb3ede074d8f93732ff85649482c5f8 +:01dae08b812ed03d747e3227963f9f87b15718 +:01daf043a169c715043c59c04ec67aa8e1c91d +:01db00d4311783262aaa2bff9b8ea0f0bb4421 +:01db10eef816af5c98dd2b69bceb0c0547de1c +:01db209e328bd836e75e8035c60a5315d13ae7 +:01db30f4678e2c887ddd844684294567b39ea3 +:01db4062746a479e536f728cc3e82578774bc7 +:01db50b842e1e6947d2cf6e64105d3c0f73704 +:01db605e62285b77769b88f53f86495e85fb05 +:01db70abaaa575436aaa23278b2fd3b6bf5d96 +:01db802ae1439e7460bec8284389f653431b70 +:01db900b8d08f59426713f470a29edc873ce0f +:01dba014c0e8db69d2076fee20ce3f594eb766 +:01dbb06c0662edc0ff38c0f1ec6bb33bbf67cc +:01dbc06cd6fedf1683013207bfa813248555ca +:01dbd00114e60dbe8c02635fbe3cfd96406373 +:01dbe0a69f755996618f1f544ba74e6213a261 +:01dbf0156ce6c9f186eaacf0b96205a8a9509e +:01dc004ca0e2ec1b7bb9c3a3d6fd97712c9f80 +:01dc10ccf800d9362434a622290978f9d110f7 +:01dc20425e65c6edcd1fb3aadcaf3096233122 +:01dc3053cd972fb44f56e53760d21cfa7906d7 +:01dc402048ec7cf7bb20528f3788a4c8ca3942 +:01dc5071d66224c0d242dd0b11bf14edb4c6d2 +:01dc60d5e2cbc9618c3fe8286c47e28dd89401 +:01dc7056dd9707478855f5db776e29cb0b2f64 +:01dc802596eb7339ca3d2c1b6def7cf06fdb23 +:01dc90c39a69c4d8be7299c7a57b5459b789ec +:01dca0701bbbea2ea796c71683e02c13f2d628 +:01dcb026ac9b20949c543b0b6543854f564ce9 +:01dcc094709301d486b78a7c4dae9202455732 +:01dcd0c2bc70a038563c9b00f9e9e7cbeb2c46 +:01dce0b4bc7016515304da3634ad94c0283b76 +:01dcf0c61d4ca173065f4bb9140750caebcaec +:01dd00f23056e2fb889917f8687750e234966d +:01dd106cc56ac8dd8b4ce768a3421ec0cd505a +:01dd202c86f7f83dd16a9d1c3549d4902f2106 +:01dd30d6ea8717814cd203016080b29fe77342 +:01dd4047c0a1754d4da0a6859e5eff27817c88 +:01dd50ac8e0ce77b6a6bd9cff56df4726b53ab +:01dd60e72c147d96969956a024b3f1af616d42 +:01dd70ae79e37331d99ba59854824d77cf66a6 +:01dd803f9568b3d43c201b0f2d2d22f43fce3c +:01dd90cf38548986da6973d6c04ff54bd42472 +:01dda01be716c61d23cf89f82ae0b27e772321 +:01ddb00be6dccb9c2ed43580aa04d1b8a78e3a +:01ddc0baf1fb277bb91121a561f1c2e881cc17 +:01ddd0c261aa31dead1539fa984f59b02b080a +:01dde0a07c53bd92551896271ca0978bc150f0 +:01ddf0eb49b117ef2d42f4ea6b4dc04a2064f5 +:01de00fc89dcca30b07dbff7a5dc56c88668ba +:01de10c7ff78f8a62e7cd266c7a7da0b2cce87 +:01de20fa87327cb160733112440678656ce9dd +:01de30191a7789d88984bf40242f4b53d300b2 +:01de4040cecaea2cd50b2649d9fa9cf689f319 +:01de502a433024bee935a9e673bb7f7c3bd3ac +:01de60c0a74de2ffc75392c06c9a719f22d1ce +:01de70911a7b143ae6f52bf316c0c4ac462ffc +:01de80941b56e0b99f52027684edd9f5b955f5 +:01de9056d75a302df905b40c26f6ec5ae9f885 +:01dea03253cc951f7a483334c2c0a47e428a87 +:01deb08316f94e82a49b2c34018ad7928e5cc5 +:01dec0b0df13de8c193131db150e30f3b47f15 +:01ded0fca93e963673c274f9f0a2e33bc947a1 +:01dee08a0e5dbd11e0484e1516911ae5c83eb3 +:01def087075b5ee992b81ec9cc3c420f54c786 +:01df00c30eda77af52f655d4c681b5063c2500 +:01df10066a5632467e386cac7b37a66148e108 +:01df2097981a9060faf7a718abfe9089dacf3a +:01df306f09db9dac304f062e5a0834b3851143 +:01df4006900e20593983f67ab42051bcb36acc +:01df50d8c502d32827e2177fd39d1b84798426 +:01df60a0f8b532236aca97503ce52511f878f3 +:01df704af18a885b01571d505267ee50df6d82 +:01df803172fe4a456e6189b07ac1c406f8bd7a +:01df90646c50b5cbba0543be41408a22c16e64 +:01dfa0235f9a370252325d69d8011ba514b246 +:01dfb03a5fe2b67917c8f3f31bd6bc5b469f66 +:01dfc06654bb563ad1a48aca7e27c814549374 +:01dfd06fde3287fbae9a1f569cd506ac5b47fa +:01dfe0dfd5ea1c3b306e7338eda3fb256195b4 +:01dff0d91baf84c9a22fdf269dc8268faea63c +:01e000067222bcfb9053c6a0c8d9e76d541b4f +:01e0100dd5b379