# HG changeset patch # User heinrichsweikamp # Date 1542912446 -3600 # Node ID ca4556fb60b9c20c279509ea6f2ff42273a5a6ea # Parent 00b24fb4324dd87388acc1402c4a6b3864d9cd0c bump to 2.99beta, work on 3.00 stable diff -r 00b24fb4324d -r ca4556fb60b9 src/Icons/dive_warning2.inc --- a/src/Icons/dive_warning2.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/Icons/dive_warning2.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,58 +1,60 @@ ; \file C:/hw/osct3_code/src/Icons/dive_warning2.inc -; Generated 2015-03-19T13:15:44 +; Generated 2015-03-19T13:15:44 V2.98a ; -dive_warning2_version equ .112 -dive_warning2_width equ .45 -dive_warning2_height equ .39 +dive_warning2_version equ .112 +dive_warning2_width equ .45 +dive_warning2_height equ .39 ; dive_warning2_block: - db .22, .39 - db .2, 0 + db .22, .39 ; width/2, height + db .4, 0 ; #colors, spare ; - dw 0x0000 ; rgb=(0,0,0) - dw 0xff80 ; rgb=(255,242,0) + dw 0x0000 ; color 0x00: outside black rgb=( 0, 0, 0) + dw 0xff80 ; color 0x01: triangle yellow rgb=(255,242, 0) + dw 0xff80 ; color 0x02: excl.mark yellow rgb=(255,242, 0) + dw 0x0000 ; color 0x03: inside black rgb=( 0, 0, 0) ; - db 0x9d, 0x00, 0x84, 0x01, 0xa0, 0x00, 0x86, 0x01 - db 0x9d, 0x00, 0x89, 0x01, 0x9b, 0x00, 0x8a, 0x01 - db 0x99, 0x00, 0x8c, 0x01, 0x98, 0x00, 0x86, 0x01 - db 0x81, 0x00, 0x84, 0x01, 0x96, 0x00, 0x87, 0x01 - db 0x83, 0x00, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01 - db 0x85, 0x00, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01 - db 0x86, 0x00, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01 - db 0x88, 0x00, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01 - db 0x89, 0x00, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01 - db 0x8b, 0x00, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01 - db 0x8c, 0x00, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01 - db 0x8e, 0x00, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01 - db 0x8f, 0x00, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01 - db 0x91, 0x00, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01 - db 0x92, 0x00, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01 - db 0x94, 0x00, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01 - db 0x95, 0x00, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01 - db 0x97, 0x00, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01 - db 0x98, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 - db 0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01 - db 0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 - db 0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01 - db 0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 - db 0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01 - db 0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01 - db 0x98, 0x00, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01 - db 0x97, 0x00, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01 - db 0x95, 0x00, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01 - db 0x94, 0x00, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01 - db 0x92, 0x00, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01 - db 0x91, 0x00, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01 - db 0x8f, 0x00, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01 - db 0x8e, 0x00, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01 - db 0x8c, 0x00, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01 - db 0x8b, 0x00, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01 - db 0x89, 0x00, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01 - db 0x88, 0x00, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01 - db 0x86, 0x00, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01 - db 0x85, 0x00, 0x83, 0x01, 0x96, 0x00, 0x87, 0x01 - db 0x83, 0x00, 0x83, 0x01, 0x98, 0x00, 0x86, 0x01 - db 0x81, 0x00, 0x84, 0x01, 0x99, 0x00, 0x8c, 0x01 - db 0x9b, 0x00, 0x8a, 0x01, 0x9c, 0x00, 0x89, 0x01 - db 0x9e, 0x00, 0x86, 0x01, 0xa0, 0x00, 0x84, 0x01 - db 0x83, 0x00 + db 0x9d, 0x00, 0x84, 0x01, 0xa0, 0x00, 0x86, 0x01 + db 0x9d, 0x00, 0x89, 0x01, 0x9b, 0x00, 0x8a, 0x01 + db 0x99, 0x00, 0x8c, 0x01, 0x98, 0x00, 0x86, 0x01 + db 0x81, 0x03, 0x84, 0x01, 0x96, 0x00, 0x87, 0x01 + db 0x83, 0x03, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01 + db 0x85, 0x03, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01 + db 0x86, 0x03, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01 + db 0x88, 0x03, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01 + db 0x89, 0x03, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01 + db 0x8b, 0x03, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01 + db 0x8c, 0x03, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01 + db 0x8e, 0x03, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01 + db 0x8f, 0x03, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01 + db 0x91, 0x03, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01 + db 0x92, 0x03, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01 + db 0x94, 0x03, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01 + db 0x95, 0x03, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01 + db 0x97, 0x03, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01 + db 0x98, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 + db 0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02 + db 0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 + db 0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02 + db 0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01 + db 0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02 + db 0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01 + db 0x98, 0x03, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01 + db 0x97, 0x03, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01 + db 0x95, 0x03, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01 + db 0x94, 0x03, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01 + db 0x92, 0x03, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01 + db 0x91, 0x03, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01 + db 0x8f, 0x03, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01 + db 0x8e, 0x03, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01 + db 0x8c, 0x03, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01 + db 0x8b, 0x03, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01 + db 0x89, 0x03, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01 + db 0x88, 0x03, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01 + db 0x86, 0x03, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01 + db 0x85, 0x03, 0x83, 0x01, 0x96, 0x00, 0x87, 0x01 + db 0x83, 0x03, 0x83, 0x01, 0x98, 0x00, 0x86, 0x01 + db 0x81, 0x03, 0x84, 0x01, 0x99, 0x00, 0x8c, 0x01 + db 0x9b, 0x00, 0x8a, 0x01, 0x9c, 0x00, 0x89, 0x01 + db 0x9e, 0x00, 0x86, 0x01, 0xa0, 0x00, 0x84, 0x01 + db 0x83, 0x00 diff -r 00b24fb4324d -r ca4556fb60b9 src/aa_fonts.asm --- a/src/aa_fonts.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/aa_fonts.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,168 +1,171 @@ ;============================================================================= ; -; File aa_fonts.asm +; File aa_fonts.asm V2.99d ; ; Font-data for the anti-aliased word processor ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2010-11-23 : [jDG] Creation for OSTC 1.72, with the original fonts repacked. -; 2010-12-01 : [jDG] Adding 3bits antialiased fonts. +; 2010-11-23 : [jDG] Creation for OSTC 1.72, with the original fonts repacked +; 2010-12-01 : [jDG] Adding 3 bit anti-aliased fonts ;============================================================================= ;---- TINY font description and data ---------------------------------------- -fonts_data CODE_PACK 0x11000 ; <- Make sure all three fonts are in the same 64kByte page... + +; Attention: all three fonts need to be in the same 64 kByte page +fonts_data CODE_PACK 0x11000 - global aa_font16_block + global aa_font16_block aa_font16_block: - DB '°', 0x7F ; Remap a few ASCII chars, to avoid - DB 'ö', 0x80 ; holes in the character table... - DB 'ä', 0x81 - DB 'ü', 0x82 - DB 'ß', 0x83 - DB 'é', 0x84 ; French accents - DB 'è', 0x85 - DB 'ê', 0x86 - DB 'ç', 0x87 - DB 'á', 0x88 ; Spanish accents - DB 'í', 0x89 - DB 'ó', 0x8A - DB 'ú', 0x8B - DB 'ñ', 0x8C - DB '¡', 0x8D - DB '¿', 0x8E - DB 0 ; End of translation table - DB aa_font16_firstChar ; To be substracted - DB aa_font16_chars ; Max value - DB '¿'-aa_font16_firstChar ; replace by ¿ when unknown. - DB aa_font16_height + 0x80 + DB '°', 0x7F ; remap a few ASCII chars, to avoid + DB 'ö', 0x80 ; holes in the character table + DB 'ä', 0x81 + DB 'ü', 0x82 + DB 'ß', 0x83 + DB 'é', 0x84 ; French accents + DB 'è', 0x85 + DB 'ê', 0x86 + DB 'ç', 0x87 + DB 'á', 0x88 ; Spanish accents + DB 'í', 0x89 + DB 'ó', 0x8A + DB 'ú', 0x8B + DB 'ñ', 0x8C + DB '¡', 0x8D + DB '¿', 0x8E + DB 0 ; end of translation table + DB aa_font16_firstChar ; to be subtracted + DB aa_font16_chars ; max value + DB '¿'-aa_font16_firstChar ; replace by ¿ when unknown + DB aa_font16_height + 0x80 ; -#include "../src/Fonts/aa_font16_idx.inc" ; SHOULD FOLLOW ! +#include "../src/Fonts/aa_font16_idx.inc" #include "../src/Fonts/aa_font16.inc" aa_font16_end: -; Make sure this is coherent... +; Attention: make sure this is coherent if aa_font16_nbbits != 3 - error TINY fount should be encoded with anti-aliasing... + error TINY font should be encoded with 3 bits anti-aliasing! endif ;---- SMALL font description and data ---------------------------------------- - global aa_font28_block + global aa_font28_block aa_font28_block: - DB '°', 0x7F ; Remap a few ASCII chars, to avoid - DB 'ö', 0x80 ; holes in the character table... - DB 'ä', 0x81 - DB 'ü', 0x82 - DB 'ß', 0x83 - DB 'é', 0x84 ; French accents - DB 'è', 0x85 - DB 'ê', 0x86 - DB 'ç', 0x87 - DB 'á', 0x88 ; Spanish accents - DB 'í', 0x89 - DB 'ó', 0x8A - DB 'ú', 0x8B - DB 'ñ', 0x8C - DB '¡', 0x8D - DB '¿', 0x8E - DB '¤', 0x8F ; Unused - ; 90, 91 are the logo. - DB 0xB7,0x92 ; Cursor - DB 0xB8,0x93 ; Dimmed cursor. - DB 0 ; End of translation table - DB aa_font28_firstChar ; To be substracted - DB aa_font28_chars ; Max value - DB 0x83-aa_font28_firstChar; replace by ¤ when unknown. - DB aa_font28_height + 0x80 + DB '°', 0x7F ; remap a few ASCII chars, to avoid + DB 'ö', 0x80 ; holes in the character table + DB 'ä', 0x81 + DB 'ü', 0x82 + DB 'ß', 0x83 + DB 'é', 0x84 ; French accents + DB 'è', 0x85 + DB 'ê', 0x86 + DB 'ç', 0x87 + DB 'á', 0x88 ; Spanish accents + DB 'í', 0x89 + DB 'ó', 0x8A + DB 'ú', 0x8B + DB 'ñ', 0x8C + DB '¡', 0x8D + DB '¿', 0x8E + DB '¤', 0x8F ; unused + ; 90 and 91 contain the logo + DB 0xB7,0x92 ; cursor + DB 0xB8,0x93 ; arrow down + DB 0xB9,0x94 ; arrow up + DB 0 ; end of translation table + DB aa_font28_firstChar ; to be subtracted + DB aa_font28_chars ; max value + DB 0x83-aa_font28_firstChar ; replace by ¤ when unknown + DB aa_font28_height + 0x80 ; -#include "../src/Fonts/aa_font28_idx.inc" ; SHOULD FOLLOW ! +#include "../src/Fonts/aa_font28_idx.inc" #include "../src/Fonts/aa_font28.inc" aa_font28_end: -; Make sure this is coherent... +; Attention: make sure this is coherent... if aa_font28_nbbits != 3 - error SMALL fount should be encoded with anti-aliasing... + error SMALL font should be encoded with 3 bits anti-aliasing! endif ;---- STD font description and data ------------------------------------------ - global aa_font36_block + global aa_font36_block aa_font36_block: - DB '°', 0x7F ; Remap a few ASCII chars, to avoid - DB 'ö', 0x80 ; holes in the character table... - DB 'ä', 0x81 - DB 'ü', 0x82 - DB 'ß', 0x83 - DB 'é', 0x84 ; French accents - DB 'è', 0x85 - DB 'ê', 0x86 - DB 'ç', 0x87 - DB 'à', 0x88 ; Spanish accents - DB 'á', 0x89 ; Spanish accents - DB 'í', 0x8A - DB 'ó', 0x8B - DB 'ú', 0x8C - DB 'ñ', 0x8D - DB '¡', 0x8E - DB '¿', 0x8F - ; 90, 91 are the logo. - DB 0xB7,0x92 ; Cursor - ; 93 is down arrow (dive start) - ; 94 is up arrow (dive end) - ; 95 is left-right arrow (dive duration) - DB '¤', 0x96 ; Unused - DB 0 ; End of translation table - DB aa_font34_firstChar ; To be substracted - DB aa_font34_chars ; Max value - DB 0x87-aa_font34_firstChar; replace by ¤ when unknown. - DB aa_font34_height + 0x80 + DB '°', 0x7F ; remap a few ASCII chars, to avoid + DB 'ö', 0x80 ; holes in the character table + DB 'ä', 0x81 + DB 'ü', 0x82 + DB 'ß', 0x83 + DB 'é', 0x84 ; French accents + DB 'è', 0x85 + DB 'ê', 0x86 + DB 'ç', 0x87 + DB 'à', 0x88 ; Spanish accents + DB 'á', 0x89 + DB 'í', 0x8A + DB 'ó', 0x8B + DB 'ú', 0x8C + DB 'ñ', 0x8D + DB '¡', 0x8E + DB '¿', 0x8F + ; 90, 91 contain the the logo + DB 0xB7,0x92 ; cursor + ; 93 is down arrow (dive start) + ; 94 is up arrow (dive end) + ; 95 is left-right arrow (dive duration) + DB '¤', 0x96 ; unused + DB 0 ; end of translation table + DB aa_font34_firstChar ; to be subtracted + DB aa_font34_chars ; max value + DB 0x87-aa_font34_firstChar ; replace by ¤ when unknown. + DB aa_font34_height + 0x80 ; -#include "../src/Fonts/aa_font34_idx.inc" ; SHOULD FOLLOW ! +#include "../src/Fonts/aa_font34_idx.inc" #include "../src/Fonts/aa_font34.inc" aa_font36_end: -; Make sure this is coherent... +; Attention: make sure this is coherent... if aa_font34_nbbits != 3 - error STANDARD fount should be encoded with anti-aliasing... + error STANDARD font should be encoded with 3 bits anti-aliasing! endif ;---- MEDIUM font description and data --------------------------------------- - global aa_font48_block + global aa_font48_block aa_font48_block: - DB 0x27, 0x3B ; ' char - DB '"', 0x3C - DB 'm', 0x3D - DB 'f', 0x3E - DB ' ', 0x3F - DB 0 - DB aa_font48_firstChar - DB aa_font48_chars - DB 0x3E-aa_font48_firstChar - DB aa_font48_height + 0x80 ; AA flag. + DB 0x27, 0x3B ; ' char + DB '"', 0x3C + DB 'm', 0x3D + DB 'f', 0x3E + DB ' ', 0x3F + DB 0 + DB aa_font48_firstChar + DB aa_font48_chars + DB 0x3E-aa_font48_firstChar + DB aa_font48_height + 0x80 ; AA flag ; #include "../src/Fonts/aa_font48_idx.inc" #include "../src/Fonts/aa_font48.inc" aa_font48_end: -; Make sure this is coherent... +; Attention: make sure this is coherent... if aa_font48_nbbits != 3 - error MEDIUM fount should be encoded with 3bits anti-aliasing... + error MEDIUM font should be encoded with 3 bits anti-aliasing! endif ;---- LARGE font description and data ---------------------------------------- - global aa_font90_block + global aa_font90_block aa_font90_block: - DB ' ', 0x2F - DB 0 - DB aa_font90_firstChar - DB aa_font90_chars - DB 0x2F-aa_font90_firstChar - DB aa_font90_height + 0x80 ; AA flag. + DB ' ', 0x2F + DB 0 + DB aa_font90_firstChar + DB aa_font90_chars + DB 0x2F-aa_font90_firstChar + DB aa_font90_height + 0x80 ; AA flag ; #include "../src/Fonts/aa_font90_idx.inc" #include "../src/Fonts/aa_font90.inc" aa_font90_end: -; Make sure this is coherent... +; Attention: make sure this is coherent... if aa_font90_nbbits != 3 - error SMALL fount should be encoded with 3bits anti-aliasing... + error SMALL font should be encoded with 3 bits anti-aliasing! endif ;============================================================================= - END \ No newline at end of file + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/aa_wordprocessor.asm --- a/src/aa_wordprocessor.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/aa_wordprocessor.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,14 +1,14 @@ ;============================================================================= ; -; File aa_wordprocessor.asm ## V2.97 +; File aa_wordprocessor.asm ## V2.99e ; ; Anti-aliased word processor ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2010-11-22 : [jDG] Creation. -; 2010-12-01 : [jDG] Adding 3bits anti-aliased fonts. +; 2010-11-22 : [jDG] Creation +; 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 ; @@ -48,16 +48,18 @@ extern aa_font48_block extern aa_font90_block +aa_word CODE + ;------------------------------------------------------------------------------ ; 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 ; -basic CODE + aa_char_setup: movwf PRODL ; save char into PROD for now - movf win_font,W,BANKED ; Get font number (updates Z flag) + movf win_font,W ; get font number (updates Z flag) bnz aa_char_1 ; TINY font --------------------------------------------------------- @@ -74,8 +76,8 @@ ; SMALL font --------------------------------------------------------- ; Font SMALL character folding... aa_char_1: - decfsz WREG ; This is small font ??? - bra aa_char_2 + decfsz WREG ; requested small font? + bra aa_char_2 ; NO movlw LOW aa_font28_block movwf TBLPTRL movlw HIGH aa_font28_block @@ -87,8 +89,8 @@ ; STD font ----------------------------------------------------------- ; Font SMALL character folding... aa_char_2: - decfsz WREG ; This is small font ??? - bra aa_char_3 + decfsz WREG ; requested std font? + bra aa_char_3 ; NO movlw LOW aa_font36_block movwf TBLPTRL movlw HIGH aa_font36_block @@ -99,10 +101,8 @@ ; MEDIUM font -------------------------------------------------------- aa_char_3: - decfsz WREG ; This is medium font ??? - bra aa_char_4 - - ; Font MEDIUM block: + decfsz WREG ; requested medium font? + bra aa_char_4 ; NO movlw LOW aa_font48_block movwf TBLPTRL movlw HIGH aa_font48_block @@ -113,7 +113,7 @@ ; LARGE font --------------------------------------------------------- aa_char_4: - ; Font LARGE block: + ; no to all above - must be large font then... movlw LOW aa_font90_block movwf TBLPTRL movlw HIGH aa_font90_block @@ -130,53 +130,53 @@ ; 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 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 + 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 + bra aa_char_30 ; loop ; Make sure char is in the available range aa_char_32: - tblrd*+ ; Read first char + tblrd*+ ; read first char movf TABLAT,W ; get it subwf PRODL,F ; (char - first) --> PRODL - tblrd*+ ; Read nb chars + tblrd*+ ; read nb chars movf TABLAT,W ; nbchars --> WREG - tblrd*+ ; Read default char - cpfslt PRODL ; if char > WREG ? + tblrd*+ ; read default char + cpfslt PRODL ; 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 + 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 + 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 ; then save it (its a register) ; Set PROM pointer to the char index - movf PRODL,W ; Read back char + 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) + 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 + 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 + movff TABLAT,aa_end+0 ; read low byte tblrd*+ movff TABLAT,aa_end+1 ; and high byte @@ -193,53 +193,53 @@ movff aa_start+1, TBLPTRH clrf aa_bitlen ; clear reminders... - ; Read bitmap byte, and decode length: + ; Read bitmap byte, and decode length: aa_char_width_1: ifdef AA_BYTE_SWAP - btg TBLPTRL,0 ; Toggle low ptr bit + btg TBLPTRL ; toggle low ptr bit tblrd* - movf TABLAT,W ; Store to WREG - btg TBLPTRL,0 ; Get is back + movf TABLAT,W ; store to WREG + btg TBLPTRL ; get is back tblrd*+ ; then increment (but trash TABLAT) - movwf TABLAT ; Then restore copy to TABLAT + movwf TABLAT ; then restore copy to TABLAT else - tblrd*+ ; Normal read... - movf TABLAT,W ; Store copy to WREG + 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 + btfss aa_antialias ; anti-aliased font ? + bra aa_char_width_10 ; NO - always 7 bit count - bn aa_char_width_10 ; Non-white pixels ? - andlw 0x1F ; Yes : 5 bits count + bn aa_char_width_10 ; none-white pixels? + andlw 0x1F ; YES - 5 bit count aa_char_width_10: - andlw 0x7F ; No: 7 bit count + andlw 0x7F ; NO - 7 bit count incf WREG ; WREG = repetition count - addwf aa_bitlen,F ; Add remaining pixels from last code + addwf aa_bitlen,F ; add remaining pixels from last code - movf win_height,W,BANKED ; WREG = - height + movf win_height,W ; WREG -= height negf WREG ; This is a hand-made division by successive subtraction of height aa_char_width_2: - addwf aa_bitlen,F ; Try to subtract 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 ; Succeeded: do a 16bit increment + infsnz win_width+0,F ; succeeded: do a 16 bit 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 + addwf aa_bitlen,F ; restore true reminder ; Are we done ? - movf TBLPTRL,W ; Compare TBLPTR to aa_end + movf TBLPTRL,W ; compare TBLPTR to aa_end cpfseq aa_end+0 - bra aa_char_width_1 ; Loop if LOW is different + bra aa_char_width_1 ; loop if LOW is different movf TBLPTRH,W - cpfseq aa_end+1 ; Loop to if HIGH is different + cpfseq aa_end+1 ; loop to if HIGH is different bra aa_char_width_1 return @@ -251,12 +251,12 @@ ; aa_string_width: lfsr FSR2, buffer ; FSR2 pointer to start of string - clrf win_width+0 ; Clear width sum + 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 + 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 @@ -279,73 +279,73 @@ aa_decode_1: ifdef AA_BYTE_SWAP - btg TBLPTRL,0 ; Toggle low ptr bit + btg TBLPTRL ; toggle low ptr bit tblrd* - movf TABLAT,W ; Store to WREG - btg TBLPTRL,0 ; Get is back + movf TABLAT,W ; store to WREG + btg TBLPTRL ; get is back tblrd*+ ; then increment (but trash TABLAT) - movwf TABLAT ; Then restore copy to TABLAT + movwf TABLAT ; then restore copy to TABLAT else - tblrd*+ ; Normal read... - movf TABLAT,W ; Store copy to WREG + tblrd*+ ; normal read... + movf TABLAT,W ; store copy to WREG endif - 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 + btfss aa_antialias ; anti-aliased font? + bra aa_decode_10 ; NO - always 7 bit count + bn aa_decode_10 ; none-white pixels? + andlw 0x1F ; Yes - 5 bit count aa_decode_10: - andlw 0x7F ; No: 7 bit count + andlw 0x7F ; NO - 7 bit count incf WREG movwf aa_bitlen ; repetition count --> aa_bitlen ;---- COLOR DECODING ------------------------------------------------- ; ; Code Normal Inverse - ; 1xx 0% 100% : Managed by aa_decode_13 + ; 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 + ; 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 + movf TABLAT,W ; get back code + btfss aa_antialias ; anti-aliased font? + bra aa_decode_13 ; NO - 1 bit case ; 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 + ; of the asymmetric processing! + bn aa_decode_13 ; decode as none-aa ; Manage 000 special case too: - andlw 0xE0 ; Select color bits - bz aa_decode_13 ; That's a 000 ! + 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 + btfss win_invert ; inverse video mode? + sublw 0x80 ; NO ; 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 ! + 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 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 + rrcf win_color1,W ; xRRRRxGG andlw b'01111011' ; 0RRRR0GG (don't change C) movwf aa_temp+0 - rrcf win_color2,W,BANKED ; GGGxBBBB + rrcf win_color2,W ; GGGxBBBB andlw b'11101111' ; GGG0BBBB movwf aa_temp+1 btfss aa_color_half bra aa_decode_12 - movff aa_temp+0,PRODH ; Add color/2 if bit set + 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 @@ -359,41 +359,41 @@ andlw b'11100111' ; GGG00BBB movwf aa_temp+1 - movf aa_temp+1,W ; Add color/4 + 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 + 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 +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 (i.e. full color) - bsf tft_rs,0 ; RS_H Data + bsf tft_rs ; 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 + bsf tft_rs ; 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 ; 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 + bcf tft_nwr ; WR_L + bsf tft_nwr ; WR_H tick decf aa_bitlen,F bnz aa_decode_4a @@ -401,11 +401,11 @@ bsf INTCON,GIE ;---- BYTE-CODE LOOP ------------------------------------------------- ; Are we done ? - movf TBLPTRL,W ; Compare TBLPTR to aa_end + movf TBLPTRL,W ; compare TBLPTR to aa_end cpfseq aa_end+0 - bra aa_decode_1 ; Loop if LOW is different + bra aa_decode_1 ; loop if LOW is different movf TBLPTRH,W - cpfseq aa_end+1 ; Loop too if HIGH is different + cpfseq aa_end+1 ; loop too if HIGH is different bra aa_decode_1 return @@ -414,21 +414,21 @@ ; 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 ; DATA block command - Index_out 0x22 ; Index_out is a macro defined in tft.inc + 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 + 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/adc_lightsensor.asm --- a/src/adc_lightsensor.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/adc_lightsensor.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File adc.asm V2.98 +; File adc.asm V2.99e ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -16,7 +16,7 @@ extern reset_battery_internal_only -sensors CODE +adc_light CODE ;============================================================================= @@ -25,20 +25,20 @@ nop bsf ADCON0,1 ; start ADC wait_adc2: - btfsc ADCON0,1 ; Wait... + btfsc ADCON0,1 ; wait... bra wait_adc2 return global get_battery_voltage get_battery_voltage: ; starts ADC and waits until finished btfss battery_gauge_available - bra get_battery_voltage1 ; Normal ostc3 hardware + 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 + tstfsz batt_voltage+1 ; < 256 mV ? + bra get_battery_voltage_noretry ; NO ; Retry call lt2942_get_accumulated_charge @@ -46,7 +46,7 @@ get_battery_voltage_noretry: btfsc divemode - return ; Not in divemode + return ; not in divemode bcf cv_active bcf cc_active @@ -68,28 +68,28 @@ decfsz get_bat_volt_counter,F return movlw .15 - cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? - bra charge_cc_active ; No + cpfsgt batt_voltage+1 ; battery 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 + bsf LEDr ; indicate charging + call lt2942_charge_done ; reset accumulating registers to 0xFFFF WAITMS d'10' - bcf LEDr ; Indicate charging + bcf LEDr ; indicate charging bsf get_bat_volt_counter,0 ; =1 return charge_cc_active: bsf cc_active - bsf LEDr ; Indicate charging + bsf LEDr ; indicate charging bcf CHRG_OUT - bsf TRISJ,2 ; Chrg-Out high impedance + bsf TRISJ,2 ; chrg-Out high impedance movlw .15 - cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? - bra charge_cc_active2 ; No + cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096 V)? + bra charge_cc_active2 ; NO movlw .81 - cpfslt batt_voltage+0 ; Batt Voltage >= 80mV(+4096mV from batt_voltage+1)? - bra charge_cv_active ; Yes + cpfslt batt_voltage+0 ; battery voltage >= 80mV (+4096mV from batt_voltage+1)? + bra charge_cv_active ; YES charge_cc_active2: movlw .10 movwf get_bat_volt_counter @@ -106,7 +106,7 @@ movff ADRESL,batt_voltage+0 ; store value bcf ADCON0,0 ; power off ADC -; Multiply with 2,006 to be exact here... +; Multiply with 2.006 to be exact here... ; bcf STATUS,C ; rlcf xA+0,F ; @@ -122,11 +122,10 @@ 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?) + ; Battery is 3.6V (> lithium_36v_low?) btfss neg_flag - bra get_battery_voltage4 ; No, use 1,5V - - bsf battery_is_36v ; Yes, set flag (Cleared in power-on reset only!) + bra get_battery_voltage4 ; NO - use 1.5V + 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 @@ -134,9 +133,9 @@ 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?) + ; 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 @@ -144,24 +143,24 @@ 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 movff battery_gauge+2,xC+0 - ; battery_gauge:6 is nAs - ; devide through 65536 - ; devide through battery_capacity:2 - ; Result is in percent + ; battery_gauge: 6 is nAs + ; divide through 65536 + ; divide through battery_capacity:2 + ; 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 = xC:4 / xB:2 with xA as remainder movff xC+0,lo - ; Limit to 100 + ; limit to 100 movlw .100 cpfslt lo movwf lo - ; lo will be between 0 (Full) and 100 (empty) + ; lo will be between 0 (full) and 100 (empty) movf lo,W sublw .100 movwf lo @@ -169,9 +168,9 @@ movlw .100 cpfslt lo movwf lo - ; lo will be between 100 (Full) and 0 (empty) + ; lo will be between 100 (full) and 0 (empty) - ; use 3,6V battery sensing based on 50mA load + ; use 3.6V battery sensing based on 50 mA load ; 75% movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 @@ -221,18 +220,18 @@ movlw .100 cpfslt lo movwf lo - ; lo will be between 100 (Full) and 0 (empty) + ; 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 + 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 + 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 @@ -247,17 +246,17 @@ rrcf sub_c+1 rrcf sub_c+0 ; /4 movff sub_c+0,lo - bra get_battery_voltage3d ; Check limits and return + 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 + return ; YES - return btfsc ambient_sensor - bra get_ambient_level1 ; Normal ostc3 hardware + 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 @@ -266,8 +265,8 @@ dcfsnz isr1_temp,F 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: @@ -281,7 +280,7 @@ bcf ADCON0,0 ; power off ADC ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) - ; First: Divide by 16 + ; first: divide by 16 banksel ambient_light bcf STATUS,C rrcf ambient_light+1 @@ -295,40 +294,40 @@ bcf STATUS,C rrcf ambient_light+1 rrcf ambient_light+0 - ; Result: ambient_light:2/16 - ; Now, make sure to have value between ambient_light_low and ambient_light_max + ; 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 + tstfsz ambient_light+1 ; > 255 ? + movwf ambient_light+0 ; YES - 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 get_ambient_level2: ; movlw .10 -; subwf ambient_light+0,F ; Subtract 10 (ADC Offset) +; 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 + clrf isr1_temp ; YES - set temporally to eco mode 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 + 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 ; YES - 3.6V battery brightest setting + banksel isr_backup ; back to bank0 ISR data dcfsnz isr1_temp,F movlw ambient_light_max_eco ; brightest setting @@ -337,10 +336,10 @@ banksel ambient_light incf ambient_light+0,F ; +1 - cpfslt ambient_light+0 ; smaller then WREG? - movwf ambient_light+0 ; No, set to max. + cpfslt ambient_light+0 ; smaller than 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 @@ -353,139 +352,141 @@ 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 + cpfsgt ambient_light+0 ; bigger than WREG? + movwf ambient_light+0 ; NO - set to min banksel common - movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt + 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 +get_analog_inputs: ; start ADC and wait 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 + bra get_analog_inputs ; wait for PWM low + movlw b'00100000' ; 2.048V Vref+ -> 1 LSB = 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 + ; add to o2_mv_sensor1:2 addwf o2_mv_sensor1+0,F movf ADRESH,W addwfc o2_mv_sensor1+1,F - ; Devide by 2 + ; divide 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 + 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 + ; ignore 1.9 mV 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 + 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 + ; add to o2_mv_sensor2:2 addwf o2_mv_sensor2+0,F movf ADRESH,W addwfc o2_mv_sensor2+1,F - ; Devide by 2 + ; divide 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 + 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 + ; ignore 1.9 mV noise for not-connected inputs + tstfsz o2_mv_sensor2+1 ; > 25.5 mV ? + bra get_analog_inputs3 ; YES - skip here movlw .19 - cpfsgt o2_mv_sensor2+0 ; >1,9mV? - clrf o2_mv_sensor2+0 ; no, clear result + cpfsgt o2_mv_sensor2+0 ; > 1.9 mV ? + 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 + ; add to o2_mv_sensor3:2 addwf o2_mv_sensor3+0,F movf ADRESH,W addwfc o2_mv_sensor3+1,F - ; Devide by 2 + ; divide 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 + 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 + ; ignore 1.9mV noise for not-connected inputs + tstfsz o2_mv_sensor3+1 ; > 25.5 mV ? + bra get_analog_inputs4 ; YES - skip here movlw .19 - cpfsgt o2_mv_sensor3+0 ; >1,9mV? - clrf o2_mv_sensor3+0 ; no, clear result + cpfsgt o2_mv_sensor3+0 ; > 1.9 mV ? + 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 + 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 + global piezo_config ; set 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 PIR5,TMR5IF ; clear flag bcf switch_right bcf switch_left piezo_config0: btfsc switch_right 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 + 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 + 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 @@ -512,32 +513,32 @@ 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 - bra piezo_config_wait_bit3 ; Wait loop + bra piezo_config_wait_bit3 ; wait loop return global reset_battery_pointer -reset_battery_pointer: ; Resets battery pointer 0x07-0x0C and battery_gauge:5 +reset_battery_pointer: ; reset 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 + 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_switches: ; start ADC and wait until finished + btfsc analog_switches ; does the OSTC have analog switches? + bra get_analog_switches2 ; YES + ; NO + bcf analog_sw1_pressed ; NO - clear flag for analog switch 1 + bcf analog_sw2_pressed ; - clear flag for analog switch 2 + return ; - done get_analog_switches2: btfsc adc_running ; ADC in use? - return ; Yes, return - + return ; YES - abort + ; NO movlw b'00001001' ; left justified movwf ADCON2 ; movlw b'00000000' ; Vref+ = Vdd @@ -550,8 +551,8 @@ movlw .0 addwfc analog_sw2_raw+1 decfsz analog_counter,F ; continue averaging? - bra get_analog_switches2a ; Yes - ; Done. Compute average + bra get_analog_switches2a ; YES + ; NO - done, compute average bcf STATUS,C rrcf analog_sw2_raw+1 rrcf analog_sw2_raw+0 ; /2 @@ -566,35 +567,35 @@ 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 + 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 + movff opt_cR_button_left,WREG ; 20-100 bcf STATUS,C - rrcf WREG ;/2 -> 10-50 + 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 + 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) + 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 + 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 + bsf analog_sw2_pressed ; left button inverted get_analog_sw1: banksel common movlw b'00101001' ; power on ADC, select AN10 @@ -605,8 +606,8 @@ movlw .0 addwfc analog_sw1_raw+1 tstfsz analog_counter ; continue averaging? - bra get_analog_switches1a ; Yes - ; Done. Compute average + bra get_analog_switches1a ; YES + ; NO - done, compute average bcf STATUS,C rrcf analog_sw1_raw+1 rrcf analog_sw1_raw+0 ; /2 @@ -621,22 +622,22 @@ 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 + 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 + movff opt_cR_button_right,WREG ; 20-100 bcf STATUS,C - rrcf WREG ;/2 -> 10-50 + 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 + 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) + btfss button_polarity,0 ; (1= normal, 0=inverted) bra sw1_inverted addwf analog_sw1,W ; average (~128) cpfsgt ADRESH @@ -652,13 +653,13 @@ bsf analog_sw1_pressed ; right button inverted get_analog_sw_done: banksel common - movlw b'10001101' ; Restore to right justified + 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 + setf TMR1H ; no button pressed, enhance timer1 to overflow quickly return END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/adc_lightsensor.inc --- a/src/adc_lightsensor.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/adc_lightsensor.inc Thu Nov 22 19:47:26 2018 +0100 @@ -8,10 +8,10 @@ ; HISTORY ; 2011-08-08 : [mH] moving from OSTC code - extern get_battery_voltage ; And percent... - extern get_ambient_level - extern reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 - extern reset_battery_internal_only ; internal registers only - extern get_analog_inputs ; Get AN8-10 - extern piezo_config ; Sets up piezo sensitivity of heinrichs weikamp Piezo buttons (~30ms) - extern get_analog_switches ; Get analog switches + extern get_battery_voltage ; and percent... + extern get_ambient_level + extern reset_battery_pointer ; resets battery pointer 0x07-0x0C and battery_gauge:5 + extern reset_battery_internal_only ; internal registers only + extern get_analog_inputs ; get AN8-10 + extern piezo_config ; set up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms) + extern get_analog_switches ; get analog switches diff -r 00b24fb4324d -r ca4556fb60b9 src/calibrate.asm --- a/src/calibrate.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/calibrate.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File calibration.asm REFACTORED VERSION V2.98 +; File calibration.asm REFACTORED VERSION V2.98b ; ; o2 sensor calibration subroutines ; @@ -8,209 +8,180 @@ ;============================================================================= #include "hwos.inc" -#include "shared_definitions.h" ; Mailbox between c and asm +#include "shared_definitions.h" ; mailbox between c and asm #include "math.inc" #include "adc_lightsensor.inc" #include "eeprom_rs232.inc" +#include "isr.inc" 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 - movwf sub_b+0 - 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 - btfsc neg_flag - bcf use_O2_sensor1 ;=1: Use this sensor for deco + + global transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics +transmit_setpoint: + return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! + btfss s8_digital ; S8 Digital connection existing? + return ; NO - ignore + ; YES - transmit setpoint from WREG + clrf lo ; initialize checksum + movwf hi ; store setpoint + movlw 0xAA ; start byte + rcall tx_to_HUD ; transmit to HUD + movlw 0x60 ; command new SP + rcall tx_to_HUD ; transmit to HUD + movff hi,WREG ; SP in cbar + rcall tx_to_HUD ; transmit to HUD + movff lo,WREG ; checksum + rcall tx_to_HUD_cs ; transmit checksum + return + +tx_to_HUD: ; entry point to transmit a byte to the HUD + addwf lo,F ; add byte to checksum +tx_to_HUD_cs: ; entry point to transmit the checksum + movff WREG,TXREG2 ; transmit byte + call rs232_wait_tx2 ; wait for UART + return + - movff o2_mv_sensor2+0, sub_a+0 - movff o2_mv_sensor2+1, sub_a+1 - movlw LOW min_mv - movwf sub_b+0 - 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 - btfsc neg_flag - bcf use_O2_sensor2 ;=1: Use this sensor for deco + global calibrate_mix +calibrate_mix: + ; set usage and calibration flags as per default + bsf use_O2_sensor1 + bsf use_O2_sensor2 + bsf use_O2_sensor3 + bsf sensor1_calibrated_ok + bsf sensor2_calibrated_ok + bsf sensor3_calibrated_ok + + ; check for HUD + btfss s8_digital ; S8 Digital connection existing? + bra calibrate_mix1 ; NO - skip HUD part - movff o2_mv_sensor3+0, sub_a+0 - movff o2_mv_sensor3+1, sub_a+1 - movlw LOW min_mv - movwf sub_b+0 - 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 - btfsc neg_flag - bcf use_O2_sensor3 ;=1: Use this sensor for deco + ; calibrate any S8-connected HUD + clrf lo ; initialize checksum + movlw 0xAA ; start byte + rcall tx_to_HUD ; transmit to HUD + movlw 0x31 ; calibration command + rcall tx_to_HUD ; transmit to HUD + movff opt_calibration_O2_ratio,WREG ; calibration gas %O2 + rcall tx_to_HUD ; transmit to HUD + movff amb_pressure+0,WREG ; ambient pressure low byte + rcall tx_to_HUD ; transmit to HUD + movff amb_pressure+1,WREG ; ambient pressure high byte + rcall tx_to_HUD ; transmit to HUD + movff lo,WREG ; checksum + rcall tx_to_HUD_cs ; transmit to HUD +; bra calibrate_mix2 - ; Check max_mv - movff o2_mv_sensor1+0, sub_a+0 + ; calibrate internal sensors +calibrate_mix1: ; compute %O2 * 100 * ambient_pressure[mbar] / 100 + movff opt_calibration_O2_ratio,WREG + mullw .100 + movff PRODL,xA+0 + movff PRODH,xA+1 + SAFE_2BYTE_COPY amb_pressure,xB + call mult16x16 ; xA*xB=xC + movlw LOW .100 + movwf xB+0 + movlw HIGH .100 + movwf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + + ; keep a copy of the result + movff xC+0,lo + movff xC+1,hi + movff xC+2,up + movff xC+3,ex + + ; compute factor for sensor 1 + 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 + movff xC+0,opt_x_s1+0 ; xC= ppO2/mV as factor for sensor 1 + movff xC+1,opt_x_s1+1 + + ; restore result + movff lo,xC+0 + movff hi,xC+1 + movff up,xC+2 + movff ex,xC+3 + + ; compute factor for sensor 2 + 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 + movff xC+0,opt_x_s2+0 ; xC= ppO2/mV as factor for sensor 2 + movff xC+1,opt_x_s2+1 + + ; restore result + movff lo,xC+0 + movff hi,xC+1 + movff up,xC+2 + movff ex,xC+3 + + ; compute factor for sensor 3 + 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 + movff xC+0,opt_x_s3+0 ; xC= ppO2/mV as factor for sensor 3 + movff xC+1,opt_x_s3+1 + + ; check sensor 1 for min/max mV + movff o2_mv_sensor1+0, sub_a+0 ; get mV from sensor 1 movff o2_mv_sensor1+1, sub_a+1 - movlw LOW max_mv - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - btfss neg_flag - bcf use_O2_sensor1 ;=1: Use this sensor for deco + rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within thresholds? + bcf use_O2_sensor1 ; NO - clear usage flag - movff o2_mv_sensor2+0, sub_a+0 + ; check sensor 2 for min/max mV + movff o2_mv_sensor2+0, sub_a+0 ; get mV from sensor 2 movff o2_mv_sensor2+1, sub_a+1 - movlw LOW max_mv - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - btfss neg_flag - bcf use_O2_sensor2 ;=1: Use this sensor for deco + rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within thresholds? + bcf use_O2_sensor2 ; NO - clear usage flag - movff o2_mv_sensor3+0, sub_a+0 + ; check sensor 3 for min/max mV + movff o2_mv_sensor3+0, sub_a+0 ; get mV from sensor 3 movff o2_mv_sensor3+1, sub_a+1 - movlw LOW max_mv - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sub_a - sub_b - btfss neg_flag - bcf use_O2_sensor3 ;=1: Use this sensor for deco + rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within thresholds? + bcf use_O2_sensor3 ; NO - clear usage flag - btfss hud_connection_ok ;=1: HUD connection ok - bra check_sensor2 ; No HUD/Digital data +calibrate_mix2: + ; check for HUD + btfss hud_connection_ok ; HUD connection existing? + bra calibrate_mix3 ; NO - skip HUD part - ; Copy disable flags from digital input + ; Copy disable flags from HUD 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 - return - - - global calibrate_mix -calibrate_mix: - ; calibrate S8 HUD - btfss s8_digital ; S8 Digital? - bra calibrate_mix2 ; No - - ; 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 lo,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 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 lo,TXREG2 ; Checksum - call rs232_wait_tx2 -calibrate_mix2: - 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 - movff amb_pressure+0,xB+0 - movff amb_pressure+1,xB+1 - 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 - ; xC= ppO2/mV - movff xC+0,opt_x_s1+0 - movff xC+1,opt_x_s1+1 ; Factor for Sensor1 +calibrate_mix3: + ; clear calibration flags if sensors are not found to be ok + btfss use_O2_sensor1 ; sensor 1 out of range? + bcf sensor1_calibrated_ok ; YES - disable this sensor + btfss use_O2_sensor2 ; sensor 2 out of range? + bcf sensor2_calibrated_ok ; YES - disable this sensor + btfss use_O2_sensor3 ; sensor 3 out of range? + bcf sensor3_calibrated_ok ; YES - disable this sensor - 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 - movff amb_pressure+0,xB+0 - movff amb_pressure+1,xB+1 - 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 - ; 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 PRODL,xA+0 - movff PRODH,xA+1 - ; (%O2*100)*[ambient,mbar]/100 -> xC - movff amb_pressure+0,xB+0 - movff amb_pressure+1,xB+1 - 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 - ; 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 - - 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 + ; When no sensor is found, enable all three to show error state and clear calibration factors btfsc use_O2_sensor1 return btfsc use_O2_sensor2 return btfsc use_O2_sensor3 return + ; Enable all sensors bsf use_O2_sensor1 bsf use_O2_sensor2 bsf use_O2_sensor3 - ; Clear factors + ; Clear calibration factors banksel opt_x_s1+0 clrf opt_x_s1+0 clrf opt_x_s1+1 @@ -221,90 +192,60 @@ banksel common return - -calibrate_mix2_helper: - call mult16x16 ; xA*xB=xC - movlw LOW .100 - movwf xB+0 - 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) +calibrate_mix_helper: + movlw LOW min_mv ; load minimum threshold... + movwf sub_b+0 ; ...into sub_b + movlw HIGH min_mv + movwf sub_b+1 + call sub16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; sensor mV lower than minimum threshold? + retlw .1 ; YES - return signaling threshold violation + movlw LOW max_mv ; load maximum threshold... + movwf sub_b+0 ; ...into sub_b + movlw HIGH max_mv + movwf sub_b+1 + call sub16 ; sub_c = sub_a - sub_b + btfss neg_flag ; sensor mV higher than maximum threshold? + retlw .1 ; YES - return signaling threshold violation + retlw .0 ; NO - return signaling min/max ok 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 ; Divide 24bit value through 409,5999512 -> 410 (0,01% error) #DEFINE ad2mv_factor .410 + movlw LOW ad2mv_factor + movwf xB+0 + movlw HIGH ad2mv_factor + movwf xB+1 ; 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 - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 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 100 uV 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 - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 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 100 uV 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 - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 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 - - bcf new_s8_data_available ; Clear flag - return ; Done. - - - global transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics -transmit_setpoint: - return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! - btfss s8_digital ; S8 Digital? - return ; No, ignore + movff xC+0,o2_mv_sensor3+0 ; in 100 uV steps - ; 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 lo,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 lo,TXREG2 ; Checksum - call rs232_wait_tx2 - return - + bcf new_s8_data_available ; clear flag + return ; done END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/color_processor.asm --- a/src/color_processor.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/color_processor.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File File color_processor.asm ## V2.98 +; File File color_processor.asm ## V2.98c ; ; Decompress and draw an image. ; @@ -19,61 +19,52 @@ ; Trashed: TBLPTR, TABLAT, FSR2, PROD, win_width, win_height ; ; ImageBloc: -; db widthx2, height -; db nbColors, 0 ; Unused yet... Should be 0 to keep packing happy. +; db widthx2, height +; db nbColors, 0 ; 0 = unused yet, should remain 0 to keep packing happy ; dw color0, color1, color2, color3, ... -; db ...packed pixels... +; db packed pixels... ; ; Limitations: -; * nbColors should be <= 15. -; * image width should be even. -; * image left border should be on even position too. +; * nbColors <= 127 +; * image width should be even +; * image left border should be on even position, too +; ; Compressed format: -; - Upper nibble = color, lower nibble = count-1. -; - All bytes F* accumulates to make count larger than 16. -; Eg. 00 is 1 pixel color 0 -; 07 is 8 pixels color 0 -; 70 is 1 pixel color 7 -; bf is 16 pixels of color .11 -; F1 F2 F3 04 is 0x1235 pixels of color 0. +; - 1-3 bytes pixel count, followed by 1 byte pixel color +; - bit 7 = 1: byte holds pixel count in bits 6-0 +; - bit 7 = 0: byte holds pixel color in bits 6-0 +; - all pixel count bytes accumulate: +; - 1 byte pixel count: 1xxxxxxx -> 7 bit pixel count +; - 2 bytes pixel count: 1yyyyyyy 1xxxxxxx -> 14 bit pixel count +; - 3 bytes pixel count: 1zzzzzzz 1yyyyyyy 1xxxxxxx -> 21 bit pixel count +; +; Pixels are written column by column from left to right, with columns down first. ; ;----------------------------------------------------------------------------- -#include "hwos.inc" -#include "tft.inc" +#include "hwos.inc" +#include "tft.inc" + +color_proc CODE ;----------------------------------------------------------------------------- -; -; Note: Some variables (win_width, win_height) are in BANK0 ! -basic CODE +; Note: some variables (win_width, win_height) are in BANK 0 ! + global color_image color_image: - banksel common ; Bank1, just to be sure... + banksel common ; Bank 1, just to be sure... - ;---- Get image parameters ------------------------------------------- + ;---- Get image size ----------------------------------------------- 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 ! + 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 @@ -92,6 +83,9 @@ call TFT_box_write Index_out 0x22 + ;---- Read the colors ------------------------------------------------ + rcall get_colors + ;---- Decode pixels -------------------------------------------------- color_image_loop_xy: ; Get pixel count @@ -132,7 +126,6 @@ movlw 0 subwfb img_pixels+2,F -color_image_not_over: infsnz img_count+0 ; Increment count incf img_count+1 @@ -150,7 +143,7 @@ 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 @@ -163,4 +156,25 @@ Index_out 0x00 return + + global get_colors +get_colors: + tblrd*+ ; read number of image colors + movff TABLAT,lo ; store in lo + tblrd*+ ; skip one spare byte (future flags ?) + movf lo,W + lfsr FSR2,buffer ; set up buffer as storage for the colors +get_colors_loop: + tblrd*+ + btfss use_custom_colors ; shall custom colors be used? + movff TABLAT,POSTINC2 ; NO + tblrd*+ + btfss use_custom_colors ; shall custom colors be used? + movff TABLAT,POSTINC2 ; NO + decfsz WREG + bra get_colors_loop + + bcf use_custom_colors ; clear custom colors request + return + END diff -r 00b24fb4324d -r ca4556fb60b9 src/colorschemes.inc --- a/src/colorschemes.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/colorschemes.inc Thu Nov 22 19:47:26 2018 +0100 @@ -6,21 +6,21 @@ ; Dive mode ; Standard -#DEFINE color_scheme_divemode_mask1 color_green -#DEFINE color_scheme_divemode_std1 color_white -#DEFINE color_scheme_divemode_dis1 color_lightblue ;color_grey +#DEFINE color_scheme_divemode_mask1 color_green +#DEFINE color_scheme_divemode_std1 color_white +#DEFINE color_scheme_divemode_dis1 color_lightblue ; color_grey ; Redish -#DEFINE color_scheme_divemode_mask2 color_red -#DEFINE color_scheme_divemode_std2 color_orange -#DEFINE color_scheme_divemode_dis2 color_dark_red +#DEFINE color_scheme_divemode_mask2 color_red +#DEFINE color_scheme_divemode_std2 color_orange +#DEFINE color_scheme_divemode_dis2 color_violet ; greenish -#DEFINE color_scheme_divemode_mask3 color_cyan -#DEFINE color_scheme_divemode_std3 color_green -#DEFINE color_scheme_divemode_dis3 color_dark_green +#DEFINE color_scheme_divemode_mask3 color_cyan +#DEFINE color_scheme_divemode_std3 color_green +#DEFINE color_scheme_divemode_dis3 color_greenish ; blueish -#DEFINE color_scheme_divemode_mask4 color_blue -#DEFINE color_scheme_divemode_std4 color_lightblue -#DEFINE color_scheme_divemode_dis4 color_deepblue \ No newline at end of file +#DEFINE color_scheme_divemode_mask4 color_blue +#DEFINE color_scheme_divemode_std4 color_lightblue +#DEFINE color_scheme_divemode_dis4 color_pink \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/comm.asm --- a/src/comm.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/comm.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File comm.asm REFACTORED VERSION 2.98 +; File comm.asm REFACTORED VERSION V2.99d ; ; RS232 via USB ; @@ -8,7 +8,7 @@ ;============================================================================= ; HISTORY ; 2011-08-22 : [mH] Creation -; 2012-02-11 : [jDG] Added "c" set custom text, and "i" identify. +; 2012-02-11 : [jDG] Added "c" set custom text, and "i" identify #include "hwos.inc" #include "eeprom_rs232.inc" @@ -22,6 +22,7 @@ #include "rtc.inc" #include "adc_lightsensor.inc" #include "shared_definitions.h" +#include "math.inc" extern restart extern option_reset_all @@ -29,13 +30,18 @@ extern gaslist_cleanup_list extern get_first_gas_to_WREG extern get_first_dil_to_WREG + extern option_save_all extern vault_decodata_into_eeprom - extern color_image + extern menu_processor_bottom_line_comm + + IFDEF _rx_functions + extern I2C_update_OSTC_rx + ENDIF -#DEFINE timeout_comm_pre_mode .240 ; Pre-loop -#DEFINE timeout_comm_mode .120 ; Download mode -#DEFINE timeout_service_mode .120 ; Service mode +#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 @@ -50,143 +56,141 @@ #DEFINE comm_status2_column comm_status1_column #DEFINE comm_status3_row .130 #DEFINE comm_status3_column comm_status1_column +#DEFINE comm_status4_row .160 +#DEFINE comm_status4_column comm_status1_column + #DEFINE comm_warning_row .160 #DEFINE comm_warning_column .65 -comm code +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 + return ; NO - it was only a glitch WAITMS d'1' btfss vusb_in ; USB plugged in? - return ; No, it was only a glitch + return ; NO - it was only a glitch comm_mode0: call TFT_ClearScreen WIN_COLOR color_greenish - btfsc ble_available ; ble available + btfsc ble_available ; BLE available bra comm_mode0_ble WIN_SMALL comm_title_column_usb, comm_title_row - STRCPY_TEXT_PRINT tUsbTitle ; USB Mode + 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 + 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 - call color_image ; Show USB logo + TFT_WRITE_PROM_IMAGE_BY_ADDR usb_ble_logo_block 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) + STRCPY_TEXT_PRINT tUsbStarting ; starting... + call menu_processor_bottom_line_comm ; serial and fw version + call option_save_all ; save all settings into EEPROM (comm mode may be entered after settings have been changed without leaving the menu in between) + + IFDEF _screendump + bcf enable_screen_dumps ; =1: ignore vin_usb, wait for "l" command (screen dump) + ENDIF + bcf switch_right 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) + 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 ... + STRCPY_TEXT_PRINT tUsbStartDone ; done... + call enable_rs232 ; also sets to speed_normal ... comm_mode1: bcf onesecupdate bcf LEDr dcfsnz comm_timeout,F - bra comm_service_exit ; Timeout -> Exit + bra comm_service_exit ; timeout -> exit comm_mode2: - rcall comm_write_get_byte + rcall comm_get_byte movlw 0xAA ; start byte=0xAA? cpfseq RCREG1 bra comm_mode2a - bra comm_mode2b ; Start byte 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 ; Start byte 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 + bra comm_service_exit_nousb_delay ; disconnected -> exit comm_mode4a: - btfsc switch_right ; Abort with right + btfsc switch_right ; abort with right bra comm_service_exit btfsc onesecupdate bra comm_mode1 - bra comm_mode2 ; Cycle + bra comm_mode2 ; cycle comm_mode2b: ; Startbyte found - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; wait for UART movlw 0x4B - movwf TXREG1 ; Send Answer + movwf TXREG1 ; send answer ; Now, check comm command - rcall comm_write_get_byte ; first byte - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_get_byte ; first byte + rcall comm_write_byte ; wait for UART movff RCREG1,TXREG1 ; Echo movlw UPPER comm_service_key cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart - rcall comm_write_get_byte ; second byte - rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + bra comm_mode1 ; wrong -> restart + rcall comm_get_byte ; second byte + rcall comm_write_byte ; wait for UART + movff RCREG1,TXREG1 ; echo movlw HIGH (comm_service_key & 0xFFFF) cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart - rcall comm_write_get_byte ; third byte - rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + bra comm_mode1 ; wrong -> restart + rcall comm_get_byte ; third byte + rcall comm_write_byte ; wait for UART + 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... + 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 + bra comm_mode4a ; YES - (still) connected, return +comm_service_exit_nousb: ; NO - disconnected -> exit WIN_SMALL comm_status3_column, comm_status3_row - STRCPY_TEXT_PRINT tUsbClosed ; Port closed + 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 - movwf TXREG1 ; Send Answer + rcall comm_write_byte ; wait for UART + movlw 0xFF ; reply FF + movwf TXREG1 ; send answer - ; Wait 1 second - bcf onesecupdate - btfss onesecupdate - bra $-2 - ; Wait 1 second - bcf onesecupdate - btfss onesecupdate - bra $-2 + call wait_1s ; wait 1 second + call wait_1s ; wait 1 second call disable_rs232 goto restart @@ -196,50 +200,50 @@ comm_service_ll_bootloader: bsf LEDr WIN_SMALL comm_status3_column, comm_status3_row - STRCPY_TEXT_PRINT tUsbLlBld ; Low Level Bootloader started + 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 + TFT_WRITE_PROM_IMAGE_BY_LABEL dive_warning2_block ; show warning icon goto 0x1FF0C ;----------------------------------------------------------------------------- ; send firmware to bootloader ; comm_send_firmware: - movlw 0x50 ; send echo + movlw 0x50 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; wait for UART ; Read 5 bytes into buffer. lfsr FSR2,buffer - movlw .5 ; counter + movlw .5 ; counter movwf lo - movlw 0x55 ; 5'ft byte checksum. + movlw 0x55 ; 5'ft byte checksum movwf hi comm_send_firmware_loop: - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_send_firmware_abort ; No, abort! + rcall comm_get_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 + ; check that 5ft byte checksum's checksum movf hi,W bnz comm_send_firmware_failed - movlw 0x4C ; send OK + movlw 0x4C ; send OK movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; 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 @@ -248,9 +252,9 @@ comm_send_firmware_abort: - movlw 0xFF ; send ABORTED byte. + movlw 0xFF ; send ABORTED byte movwf TXREG1 - bra comm_download_mode0 ; Done. + bra comm_download_mode0 ; done ;----------------------------------------------------------------------------- ; Reset to Dive 1 in logbook @@ -261,111 +265,111 @@ 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 +; erases range in 4 kB steps comm_erase_range4kb: - movlw 0x42 ; send echo + 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. + rcall comm_write_byte ; 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_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! + 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 + 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). + 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 interrupts 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_receive_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_write_byte ; wait for UART - bcf INTCON,GIE ; All interrupts off! + 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_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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, Done (and send OK byte too). + rcall comm_get_byte + 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 +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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + rcall comm_write_byte ; 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_get_byte + btfsc rs232_receive_overflow ; got byte? + bra comm_download_mode0 ; NO - done movff RCREG1,up - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + bra comm_download_mode0 ; NO - done movff RCREG1,hi - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + rcall comm_get_byte + 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 ! + ; if lo==0, we must precondition hi because there are too many bytes sent movf lo,W bnz $+4 decf hi,F movlw 0x40 - cpfslt up ; Abort when up > 0x3F - bra comm_download_mode0 ; Abort + cpfslt up ; up > 0x3F? + bra comm_download_mode0 ; YES - 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 24 bit 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_write_byte ; wait for UART decfsz lo,F bra comm_send_range24_loop decf hi,F @@ -377,22 +381,22 @@ 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_receive_overflow ; Got byte? - return ; No, return + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + return ; NO - return movff RCREG1,ext_flash_address+2 - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - return ; No, return + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + return ; NO - return movff RCREG1,ext_flash_address+1 - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - return ; No, return + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + return ; NO - return movff RCREG1,ext_flash_address+0 return @@ -401,39 +405,39 @@ 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 interrupts on - rcall comm_rs232_wait_tx ; Wait for UART - movlw 0xBB ; Command Echo - movwf TXREG1 ; Send Answer + STRCPY_TEXT_PRINT tUsbDownloadMode ; download mode enabled + bsf INTCON,GIE ; all interrupts on + rcall comm_write_byte ; wait for UART + movlw 0xBB ; command echo + movwf TXREG1 ; send answer comm_download_mode0: - bsf INTCON,GIE ; All interrupts on - rcall comm_rs232_wait_tx ; Wait for UART + bsf INTCON,GIE ; all interrupts on + rcall comm_write_byte ; wait for UART movlw 0x4C ; 4C in service mode btfss comm_service_enabled movlw 0x4D ; 4D in download mode - movwf TXREG1 ; Send Answer + movwf TXREG1 ; send answer movlw timeout_service_mode - movwf comm_timeout ; Timeout + movwf comm_timeout ; timeout bcf switch_right comm_download_mode1: bcf onesecupdate dcfsnz comm_timeout,F - bra comm_service_exit ; Timeout -> Exit + bra comm_service_exit ; timeout -> exit comm_download_mode2: - rcall comm_write_get_byte ; Check for a byte + rcall comm_get_byte ; check for a byte btfsc comm_service_enabled - btg LEDr ; Blink in Service mode + 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_nousb ; NO - disconnected -> exit + btfsc switch_right ; abort with right button bra comm_service_exit btfsc onesecupdate bra comm_download_mode1 btfsc rs232_receive_overflow - bra comm_download_mode2 ; Wait for command byte + bra comm_download_mode2 ; wait for command byte - ; command received! + ; command received bcf LEDr movlw 0xFF cpfseq RCREG1 @@ -442,58 +446,62 @@ movlw "a" cpfseq RCREG1 bra $+4 - bra comm_send_headers ; Send all 256 dive headers + bra comm_send_headers ; send all 256 dive headers movlw "b" cpfseq RCREG1 bra $+4 - bra comm_set_time ; Read time and date from the PC and set clock + bra comm_set_time ; read time and date from the PC and set clock movlw "c" cpfseq RCREG1 bra $+4 - bra comm_set_custom_text ; Send a opt_name_length byte string of custom text. + bra comm_set_custom_text ; send a opt_name_length byte string of custom text movlw "f" ; 0x66 cpfseq RCREG1 bra $+4 - bra comm_send_dive ; Send header and profile for one dive + 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 information movlw "n" cpfseq RCREG1 bra $+4 - goto comm_send_string ; Send a 15byte string to the screen + goto comm_send_string ; send a 15 byte string to the screen movlw "m" cpfseq RCREG1 bra $+4 - goto comm_send_compact_headers ; Send all 256 compact headers + goto comm_send_compact_headers ; send all 256 compact headers + + IFDEF _screendump movlw "l" cpfseq RCREG1 - bra $+4 - call TFT_dump_screen ; Dump the screen contents + bra $+4 + call TFT_dump_screen ; dump the screen contents + ENDIF + 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 @@ -502,23 +510,23 @@ movlw 0x22 cpfseq RCREG1 bra $+4 - bra comm_reset_logbook_pointers ; Resets all logbook pointers and the logbook (!) + bra comm_reset_logbook_pointers ; reset all logbook pointers and the logbook movlw 0x23 cpfseq RCREG1 bra $+4 - bra comm_reset_battery_gauge ; Resets battery gauge registers + bra comm_reset_battery_gauge ; reset 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 ; erase 4 kB 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 ; erase range in 4 kB steps (get 3 bytes address and 1 byte amount of 4 kB blocks) movlw 0x50 cpfseq RCREG1 bra $+4 @@ -526,19 +534,25 @@ ; movlw "t" ; cpfseq RCREG1 ; bra $+4 -; goto testloop ; Start raw-data testloop +; goto testloop ; start raw-data test loop + IFDEF _rx_function + movlw 0x70 + cpfseq RCREG1 + bra $+4 + bra comm_update_ostc_rx ; send firmware from external memory 3D0800h -> 3DFFFFh to OSTC RX circuity + ENDIF 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 ;----------------------------------------------------------------------------- comm_send_compact_headers: movlw "m" ; send echo movwf TXREG1 - ; Send 13 bytes/dive (Compact Header) + ; send 13 bytes/dive (compact header) ; 1st: 200009h-200016h ; 2nd: 201009h-201016h ; 3rd: 202009h-202016h @@ -552,29 +566,29 @@ comm_send_compact_headers2: movlw 0x09 movwf ext_flash_address+0 - ; Adjust address for next dive + ; adjust address for next dive movlw 0x10 addwf ext_flash_address+1 movlw 0x00 addwfc ext_flash_address+2 movlw 0x30 - cpfseq ext_flash_address+2 ; All 256 dive send? - bra comm_send_compact_headers4 ; No, continue - bra comm_download_mode0 ; Done. Loop with timeout reset + cpfseq ext_flash_address+2 ; all 256 dive send? + bra comm_send_compact_headers4 ; NO - continue + bra comm_download_mode0 ; done, loop with timeout reset comm_send_compact_headers4: movlw .13 - movwf lo ; Counter - rcall comm_rs232_wait_tx ; Wait for UART + movwf lo ; counter + rcall comm_write_byte ; wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 - bra comm_send_compact_headers3 ; counter 24bit + bra comm_send_compact_headers3 ; counter 24 bit comm_send_compact_headers_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_compact_headers3: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; wait for UART decfsz lo,F bra comm_send_compact_headers_loop call ext_flash_read_block_stop @@ -584,18 +598,18 @@ movwf ext_flash_address+0 call ext_flash_read_block_start ; 1st byte movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; 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 + rcall comm_write_byte ; wait for UART ; Offset to Logbook-Profile version movlw .8 movwf ext_flash_address+0 - call ext_flash_byte_read ; Get byte + call ext_flash_byte_read ; get byte movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; wait for UART bra comm_send_compact_headers2 ; continue @@ -622,20 +636,20 @@ 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 + 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 - rcall comm_rs232_wait_tx ; Wait for UART + clrf lo ; counter + rcall comm_write_byte ; wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 - bra comm_send_headers3 ; counter 24bit + bra comm_send_headers3 ; counter 24 bit comm_send_headers_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_headers3: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_write_byte ; wait for UART decfsz lo,F bra comm_send_headers_loop call ext_flash_read_block_stop @@ -643,127 +657,121 @@ ;----------------------------------------------------------------------------- -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 + bra comm_download_mode0 ; done, back to loop with timeout reset ;----------------------------------------------------------------------------- -comm_write_get_byte: - goto rs232_get_byte ; returns... - -comm_rs232_wait_tx: - goto rs232_wait_tx ; returns... - comm_set_time: movlw "b" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + rcall comm_write_byte ; wait for UART + rcall comm_get_byte + 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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + rcall comm_get_byte + 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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + rcall comm_get_byte + 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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + rcall comm_get_byte + 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_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort - call comm_check_day ; Check day - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + bra comm_download_mode0 ; NO - abort + call comm_check_day ; check day + rcall comm_get_byte + 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 + ; 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 + bra comm_download_mode0 ; done, back to loop with timeout reset ;----------------------------------------------------------------------------- -; Set OSTC3 custom text string (opt_name_length ASCII chars). +; Set 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 + rcall comm_write_byte ; 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_receive_overflow ; Got byte? - bra comm_set_ctext_loop_done ; no, abort - movff RCREG1,POSTINC2 ; Store character + rcall comm_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 + bra comm_download_mode0 ; done, loop with timeout reset ;----------------------------------------------------------------------------- -; Reply Serial (2 bytes low:high), firmware (major.minor) and custom text. +; 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 + rcall comm_write_byte ; wait for UART ;---- Read serial from internal EEPROM address 0000 clrf EEADRH - clrf EEADR ; Get Serial number LOW + clrf EEADR ; get serial number LOW call read_eeprom ; read byte movff EEDATA,lo - incf EEADR,F ; Get Serial number HIGH + incf EEADR,F ; get serial number HIGH call read_eeprom ; read byte movff EEDATA,hi ;---- Emit serial number movff lo,TXREG1 - rcall comm_rs232_wait_tx + rcall comm_write_byte movff hi,TXREG1 - rcall comm_rs232_wait_tx + rcall comm_write_byte ;---- Emit firmware hi.lo movlw softwareversion_x movwf TXREG1 - rcall comm_rs232_wait_tx + rcall comm_write_byte movlw softwareversion_y movwf TXREG1 - rcall comm_rs232_wait_tx + rcall comm_write_byte ;---- Emit custom text movlw opt_name_length @@ -772,11 +780,19 @@ common_identify_loop: movff POSTINC2,TXREG1 - rcall comm_rs232_wait_tx + rcall comm_write_byte decfsz hi,F bra common_identify_loop - bra comm_download_mode0 ; Done. + bra comm_download_mode0 ; done + +;----------------------------------------------------------------------------- + +comm_get_byte: + goto rs232_get_byte ; ... and return + +comm_write_byte: + goto rs232_wait_tx ; ... and return ;----------------------------------------------------------------------------- ; Reply hardware descriptor byte @@ -785,28 +801,109 @@ 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. + rcall comm_write_byte ; wait for UART + movff hardware_flag1,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 + rcall comm_write_byte ; wait for UART + movlw 0x00 ; hardware high byte + movwf TXREG1 + rcall comm_write_byte ; wait for UART + movff hardware_flag1,TXREG1 + rcall comm_write_byte ; wait for UART + movlw 0x00 ; feature high Byte + movwf TXREG1 + rcall comm_write_byte ; wait for UART + movlw 0x00 ; feature low 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 + rcall comm_write_byte ; wait for UART + movlw 0x00 ; model descriptor byte + movwf TXREG1 + bra comm_download_mode0 ; done + +;----------------------------------------------------------------------------- + + IFDEF _rx_function + +comm_update_ostc_rx: + movlw 0x70 ; send echo 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. + rcall comm_write_byte ; wait for UART +; btfss ostc_rx_present ; rx model? +; bra comm_download_mode0 ; NO - abort + + ; Setup ext_flash_address:3 + movlw LOW 0x3D0800 + movwf ext_flash_address+0 + movlw HIGH (0x3D0800 & 0xFFFF) ; <- & 0xFFFF to suppress warning message... + movwf ext_flash_address+1 + movlw UPPER 0x3D0800 + movwf ext_flash_address+2 + + bsf active_reset_ostc_rx + WAITMS .5 + bcf active_reset_ostc_rx + WAITMS .100 + bcf INTCON,GIE ; halt all interrupts + + movlw LOW .992 + movwf uart1_temp + movlw HIGH .992 + movwf uart2_temp + incf uart2_temp,F ; ++1 + WAITMS .1 + + call ext_flash_read_block_start + movwf up ; first byte to write + +comm_update_ostc_rx_loop: ; (run 992 times) + WIN_SMALL comm_status4_column, comm_status4_row + movff uart1_temp,xA+0 + movf uart2_temp,W + tstfsz uart2_temp + decf uart2_temp,W ; --1 for display + movwf xA+1 + movlw .64 + movwf xB+0 + clrf xB+1 + call mult16x16 ; xA * xB = xC + movff xC+0,lo + movff xC+1,hi + bsf leftbind + output_16 + bcf leftbind + STRCAT_PRINT " Bytes left " + + call I2C_update_OSTC_rx ; send firmware from external memory 3D0800h -> 3DFFFFh to OSTC RX circuity + + tstfsz WREG ; returns with WREG=0 if everything was ok + bra comm_update_ostc_rx_loop_error ; error -> abort + + decfsz uart1_temp,F + bra comm_update_ostc_rx_loop + decfsz uart2_temp,F + bra comm_update_ostc_rx_loop + +comm_update_ostc_rx_loop_done: + call ext_flash_read_block_stop + bsf INTCON,GIE + WIN_SMALL comm_status4_column, comm_status4_row + STRCPY_PRINT " " + bra comm_download_mode0 ; done + +comm_update_ostc_rx_loop_error: + bsf INTCON,GIE + WIN_SMALL comm_status4_column, comm_status4_row + STRCPY_PRINT "ERROR. Retry! " + call wait_1s ; do not use for time critical routines, can be between 0 and 1 sec! + call wait_1s ; do not use for time critical routines, can be between 0 and 1 sec! + call wait_1s ; do not use for time critical routines, can be between 0 and 1 sec! + bra comm_update_ostc_rx_loop_done + + ENDIF ;----------------------------------------------------------------------------- @@ -814,12 +911,12 @@ movlw "f"; 0x66 ; send echo movwf TXREG1 - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_download_mode0 ; No, abort! - movff RCREG1,lo ; Store dive number (0-255) + rcall comm_get_byte + 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 + ; 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 @@ -835,48 +932,48 @@ 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 + 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 + 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 + 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 + 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 + 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 + 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 + decf_ext_flash_address d'8' ; back again to first 0xFA in header movf ext_flash_log_pointer+0,W - cpfseq ext_flash_end_pointer+0 ; Equal? - bra comm_send_dive1 ; No, Send header + cpfseq ext_flash_end_pointer+0 ; 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 + cpfseq ext_flash_end_pointer+1 ; 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 + 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 + 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 + clrf hi ; counter + rcall comm_write_byte ; wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_dive_header comm_send_dive_header2: - call ext_flash_read_block ; Read one byte - movwf TXREG1 ; Start new transmit + 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_write_byte ; wait for UART decfsz hi,F bra comm_send_dive_header2 call ext_flash_read_block_stop @@ -886,15 +983,15 @@ 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 + movlw .6 ; skip 6 byte 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 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 + call ext_flash_byte_read_plus_0x20 ; read one byte into ext_flash_rw, takes care of banking at 0x200000 + rcall comm_write_byte ; wait for UART + movff ext_flash_rw,TXREG1 ; send a byte ; 24bit compare with end address movff ext_flash_end_pointer+0,WREG @@ -907,401 +1004,387 @@ 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 + rcall comm_write_byte ; wait for UART + bra comm_download_mode0 ; done, loop with timeout reset ;----------------------------------------------------------------------------- comm_read_setting: movlw "r" movwf TXREG1 - rcall comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_read_abort ; No, abort! - rcall comm_read_setting_wait ; Wait for UART + rcall comm_get_byte + btfsc rs232_receive_overflow ; got byte? + bra comm_read_abort ; NO - abort! + rcall comm_write_byte ; 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 + subwf RCREG1,W ; subtract unused commands + + clrf up ; set gas/dil index to 0 (0 = gas 1) dcfsnz WREG - bra comm_read_gas2 ; RCREG1=0x11 + bra comm_read_gas_dil ; RCREG1=0x10 + incf up ; increment gas/dil index (1 = gas 2) dcfsnz WREG - bra comm_read_gas3 ; RCREG1=0x12 + bra comm_read_gas_dil ; RCREG1=0x11 + incf up ; increment gas/dil index (2 = gas 3) dcfsnz WREG - bra comm_read_gas4 ; RCREG1=0x13 + bra comm_read_gas_dil ; RCREG1=0x12 + incf up ; increment gas/dil index (3 = gas 4) dcfsnz WREG - bra comm_read_gas5 ; RCREG1=0x14 + bra comm_read_gas_dil ; RCREG1=0x13 + incf up ; increment gas/dil index (4 = gas 5) dcfsnz WREG - bra comm_read_dil1 ; RCREG1=0x15 + bra comm_read_gas_dil ; RCREG1=0x14 + incf up ; increment gas/dil index (5 = dil 1) + dcfsnz WREG + bra comm_read_gas_dil ; RCREG1=0x15 + incf up ; increment gas/dil index (6 = dil 2) dcfsnz WREG - bra comm_read_dil2 ; RCREG1=0x16 + bra comm_read_gas_dil ; RCREG1=0x16 + incf up ; increment gas/dil index (7 = dil 3) dcfsnz WREG - bra comm_read_dil3 ; RCREG1=0x17 + bra comm_read_gas_dil ; RCREG1=0x17 + incf up ; increment gas/dil index (8 = dil 4) dcfsnz WREG - bra comm_read_dil4 ; RCREG1=0x18 + bra comm_read_gas_dil ; RCREG1=0x18 + incf up ; increment gas/dil index (9 = dil 5) dcfsnz WREG - bra comm_read_dil5 ; RCREG1=0x19 + bra comm_read_gas_dil ; RCREG1=0x19 + + clrf up ; set setpoint index to 0 (0 = SP 1) dcfsnz WREG - bra comm_read_sp1 ; RCREG1=0x1A + bra comm_read_sp ; RCREG1=0x1A + incf up ; increment setpoint index (1 = SP2) dcfsnz WREG - bra comm_read_sp2 ; RCREG1=0x1B + bra comm_read_sp ; RCREG1=0x1B + incf up ; increment setpoint index (2 = SP3) dcfsnz WREG - bra comm_read_sp3 ; RCREG1=0x1C + bra comm_read_sp ; RCREG1=0x1C + incf up ; increment setpoint index (3 = SP4) dcfsnz WREG - bra comm_read_sp4 ; RCREG1=0x1D + bra comm_read_sp ; RCREG1=0x1D + incf up ; increment setpoint index (4 = SP5) dcfsnz WREG - bra comm_read_sp5 ; RCREG1=0x1E + bra comm_read_sp ; RCREG1=0x1E + dcfsnz WREG - movff opt_ccr_mode, TXREG1 ; RCREG1=0x1F + movff opt_ccr_mode, TXREG1 ; RCREG1=0x1F + dcfsnz WREG + movff opt_dive_mode, TXREG1 ; RCREG1=0x20 dcfsnz WREG - movff opt_dive_mode, TXREG1 ; RCREG1=0x20 + movff char_I_deco_model, TXREG1 ; RCREG1=0x21 + dcfsnz WREG + movff char_I_ppO2_max, TXREG1 ; RCREG1=0x22 dcfsnz WREG - movff char_I_deco_model, TXREG1 ; RCREG1=0x21 + movff char_I_ppO2_min, TXREG1 ; RCREG1=0x23 dcfsnz WREG - movff char_I_ppO2_max, TXREG1 ; RCREG1=0x22 + movff char_I_extra_time, TXREG1 ; RCREG1=0x24 + dcfsnz WREG + movff opt_GF_low, TXREG1 ; RCREG1=0x25 dcfsnz WREG - movff char_I_ppO2_min, TXREG1 ; RCREG1=0x23 + movff opt_GF_high, TXREG1 ; RCREG1=0x26 + dcfsnz WREG + movff opt_aGF_low, TXREG1 ; RCREG1=0x27 dcfsnz WREG - movff char_I_extra_time, TXREG1 ; RCREG1=0x24 + movff opt_aGF_high, TXREG1 ; RCREG1=0x28 + dcfsnz WREG + movff opt_enable_aGF, TXREG1 ; RCREG1=0x29 dcfsnz WREG - movff opt_GF_low, TXREG1 ; RCREG1=0x25 + movff opt_sat_multiplier_non_gf, TXREG1 ; RCREG1=0x2A + dcfsnz WREG + movff opt_desat_multiplier_non_gf,TXREG1 ; RCREG1=0x2B dcfsnz WREG - movff opt_GF_high, TXREG1 ; RCREG1=0x26 + movff opt_last_stop, TXREG1 ; RCREG1=0x2C dcfsnz WREG - movff opt_aGF_low, TXREG1 ; RCREG1=0x27 + movff opt_brightness, TXREG1 ; RCREG1=0x2D dcfsnz WREG - movff opt_aGF_high, TXREG1 ; RCREG1=0x28 + movff opt_units, TXREG1 ; RCREG1=0x2E + dcfsnz WREG + movff opt_sampling_rate, TXREG1 ; RCREG1=0x2F dcfsnz WREG - movff opt_enable_aGF, TXREG1 ; RCREG1=0x29 + movff opt_salinity, TXREG1 ; RCREG1=0x30 + dcfsnz WREG + movff opt_dive_color_scheme, TXREG1 ; RCREG1=0x31 dcfsnz WREG - movff opt_sat_multiplier_non_gf, TXREG1 ; RCREG1=0x2A + movff opt_language, TXREG1 ; RCREG1=0x32 + dcfsnz WREG + movff opt_dateformat, TXREG1 ; RCREG1=0x33 dcfsnz WREG - movff opt_desat_multiplier_non_gf, TXREG1 ; RCREG1=0x2B + movff opt_compass_gain, TXREG1 ; RCREG1=0x34 dcfsnz WREG - movff opt_last_stop, TXREG1 ; RCREG1=0x2C + movff opt_pressure_adjust, TXREG1 ; RCREG1=0x35 dcfsnz WREG - movff opt_brightness, TXREG1 ; RCREG1=0x2D + movff opt_enable_safetystop, TXREG1 ; RCREG1=0x36 + dcfsnz WREG + movff opt_calibration_O2_ratio, TXREG1 ; RCREG1=0x37 dcfsnz WREG - movff opt_units, TXREG1 ; RCREG1=0x2E + clrf TXREG1 ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) + dcfsnz WREG + movff opt_flip_screen, TXREG1 ; RCREG1=0x39 dcfsnz WREG - movff opt_sampling_rate, TXREG1 ; RCREG1=0x2F + movff opt_cR_button_left, TXREG1 ; RCREG1=0x3A + dcfsnz WREG + movff opt_cR_button_right, TXREG1 ; RCREG1=0x3B dcfsnz WREG - movff opt_salinity, TXREG1 ; RCREG1=0x30 + movff char_I_bottom_usage, TXREG1 ; RCREG1=0x3C dcfsnz WREG - movff opt_dive_color_scheme, TXREG1 ; RCREG1=0x31 + movff char_I_deco_usage, TXREG1 ; RCREG1=0x3D dcfsnz WREG - movff opt_language, TXREG1 ; RCREG1=0x32 + movff opt_modwarning, TXREG1 ; RCREG1=0x3E + dcfsnz WREG + movff opt_vsitextv2, TXREG1 ; RCREG1=0x3F dcfsnz WREG - movff opt_dateformat, TXREG1 ; RCREG1=0x33 + movff opt_vsigraph, TXREG1 ; RCREG1=0x40 + dcfsnz WREG + movff opt_showppo2, TXREG1 ; RCREG1=0x41 dcfsnz WREG - movff opt_compass_gain, TXREG1 ; RCREG1=0x34 + movff opt_temperature_adjust, TXREG1 ; RCREG1=0x42 + dcfsnz WREG + movff opt_safety_stop_length, TXREG1 ; RCREG1=0x43 dcfsnz WREG - movff opt_pressure_adjust, TXREG1 ; RCREG1=0x35 + movff opt_safety_stop_start, TXREG1 ; RCREG1=0x44 dcfsnz WREG - movff opt_enable_safetystop, TXREG1 ; RCREG1=0x36 + movff opt_safety_stop_end, TXREG1 ; RCREG1=0x45 dcfsnz WREG - movff opt_calibration_O2_ratio, TXREG1; RCREG1=0x37 + movff opt_safety_stop_reset, TXREG1 ; RCREG1=0x46 + dcfsnz WREG + clrf TXREG1 ; RCREG1=0x47, ignore conservatism in hwOS tech firmware dcfsnz WREG - clrf TXREG1 ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) + movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 + dcfsnz WREG + movff button_polarity, TXREG1 ; RCREG1=0x49 dcfsnz WREG - movff opt_flip_screen, TXREG1 ; RCREG1=0x39 + movff char_I_PSCR_drop, TXREG1 ; RCREG1=0x4A + dcfsnz WREG + movff char_I_PSCR_lungratio, TXREG1 ; RCREG1=0x4B dcfsnz WREG - movff opt_cR_button_left, TXREG1 ; RCREG1=0x3A + movff char_I_ppO2_max_deco, TXREG1 ; RCREG1=0x4C dcfsnz WREG - movff opt_cR_button_right, TXREG1 ; RCREG1=0x3B + movff char_I_ppO2_min_loop, TXREG1 ; RCREG1=0x4D dcfsnz WREG - movff char_I_bottom_usage, TXREG1 ; RCREG1=0x3C + 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_deco_usage, TXREG1 ; RCREG1=0x3D + movff char_I_tank_size+2, TXREG1 ; RCREG1=0x50 + dcfsnz WREG + movff char_I_tank_size+3, TXREG1 ; RCREG1=0x51 dcfsnz WREG - movff opt_modwarning, TXREG1 ; RCREG1=0x3E + movff char_I_tank_size+4, TXREG1 ; RCREG1=0x52 + dcfsnz WREG + movff char_I_tank_pres_fill+0, TXREG1 ; RCREG1=0x53 dcfsnz WREG - movff opt_vsitextv2, TXREG1 ; RCREG1=0x3F + movff char_I_tank_pres_fill+1, TXREG1 ; RCREG1=0x54 dcfsnz WREG - movff opt_vsigraph, TXREG1 ; RCREG1=0x40 + movff char_I_tank_pres_fill+2, TXREG1 ; RCREG1=0x55 dcfsnz WREG - movff opt_showppo2, TXREG1 ; RCREG1=0x41 + 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 opt_temperature_adjust, TXREG1 ; RCREG1=0x42 + movff char_I_cc_max_frac_o2, TXREG1 ; RCREG1=0x58 + dcfsnz WREG + movff opt_sim_setpoint_number, TXREG1 ; RCREG1=0x59 dcfsnz WREG - movff opt_safety_stop_length, TXREG1 ; RCREG1=0x43 + movff opt_calc_asc_gasvolume, TXREG1 ; RCREG1=0x5A + dcfsnz WREG + movff opt_sim_use_aGF, TXREG1 ; RCREG1=0x5B dcfsnz WREG - movff opt_safety_stop_start, TXREG1 ; RCREG1=0x44 + movff char_I_altitude_wait, TXREG1 ; RCREG1=0x5C dcfsnz WREG - movff opt_safety_stop_end, TXREG1 ; RCREG1=0x45 + movff opt_enable_IBCD, TXREG1 ; RCREG1=0x5D dcfsnz WREG - movff opt_safety_stop_reset, TXREG1 ; RCREG1=0x46 + movff opt_sat_multiplier_gf, TXREG1 ; RCREG1=0x5E + dcfsnz WREG + movff opt_desat_multiplier_gf, TXREG1 ; RCREG1=0x5F dcfsnz WREG - clrf TXREG1 ; RCREG1=0x47, ignore conservatism for standard hwOS + movff opt_transmitter_id_1+0, TXREG1 ; RCREG1=0x60 + dcfsnz WREG + movff opt_transmitter_id_1+1, TXREG1 ; RCREG1=0x61 dcfsnz WREG - movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 + movff opt_transmitter_id_2+0, TXREG1 ; RCREG1=0x62 + dcfsnz WREG + movff opt_transmitter_id_2+1, TXREG1 ; RCREG1=0x63 dcfsnz WREG - movff button_polarity, TXREG1 ; RCREG1=0x49 + movff opt_transmitter_id_3+0, TXREG1 ; RCREG1=0x64 dcfsnz WREG - movff char_I_PSCR_drop, TXREG1 ; RCREG1=0x4A + movff opt_transmitter_id_3+1, TXREG1 ; RCREG1=0x65 dcfsnz WREG - movff char_I_PSCR_lungratio, TXREG1 ; RCREG1=0x4B + movff opt_transmitter_id_4+0, TXREG1 ; RCREG1=0x66 + dcfsnz WREG + movff opt_transmitter_id_4+1, TXREG1 ; RCREG1=0x67 dcfsnz WREG - movff char_I_ppO2_max_deco, TXREG1 ; RCREG1=0x4C + movff opt_transmitter_id_5+0, TXREG1 ; RCREG1=0x68 + dcfsnz WREG + movff opt_transmitter_id_5+1, TXREG1 ; RCREG1=0x69 dcfsnz WREG - movff char_I_ppO2_min_loop, TXREG1 ; RCREG1=0x4D + movff opt_transmitter_id_6+0, TXREG1 ; RCREG1=0x6A + dcfsnz WREG + movff opt_transmitter_id_6+1, TXREG1 ; RCREG1=0x6B dcfsnz WREG - movff char_I_tank_size+0, TXREG1 ; RCREG1=0x4E + movff opt_transmitter_id_7+0, TXREG1 ; RCREG1=0x6C dcfsnz WREG - movff char_I_tank_size+1, TXREG1 ; RCREG1=0x4F + movff opt_transmitter_id_7+1, TXREG1 ; RCREG1=0x6D dcfsnz WREG - movff char_I_tank_size+2, TXREG1 ; RCREG1=0x50 + movff opt_transmitter_id_8+0, TXREG1 ; RCREG1=0x6E + dcfsnz WREG + movff opt_transmitter_id_8+1, TXREG1 ; RCREG1=0x6F dcfsnz WREG - movff char_I_tank_size+3, TXREG1 ; RCREG1=0x51 + movff opt_transmitter_id_9+0, TXREG1 ; RCREG1=0x70 + dcfsnz WREG + movff opt_transmitter_id_9+1, TXREG1 ; RCREG1=0x71 dcfsnz WREG - movff char_I_tank_size+4, TXREG1 ; RCREG1=0x52 + movff opt_transmitter_id_10+0, TXREG1 ; RCREG1=0x72 + dcfsnz WREG + movff opt_transmitter_id_10+1, TXREG1 ; RCREG1=0x73 dcfsnz WREG - movff char_I_tank_pres_fill+0, TXREG1 ; RCREG1=0x53 + movff char_I_tank_size+5, TXREG1 ; RCREG1=0x74 dcfsnz WREG - movff char_I_tank_pres_fill+1, TXREG1 ; RCREG1=0x54 + movff char_I_tank_size+6, TXREG1 ; RCREG1=0x75 dcfsnz WREG - movff char_I_tank_pres_fill+2, TXREG1 ; RCREG1=0x55 + movff char_I_tank_size+7, TXREG1 ; RCREG1=0x76 + dcfsnz WREG + movff char_I_tank_size+8, TXREG1 ; RCREG1=0x77 dcfsnz WREG - movff char_I_tank_pres_fill+3, TXREG1 ; RCREG1=0x56 + movff char_I_tank_size+9, TXREG1 ; RCREG1=0x78 + dcfsnz WREG + movff char_I_tank_pres_fill+5, TXREG1 ; RCREG1=0x79 dcfsnz WREG - movff char_I_tank_pres_fill+4, TXREG1 ; RCREG1=0x57 + movff char_I_tank_pres_fill+6, TXREG1 ; RCREG1=0x7A + dcfsnz WREG + movff char_I_tank_pres_fill+7, TXREG1 ; RCREG1=0x7B dcfsnz WREG - movff char_I_cc_max_frac_o2, TXREG1 ; RCREG1=0x58 + movff char_I_tank_pres_fill+8, TXREG1 ; RCREG1=0x7C dcfsnz WREG - movff opt_sim_setpoint_number, TXREG1 ; RCREG1=0x59 + movff char_I_tank_pres_fill+9, TXREG1 ; RCREG1=0x7D dcfsnz WREG - movff opt_calc_asc_gasvolume, TXREG1 ; RCREG1=0x5A + movff opt_TR_mode, TXREG1 ; RCREG1=0x7E + dcfsnz WREG + movff opt_TR_1st_pres, TXREG1 ; RCREG1=0x7F dcfsnz WREG - movff opt_sim_use_aGF, TXREG1 ; RCREG1=0x5B + movff opt_TR_2nd_pres, TXREG1 ; RCREG1=0x80 dcfsnz WREG - movff char_I_altitude_wait, TXREG1 ; RCREG1=0x5C + movff opt_TR_Bail_pres, TXREG1 ; RCREG1=0x81 dcfsnz WREG - movff opt_enable_IBCD, TXREG1 ; RCREG1=0x5D + movff char_I_max_pres_diff, TXREG1 ; RCREG1=0x82 + dcfsnz WREG + movff opt_ZfactorUse, TXREG1 ; RCREG1=0x83 dcfsnz WREG - movff opt_sat_multiplier_gf, TXREG1 ; RCREG1=0x5E + movff opt_ZfactorTemp, TXREG1 ; RCREG1=0x84 dcfsnz WREG - movff opt_desat_multiplier_gf, TXREG1; RCREG1=0x5F - + movff opt_2ndDepthDisp, TXREG1 ; RCREG1=0x85 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!) +;----------------------------------------------------------------------------- -comm_read_gas1: - movff opt_gas_O2_ratio+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_He_ratio+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_type+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_OC_bail_gas_change+0,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_gas2: - movff opt_gas_O2_ratio+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_He_ratio+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_type+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_OC_bail_gas_change+1,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_gas3: - movff opt_gas_O2_ratio+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_He_ratio+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_type+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_OC_bail_gas_change+2,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_gas4: - movff opt_gas_O2_ratio+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_He_ratio+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_type+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_OC_bail_gas_change+3,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_gas5: - movff opt_gas_O2_ratio+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_He_ratio+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_gas_type+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_OC_bail_gas_change+4,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset +; Memory map is as follows: +; ------------------------- +; opt_gas_O2_ratio res 5 ; O2 ratios of OC/bailout gases +; opt_dil_O2_ratio res 5 ; O2 ratios of diluents +; opt_gas_He_ratio res 5 ; He ratios of OC/bailout gases +; opt_dil_He_ratio res 5 ; He ratios of diluents +; opt_gas_type res 5 ; OC/bailout gas type +; opt_dil_type res 5 ; dil type +; opt_gas_change res 5 ; change depths for OC/Bailout gases +; opt_dil_change res 5 ; change depths for diluents -comm_read_dil1: - movff opt_dil_O2_ratio+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_He_ratio+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_type+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_dil_change+0,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_dil2: - movff opt_dil_O2_ratio+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_He_ratio+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_type+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_dil_change+1,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_dil3: - movff opt_dil_O2_ratio+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_He_ratio+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_type+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_dil_change+2,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_dil4: - movff opt_dil_O2_ratio+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_He_ratio+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_type+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_dil_change+3,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_dil5: - movff opt_dil_O2_ratio+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_He_ratio+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff opt_dil_type+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_dil_change+4,TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset - -comm_read_sp1: - movff char_I_setpoint_cbar+0, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_setpoint_change+0, TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_sp2: - movff char_I_setpoint_cbar+1, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_setpoint_change+1, TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_sp3: - movff char_I_setpoint_cbar+2, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_setpoint_change+2, TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_sp4: - movff char_I_setpoint_cbar+3, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_setpoint_change+3, TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset -comm_read_sp5: - movff char_I_setpoint_cbar+4, TXREG1 - rcall comm_read_setting_wait ; Wait for UART - movff char_I_setpoint_change+4, TXREG1 - bra comm_read_done ; Done. Wait for UART and loop with timeout reset +comm_read_gas_dil: + lfsr FSR0,opt_gas_O2_ratio ; load base address of gas data arrays + movf up,W ; load index (0-9) of gas/dil into WREG, addressing O2 ratio + movff PLUSW0, TXREG1 ; transmit O2 ratio + rcall comm_write_byte ; wait for UART + addlw .10 ; increment index by 10, addressing He ratio now + movff PLUSW0, TXREG1 ; transmit He ratio + rcall comm_write_byte ; wait for UART + addlw .10 ; increment index by 10, addressing gas/dil type now + movff PLUSW0, TXREG1 ; transmit gas/dil type + rcall comm_write_byte ; wait for UART + addlw .10 ; increment index by 10, addressing change depth now + movff PLUSW0,TXREG1 ; transmit change depth + bra comm_read_done ; done, wait for UART and loop with timeout reset +; Memory map is as follows: +; ------------------------- +; char_I_setpoint_cbar res 5 ; setpoints in cbar +; char_I_setpoint_change res 5 ; change depth for the setpoints in meter + +comm_read_sp: + lfsr FSR0,char_I_setpoint_cbar ; load base address of setpoint cbar values + movf up,W ; load index (0-4) of setpoint into WREG, addressing cbar value + movff PLUSW0, TXREG1 ; transmit setpoint cbar value + rcall comm_write_byte ; wait for UART + addlw .5 ; increment index by 5, addressing change depth now + movff PLUSW0, TXREG1 ; transmit change depth + bra comm_read_done ; done, wait for UART and loop with timeout reset + ;----------------------------------------------------------------------------- -comm_write_gas1: - movff RCREG1,opt_gas_O2_ratio+0 - rcall comm_write_get_byte - movff RCREG1,opt_gas_He_ratio+0 - rcall comm_write_get_byte - movff RCREG1,opt_gas_type+0 - rcall comm_write_get_byte - movff RCREG1,opt_OC_bail_gas_change+0 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_gas2: - movff RCREG1,opt_gas_O2_ratio+1 - rcall comm_write_get_byte - movff RCREG1,opt_gas_He_ratio+1 - rcall comm_write_get_byte - movff RCREG1,opt_gas_type+1 - rcall comm_write_get_byte - movff RCREG1,opt_OC_bail_gas_change+1 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_gas3: - movff RCREG1,opt_gas_O2_ratio+2 - rcall comm_write_get_byte - movff RCREG1,opt_gas_He_ratio+2 - rcall comm_write_get_byte - movff RCREG1,opt_gas_type+2 - rcall comm_write_get_byte - movff RCREG1,opt_OC_bail_gas_change+2 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_gas4: - movff RCREG1,opt_gas_O2_ratio+3 - rcall comm_write_get_byte - movff RCREG1,opt_gas_He_ratio+3 - rcall comm_write_get_byte - movff RCREG1,opt_gas_type+3 - rcall comm_write_get_byte - movff RCREG1,opt_OC_bail_gas_change+3 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_gas5: - movff RCREG1,opt_gas_O2_ratio+4 - rcall comm_write_get_byte - movff RCREG1,opt_gas_He_ratio+4 - rcall comm_write_get_byte - movff RCREG1,opt_gas_type+4 - rcall comm_write_get_byte - movff RCREG1,opt_OC_bail_gas_change+4 - bra comm_write_abort ; Done. Loop with timeout reset - comm_write_setting: movlw "w" movwf TXREG1 - rcall comm_write_get_byte ; "Byte 2" - btfsc rs232_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 + rcall comm_get_byte ; "Byte 2" + btfsc rs232_receive_overflow ; got byte? + bra comm_write_abort ; NO - abort! + movff RCREG1,lo ; copy + rcall comm_get_byte ; "Byte 3" + rcall comm_write_byte ; 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 + subwf lo,W ; subtract unused commands + + clrf up ; set gas/dil index to 0 (0 = gas 1) dcfsnz WREG - bra comm_write_gas2 ; RCREG1=0x11 + bra comm_write_gas_dil ; RCREG1=0x10 + incf up ; increment gas/dil index (1 = gas 2) dcfsnz WREG - bra comm_write_gas3 ; RCREG1=0x12 + bra comm_write_gas_dil ; RCREG1=0x11 + incf up ; increment gas/dil index (2 = gas 3) dcfsnz WREG - bra comm_write_gas4 ; RCREG1=0x13 + bra comm_write_gas_dil ; RCREG1=0x12 + incf up ; increment gas/dil index (3 = gas 4) dcfsnz WREG - bra comm_write_gas5 ; RCREG1=0x14 + bra comm_write_gas_dil ; RCREG1=0x13 + incf up ; increment gas/dil index (4 = gas 5) dcfsnz WREG - bra comm_write_dil1 ; RCREG1=0x15 + bra comm_write_gas_dil ; RCREG1=0x14 + incf up ; increment gas/dil index (5 = dil 1) dcfsnz WREG - bra comm_write_dil2 ; RCREG1=0x16 + bra comm_write_gas_dil ; RCREG1=0x15 + incf up ; increment gas/dil index (6 = dil 2) + dcfsnz WREG + bra comm_write_gas_dil ; RCREG1=0x16 + incf up ; increment gas/dil index (7 = dil 3) dcfsnz WREG - bra comm_write_dil3 ; RCREG1=0x17 - dcfsnz WREG - bra comm_write_dil4 ; RCREG1=0x18 + bra comm_write_gas_dil ; RCREG1=0x17 + incf up ; increment gas/dil index (8 = dil 4) dcfsnz WREG - bra comm_write_dil5 ; RCREG1=0x19 + bra comm_write_gas_dil ; RCREG1=0x18 + incf up ; increment gas/dil index (9 = dil 5) dcfsnz WREG - bra comm_write_sp1 ; RCREG1=0x1A + bra comm_write_gas_dil ; RCREG1=0x19 + + clrf up ; set setpoint index to 0 (0 = SP 1) dcfsnz WREG - bra comm_write_sp2 ; RCREG1=0x1B + bra comm_write_sp ; RCREG1=0x1A + incf up ; increment setpoint index (1 = SP2) dcfsnz WREG - bra comm_write_sp3 ; RCREG1=0x1C + bra comm_write_sp ; RCREG1=0x1B + incf up ; increment setpoint index (2 = SP3) dcfsnz WREG - bra comm_write_sp4 ; RCREG1=0x1D + bra comm_write_sp ; RCREG1=0x1C + incf up ; increment setpoint index (3 = SP4) dcfsnz WREG - bra comm_write_sp5 ; RCREG1=0x1E + bra comm_write_sp ; RCREG1=0x1D + incf up ; increment setpoint index (4 = SP5) + dcfsnz WREG + bra comm_write_sp ; RCREG1=0x1E + dcfsnz WREG movff RCREG1, opt_ccr_mode ; RCREG1=0x1F dcfsnz WREG @@ -1353,7 +1436,7 @@ dcfsnz WREG movff RCREG1, opt_calibration_O2_ratio; RCREG1=0x37 dcfsnz WREG - nop ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) + nop ; RCREG1=0x38 NOT USED ANYMORE (ex opt_sensor_fallback) dcfsnz WREG movff RCREG1, opt_flip_screen ; RCREG1=0x39 dcfsnz WREG @@ -1432,116 +1515,163 @@ movff RCREG1, opt_sat_multiplier_gf ; RCREG1=0x5E dcfsnz WREG movff RCREG1, opt_desat_multiplier_gf ; RCREG1=0x5F - + dcfsnz WREG + movff RCREG1, opt_transmitter_id_1+0 ; RCREG1=0x60 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_1+1 ; RCREG1=0x61 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_2+0 ; RCREG1=0x62 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_2+1 ; RCREG1=0x63 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_3+0 ; RCREG1=0x64 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_3+1 ; RCREG1=0x65 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_4+0 ; RCREG1=0x66 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_4+1 ; RCREG1=0x67 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_5+0 ; RCREG1=0x68 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_5+1 ; RCREG1=0x69 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_6+0 ; RCREG1=0x6A + dcfsnz WREG + movff RCREG1, opt_transmitter_id_6+1 ; RCREG1=0x6B + dcfsnz WREG + movff RCREG1, opt_transmitter_id_7+0 ; RCREG1=0x6C + dcfsnz WREG + movff RCREG1, opt_transmitter_id_7+1 ; RCREG1=0x6D + dcfsnz WREG + movff RCREG1, opt_transmitter_id_8+0 ; RCREG1=0x6E + dcfsnz WREG + movff RCREG1, opt_transmitter_id_8+1 ; RCREG1=0x6F + dcfsnz WREG + movff RCREG1, opt_transmitter_id_9+0 ; RCREG1=0x70 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_9+1 ; RCREG1=0x71 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_10+0 ; RCREG1=0x72 + dcfsnz WREG + movff RCREG1, opt_transmitter_id_10+1 ; RCREG1=0x73 + dcfsnz WREG + movff RCREG1, char_I_tank_size+5 ; RCREG1=0x74 + dcfsnz WREG + movff RCREG1, char_I_tank_size+6 ; RCREG1=0x75 + dcfsnz WREG + movff RCREG1, char_I_tank_size+7 ; RCREG1=0x76 + dcfsnz WREG + movff RCREG1, char_I_tank_size+8 ; RCREG1=0x77 + dcfsnz WREG + movff RCREG1, char_I_tank_size+9 ; RCREG1=0x78 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+5 ; RCREG1=0x79 + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+6 ; RCREG1=0x7A + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+7 ; RCREG1=0x7B + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+8 ; RCREG1=0x7C + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+9 ; RCREG1=0x7D + dcfsnz WREG + movff RCREG1, opt_TR_mode ; RCREG1=0x7E + dcfsnz WREG + movff RCREG1, opt_TR_1st_pres ; RCREG1=0x7F + dcfsnz WREG + movff RCREG1, opt_TR_2nd_pres ; RCREG1=0x80 + dcfsnz WREG + movff RCREG1, opt_TR_Bail_pres ; RCREG1=0x81 + dcfsnz WREG + movff RCREG1, char_I_max_pres_diff ; RCREG1=0x82 + dcfsnz WREG + movff RCREG1, opt_ZfactorUse ; RCREG1=0x83 + dcfsnz WREG + movff RCREG1, opt_ZfactorTemp ; RCREG1=0x84 + dcfsnz WREG + movff RCREG1, opt_2ndDepthDisp ; RCREG1=0x85 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 +comm_write_done: + ; check options, gases and diluents + call option_check_all ; check all options (and reset if not within their min/max boundaries) + bsf FLAG_diluent_setup ; =1: setting up diluents + call gaslist_cleanup_list ; take care that only one gas can be first and first has 0m change depth + bcf FLAG_diluent_setup ; =1: Setting up diluents + call gaslist_cleanup_list ; take care that only one gas can be first and first has 0m change depth + call get_first_gas_to_WREG ; make sure at least one gas is "First" + call get_first_dil_to_WREG ; make sure at least one diluent is "First" + goto comm_download_mode0 ; done, loop with timeout reset + +;----------------------------------------------------------------------------- + +; Memory map is as follows: +; ------------------------- +; opt_gas_O2_ratio res 5 ; O2 ratios of OC/bailout gases +; opt_dil_O2_ratio res 5 ; O2 ratios of diluents +; opt_gas_He_ratio res 5 ; He ratios of OC/bailout gases +; opt_dil_He_ratio res 5 ; He ratios of diluents +; opt_gas_type res 5 ; OC/bailout gas type +; opt_dil_type res 5 ; dil type +; opt_gas_change res 5 ; change depths for OC/Bailout gases +; opt_dil_change res 5 ; change depths for diluents -comm_write_dil1: - movff RCREG1,opt_dil_O2_ratio+0 - rcall comm_write_get_byte - movff RCREG1,opt_dil_He_ratio+0 - rcall comm_write_get_byte - movff RCREG1,opt_dil_type+0 - rcall comm_write_get_byte - movff RCREG1,char_I_dil_change+0 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_dil2: - movff RCREG1,opt_dil_O2_ratio+1 - rcall comm_write_get_byte - movff RCREG1,opt_dil_He_ratio+1 - rcall comm_write_get_byte - movff RCREG1,opt_dil_type+1 - rcall comm_write_get_byte - movff RCREG1,char_I_dil_change+1 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_dil3: - movff RCREG1,opt_dil_O2_ratio+2 - rcall comm_write_get_byte - movff RCREG1,opt_dil_He_ratio+2 - rcall comm_write_get_byte - movff RCREG1,opt_dil_type+2 - rcall comm_write_get_byte - movff RCREG1,char_I_dil_change+2 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_dil4: - movff RCREG1,opt_dil_O2_ratio+3 - rcall comm_write_get_byte - movff RCREG1,opt_dil_He_ratio+3 - rcall comm_write_get_byte - movff RCREG1,opt_dil_type+3 - rcall comm_write_get_byte - movff RCREG1,char_I_dil_change+3 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_dil5: - movff RCREG1,opt_dil_O2_ratio+4 - rcall comm_write_get_byte - movff RCREG1,opt_dil_He_ratio+4 - rcall comm_write_get_byte - movff RCREG1,opt_dil_type+4 - rcall comm_write_get_byte - movff RCREG1,char_I_dil_change+4 - bra comm_write_abort ; Done. Loop with timeout reset +comm_write_gas_dil: + lfsr FSR0,opt_gas_O2_ratio ; load base address of gas data arrays + movf up,W ; load index (0-9) of gas/dil into WREG, addressing O2 ratio + movff RCREG1,PLUSW0 ; receive O2 ratio + rcall comm_get_byte ; wait for UART + addlw .10 ; increment index by 10, addressing He ratio now + movff RCREG1,PLUSW0 ; receive He ratio + rcall comm_get_byte ; wait for UART + addlw .10 ; increment index by 10, addressing gas/dil type now + movff RCREG1,PLUSW0 ; receive gas/dil type + rcall comm_get_byte ; wait for UART + addlw .10 ; increment index by 10, addressing change depth now + movff RCREG1,PLUSW0 ; receive change depth + bra comm_write_done ; done, loop with timeout reset -comm_write_sp1: - movff RCREG1,char_I_setpoint_cbar+0 - rcall comm_write_get_byte - movff RCREG1,char_I_setpoint_change+0 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_sp2: - movff RCREG1,char_I_setpoint_cbar+1 - rcall comm_write_get_byte - movff RCREG1,char_I_setpoint_change+1 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_sp3: - movff RCREG1,char_I_setpoint_cbar+2 - rcall comm_write_get_byte - movff RCREG1,char_I_setpoint_change+2 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_sp4: - movff RCREG1,char_I_setpoint_cbar+3 - rcall comm_write_get_byte - movff RCREG1,char_I_setpoint_change+3 - bra comm_write_abort ; Done. Loop with timeout reset -comm_write_sp5: - movff RCREG1,char_I_setpoint_cbar+4 - rcall comm_write_get_byte - movff RCREG1,char_I_setpoint_change+4 - bra comm_write_abort ; Done. Loop with timeout reset + +; Memory map is as follows: +; ------------------------- +; char_I_setpoint_cbar res 5 ; setpoints in cbar +; char_I_setpoint_change res 5 ; change depth for the setpoints in meter + +comm_write_sp: + lfsr FSR0,char_I_setpoint_cbar ; load base address of setpoint cbar values + movf up,W ; load index (0-4) of setpoint into WREG, addressing cbar value + movff RCREG1,PLUSW0 ; receive setpoint cbar value + rcall comm_get_byte ; wait for UART + addlw .5 ; increment index by 5, addressing change depth now + movff RCREG1,PLUSW0 ; receive change depth + bra comm_write_done ; done, loop with timeout reset ;----------------------------------------------------------------------------- comm_send_string: - movlw "n" ; send echo + movlw "n" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + call comm_write_byte ; wait for UART WIN_SMALL comm_string_column, comm_string_row movlw .16 - movwf lo ; counter + movwf lo ; counter comm_send_string_loop: - call comm_write_get_byte - btfsc rs232_receive_overflow ; Got byte? - bra comm_send_string_abort ; No, abort! - movff RCREG1,POSTINC2 ; Store character + call comm_get_byte + 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 + STRCAT_PRINT "" ; show the text + goto comm_download_mode0 ; done, loop with timeout reset ;----------------------------------------------------------------------------- comm_check_day: movff RCREG1,day - movff month,lo ; new month + movff month,lo ; new month dcfsnz lo,F movlw .31 dcfsnz lo,F @@ -1566,23 +1696,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 ; YES + movlw .1 ; NO - set to 1st movwf day return comm_write_button_polarity: - ; Store RCREG1 into EEPROM .897 + ; store RCREG1 into EEPROM .897 movlw LOW .897 movwf EEADR 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/compass.c --- a/src/compass.c Thu Oct 11 21:06:29 2018 +0200 +++ b/src/compass.c Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// /// compass.c -/// Compute north direction from magnetic/acceleration measures. +/// Compute north direction from magnetic/acceleration measures +/// /// Copyright (c) 2012-2015, JD Gascuel, HeinrichsWeikamp, all right reserved. ////////////////////////////////////////////////////////////////////////////// // HISTORY @@ -12,189 +13,197 @@ #include "compass.h" ////////////////////////////////////////////////////////////////////////////// -// mH: Crude work-around, needs to be made right +// mH: crude work-around, needs to be fixed up #ifndef UNIX -# pragma udata overlay bank8=0x800 - static char C_STACK[256]; // Overlay C-code data stack here. -# define RESET_C_STACK \ - _asm \ - LFSR 1, 0x800 \ - LFSR 2, 0x800 \ - _endasm -# pragma udata overlay bank9_compass -# pragma code compass_run +# pragma udata overlay bank8=0x800 + static char C_STACK[256]; // overlay C-code data stack here +# define RESET_C_STACK \ + _asm \ + LFSR 1, 0x800 \ + LFSR 2, 0x800 \ + _endasm +# pragma udata overlay bank9_compass +# pragma code compass_run #else -# define RESET_C_STACK +# define RESET_C_STACK #endif ////////////////////////////////////////////////////////////////////////////// // fifth order of polynomial approximation of atan(), giving 0.05 deg max error // -#define K1 (5701) // Needs K1/2**16 -#define K2 (1645) // Needs K2/2**48 WAS NEGATIV -#define K3 ( 446) // Needs K3/2**80 +#define K1 (5701) // needs K1/2**16 +#define K2 (1645) // needs K2/2**48 WAS NEGATIV +#define K3 ( 446) // needs K3/2**80 + ////////////////////////////////////////////////////////////////////////////// -// Interface to assembleur multiplies +// Interface to assembler multiplies + Int16 umul(PARAMETER Int16 a, PARAMETER Int16 b) { - extern Int16 compass_umul(void); - extern Int16 compass_a, compass_b; - compass_a = a; - compass_b = b; - return compass_umul(); + extern Int16 compass_umul(void); + extern Int16 compass_a, compass_b; + compass_a = a; + compass_b = b; + return compass_umul(); } Int16 imul(PARAMETER Int16 a, PARAMETER Int16 b) { - extern Int16 compass_imul(void); - extern Int16 compass_a, compass_b; - compass_a = a; - compass_b = b; - return compass_imul(); + extern Int16 compass_imul(void); + extern Int16 compass_a, compass_b; + compass_a = a; + compass_b = b; + return compass_imul(); } ////////////////////////////////////////////////////////////////////////////// /// Returns a / b * 2**16 /// -/// A 16/16 -> 16 bits divide, returning a scalled result. +/// A 16/16 -> 16 bits divide, returning a scaled result. /// Used to multiply fractional numbers in the range 0..1, /// represented as 0..32767. + Int16 udiv(PARAMETER Int16 a, PARAMETER Int16 b) { - OVERLAY Int16 d, r; + OVERLAY Int16 d, r; - //---- Pre-scale both numerator and denominator -------------------------- - while( (((a>>8) | (b>>8)) & 0xC0) == 0 ) - { - a <<= 1; - b <<= 1; - } + //---- Pre-scale both numerator and denominator -------------------------- + while( (((a>>8) | (b>>8)) & 0xC0) == 0 ) + { + a <<= 1; + b <<= 1; + } - //---- Make division trials ---------------------------------------------- - d = 0x4000; // Starts with 0.5, because 1.0 is sign bit. - b >>= 1; // Hence pre-shift b. - r = 0; - do { - if( a >= b ) { // a is big enough ? - a -= b; // then count d times b out of it. - r |= d; // and accumulate that bit. - } - b >>= 1; // then loop trying twice smaller. - d >>= 1; - } while( b ); - return r; + //---- Make division trials ---------------------------------------------- + d = 0x4000; // start with 0.5, because 1.0 is sign bit + b >>= 1; // hence pre-shift b + r = 0; + do { + if( a >= b ) // a is big enough ? + { + a -= b; // then count d times b out of it + r |= d; // and accumulate that bit + } + b >>= 1; // then loop trying twice smaller + d >>= 1; + } while( b ); + return r; } ////////////////////////////////////////////////////////////////////////////// /// Computes atan(y/x) in Angle, for x, y in range 0..32767 /// /// Results a single quadrant Angle, in the range 0 .. Q_PI/2 + Angle utan(PARAMETER Int16 y, PARAMETER Int16 x) { - OVERLAY Int16 ratio, angle, x2, x3; + OVERLAY Int16 ratio, angle, x2, x3; - //---- Handle zero divisor ----------------------------------------------- - if( x == 0 ) - return (y == 0) ? 0 : Q_PIO2; + //---- Handle zero divisor ----------------------------------------------- + if( x == 0 ) + return (y == 0) ? 0 : Q_PIO2; - //---- Make it half-quadrant : 0 .. 45 deg ------------------------------- - ratio = (x > y) ? udiv(y, x) : udiv(x, y); + //---- Make it half-quadrant : 0 .. 45 deg ------------------------------- + ratio = (x > y) ? udiv(y, x) : udiv(x, y); - //---- Then apply the polynomial approximation --------------------------- - angle = umul(K1, ratio); // r*K1 / 2**16 - x2 = umul(ratio, ratio); // r**2 / 2**16 - x3 = umul(x2, ratio); // r**3 / 2**32 - angle -= umul(x3, K2); // K2*r**3 / 2**48: NEGATIV. + //---- Then apply the polynomial approximation --------------------------- + angle = umul(K1, ratio); // r*K1 / 2**16 + x2 = umul(ratio, ratio); // r**2 / 2**16 + x3 = umul(x2, ratio); // r**3 / 2**32 + angle -= umul(x3, K2); // K2*r**3 / 2**48: NEGATIV. - x3 = umul(x3, x2); // r**5 / 2**64 - angle += umul(x3, K3); // K3*r**5 / 2**80 + x3 = umul(x3, x2); // r**5 / 2**64 + angle += umul(x3, K3); // K3*r**5 / 2**80 - //---- Recover the full quadrant ----------------------------------------- - return (x < y) ? (Angle)(Q_PIO2 - angle) - : (Angle)(angle); + //---- Recover the full quadrant ----------------------------------------- + return (x < y) ? (Angle)(Q_PIO2 - angle) + : (Angle)(angle); } ////////////////////////////////////////////////////////////////////////////// /// Computes atan2(y/x) in Angle, for x, y in range -32768 to 32767 /// /// Results a four quadrant Angle, in the range -Q_PI .. +Q_PI + Angle itan(PARAMETER Int16 y, PARAMETER Int16 x) { - // Beware: -32768 is not properly handled (sgn error). - if( x == -32768 ) x = -32767; - if( y == -32768 ) y = -32767; + // Beware: -32768 is not properly handled (sign error) + if( x == -32768 ) x = -32767; + if( y == -32768 ) y = -32767; - if( x >= 0 ) - if( y >= 0 ) // First quadrant: 0..90 deg. - return utan(y,x); - else // Fourth quadrant: 0..-90 deg - return -utan(-y,x); - else - if( y >= 0 ) // Second quadrant: 90..180 deg - return Q_PI - utan(y, -x); - else // Third quadrant: -90..-180 deg; - return -Q_PI + utan(-y, -x); + if( x >= 0 ) + if( y >= 0 ) // first quadrant: 0..90 deg. + return utan(y,x); + else // fourth quadrant: 0..-90 deg + return -utan(-y,x); + else + if( y >= 0 ) // second quadrant: 90..180 deg + return Q_PI - utan(y, -x); + else // third quadrant: -90..-180 deg; + return -Q_PI + utan(-y, -x); } ////////////////////////////////////////////////////////////////////////////// /// Computes cos(theta) = sqrtf(x2/h2), /// when theta = atan(y/x) and h2=x*x+y*y /// + Int16 cosxh(PARAMETER Int16 x2, PARAMETER Int16 h2) { - OVERLAY Int16 r = 0; - OVERLAY Int16 d = 0x4000; + OVERLAY Int16 r = 0; + OVERLAY Int16 d = 0x4000; - do { - OVERLAY Int16 a = r + d; - a = umul(a, a); - a = umul(a, h2); - if( a <= x2 ) r += d; - d >>= 1; - } while( d ); + do { + OVERLAY Int16 a = r + d; + a = umul(a, a); + a = umul(a, h2); + if( a <= x2 ) r += d; + d >>= 1; + } while( d ); - return r; + return r; } ////////////////////////////////////////////////////////////////////////////// /// Computes both sin and cos of angle y/x, /// with h = sqrt(x**2+y**2). /// + void sincos(PARAMETER Int16 x, PARAMETER Int16 y, Int16* sin, Int16* cos) { - OVERLAY Int16 x2, y2, h2; + OVERLAY Int16 x2, y2, h2; - //---- Fold into one quadant --------------------------------------------- - OVERLAY char neg = 0; - if( x < 0 ) - { - neg |= 1; - x = -x; - } - if( y < 0 ) - { - neg |= 2; - y = -y; - } + //---- Fold into one quadant --------------------------------------------- + OVERLAY char neg = 0; + if( x < 0 ) + { + neg |= 1; + x = -x; + } + if( y < 0 ) + { + neg |= 2; + y = -y; + } - //---- Pre-scale both numerator and denominator ---------------------- - while( (((x>>8) | (y>>8)) & 0xE0) == 0 ) - { - x <<= 1; - y <<= 1; - } + //---- Pre-scale both numerator and denominator ---------------------- + while( (((x>>8) | (y>>8)) & 0xE0) == 0 ) + { + x <<= 1; + y <<= 1; + } - //---- Uses trig() to do the stuff one on quadrant ------------------- - x2 = umul(x,x); - y2 = umul(y,y); - h2 = x2 + y2; - x2 = cosxh(x2, h2); + //---- Uses trig() to do the stuff one on quadrant ------------------- + x2 = umul(x,x); + y2 = umul(y,y); + h2 = x2 + y2; + x2 = cosxh(x2, h2); - //---- Results back in four quadrants -------------------------------- - *cos = (neg & 1) ? -x2 : x2; - y2 = cosxh(y2, h2); - *sin = (neg & 2) ? -y2 : y2; + //---- Results back in four quadrants -------------------------------- + *cos = (neg & 1) ? -x2 : x2; + y2 = cosxh(y2, h2); + *sin = (neg & 2) ? -y2 : y2; } ////////////////////////////////////////////////////////////////////////////// @@ -202,47 +211,48 @@ void compass(void) { - OVERLAY Int16 sin, cos; - OVERLAY Int16 iBfx, iBfy, Gz; - OVERLAY Int16 iBpx, iBpy, iBpz; - RESET_C_STACK; + OVERLAY Int16 sin, cos; + OVERLAY Int16 iBfx, iBfy, Gz; + OVERLAY Int16 iBpx, iBpy, iBpz; + + RESET_C_STACK; - //---- Make hard iron correction ----------------------------------------- - // Measured magnetometer orientation, measured ok. - // From matthias drawing: (X,Y,Z) --> (X,Y,Z) : no rotation. - iBpx = compass_DX_f - compass_CX_f; // X - iBpy = compass_DY_f - compass_CY_f; // Y - iBpz = compass_DZ_f - compass_CZ_f; // Z + //---- Make hard iron correction ----------------------------------------- + // Measured magnetometer orientation, measured ok + // From matthias drawing: (X,Y,Z) --> (X,Y,Z) : no rotation + iBpx = compass_DX_f - compass_CX_f; // X + iBpy = compass_DY_f - compass_CY_f; // Y + iBpz = compass_DZ_f - compass_CZ_f; // Z - //---- Calculate sine and cosine of roll angle Phi ----------------------- - sincos(accel_DZ_f, accel_DY_f, &sin, &cos); + //---- Calculate sine and cosine of roll angle Phi ----------------------- + sincos(accel_DZ_f, accel_DY_f, &sin, &cos); - //---- rotate by roll angle (-Phi) --------------------------------------- - iBfy = imul(iBpy, cos) - imul(iBpz, sin); - iBpz = imul(iBpy, sin) + imul(iBpz, cos); - Gz = imul(accel_DY_f, sin) + imul(accel_DZ_f, cos); + //---- rotate by roll angle (-Phi) --------------------------------------- + iBfy = imul(iBpy, cos) - imul(iBpz, sin); + iBpz = imul(iBpy, sin) + imul(iBpz, cos); + Gz = imul(accel_DY_f, sin) + imul(accel_DZ_f, cos); - //---- calculate sin and cosine of pitch angle Theta --------------------- - sincos(Gz, -accel_DX_f, &sin, &cos); // NOTE: changed sin sign. + //---- calculate sin and cosine of pitch angle Theta --------------------- + sincos(Gz, -accel_DX_f, &sin, &cos); // NOTE: changed sin sign - /* correct cosine if pitch not in range -90 to 90 degrees */ - if( cos < 0 ) cos = -cos; + /* correct cosine if pitch not in range -90 to 90 degrees */ + if( cos < 0 ) cos = -cos; - ///---- de-rotate by pitch angle Theta ----------------------------------- - iBfx = imul(iBpx, cos) + imul(iBpz, sin); + ///---- de-rotate by pitch angle Theta ----------------------------------- + iBfx = imul(iBpx, cos) + imul(iBpz, sin); - //---- Detect uncalibrated compass --------------------------------------- - if( !compass_CX_f && !compass_CY_f && !compass_CZ_f ) - { - compass_heading = -1; - return; - } + //---- Detect uncalibrated compass --------------------------------------- + if( !compass_CX_f && !compass_CY_f && !compass_CZ_f ) + { + compass_heading = -1; + return; + } - //---- calculate current yaw = e-compass angle Psi ----------------------- - // Result in degree (no need of 0.01 deg precision... - compass_heading = itan(-iBfy, iBfx) / 100; + //---- calculate current yaw = e-compass angle Psi ----------------------- + // Result in degree (no need of 0.01 deg precision... + compass_heading = itan(-iBfy, iBfx) / 100; - // Result in 0..360 range: - if( compass_heading < 0 ) - compass_heading += 360; + // Result in 0..360 range: + if( compass_heading < 0 ) + compass_heading += 360; } diff -r 00b24fb4324d -r ca4556fb60b9 src/compass.h --- a/src/compass.h Thu Oct 11 21:06:29 2018 +0200 +++ b/src/compass.h Thu Nov 22 19:47:26 2018 +0100 @@ -5,23 +5,23 @@ //---- Storage classes ------------------------------------------------------- // Declaring PIC18 and VC++/G++ functions. #ifdef UNIX -# define PARAMETER -# define OVERLAY +# define PARAMETER +# define OVERLAY #else //---- Bank 9 parameters ----------------------------------------------------- -# pragma udata overlay bank9_compass = 0x900 -# define PARAMETER static -# define OVERLAY overlay +# pragma udata overlay bank9_compass = 0x900 +# define PARAMETER static +# define OVERLAY overlay #endif ////////////////////////////////////////////////////////////////////////////// -#define Q_PI (18000) -#define Q_PIO2 (9000) +#define Q_PI (18000) +#define Q_PIO2 (9000) -typedef short int Int16; -typedef signed char Int8; -typedef Int16 Angle; +typedef short int Int16; +typedef signed char Int8; +typedef Int16 Angle; // The (filtered) components of the magnetometer sensor: extern Int16 compass_DX_f; @@ -49,12 +49,12 @@ extern Angle utan(PARAMETER Int16 a, PARAMETER Int16 b); extern Angle itan(PARAMETER Int16 a, PARAMETER Int16 b); extern Angle cosxh(PARAMETER Int16 a, PARAMETER Int16 b); -extern void sincos(PARAMETER Int16 a, PARAMETER Int16 b, Int16* sin, Int16* cos); + +extern void sincos(PARAMETER Int16 a, PARAMETER Int16 b, Int16* sin, Int16* cos); ////////////////////////////////////////////////////////////////////////////// // The user functions extern void compass(void); extern void compass_reset_calibration(void); extern void compass_add_calibration(void); - extern void compass_solve_calibration(void); diff -r 00b24fb4324d -r ca4556fb60b9 src/compass_calib.c --- a/src/compass_calib.c Thu Oct 11 21:06:29 2018 +0200 +++ b/src/compass_calib.c Thu Nov 22 19:47:26 2018 +0100 @@ -11,12 +11,12 @@ // mH: Put compass data into bank 8 (stack) and bank 9 (variables) #ifndef UNIX # pragma udata overlay bank8=0x800 - static char C_STACK[256]; // Overlay C-code data stack here. -# define RESET_C_STACK \ - _asm \ - LFSR 1, 0x800 \ - LFSR 2, 0x800 \ - _endasm + static char C_STACK[256]; // overlay C-code data stack here +# define RESET_C_STACK \ + _asm \ + LFSR 1, 0x800 \ + LFSR 2, 0x800 \ + _endasm # pragma udata overlay bank9_compass #else # define RESET_C_STACK @@ -26,157 +26,158 @@ static unsigned short int compass_N; -static float Su, Sv, Sw; // First order moments. -static float Suu, Svv, Sww, Suv, Suw, Svw; // Second order moments. -static float Saa; // Suu + Svv + Sww -static float Saau; // Suuu + Svvu + Swwu // Third order moment. -static float Saav; // Suuv + Svvv + Swwv -static float Saaw; // Suuw + Svvw + Swww -static float yu, yv, yw; // temp solution vector. -static float uc, vc, wc; // temp sphere's center. +static float Su, Sv, Sw; // first order moments +static float Suu, Svv, Sww, Suv, Suw, Svw; // second order moments +static float Saa; // Suu + Svv + Sww +static float Saau; // Suuu + Svvu + Swwu // third order moment +static float Saav; // Suuv + Svvv + Swwv +static float Saaw; // Suuw + Svvw + Swww +static float yu, yv, yw; // temp solution vector +static float uc, vc, wc; // temp sphere's center ////////////////////////////////////////////////////////////////////////////// void compass_reset_calibration() { - RESET_C_STACK; + RESET_C_STACK; - compass_N = 0; - Su = Sv = Sw = 0.0; - Suu = Svv = Sww = Suv = Suw = Svw = 0.0; - Saau = Saav = Saaw = 0.0; - compass_CX_f = compass_CY_f = compass_CZ_f = 0; + compass_N = 0; + Su = Sv = Sw = 0.0; + Suu = Svv = Sww = 0.0; + Suv = Suw = Svw = 0.0; + Saau = Saav = Saaw = 0.0; + compass_CX_f = compass_CY_f = compass_CZ_f = 0; } ////////////////////////////////////////////////////////////////////////////// void compass_add_calibration() { - RESET_C_STACK; + RESET_C_STACK; - // Get filtered/calibrated magnetic direction: - yu = (compass_DX_f - compass_CX_f) / 32768.0f; - yv = (compass_DY_f - compass_CY_f) / 32768.0f; - yw = (compass_DZ_f - compass_CZ_f) / 32768.0f; + // get filtered/calibrated magnetic direction + yu = (compass_DX_f - compass_CX_f) / 32768.0f; + yv = (compass_DY_f - compass_CY_f) / 32768.0f; + yw = (compass_DZ_f - compass_CZ_f) / 32768.0f; - // Add to all moments: - compass_N++; + // add to all moments + compass_N++; - Su += yu; - Sv += yv; - Sw += yw; + Su += yu; + Sv += yv; + Sw += yw; - Suu += yu*yu; - Suv += yu*yv; - Suw += yu*yw; - Svv += yv*yv; - Svw += yv*yw; - Sww += yw*yw; + Suu += yu*yu; + Suv += yu*yv; + Suw += yu*yw; + Svv += yv*yv; + Svw += yv*yw; + Sww += yw*yw; - Saa = yu*yu + yv*yv + yw*yw; - Saau += yu * Saa; - Saav += yv * Saa; - Saaw += yw * Saa; + Saa = yu*yu + yv*yv + yw*yw; + Saau += yu * Saa; + Saav += yv * Saa; + Saaw += yw * Saa; } ////////////////////////////////////////////////////////////////////////////// static float compass_discriminent(PARAMETER char column) { - // Basic symetric matrix: - OVERLAY float a = Suu, d = Suv, g = Suw; - OVERLAY float b = Suv, e = Svv, h = Svw; - OVERLAY float c = Suw, f = Svw, i = Sww; + // basic symmetric matrix + OVERLAY float a = Suu, d = Suv, g = Suw; + OVERLAY float b = Suv, e = Svv, h = Svw; + OVERLAY float c = Suw, f = Svw, i = Sww; - // Substitute a column, if asked to: - if( column==1 ) { a = yu; b = yv; c = yw; } - if( column==2 ) { d = yu; e = yv; f = yw; } - if( column==3 ) { g = yu; h = yv; i = yw; } + // substitute a column, if asked to + if( column==1 ) { a = yu; b = yv; c = yw; } + if( column==2 ) { d = yu; e = yv; f = yw; } + if( column==3 ) { g = yu; h = yv; i = yw; } - // Do the math: - return a * (e * i - f * h) - - b * (d * i - f * g) - + c * (d * h - e * g); + // do the math + return a * (e * i - f * h) + - b * (d * i - f * g) + + c * (d * h - e * g); } ////////////////////////////////////////////////////////////////////////////// static float compass_dotc(PARAMETER float u, float v, float w) { - return u*uc + v*vc + w*wc; + return u*uc + v*vc + w*wc; } ////////////////////////////////////////////////////////////////////////////// void compass_solve_calibration() { - OVERLAY float delta; - RESET_C_STACK; + OVERLAY float delta; + RESET_C_STACK; - //---- Compute center of measured magnetic directions -------------------- - uc = Su/compass_N; - vc = Sv/compass_N; - wc = Sw/compass_N; + //---- Compute center of measured magnetic directions -------------------- + uc = Su/compass_N; + vc = Sv/compass_N; + wc = Sw/compass_N; - //---- Normalize partial sums -------------------------------------------- - // - // We measured the (u, v, w) values, and need the centered (x, y, z) ones - // around the sphere center's (uc, vc, wc) as: - // uc = Su / N; The mean value - // x = u - uc; The differnce to the mean. - // - // So: - // x**2 = (u - uc)**2 = u**2 - 2u*uc + uc**2 - // - // We need the Sxx sum of 2nd orders: - // Sxx = Suu - 2 uc Su + N*uc*(Su/N) = Suu - uc Su - Suu -= Su*uc; - Svv -= Sv*vc; - Sww -= Sw*wc; + //---- Normalize partial sums -------------------------------------------- + // + // We measured the (u, v, w) values, and need the centered (x, y, z) ones + // around the sphere center's (uc, vc, wc) as: + // uc = Su / N; The mean value + // x = u - uc; The differnce to the mean. + // + // So: + // x**2 = (u - uc)**2 = u**2 - 2u*uc + uc**2 + // + // We need the Sxx sum of 2nd orders: + // Sxx = Suu - 2 uc Su + N*uc*(Su/N) = Suu - uc Su + Suu -= Su*uc; + Svv -= Sv*vc; + Sww -= Sw*wc; - // (u - uc)(v - vc) = uv - u vc - v uc + uc vc - // Sxy = Suv - Su vc - Sv uc + N uc vc - // = Suv - Su vc - N vc uc + N uc vc - // = Suv - Su vc - Suv -= Su*vc; - Suw -= Su*wc; - Svw -= Sv*wc; + // (u - uc)(v - vc) = uv - u vc - v uc + uc vc + // Sxy = Suv - Su vc - Sv uc + N uc vc + // = Suv - Su vc - N vc uc + N uc vc + // = Suv - Su vc + Suv -= Su*vc; + Suw -= Su*wc; + Svw -= Sv*wc; - // (u + um)**3 = u**3 + 3 u**2 um + 3 u um**2 + um**3 - // Sxxx = Suuu + 3 um Suu + 3 um**2 Su + N.um**3 - // Su = 0, um = Sx/N: - // Suuu = Sxxx - 3 Sx*Suu/N - N.(Sx/N)**3 - // = Sxxx - 3 Sx*Suu/N - Sx**3/N**2 + // (u + um)**3 = u**3 + 3 u**2 um + 3 u um**2 + um**3 + // Sxxx = Suuu + 3 um Suu + 3 um**2 Su + N.um**3 + // Su = 0, um = Sx/N: + // Suuu = Sxxx - 3 Sx*Suu/N - N.(Sx/N)**3 + // = Sxxx - 3 Sx*Suu/N - Sx**3/N**2 - // (u + um)**2 (v + vm) = (u**2 + 2 u um + um**2)(v + vm) - // Sxxy = Suuv + vm Suu + 2 um (Suv + vm Su) + um**2 (Sv + N.vm) - // - // Su = 0, Sv = 0, vm = Sy/N: - // Sxxy = Suuv + vm Suu + 2 um Suv + N um**2 vm - // - // Suuv = Sxxy - (Sy/N) Suu - 2 (Sx/N) Suv - (Sx/N)**2 Sy - // = Sxxy - Suu*Sy/N - 2 Suv*Sx/N - Sx*Sx*Sy/N/N - // = Sxxy - (Suu + Sx*Sx/N)*Sy/N - 2 Suv*Sx/N - Saa = Suu + Svv + Sww; - yu = Saau - Saa*uc - compass_dotc(Su*uc + 2*Suu, Sv*uc + 2*Suv, Sw*uc + 2*Suw); - yv = Saav - Saa*vc - compass_dotc(Su*vc + 2*Suv, Sv*vc + 2*Svv, Sw*vc + 2*Svw); - yw = Saaw - Saa*wc - compass_dotc(Su*wc + 2*Suw, Sv*wc + 2*Svw, Sw*wc + 2*Sww); + // (u + um)**2 (v + vm) = (u**2 + 2 u um + um**2)(v + vm) + // Sxxy = Suuv + vm Suu + 2 um (Suv + vm Su) + um**2 (Sv + N.vm) + // + // Su = 0, Sv = 0, vm = Sy/N: + // Sxxy = Suuv + vm Suu + 2 um Suv + N um**2 vm + // + // Suuv = Sxxy - (Sy/N) Suu - 2 (Sx/N) Suv - (Sx/N)**2 Sy + // = Sxxy - Suu*Sy/N - 2 Suv*Sx/N - Sx*Sx*Sy/N/N + // = Sxxy - (Suu + Sx*Sx/N)*Sy/N - 2 Suv*Sx/N + Saa = Suu + Svv + Sww; + yu = Saau - Saa*uc - compass_dotc(Su*uc + 2*Suu, Sv*uc + 2*Suv, Sw*uc + 2*Suw); + yv = Saav - Saa*vc - compass_dotc(Su*vc + 2*Suv, Sv*vc + 2*Svv, Sw*vc + 2*Svw); + yw = Saaw - Saa*wc - compass_dotc(Su*wc + 2*Suw, Sv*wc + 2*Svw, Sw*wc + 2*Sww); - //---- Solve the system -------------------------------------------------- - // uc Suu + vc Suv + wc Suw = (Suuu + Svvu + Swwu) / 2 - // uc Suv + vc Svv + wc Svw = (Suuv + Svvv + Swwv) / 2 - // uc Suw + vc Svw + wc Sww = (Suuw + Svvw + Swww) / 2 - // Note this is symetric, with a positiv diagonal, hence - // discriminent is always not null. - delta = 0.5f / compass_discriminent(0); + //---- Solve the system -------------------------------------------------- + // uc Suu + vc Suv + wc Suw = (Suuu + Svvu + Swwu) / 2 + // uc Suv + vc Svv + wc Svw = (Suuv + Svvv + Swwv) / 2 + // uc Suw + vc Svw + wc Sww = (Suuw + Svvw + Swww) / 2 + // Note this is symmetric, with a positive diagonal, hence + // discriminant is always not null. + delta = 0.5f / compass_discriminent(0); - // So computed new center, with offsetted values: - uc += compass_discriminent(1) * delta; - vc += compass_discriminent(2) * delta; - wc += compass_discriminent(3) * delta; + // so computed new center, with offset values: + uc += compass_discriminent(1) * delta; + vc += compass_discriminent(2) * delta; + wc += compass_discriminent(3) * delta; - // Add correction due to already applyed calibration: - compass_CX_f += (short)(32768 * uc); - compass_CY_f += (short)(32768 * vc); - compass_CZ_f += (short)(32768 * wc); + // add correction due to already applied calibration: + compass_CX_f += (short)(32768 * uc); + compass_CY_f += (short)(32768 * vc); + compass_CZ_f += (short)(32768 * wc); } diff -r 00b24fb4324d -r ca4556fb60b9 src/compass_ops.asm --- a/src/compass_ops.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/compass_ops.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File compass_ops.asm V2.98 +; File compass_ops.asm V2.98a ; ; Compass Operations ; @@ -1446,17 +1446,4 @@ banksel common return - 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 - END diff -r 00b24fb4324d -r ca4556fb60b9 src/convert.asm --- a/src/convert.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/convert.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File convert.asm ## V2.98 +; File convert.asm ## V2.98c ; ; Converts register values to string ; @@ -13,7 +13,7 @@ #include "hwos.inc" ; Mandatory header -basic CODE +convert CODE ;============================================================================= @@ -28,7 +28,7 @@ output99: movlw d'99' cpfslt lo - movwf lo ; Limit to 99 + movwf lo ; limit to 99 movff lo,lo_temp clrf hi_temp bcf pre_zero_flag ; do not display leading zeros @@ -54,7 +54,7 @@ movlw d'99' cpfslt lo - movwf lo ; Limit to 99 + movwf lo ; limit to 99 movff lo, lo_temp clrf hi_temp bsf pre_zero_flag ; display leading zeros @@ -84,18 +84,18 @@ ; 9999 = 27 0F = [39][15] movlw .40 cpfslt hi ; hi < 40 ? - bra output16_4_call_2 ; No, hi >= 40, do limit + 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 + 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. + 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 + bra output16_4_call_3 ; done +output16_4_call_2: ; set to 9999 movlw LOW .9999 movwf lo movlw HIGH .9999 @@ -113,13 +113,13 @@ 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...) + 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 + bra output16_3_call_3 ; done +output16_3_call_2: ; set to .999 movlw LOW .999 movwf lo movlw HIGH .999 @@ -130,10 +130,10 @@ incf ignore_digits,F clrf WREG output16: - movwf cvt_temp4 ; Passed from output16dp macro, cleared by others. + 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 cvt_temp4 ; Display leading zeros at all? + tstfsz cvt_temp4 ; display leading zeros at all? bcf leading_zeros bsf DP_done2 tstfsz cvt_temp4 @@ -149,7 +149,7 @@ bra output16_sk5 btfsc show_last4 ; display only last four figures? bra output16_sk5 - rcall DEC2ASCII ; No, show all. Here: 5th order digit + rcall DEC2ASCII ; NO - show all, here: 5th order digit output16_sk5: bcf show_last4 @@ -157,41 +157,41 @@ movwf cvt_temp2 movlw b'00000011' movwf cvt_temp3 - btfsc DP_done2 ; Is there a decimal point at all? - bra output16_2 ; no, use normal display mode + 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 bsf pre_zero_flag ; display figure if zero? decfsz cvt_temp4,W - bcf pre_zero_flag ; No + 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 + 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 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 + 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 @@ -211,28 +211,28 @@ btfsc DP_done2 bsf pre_zero_flag output16_4: - btfsc ignore_digit4 ; Ignore 4-5th digit? - bra output16_5 ; Yes, skip the rest + btfsc ignore_digit4 ; ignore 4-5th digit? + bra output16_5 ; YES - skip the rest rcall DEC2ASCII ; 2nd order digit movlw b'00000001' ; 1s movwf cvt_temp2 clrf cvt_temp3 bsf pre_zero_flag - btfss ignore_digit5 ; Ignore 5th digit? + btfss ignore_digit5 ; ignore 5th digit? rcall DEC2ASCII ; 1st order digit - bcf ignore_digit5 ; yes, and clear flag + bcf ignore_digit5 ; YES - 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... + return ; done with convert.asm... DEC2ASCII: - clrf cvt_temp1 ; converts into ASCII code + clrf cvt_temp1 ; converts into ASCII code DEC2ASCII_2: movf cvt_temp3,W subwf hi_temp,W @@ -257,10 +257,10 @@ decfsz ignore_digits,F return incf ignore_digits,F ; so ignore_digits stays zero for the test above - movlw '0' ; Offset for ASCII-value + movlw '0' ; offset for ASCII-value addwf cvt_temp1,W btfsc pre_zero_flag ; is this a leading zero? - bra DEC2ASCII_4_1 ; no + bra DEC2ASCII_4_1 ; NO btfsc leftbind bra DEC2ASCII_6 movlw ' ' ; instead of leading zeros a space! @@ -270,11 +270,34 @@ DEC2ASCII_5: movwf POSTINC2 DEC2ASCII_6: - decfsz cvt_temp4,F ; Set decimal point? - RETURN ; No - movlw "." ; Yes + decfsz cvt_temp4,F ; set decimal point? + RETURN ; NO + movlw "." ; YES movwf POSTINC2 bsf DP_done return + + global outputHEX_call +outputHEX_call: ; coverts 8 Bit integer into two hex digits + movwf cvt_temp1 ; copy byte to process from WREG to local temp + swapf cvt_temp1,F ; swap nibbles to process upper nibble first + rcall outputHEX_nibble ; print nibble as ASCII + swapf cvt_temp1,F ; swap back to process lower nibble +outputHEX_nibble: + movff cvt_temp1,cvt_temp2 ; create a working copy + movlw 0x0F ; mask for lower nibble + andwf cvt_temp2,F ; isolate lower nibble + movlw 0x30 ; offset from binary 0 to ASCII code for "0" + addwf cvt_temp2,F ; add offset + movlw 0x39 ; ASCII code for "9" + cpfsgt cvt_temp2 ; character code in cvt_temp2 pointing to something after "9"? + bra outputHEX_1 ; NO - character code represents "0"..."9", can be printed + movlw 0x07 ; YES - offset from ASCII code for character after "9" to character "A" + addwf cvt_temp2,F ; - add offset, character code now represents "A"..."F", can be printed now +outputHEX_1: + movff cvt_temp2,POSTINC2 ; copy character code to output buffer + return + + END diff -r 00b24fb4324d -r ca4556fb60b9 src/convert.inc --- a/src/convert.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/convert.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File convert.inc ## V2.98 +; File convert.inc ## V2.98b ; ; Converts register values to string ; @@ -12,37 +12,42 @@ extern output16_3_call -output_16_3 macro ; displays only last three figures from a 16Bit value (0-999) +output_16_3 macro ; displays only last three digits from a 16 bit 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) +output_16_4 macro ; displays only last four digits from a 16 bit value (0-9999) call output16_4_call endm extern output16 -output_16dp macro dp_position ; 16 Bit with decimal point +output_16dp macro dp_position ; 16 bit with decimal point movlw dp_position call output16 endm extern output16_call -output_16 macro ; 16Bit Normal +output_16 macro ; 16 bit normal call output16_call endm extern output8_call -output_8 macro ; 8 Bit Normal +output_8 macro ; 8 bit normal call output8_call endm extern output99_call -output_99 macro ; displays only last two figures from a 8Bit value (0-99) +output_99 macro ; displays only last two digits from a 8 bit value (0-99) call output99_call endm extern output99x_call -output_99x macro ; displays only last two figures from a 8Bit value with leading zero (00-99) +output_99x macro ; displays only last two figures from a 8 bit value with leading zero (00-99) call output99x_call endm + + extern outputHEX_call +output_hex macro ; displays 8 bit integer in hex, input via WREG + call outputHEX_call + endm diff -r 00b24fb4324d -r ca4556fb60b9 src/customview.asm --- a/src/customview.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/customview.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,8 +1,8 @@ ;============================================================================= ; -; File customview.asm REFACTORED VERSION V2.98 +; File customview.asm REFACTORED VERSION V2.99e ; -; Customview in Surfacemode and Divemode +; Custom Views in Surface and Dive Mode ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= @@ -11,7 +11,7 @@ ;============================================================================= -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; mandatory header #include "tft_outputs.inc" #include "strings.inc" #include "tft.inc" @@ -24,71 +24,65 @@ #include "start.inc" - extern gaslist_strcat_gas_mod + extern gaslist_strcat_gas_cd extern char_I_deco_model - extern TFT_sensor_mV extern TFT_surface_compass_mask extern TFT_dive_compass_mask - -gui CODE +custview CODE ;============================================================================= -; Do every-second tasks for the custom view area (Dive mode) +; Jump table for the every-second tasks for the custom view area (dive mode) +; +; Attention: the ordering must be in line with the init jump table and the +; index numbers defined in hwos.inc! global customview_second customview_second: - movff menupos3,WREG ; copy current view (1-...) - dcfsnz WREG,F - 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 - dcfsnz WREG,F - goto TFT_decoplan ; Show decoplan ; and return - dcfsnz WREG,F - goto TFT_battinfo_tissues_clock ; Update Battery, Tissues and clock ; and return - dcfsnz WREG,F - goto TFT_gf_info ; Update GF informations ; and return - dcfsnz WREG,F - return ; Compass updated separately (faster) in divemode; - dcfsnz WREG,F - nop ; ex goto TFT_dyn_gaslist - dcfsnz WREG,F - 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 - dcfsnz WREG,F - 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 - dcfsnz WREG,F - goto TFT_pscr_info ; Show ppO2, drop and lung ratio; and return - dcfsnz WREG,F - goto TFT_gas_needs ; Show gas needs + movf menupos3,W ; copy current view (1-...) + dcfsnz WREG,F ; 1: + goto TFT_avr_stopwatch ; average depth and stopwatch + dcfsnz WREG,F ; 2: + return ; compass - will be updated separately (faster) in divemode + dcfsnz WREG,F ; 3: + goto TFT_ppo2_sensors ; ppO2 sensors + dcfsnz WREG,F ; 4: + goto TFT_sensor_check ; sensor check + dcfsnz WREG,F ; 5; + goto TFT_pscr_info ; pSCR data + dcfsnz WREG,F ; 6: + IFDEF _rx_functions + goto TFT_pressures_SAC ; tank pressure and SAC rate + ELSE + return ; not available without RX functions + ENDIF + dcfsnz WREG,F ; 7: + goto TFT_gas_needs_ascent ; gas needs for ascent / cave return + dcfsnz WREG,F ; 8: + goto TFT_decoplan ; deco plan + dcfsnz WREG,F ; 9: + goto TFT_ceiling_GF_tissue ; ceiling, current GF and tissues + dcfsnz WREG,F ; 10: + goto TFT_CNS ; CNS values + dcfsnz WREG,F ; 11: + goto TFT_ppo2_ead_end_cns ; ppO2, END/EAD and CNS + dcfsnz WREG,F ; 12: + goto TFT_gf_factors ; GF factors + dcfsnz WREG,F ; 13: + goto TFT_clock_batt_surfpress ; clock, battery and surface pressure + return ; menupos3 = 0 -> do nothing - ; Menupos3=0, do nothing - 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-...) + movf menupos3,W ; copy current view (0-...) dcfsnz WREG,F - bra customview_alt_second_view1 ; View 1 + nop ; view 1 dcfsnz WREG,F - nop ; View 2 + nop ; view 2 + ;bra customview_alt_second_view0 ; default view - ; Menupos3=0, do nothing - return - -customview_alt_second_view1: - bsf FLAG_TFT_max_depth_alt +customview_alt_second_view0: bsf FLAG_TFT_big_deco_alt return @@ -96,9 +90,9 @@ ; Do every-minute tasks for the custom view area global customview_minute -customview_minute: +customview_minute: ; called from dive mode, call disabled at present return -; movff menupos3,WREG ; copy +; movf menupos3,W ; copy ; dcfsnz WREG,F ; bra customview_1min_view1 ; dcfsnz WREG,F @@ -121,7 +115,7 @@ ; bra customview_1min_view10 ; dcfsnz WREG,F ; bra customview_1min_view11 -; ; Menupos3=0, do nothing +; ; menupos3=0, do nothing ; return ; ;customview_1min_view1: @@ -140,12 +134,19 @@ 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 + incf menupos3,F ; number of custom view to show + + movlw .6 ; index of surface custom view compass + cpfseq menupos3 ; will compass be shown in custom view? + call I2C_sleep_accelerometer ; NO - stop accelerometer + cpfseq menupos3 ; will compass be shown in custom view? + call I2C_sleep_compass ; NO - stop compass + + movlw d'10' ; max number of custom views 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) + movwf menupos3 ; reset to one (always one custom view visible) global surf_customview_mask surf_customview_mask: @@ -153,555 +154,560 @@ ; 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 - dcfsnz WREG,F - bra surf_customview_init_view2 ; CC Dil list - dcfsnz WREG,F + movf menupos3,W ; menupos3 holds number of custom view function + dcfsnz WREG,F ; 1: + bra surf_customview_init_view1 ; OC gas list + dcfsnz WREG,F ; 2: + bra surf_customview_init_view2 ; CC dil list + dcfsnz WREG,F ; 3: bra surf_customview_init_view3 ; CC SP list - dcfsnz WREG,F - bra surf_customview_init_view4 ; Custom Text - dcfsnz WREG,F - bra surf_customview_init_view5 ; Tissue Diagram - dcfsnz WREG,F - bra surf_customview_init_view6 ; Compass - dcfsnz WREG,F - bra surf_customview_init_view7 ; Deco settings - dcfsnz WREG,F - bra surf_customview_init_view8 ; Last Dive info - dcfsnz WREG,F - bra surf_customview_init_view9 ; Sensor mV readings + dcfsnz WREG,F ; 4: + bra surf_customview_init_view4 ; custom text + dcfsnz WREG,F ; 5: + bra surf_customview_init_view5 ; tissue diagram + dcfsnz WREG,F ; 6: + bra surf_customview_init_view6 ; compass + dcfsnz WREG,F ; 7: + bra surf_customview_init_view7 ; deco settings + dcfsnz WREG,F ; 8: + bra surf_customview_init_view8 ; last dive info + dcfsnz WREG,F ; 9: + bra surf_customview_init_view9 ; sensor mV readings + dcfsnz WREG,F ; 10: + bra surf_customview_init_view10 ; tank data + bra surf_customview_init_view4 ; default view after restart and loading new firmware - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass - - movlw .1 - movwf menupos3 ; Reset to one (Always one custom view visible) - -surf_customview_init_view1: ; View1: OC Gas list +surf_customview_init_view1: ; view 1: 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 + btfss FLAG_oc_mode + bra surf_customview_init_view1a ; bailout version of "OC Gas List" + STRCPY_TEXT_PRINT tGaslist ; title of custom view / OC mode + bra surf_customview_init_view1b +surf_customview_init_view1a: + STRCPY_TEXT_PRINT tDiveBailout ; title of custom view / CCR & pSCR mode +surf_customview_init_view1b: ; remaining common part call TFT_standard_color - call TFT_gaslist_surfmode ; Show gas list - bra customview_toggle_exit ; Done. + 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. - -surf_customview_init_view2: ; View2: CC Dil list +surf_customview_init_view2: ; view 2: CCR / pSCR diluent list + btfsc FLAG_ccr_mode + bra surf_customview_init_view2a 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_init_view2a bra surf_customview_toggle - btfsc FLAG_apnoe_mode - bra surf_customview_toggle -surf_customview_init_view2_2: - STRCPY_TEXT_PRINT tGaslistCC ; Title of customview +surf_customview_init_view2a: + STRCPY_TEXT_PRINT tGaslistCC ; title of custom view call TFT_standard_color - call TFT_dillist_surfmode ; Show diluent list - bra customview_toggle_exit ; Done. + call TFT_dillist_surfmode ; show diluent list + bra customview_toggle_exit ; done -surf_customview_init_view3: ; View3: CC SP list - btfss FLAG_ccr_mode +surf_customview_init_view3: ; view 3: CC SP list + btfsc FLAG_ccr_mode + bra surf_customview_init_view3a 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 +surf_customview_init_view3a: + STRCPY_TEXT_PRINT tFixedSetpoints ; title of custom view call TFT_standard_color - call TFT_splist_surfmode ; Show Setpoint list - bra customview_toggle_exit ; Done. + call TFT_splist_surfmode ; show setpoint list + bra customview_toggle_exit ; done -surf_customview_init_view9: ; View 9: Sensor mV on the surface +surf_customview_init_view9: ; view 9: sensor mV at the surface btfsc FLAG_ccr_mode - bra surf_customview_init_view9a ; we are in 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 + 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 custom view call TFT_sensor_mV ; write sensor mV readings to screen - bra customview_toggle_exit ; Done. + 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: ; view 4: custom text + call TFT_custom_text ; show the custom text + bra customview_toggle_exit ; done -surf_customview_init_view5: ; View5: Tissue Diagram +surf_customview_init_view5: ; view 5: 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. + 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 - call TFT_surface_compass_mask ; Show compass - bra customview_toggle_exit ; Done. +surf_customview_init_view6: ; view 6: compass + call I2C_init_accelerometer ; start accelerometer + call I2C_init_compass ; start compass + call TFT_surface_compass_mask ; show compass mask + bra customview_toggle_exit ; done surf_customview_init_view7: - btfsc FLAG_gauge_mode ; View7: Deco settings + btfsc FLAG_gauge_mode ; view 7: 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 - call TFT_surface_decosettings ; Show all deco settings - bra customview_toggle_exit ; Done. +surf_customview_init_view8: ; view 8: 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. +surf_customview_init_view10: ; transmitter data / debug + IFDEF _rx_functions + btfss FLAG_tr_enabled ; TR functions enabled? + bra surf_customview_toggle ; NO - show next view in list + STRCAT_PRINT "ID bar Volt" ; title of custom view (none language-dependent) + call TFT_surface_tankdata + bra customview_toggle_exit ; done + ELSE + bra surf_customview_toggle + ENDIF + + + global switch_layout_to_normal +switch_layout_to_normal: ; switch back from alternative to normal layout + ; needs custom view to be selected / restored separately! + bcf alternative_divelayout ; clear flag + bsf FLAG_TFT_divemode_mask ; set flag for normal layout mask + bsf FLAG_TFT_max_depth ; set flag for normal layout data + btfss decostop_active ; deco? + bsf FLAG_TFT_display_ndl_mask ; NO - set flag for normal layout NDL data + btfsc decostop_active ; deco? + bsf FLAG_TFT_display_deko_mask ; YES - set flag for normal layout deco data + clrf menupos3 ; set to no active custom view + call TFT_ClearScreen ; clear the whole screen + return 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_toggle: ; show menu or the simulator tasks + bcf switch_left + btfss alternative_divelayout ; in alternative layout mode? + bra menuview_toggle2 ; NO - continue with menu or simulator tasks + rcall switch_layout_to_normal ; YES - switch back to normal layout + movff customview_divemode,menupos3; - restore the custom view shown in normal layout + rcall customview_mask ; - re-draw the custom view + bra menuview_toggle_reset ; - suppress the menu when returning from alternative layout menuview_toggle2: 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 + bsf menuview ; flag that the options menu is shown + incf menupos2,F ; number of option to show + movlw d'10' ; max number of options in divemode + cpfsgt menupos2 ; max reached? + bra menuview_mask ; NO - show option global menuview_toggle_reset -menuview_toggle_reset: ; Timeout occurred - clrf menupos2 - bcf menuview +menuview_toggle_reset: ; timeout occurred, beyond max number of options, or item executed + clrf menupos2 ; reset option selector + bcf menuview ; revoke options menu if shown 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+.46 ; top, bottom, left, right + btfss FLAG_gauge_mode ; in gauge mode? + bra menuview_mask2 ; NO + ; YES - clear some more in gauge mode -- "Reset Avg." text is longer than all the other texts + WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column+.47, 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 + 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 + movf menupos2,W ; 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 ; check if a better gas/diluent is advised and prompt for switching if yes dcfsnz WREG,F - bra menuview_view1 ; "Menu?" (Not in Gauge and Anpnoe) + bra menuview_view1 ; "Menu?" (skipped in gauge and apnoe modes) dcfsnz WREG,F - bra menuview_view2 ; "Quit Simulation?" (Sim only) + bra menuview_view2 ; "Quit?" (in simulation mode only) dcfsnz WREG,F - bra menuview_view3 ; "Descent 1m" (Sim only) + bra menuview_view3 ; "Sim-1m" (in simulation mode only) dcfsnz WREG,F - bra menuview_view4 ; "Ascend 1m" (Sim only) + bra menuview_view4 ; "Sim+1m" (in simulation mode only) dcfsnz WREG,F - bra menuview_view5 ; "Quit Apnea mode?" (Apnea only) + bra menuview_view5 ; "Quit?" (in apnoe mode only) dcfsnz WREG,F - bra menuview_view6 ; "Reset Avr." (Gauge only) + bra menuview_view6 ; "Reset Avr." (in gauge mode only) dcfsnz WREG,F - bra menuview_view7 ; "Sim:+5mins" (Sim only) + bra menuview_view7 ; "Sim+5'" (in simulation mode only) dcfsnz WREG,F - bra menuview_view8 ; "Heading" (When compass is shown) + bra menuview_view8 ; "Heading" (only when compass is shown) dcfsnz WREG,F - bra menuview_view9 ; "Layout" (Alternative Layout, aka Blind mode) + bra menuview_view9 ; "Layout" (offer alternative layout, aka blind mode) menuview_exit: call TFT_standard_color - bcf win_invert ; Reset invert flag - return ; Menupos2 = 0, Show nothing + bcf win_invert ; reset invert flag + btfss alternative_divelayout ; in alternative layout? + bsf FLAG_TFT_active_gas_divemode; NO - redraw gas and setpoint (eventually needed to restore the "Bailout" text) + return ; menupos2 = 0, show nothing menuview_view_gaschange: - 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 + btfsc divemode_gaschange ; last gas change done yet? + bra menuview_toggle ; NO - call next option + btfsc FLAG_oc_mode ; in OC mode? + bra menuview_view_gaschange_OC ; YES + btfsc FLAG_bailout_mode ; in bailout? + bra menuview_view_gaschange_OC ; YES +menuview_view_gaschange_DIL: + btfss better_dil_available ; is the better diluent still available? + bra menuview_toggle ; NO - call next option + movff best_dil_number,PRODL ; number (1-5) of the "best diluent" + bsf FLAG_diluent_setup ; flag to use diluents + bra menuview_view_gaschange_com +menuview_view_gaschange_OC: + btfss better_gas_available ; is the better gas still available? + bra menuview_toggle ; NO - call next option + movff best_gas_number,PRODL ; number (1-5) of the "best gas" + bcf FLAG_diluent_setup ; flag to use oc gases +menuview_view_gaschange_com: + decf PRODL,F ; (1-5) -> (0-4) + bsf short_gas_decriptions ; =1: use short version of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bsf better_gas_hint ; color-code as best gas/diluent + call gaslist_strcat_gas_cd ; append gas description of gas #PRODL (0-4) to current string movlw .5 - movwf FSR2L ; Point to char 6 (5 chars gas description only) + movwf FSR2L ; point to 6th character (5 chars are used for the gas/dil description) STRCAT_PRINT "?" - bra menuview_exit ; Done. + 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 ; YES - goto next option + btfsc FLAG_gauge_mode ; in Gauge mode? + bra menuview_toggle ; YES - goto next option + STRCPY_TEXT_PRINT tDivePreMenu ; print "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 ; in simulator mode? + bra menuview_toggle ; NO - goto next option + STRCPY_TEXT_PRINT tQuitSim ; print "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" ; "-" for going down - bra menuview_exit ; Done. + btfss simulatormode_active ; in simulator mode? + bra menuview_toggle ; NO - goto next option +; STRCPY_PRINT "Sim-1m" ; print "-" for going down + STRCPY_PRINT "Sim\xb8" ; print down arrow 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" ; "+" for going up - bra menuview_exit ; Done. + btfss simulatormode_active ; in simulator mode? + bra menuview_toggle ; NO - goto next option +; STRCPY_PRINT "Sim+1m" ; "+" for going up + STRCPY_PRINT "Sim\xb9" ; print up arrow 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 -; We are at the surface: - STRCPY_TEXT_PRINT tQuitSim ; "Quit Apnea mode?" - bra menuview_exit ; Done. + btfss FLAG_apnoe_mode ; in Apnoe mode? + bra menuview_toggle ; NO - goto next option + btfss FLAG_active_descent ; descending? + bra menuview_toggle ; YES - goto next option + ; We are at the surface: + STRCPY_TEXT_PRINT tQuitSim ; print "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 - goto next option + STRCPY_TEXT_PRINT tDivemenu_ResetAvg; print "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 ; in simulator mode? + bra menuview_toggle ; NO - goto next option + btfsc FLAG_gauge_mode ; in Gauge mode? + bra menuview_toggle ; YES - goto next option + btfsc FLAG_apnoe_mode ; in Apnoe mode? + bra menuview_toggle ; YES - goto next option + STRCPY_PRINT "Sim+5'" ; print "Sim+5'" + bra menuview_exit ; done + menuview_view8: - movlw .6 + movlw index_compass_dm ; index of compass view cpfseq menupos3 ; in compass view? - bra menuview_toggle ; No, call next option - STRCPY_TEXT_PRINT tSetHeading ; "Heading" - bra menuview_exit ; Done. + bra menuview_toggle ; NO - goto next option + STRCPY_TEXT_PRINT tSetHeading ; print "Heading" + bra menuview_exit ; done + menuview_view9: - 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 + btfsc FLAG_apnoe_mode ; in Apnoe mode? + bra menuview_toggle ; YES - goto next option STRCPY_PRINT "Layout" - bra menuview_exit ; Done. + bra menuview_exit ; done ;============================================================================= + global customview_mask_alternative 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: + call I2C_sleep_accelerometer ; no compass in alternative layout - stop accelerometer + call I2C_sleep_compass ; no compass in alternative layout - stop compass + movlw d'0' ; max number of custom views in divemode, alternative layout + cpfsgt menupos3 ; max reached? + bra customview_mask_alternative ; NO - show + clrf menupos3 ; reset to zero (zero = default custom view 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 + WIN_BOX_BLACK dm_customview_row, .239, .0, .159 ; top, bottom, left, right + movf menupos3,W ; menupos3 holds number of custom view function dcfsnz WREG,F - bra customview_alt_init_view1 ; View 1: Big deco/ndl and max. depth + bra customview_alt_init_view1 ; view 1: -- for test only -- dcfsnz WREG,F - bra customview_alt_init_view2 ; View 2: - - ;bra customview_alternative_toggle_exit ; No view (menupos3=0) + nop ; view 2: ... + ;bra customview_alt_init_view0 ; default view: big deco/ndl and max. depth -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 +customview_alt_init_view0: ; default view: 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 */ +customview_alt_init_view1: ; view 1 - just for test use + call TFT_avr_stopwatch_mask ; mask for average depth and stopwatch + call TFT_avr_stopwatch ; data for average depth and stopwatch bra customview_alt_toggle_exit +customview_alt_toggle_exit: + bcf toggle_customview ; clear flag + return -; Show next customview (and delete this flag) + +; Show next dive mode custom view (and delete this flag) global customview_toggle customview_toggle: - bcf switch_right - incf menupos3,F ; Number of customview to show + bcf switch_right + incf menupos3,F ; number of custom view to show + + btfsc alternative_divelayout ; in alternative layout mode? + bra customview_toggle_alternative ; YES - use the big ones instead - btfsc alternative_divelayout ; In alternative layout mode? - bra customview_toggle_alternative ; Yes, use the big ones instead + movlw index_compass_dm ; index of custom view compass + cpfseq menupos3 ; will compass be shown in custom view? + call I2C_sleep_accelerometer ; NO - stop accelerometer + cpfseq menupos3 ; will compass be shown in custom view? + call I2C_sleep_compass ; NO - stop compass - 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) + movlw index_cv_dm_max ; highest index in use in dive mode custom view + cpfsgt menupos3 ; max reached? + bra customview_mask ; NO - show + clrf menupos3 ; reset to zero (zero = no custom view) +;---------------------------------------------------------------------------------- +; Jump table for initialization of the every-second tasks in custom view area (dive mode) +; +; Attention: the ordering must be in line with the every-second update jump table +; and the index numbers defined in hwos.inc! +; global customview_mask -customview_mask: +customview_mask: + bcf redraw_custview_mask ; clear redraw request flag ; 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 - dcfsnz WREG,F - bra customview_init_view1 ; Update Sensor data - dcfsnz WREG,F - bra customview_init_view2 ; average depth and stopwatch - dcfsnz WREG,F - bra customview_init_view3 ; Decoplan - dcfsnz WREG,F - bra customview_init_view4 ; Battery info, Tissues and clock - dcfsnz WREG,F - bra customview_init_view5 ; GF informations - dcfsnz WREG,F - bra customview_init_view6 ; Compass - dcfsnz WREG,F - bra customview_init_view7 ; Dynamic gaslist - dcfsnz WREG,F - bra customview_init_view8 ; CNS - dcfsnz WREG,F - bra customview_init_view9 ; ppO2, Ceiling and current GF - dcfsnz WREG,F - bra customview_init_view10 ; Sensor check - dcfsnz WREG,F - bra customview_init_view11 ; ppO2, END/EAD and CNS - dcfsnz WREG,F - bra customview_init_view12 ; PSCR Info - dcfsnz WREG,F - bra customview_init_view13 ; Gas needs + WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt ; top, bottom, left, right + movf menupos3,W ; menupos3 holds number of custom view function + dcfsnz WREG,F ; 1: + bra init_avr_stopwatch ; average depth and stopwatch + dcfsnz WREG,F ; 2: + bra init_TFT_dive_compass ; compass + dcfsnz WREG,F ; 3: + bra init_ppo2_sensors ; ppO2 sensors + dcfsnz WREG,F ; 4: + bra init_sensor_check ; sensor check + dcfsnz WREG,F ; 5: + bra init_pscr_info ; pSCR data + dcfsnz WREG,F ; 6: + bra init_pressures_SAC ; tank pressure and SAC rate + dcfsnz WREG,F ; 7: + bra init_gas_needs_ascent ; gas needs for ascent / cave return + dcfsnz WREG,F ; 8: + bra init_decoplan ; deco plan + dcfsnz WREG,F ; 9: + bra init_ceiling_GF_tissue ; ceiling, current GF and tissues + dcfsnz WREG,F ; 10: + bra init_CNS ; CNS values + dcfsnz WREG,F ; 11: + bra init_ppo2_ead_end_cns ; ppO2, END/EAD and CNS + dcfsnz WREG,F ; 12: + bra init_gf_factors ; GF factors + dcfsnz WREG,F ; 13: + bra init_clock_batt_surfpress ; clock, battery and surface pressure + bra customview_toggle_exit ; no view (blank screen in custom view area) -customview_init_nocustomview: - 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... - +init_ppo2_sensors: + btfsc FLAG_ccr_mode ; in CC mode? + bra customview_init_view1a ; YES + btfsc FLAG_pscr_mode ; in PSCR mode? + bra customview_init_view1a ; YES + bra customview_toggle ; NO to both, call next view customview_init_view1a: btfsc analog_o2_input ; do we have an analog input? bra customview_init_view1b ; YES - show this view - btfsc s8_digital ; NO - do we have a digital input? + btfsc s8_digital ; NO - do we have a digital input? bra customview_init_view1b ; YES - show this view btfss optical_input ; NO - do we have an optical input? - bra customview_toggle ; NO - call next view... - + 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 + call TFT_ppo2_sensors_mask ; mask for ppO2 sensors + call TFT_ppo2_sensors ; data for ppO2 sensors 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 +init_avr_stopwatch: + btfsc FLAG_apnoe_mode ; in apnoe mode? + bra customview_toggle ; YES - call next view + call TFT_avr_stopwatch_mask ; mask for average depth and stopwatch + call TFT_avr_stopwatch ; data for 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 +init_decoplan: + 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_mask ; mask for deco plan + call TFT_decoplan ; data for deco plan 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 +init_clock_batt_surfpress: + call TFT_clock_batt_surfpress_mask ; mask for clock, battery and surface pressure + call TFT_clock_batt_surfpress ; data for clock, battery and surface pressure 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... - - TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - bra customview_toggle ; No GF info for non-GF modes - - call TFT_gf_mask ; Setup Mask - call TFT_gf_info ; Show GF informations +init_gf_factors: + 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 + TSTOSS char_I_deco_model ; in GF mode (0 = ZH-L16, 1 = ZH-L16-GF)? + bra customview_toggle ; NO - no GF info for non-GF modes + call TFT_gf_factors_mask ; mask for GF factors + call TFT_gf_factors ; data for GF factors 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 +init_TFT_dive_compass: ; compass + call I2C_init_accelerometer ; start accelerometer + call I2C_init_compass ; start compass + call TFT_dive_compass_mask ; show compass mask bra customview_toggle_exit -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 +init_pressures_SAC: ; tank pressure and SAC rate + IFDEF _rx_functions + btfss FLAG_tr_enabled ; TR functions enabled? + bra customview_toggle ; NO - call next view + call TFT_pressures_SAC_mask ; mask for pressures and SAC + call TFT_pressures_SAC ; data for pressures and SAC + bra customview_toggle_exit + ELSE + bra customview_toggle ; skip, not available without RX functions + ENDIF -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 +init_CNS: ; 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 ; mask for CNS values + call TFT_CNS ; data for CNS values + bra customview_toggle_exit - ; ppO2 value - call TFT_mask_ppo2 - call TFT_display_pure_ppo2 - - ; 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 +init_ceiling_GF_tissue: ; ceiling, tissues 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_GF_tissue_mask ; mask for ceiling, current GF and tissues + call TFT_ceiling_GF_tissue ; data for ceiling, current GF and tissues 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... - - call TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask - call TFT_sensor_check ; Show ppO2 of O2 and Diluent +init_sensor_check: ; sensor check + btfsc FLAG_ccr_mode ; in CCR mode? + bra customview_init_view10a ; YES +; btfsc FLAG_pscr_mode ; in pSCR mode? +; bra customview_init_view10a ; YES + bra customview_toggle ; NO to both, call next view +customview_init_view10a: + call TFT_sensor_check_mask ; mask for sensor check + call TFT_sensor_check ; data for sensor check 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... - - 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 +init_ppo2_ead_end_cns: ; 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 ; mask for ppO2, END/EAD and CNS + call TFT_ppo2_ead_end_cns ; data for ppO2, END/EAD and CNS 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 +init_pscr_info: ; pSCR information + btfss FLAG_pscr_mode ; in pSCR mode? + bra customview_toggle ; NO - call next view + call TFT_pscr_info_mask ; mask for pSCR info + call TFT_pscr_info ; data for pSCR info + bra customview_toggle_exit + +init_gas_needs_ascent: ; gas needs for ascent + 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 + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is switched on + bra customview_toggle ; NO - call next view + call TFT_gas_needs_ascent_mask ; mask for gas needs ascent + call TFT_gas_needs_ascent ; data for gas needs ascent 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 - - 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 -customview_show_mix_metric: - output_99 ; Change depth in lo - STRCAT_TEXT tMeters + bcf toggle_customview ; clear flag + btfsc divemode ; in dive mode? + bsf FLAG_TFT_temp_divemode ; YES - set flag to redraw temp return global customview_show_mix -customview_show_mix: ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 +customview_show_mix: ; put "Nxlo", "Txlo/hi", "Air" or "O2" into postinc2 tstfsz hi ; He=0? - bra customview_show_mix5 ; No, Show a TX + 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_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_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" + bra customview_show_mix4 ; NO + STRCAT_TEXT tGasErr ; YES - show "Err" output_99 ; O2 ratio is still in "lo" - bra customview_show_mix4c - + bra customview_show_mix4c customview_show_mix4: - STRCAT_TEXT tSelectNx ; Show "Nx" + STRCAT_TEXT tSelectNx ; show "Nx" output_99 ; O2 ratio is still in "lo" customview_show_mix4b: STRCAT " " customview_show_mix4c: - btfsc divemode ; In divemode - return ; Yes + btfsc divemode ; in divemode? + return ; YES STRCAT " " return - customview_show_mix5: btfsc divemode bra customview_show_mix6 - STRCAT_TEXT tSelectTx ; Show "Tx" + STRCAT_TEXT tSelectTx ; show "Tx" customview_show_mix6: output_99 ; O2 ratio is still in "lo" PUTC "/" diff -r 00b24fb4324d -r ca4556fb60b9 src/customview.inc --- a/src/customview.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/customview.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File customview.inc +; File customview.inc V2.99d ; ; Customview for divemode and surfacemode ; @@ -9,21 +9,25 @@ ; HISTORY ; 2011-08-10 : [mH] Import into hwOS sources - ; Dive mode +; Dive mode extern customview_toggle extern customview_second extern customview_minute - extern customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - extern customview_show_change_depth ; Put " in lo m" or " in lo ft" into Postinc2 - extern menuview_toggle - extern menuview_toggle_reset - extern customview_mask - - extern customview_alternative_second + extern customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + extern menuview_toggle + extern menuview_toggle_reset + extern customview_mask + extern customview_mask_alternative + extern customview_alternative_second + extern switch_layout_to_normal - ; Surface mode - extern surf_customview_toggle - extern surf_customview_mask +; Surface mode + extern surf_customview_toggle + extern surf_customview_mask + -; extern surf_customview_second -; extern surf_customview_minute + + + + + diff -r 00b24fb4324d -r ca4556fb60b9 src/divemenu_tree.asm --- a/src/divemenu_tree.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/divemenu_tree.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemenu_tree.asm REFACTORED VERSION V2.98 +; File divemenu_tree.asm REFACTORED VERSION V2.99e ; ; OSTC dive mode menu ; @@ -18,115 +18,165 @@ #include "calibrate.inc" extern timeout_divemode_menu2 + extern restart_deco_engine_wo_ceiling extern diveloop_loop4 -divegui CODE +dmenu_tree CODE ;============================================================================= ; Main Menu + +do_return_main_divemenu: + call menu_processor_double_pop ; drop exit line and back to last line + incf selected_item,W ; item numbers start with 0, menu positions with 1 + movwf menupos1 ; position cursor where we came from + bra do_main_divemenu_common + global do_main_divemenu do_main_divemenu: call menu_processor_reset ; restart from first icon movlw .1 movwf menupos1 ; set to first option in divemode menu + +do_main_divemenu_common: 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: - bcf ccr_diluent_setup + bcf FLAG_diluent_setup ; set to operations on OC gases bcf is_bailout_menu + IFDEF _cave_mode + btfss FLAG_cave_mode ; in cave mode? + bra main_divemenu_OC_no_cave ; NO - do OC menu without turn option + + MENU_BEGIN tMainMenu, .6 + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_DYNAMIC do_toggle_gf_label, do_toggle_gf + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_DYNAMIC do_turn_dive_label, do_turn_dive + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + ENDIF + +main_divemenu_OC_no_cave: 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_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_DYNAMIC do_toggle_gf_label, 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 - bcf is_bailout_menu ; default to none-bailout menu + bsf FLAG_diluent_setup ; set to operations on diluents + bcf is_bailout_menu ; flag as none-bailout menu btfsc FLAG_pscr_mode - bra main_divemenu_pscr ; PSCR Menu + 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_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tDivemenu_Setpoint, do_divemode_splist + MENU_CALL tDivemenu_Diluent, do_divemode_gaslist + MENU_CALL tDivemenu_Avg_Mkr, do_reset_avg_set_mkr + MENU_DYNAMIC do_toggle_gf_label, do_toggle_gf + MENU_CALL tExit, do_exit_divemode_menu MENU_END main_divemenu_pscr: - 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 - btfsc optical_input ; do we have an optical input? - bra main_divemenu_pscr_sensors ; YES + btfsc analog_o2_input ; do we have an analog input (OSTC cR)? + bra main_divemenu_pscr_sensors ; YES + btfsc optical_input ; do we have an optical input (OSTC 3)? + 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_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tDivemenu_Premix, do_divemode_gaslist + MENU_CALL tBackToLoop, do_switch_sp_calc + MENU_CALL tDivemenu_Avg_Mkr, do_reset_avg_set_mkr + MENU_DYNAMIC do_toggle_gf_label, do_toggle_gf + 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_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tCCRSensor, do_divemode_setpoint_pscr + MENU_CALL tDivemenu_Premix, do_divemode_gaslist + MENU_CALL tDivemenu_Avg_Mkr, do_reset_avg_set_mkr + MENU_DYNAMIC do_toggle_gf_label, 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_main_divemenu ; No, do nothing and return + TSTOSS char_I_deco_model ; toggle GF only in GF modes - in GF mode? (0 = ZH-L16, 1 = ZH-L16-GF) + bra do_main_divemenu_common ; 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... + bra do_main_divemenu_common ; NO - do nothing and return + movlw index_gf_factors-1 ; custom view number one below GF factors + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> GF factors movlw .1 - movwf menupos1 ; Set to first option in divemode menu + movwf menupos1 ; set to first option in dive mode menu MENU_BEGIN tDivemenu_ToggleGF, .2 - MENU_CALL tDivemenu_ToggleGF, do_togglegf - MENU_CALL tBack, do_main_divemenu + MENU_CALL tDivemenu_ToggleGF, do_togglegf + MENU_CALL tBack, do_return_main_divemenu MENU_END do_togglegf: - ;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... + bsf toggle_gf ; set command flag... bra do_exit_divemode_menu ; continue with exiting menu code +do_reset_avg_set_mkr: + movlw .1 + movwf menupos1 ; set to first option in dive mode menu + + IFDEF _cave_mode + btfss FLAG_cave_mode ; in cave mode? + bra do_reset_average_no_cave ; NO - do menu without turn option + + MENU_BEGIN tDivemenu_Avg_Mkr, .4 + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_DYNAMIC do_turn_dive_label, do_turn_dive + MENU_CALL tBack, do_return_main_divemenu + MENU_END + ENDIF + +do_reset_average_no_cave: + MENU_BEGIN tDivemenu_Avg_Mkr, .3 + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_CALL tBack, do_return_main_divemenu + MENU_END + + +do_reset_average: + bsf reset_average_depth ; set flag... + bra do_exit_divemode_menu ; ... and exit + do_set_marker: 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 + IFDEF _cave_mode +do_turn_dive: + bsf toggle_turn_dive ; set flag... + bra do_exit_divemode_menu ; ... and exit + ENDIF do_switch_sensor: ; entry point when coming from switch to sensor - movlw .1 ; 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 @@ -141,7 +191,7 @@ 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 + clrf WREG ; switch to fixed SP movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP bra do_switch_sp_com @@ -156,11 +206,13 @@ bsf setpoint_changed ; set flag (for profile) ; Clear some flags in case we were in bailout before... - bcf is_bailout ; end bailout mode + bcf FLAG_bailout_mode ; 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 better_gas_available ; =1: a better gas is available and a gas change is advised in dive mode + bcf better_dil_available ; =1: a better diluent is available and a gas change is advised in dive mode bcf blinking_better_gas ; clear blinking flag - call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: + bcf blinking_better_dil ; clear blinking flag + bsf redraw_custview_mask ; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label 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 @@ -169,28 +221,35 @@ do_divemode_gaslist_bail: ; entry point from CCR/pSCR to bailout to OC gases - bcf ccr_diluent_setup ; switch to OC gases + bcf FLAG_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 -do_divemode_gaslist_com: - bsf short_gas_decriptions - movlw .1 - movwf menupos1 ; Set to first option in divemode menu + btfsc FLAG_bailout_mode ; in bailout mode? + bcf FLAG_diluent_setup ; yes - for safety reasons, redirect to OC (bailout) gases + bsf short_gas_decriptions ; do not show "Gas x" etc. + bsf better_gas_hint ; mark the gas which is the best gas/diluent + movf best_gas_number,W ; load number of best gas (1-5)into WREG + btfsc FLAG_diluent_setup ; in diluent selection? + movf best_dil_number,W ; YES - overwrite with best diluent (1-5) + bnz do_divemode_gaslist_1 ; best gas/dil number = 0 (none available) ? + movlw .1 ; YES - default to first gas/dil + btfsc WREG,7 ; best gas/dil number >= 128 (not computed yet) ? + movlw .1 ; YES - default to first gas/dil +do_divemode_gaslist_1: + movwf menupos1 ; position cursor to best gas/dil (or first option if none avail) 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_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas + MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas MENU_CALL tMore, do_divemode_gaslist_more MENU_END do_divemode_gaslist_more: movlw .1 - movwf menupos1 ; Set to first option in divemode menu + movwf menupos1 ; set to first option in dive mode 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 @@ -208,30 +267,38 @@ do_lost_gas: movlw .1 - movwf menupos1 ; Set to first option in divemode menu + movwf menupos1 ; set to first option in dive mode menu do_lost_gas_common: - bsf short_gas_decriptions + bsf short_gas_decriptions ; do not show "Gas x" etc. + bcf better_gas_hint ; do not mark the best gas/diluent 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_DYNAMIC gaslist_strcat_gas_cd, do_toggle_active ; toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_cd, do_toggle_active ; toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_cd, do_toggle_active ; toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_cd, do_toggle_active ; toggle the gas (in)active + MENU_DYNAMIC gaslist_strcat_gas_cd, 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 menupos1 ; transfer register for selected gas towards gas_switched_common: + 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: - bsf divemode_gaschange ; Set flag, will also trigger restart of deco_engine - btfsc is_bailout_menu ; Bailout confirmed? - bsf is_bailout ; begin bailout mode - call customview_mask ; update custom view mask to (eventually) rewrite ppO2(Dil): to ppO2: + bsf divemode_gaschange ; set flag, will also trigger restart of deco_engine + btfss is_bailout_menu ; doing a bailout? + bra do_switch_gas_1 ; NO + bsf FLAG_bailout_mode ; YES - begin bailout mode + IFDEF _cave_mode + btfsc FLAG_cave_mode ; - in cave mode? + bsf FLAG_dive_turned ; YES - set dive as turned + ENDIF +do_switch_gas_1: + bcf setpoint_fallback ; eventually terminate fallback mode and get rid of its warning + bsf redraw_custview_mask ; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label ;bra do_exit_divemode_menu ; continue with exiting menu code do_exit_divemode_menu: @@ -241,35 +308,31 @@ do_toggle_active: - extern restart_deco_engine_wo_ceiling - call restart_deco_engine_wo_ceiling 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 -do_toggle_active3: + btfsc FLAG_diluent_setup ; operating on diluents? + addwf menupos1,F ; YES - add offset of 5 to shift 1-5 -> 6-10 + decf menupos1,W ; 1-10 -> 0-4 for gases / 5-9 for diluents + lfsr FSR1,opt_gas_type ; load base address of gas types + movff PLUSW1,lo ; get gas/dil type + tstfsz lo ; already disabled? + bra do_toggle_active_disable ; NO - disable now +do_toggle_active_enable ; YES - re-enable now + lfsr FSR1,opt_gas_type_backup ; load base address of backed-up gas types + movff PLUSW1,lo ; get backed-up gas/dil type + lfsr FSR1,opt_gas_type ; load base address of gas types + movff lo,PLUSW1 ; restore gas type + bra do_toggle_active_common +do_toggle_active_disable: ; disable gas / diluent + ;lfsr FSR1,opt_gas_type ; (still set) + clrf PLUSW1 ; set type to disabled (0=disabled, 1=first, 2=travel/normal, 3=deco/-) +do_toggle_active_common: 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 - + btfsc FLAG_diluent_setup ; operating on diluents? + subwf menupos1,F ; NO - back to 0-4 for gases 1-5 + bcf blinking_better_gas ; clear blinking flag for gases to avoid "leftovers" + bcf blinking_better_dil ; clear blinking flag for diluents to avoid "leftovers" + call restart_deco_engine_wo_ceiling ; invalidate deco data (but not the ceiling) and restart deco engine + bra do_lost_gas_common do_dive_pO2: banksel gas6_O2_ratio @@ -303,7 +366,7 @@ movwf lo movlw .101 cpfslt lo ; O2 + He < 101 ? - decf gas6_He_ratio,F ; Yes, He-- (Unchanged) + decf gas6_He_ratio,F ; Yes, He-- (unchanged) banksel common bra do_divemode_gaslist_more_common @@ -320,14 +383,14 @@ do_divemode_splist: bsf short_gas_decriptions movlw .1 - movwf menupos1 ; set to first option in divemode menu + movwf menupos1 ; set to first option in dive mode menu do_divemode_splist_common: - btfsc analog_o2_input ; do we have an analog input? + btfsc analog_o2_input ; do we have an analog input (OSTC cR)? bra do_divemode_splist_sensor ; YES - btfsc s8_digital ; do we have a digital input? - bra do_divemode_splist_sensor ; YES - btfsc optical_input ; do we have an optical input? +; btfsc s8_digital ; do we have a digital input? +; bra do_divemode_splist_sensor ; YES + btfsc optical_input ; do we have an optical input (OSTC 3)? bra do_divemode_splist_sensor ; YES do_divemode_splist_no_sensor: @@ -351,10 +414,11 @@ do_divemode_sensor: - clrf menupos3 ; show customview 1 (HUD Data) - bsf toggle_customview + movlw index_ppo2_sensors-1 ; custom view number one below ppO2 sensors + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> ppO2 sensors movlw .1 - movwf menupos1 ; Set to 1st option: use sensors + movwf menupos1 ; set to 1st option: use sensors do_return_divemode_sensor: MENU_BEGIN tGaslist, .6 @@ -368,7 +432,7 @@ do_divemode_setpoint_pscr: movlw .1 - movwf menupos1 ; Set to 1st option: use calculated ppO2 + 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/divemode.asm --- a/src/divemode.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/divemode.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.asm REFACTORED VERSION V2.98 +; File divemode.asm REFACTORED VERSION V2.99e ; ; Divemode ; @@ -9,8 +9,8 @@ ; 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 "hwos.inc" ; mandatory header +#include "shared_definitions.h" ; mailbox from/to p2_deco.c #include "tft_outputs.inc" #include "strings.inc" #include "tft.inc" @@ -26,6 +26,10 @@ #include "calibrate.inc" #include "convert.inc" + IFDEF _rx_functions +#include "rx_ops.inc" + ENDIF + extern TFT_dive_compass_heading extern do_line_menu @@ -38,37 +42,50 @@ 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 + check_gas_num ; used in search for best gas/dil: current gas/dil number (1-5) + check_gas_depth ; used in search for best gas/dil: current gas/dil change depth + check_gas_type ; used in search for best gas/dil: current gas/dil type + check_gas_O2_ratio ; used in search for best gas/dil: current gas/dil O2 ratio + best_gas_num ; used in search for best gas/dil: best gas/dil number (1-5) CAUTION: there is also a variable named best_gas_number ! + best_gas_depth ; used in search for best gas/dil: best gas/dil change depth + ppO2_min ; used in search for best gas/dil: minimum ppO2 required + ppO2_max ; used in search for best gas/dil: maximum ppO2 allowed + ENDC ; used: 10 byte, remaining: 6 byte + + CBLOCK local2 ; max size is 16 Byte !!! + average_depth_hold:4 ; used to calculate the resettable average depth + average_depth_hold_total:4 ; used to calculate the absolute average depth + ENDC ; used: 8 byte, remaining: 8 byte + +dmode CODE ;============================================================================= global diveloop diveloop: - banksel common + 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 + 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 ; request display of dive mode mask + + movff customview_divemode,menupos3; reload last custom view + bsf redraw_custview_mask ; request redraw of last custom view btfsc FLAG_apnoe_mode - bsf realdive ; Set Realdive flag in Apnoe mode - - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge 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 + btfsc FLAG_gauge_mode ; done for apnoe or gauge mode bra diveloop_loop_start - bsf FLAG_TFT_display_ndl_mask ; display "NDL" + ; Deco modes + bsf FLAG_TFT_active_gas_divemode; request display of gas and setpoint + bsf FLAG_TFT_display_ndl_mask ; request display of "NDL" ; +@5 init clrf WREG ; WAIT marker: display "---" @@ -79,37 +96,53 @@ movff WREG,int_O_alternate_ascenttime+1 diveloop_loop_start: + btfsc FLAG_TFT_divemode_mask + call TFT_divemode_mask btfsc FLAG_TFT_display_ndl_mask call TFT_display_ndl_mask - -diveloop_loop: ; The diveloop starts here +diveloop_loop: ; the dive loop starts here btfss quarter_second_update bra diveloop_loop1 ; tasks any 1/4 second, any mode bcf quarter_second_update ; clear flag - movlw .6 - cpfseq menupos3 ; in compass view? - bra diveloop_loop1 ; No, done. - - btfsc alternative_divelayout ; In alternative layout mode? - bra diveloop_loop1 ; Yes, done. No Compass. - -; 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 + btfsc alternative_divelayout ; in alternative layout? + bra diveloop_loop1 ; YES - no compass in alternative layout mode + movlw index_compass_dm ; NO - index of compass view + cpfseq menupos3 ; - in compass view? + bra diveloop_loop1 ; NO - done + call TFT_dive_compass_heading ; YES - update compass heading value + bsf FLAG_TFT_temp_divemode ; - redraw temperature (is slightly affected from compass heading arrow) diveloop_loop1: - btfss onesecupdate - bra diveloop_loop3 + btfss onesecupdate ; next second begun? + bra diveloop_loop3 ; NO ; 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. - ;bsf LEDg ; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ### +; ###-- USE FOR DEBUG ONLY - RESETS RX CIRCUITRY --### +; bsf LEDg +; ###----------------------------------------------### + + ; compute current depth in meters + SAFE_2BYTE_COPY rel_pressure,xA + movlw .100 + movwf xB+0 + clrf xB+1 + call div16x16 ; xC = xA / xB, xC+0 now holds depth in full meters + movff xC+0,curr_depth ; store result in curr_depth + + ; compute ambient pressure / 10, will be needed later + SAFE_2BYTE_COPY amb_pressure,xA + movlw .10 + movwf xB+0 + clrf xB+1 + call div16x16 ; xC = xA / xB = p_amb / 10 + movff xC+0,amb_press_10+0 ; store result for later use + movff xC+1,amb_press_10+1 ; ... ; display depth based on full seconds interval (nicer blinking) btfss alternative_divelayout @@ -117,22 +150,29 @@ btfsc alternative_divelayout rcall TFT_output4_alternative - btfsc FLAG_apnoe_mode ; Only in apnoe mode - bra diveloop_loop1_nonedeco ; One Second Tasks in Apnoe mode + btfsc FLAG_apnoe_mode ; in Apnoe mode? + bra diveloop_loop1_nonedeco ; YES - do Apnoe mode every second tasks ; 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. +diveloop_loop1_deco: + bsf FLAG_TFT_divemins ; display (new) dive time! + btfsc show_safety_stop ; show the safety stop? + bsf FLAG_TFT_show_safety_stop ; YES - show/delete if done btfss alternative_divelayout rcall TFT_output1_normal btfsc alternative_divelayout rcall TFT_output1_alternative - btfsc FLAG_ccr_mode ; in CCR mode... - call check_dive_autosp ; ...check for Auto-SP + call divemode_check_for_warnings ; check for warnings + + IFDEF _rx_functions + btfss FLAG_tr_enabled ; TR functions enabled? + bra diveloop_loop1_deco1 ; NO - skip pressure readings part + call get_pressure_readings ; YES - get pressure readings + call configure_sac_calculation ; - set up SAC calculation +diveloop_loop1_deco1: + ENDIF call calc_deko_divemode ; calculate decompression and set resulting display flags @@ -140,124 +180,108 @@ rcall TFT_output2_normal btfsc alternative_divelayout rcall TFT_output2_alternative - - call divemode_check_for_warnings ; Check for any warnings - - bra diveloop_loop2 ; Common Tasks - + bra diveloop_loop2 ; continue with common tasks ; tasks any new second - only for apnoe mode 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_loop2 ; Common Tasks + rcall divemode_apnoe_tasks ; 1 sec. apnoe tasks + call customview_second ; do every-second tasks for the custom view area + ;bra diveloop_loop2 ; common tasks ; continue tasks any new second, any mode diveloop_loop2: - rcall timeout_divemode ; ** menu timeout? ** This routine sets the required flags + btfsc redraw_custview_mask ; shall we redraw the custom view mask? + call customview_mask ; YES - redraw custom view mask + + rcall timeout_divemode ; ** menu timeout? ** - this routine sets the required flags 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...) + rcall set_min_temp ; store min. temp if required (future hardware will need this to be checked 1/second...) btfsc oneminupdate ; one minute tasks - rcall update_divemode60 ; Update clock, etc. + rcall update_divemode60 ; update clock, etc. + + btfss FLAG_oc_mode ; are we in OC mode? + bsf FLAG_TFT_active_gas_divemode; NO - have the gas and setpoint redrawn on every second to update setpoint display, animate the blinking, etc. btfss alternative_divelayout rcall TFT_output3_normal btfsc alternative_divelayout rcall TFT_output3_alternative - ;bcf LEDg ; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ### +; ###-- USE FOR DEBUG ONLY - RESETS RX CIRCUITRY --### +; bcf LEDg +; ###----------------------------------------------### ; tasks any round, any mode diveloop_loop3: - call test_switches_divemode ; Check switches in divemode + call test_switches_divemode ; check switches in dive mode 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 -diveloop_loop4b: - btfsc toggle_customview ; Next view? - call customview_toggle ; Yes, show next customview (and delete this flag) - - btfsc divemode_gaschange ; Gas switch flag set? +diveloop_loop4: ; menu-exit returns here... + btfsc toggle_customview ; next view? + call customview_toggle ; YES - show next custom view (and delete this flag) + + btfsc divemode_gaschange ; gas switch flag set? call gas_switched_common ; YES - btfsc toggle_gf ; Toggle GF/aGF? + btfsc toggle_gf ; toggle GF/aGF? rcall divemodemode_togglegf ; YES - btfsc FLAG_set_marker ; shall a marker be set? + IFDEF _cave_mode + btfsc toggle_turn_dive ; toggle dive turned? + rcall divemodemode_toggleturn ; YES + ENDIF + + btfsc FLAG_set_marker ; shall set a marker? 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 store_sample ; shall store new sample? + call store_dive_data ; YES - store profile data + + btfss divemode ; dive finished? + goto ghostwriter_end_dive ; YES - dive finished! btfsc pressure_refresh ; new pressure available? - rcall set_max_depth ; update max. depth if required + rcall set_max_depth ; YES - update max. depth if required btfsc pressure_refresh ; new pressure available? - bsf FLAG_TFT_depth ; Yes, update depth + bsf FLAG_TFT_depth ; YES - update depth bcf pressure_refresh ; clear flag - 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 - -diveloop_loop5: - 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 + btfsc temp_changed ; temperature changed? + bsf FLAG_TFT_temp_divemode ; YES - display temperature + + IFDEF _screendump + btfsc enable_screen_dumps ; screen dump function enabled? + call TFT_dump_screen_check ; YES - check if requested and do it + ENDIF + + bra diveloop_loop ; loop the dive mode ;-------------------------------------------------------------------------------------------------------- -TFT_output1_normal: ; beginning of any new second - only for deco modes +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 + call TFT_divemins ; display (new) dive time! + call customview_second ; do every-second tasks for the custom view area (in sync with the dive time) mH btfsc FLAG_TFT_show_safety_stop - call TFT_show_safety_stop ; Show safety stop + call TFT_show_safety_stop ; show safety stop btfsc FLAG_TFT_clear_safety_stop - call TFT_clear_safety_stop ; Clear safety stop + call TFT_clear_safety_stop ; clear safety stop return -TFT_output1_alternative: ; beginning of any new second - only for deco modes +TFT_output1_alternative: ; beginning of any new second - only for deco modes + btfsc FLAG_TFT_divemode_mask_alt + call TFT_divemode_mask_alternative ; alternative mask 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_divemins_alternative ; display (new) divetime! + call customview_alternative_second ; do every-second tasks for the custom view area (in sync with the dive time) mH btfsc FLAG_TFT_big_deco_alt - call TFT_big_deco_alt ; Big deco and safety stop + call TFT_big_deco_alt ; big deco, also manages alternative safety stop thus moved to first wave of outputs [rl] return -TFT_output2_normal: ; any new second - only for deco modes +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 @@ -270,56 +294,56 @@ 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, after deco calculations btfsc FLAG_TFT_max_depth - call TFT_max_depth ; use normal max. depth + call TFT_max_depth ; use normal max. depth btfsc FLAG_TFT_divemode_warning call TFT_divemode_warning 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 btfsc FLAG_TFT_dive_warning_text_clear - call TFT_clear_warning_text ; clear complete warnings area + 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_2nd_row ; clear 2nd row of warnings return -TFT_output3_alternative: ; tasks any new second, any mode - btfsc FLAG_TFT_max_depth_alt - call TFT_max_depth_alternative ; big max. depth +TFT_output3_alternative: ; tasks any new second + btfsc FLAG_TFT_max_depth + call TFT_max_depth_alternative ; big max. depth btfsc FLAG_TFT_dive_warning_text_clear - call TFT_clear_warning_text ; clear complete warnings area (In alt mode only 2nd. row...) + call TFT_clear_warning_text ; clear complete warnings area (in alt mode only 2nd row...) return -TFT_output4_normal: ; tasks any round, any mode +TFT_output4_normal: ; tasks any round, any mode, before deco calculations (stable timebase) btfsc FLAG_TFT_depth - call TFT_depth ; Displays new depth + call TFT_depth ; display depth + btfsc FLAG_TFT_active_gas_divemode + call TFT_active_gas_divemode ; display gas/setpoint btfsc FLAG_TFT_temp_divemode - call TFT_temp_divemode ; Update temperature + call TFT_temp_divemode ; update temperature return -TFT_output4_alternative: ; tasks any round, any mode +TFT_output4_alternative: ; tasks any round, any mode btfsc FLAG_TFT_depth - call TFT_depth ; Displays new depth + call TFT_depth ; display new depth return ;-------------------------------------------------------------------------------------------------------- -divemode_apnoe_tasks: ; 1 sec. Apnoe tasks - call TFT_display_apnoe_descent ; Yes, Show descent timer +divemode_apnoe_tasks: ; 1 sec. apnoe tasks + call TFT_display_apnoe_descent ; show descent timer call TFT_max_depth ; use normal max. depth - btfsc divemode2 ; Time running? - bra divemode_apnoe_tasks2 ; New descent, reset data if flag is set + btfsc divemode2 ; time running? + bra divemode_apnoe_tasks2 ; YES - new descent, reset data if flag is set rcall apnoe_calc_maxdepth call TFT_display_apnoe_surface - call TFT_display_apnoe_last_max ; Show last max. depth + call TFT_display_apnoe_last_max ; show last max. depth incf apnoe_surface_secs,F movlw d'60' cpfseq apnoe_surface_secs @@ -328,26 +352,26 @@ incf apnoe_surface_mins,F divemode_apnoe_tasks1: - bcf FLAG_active_descent ; Clear flag - btfsc divemode2 ; Time running? - return ; Yes, return - bsf FLAG_active_descent ; Set Flag + bcf FLAG_active_descent ; clear flag + btfsc divemode2 ; time running? + return ; YES - return + bsf FLAG_active_descent ; set flag return divemode_apnoe_tasks2: - btfss FLAG_active_descent ; Are we descending? - return ; No, We are at the surface - rcall apnoe_calc_maxdepth ; Yes! - call TFT_apnoe_clear_surface ; Clear Surface timer - clrf apnoe_timeout_counter ; Delete timeout + btfss FLAG_active_descent ; are we descending? + return ; NO - we are at the surface + rcall apnoe_calc_maxdepth ; YES + call TFT_apnoe_clear_surface ; clear surface timer + clrf apnoe_timeout_counter ; delete timeout clrf apnoe_surface_secs clrf apnoe_surface_mins clrf apnoe_secs - clrf apnoe_mins ; Reset Descent time + clrf apnoe_mins ; reset descent time movlw .0 movff WREG,max_pressure+0 - movff WREG,max_pressure+1 ; Reset Max. Depth - bcf FLAG_active_descent ; Clear flag + movff WREG,max_pressure+1 ; reset max. depth + bcf FLAG_active_descent ; clear flag return global apnoe_calc_maxdepth @@ -357,8 +381,8 @@ movff max_pressure+0,sub_b+0 movff max_pressure+1,sub_b+1 call subU16 ; sub_c = sub_a - sub_b - ; apnoe_max_pressure neg_flag=1 - ; max_pressure<=apnoe_max_pressure -> neg_flag=0 + ; apnoe_max_pressure < max_pressure -> neg_flag=1 + ; max_pressure <= apnoe_max_pressure -> neg_flag=0 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 - call TFT_debug_output - - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - return - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - return - -; 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 - - 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 - - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine + goto set_reset_safety_stop ; set/reset flags for safety stop and return + + +calc_deko_engine: + btfsc FLAG_ccr_mode ; in CCR mode? + call check_dive_autosp ; YES - check for Auto-SP + + btfsc FLAG_ccr_mode ; in CCR mode? + rcall calc_deko_divemode_sensor ; YES - do sensor data acquisition if applicable by OSTC model + + btfsc FLAG_pscr_mode ; in pSCR mode? + rcall calc_deko_divemode_sensor ; YES - do sensor data acquisition if applicable by OSTC model ; 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. - - ; 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 - andwf lo,W ; mask out bits showing deco engine computations state - tstfsz WREG ; check if the last compute cycle has finished (bits 1 and 0 cleared) - bra calc_deko_divemode2e ; NO - computations still in progress, needs more computation cycles - btfss lo,DECO_PLAN_FLAG ; YES - computation cycle finished, so check what has been computed - bra calc_deko_divemode2b ; PLAN bit is cleared i.e. normal plan was done, may do alternative next - - ; 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 + ; 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. + + ; get working copies of char_O_main_status and char_O_deco_status + movff char_O_main_status,hi ; get char_O_main_status into hi + movff char_O_deco_status,lo ; get char_O_deco_status into lo + + ; check state of deco calculations + btfsc hi,DECO_COMPLETED_NORM ; finished calculations for normal plan? + bra calc_deko_engine_alt ; YES - do an alternative plan next (or a normal one with more features enabled) + btfsc hi,DECO_COMPLETED_ALT ; finished calculations for alternative plan? + bra calc_deko_engine_norm ; YES - do a normal plan next + bra calc_deko_engine_cont ; NO to both - continue calculations / do first invocation in INIT mode + +calc_deko_engine_norm: + ; Last cycle did an alternative plan, or the deco engine has been restarted because of a gas change etc. + ; --> Reconfigure to normal plan for next computation cycle. + bcf lo,DECO_PLAN_FLAG ; clear flag for alternative plan to do a normal plan next + bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation + bcf lo,DECO_VOLUME_FLAG ; clear flag for gas needs calculation + bcf lo,DECO_BAILOUT_FLAG ; clear flag for bailout mode + IFDEF _cave_mode + bcf hi,DECO_CAVE_MODE ; clear flag for cave mode + ENDIF + + btfsc FLAG_ccr_mode ; in CCR mode? + bra calc_deko_engine_norm_loop ; YES - reload diluents and reconfigure CCR mode if not in bailout + btfsc FLAG_pscr_mode ; in pSCR mode? + bra calc_deko_engine_norm_loop ; YES - reload diluents and reconfigure pSCR mode if not in bailout + ;bra calc_deko_engine_norm_OC ; neither in CCR nor pSCR mode, so reload OC gases and reconfigure OC mode + ; (first cycle omits gas needs calculation for faster first deco results) +calc_deko_engine_norm_OC: + movff active_gas,WREG ; get current OC gas + call deco_setup_oc_gases_pre ; set up deco calculations in OC mode with OC gases + bra calc_deko_engine_start ; start deco engine + +calc_deko_engine_norm_loop: ; switch to loop calculation if not in a real bailout situation + btfsc FLAG_bailout_mode ; check if a real bailout situation is present + bra calc_deko_engine_norm_OC ; YES - revert to OC mode + ; NO - switch to loop calculation: + movff active_dil,WREG ; - get current diluent + call deco_setup_cc_diluents_pre ; - set up deco calculations in CCR/pSCR mode with diluents + bra calc_deko_engine_start ; - start deco engine + +calc_deko_engine_alt: + ; A normal plan was computed in the last cycle. For the next calculation cycle the mode may be switched + ; to alternative plan, or stay in normal plan but with certain features enabled... + bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation + bcf lo,DECO_VOLUME_FLAG ; clear flag for gas needs calculation + bcf lo,DECO_BAILOUT_FLAG ; clear flag for bailout mode + IFDEF _cave_mode + bcf hi,DECO_CAVE_MODE ; clear flag for cave mode + ENDIF + + btfsc FLAG_bailout_mode ; check if a real bailout situation is present + bra calc_deko_engine_alt_1 ; YES - stay in normal plan mode and preclude delayed ascent calculation + TSTOSS char_I_extra_time ; NO - check if a delayed ascent is enabled + bra calc_deko_engine_alt_1 ; NO - stay in normal plan mode and preclude delayed ascent calculation + bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan + bsf lo,DECO_ASCENT_FLAG ; - set flag for delayed ascent + +calc_deko_engine_alt_1: + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is enabled + bra calc_deko_engine_start ; NO - no volume calculation, no simulated bailout plan in this case + bsf lo,DECO_VOLUME_FLAG ; YES - set gas needs calculation flag + + btfsc FLAG_bailout_mode ; check if a real bailout situation is present + bra calc_deko_engine_start ; YES - normal plan already does bailout (OC) calculation "for real" + + IFDEF _cave_mode + bsf hi,DECO_CAVE_MODE ; activate cave mode by default + btfss FLAG_cave_mode ; cave mode switched on? + bcf hi,DECO_CAVE_MODE ; NO - deactivate p2deco cave mode again + btfsc FLAG_dive_turned ; dive turned? + bcf hi,DECO_CAVE_MODE ; YES - deactivate p2deco cave mode again + btfsc FLAG_cave_mode_shutdown ; cave mode function shut down? + bcf hi,DECO_CAVE_MODE ; YES - deactivate p2deco cave mode again + ENDIF + + btfss lo,DECO_MODE_LOOP_FLAG ; NO - has a loop mode calculation been done during the normal plan? + bra calc_deko_engine_start ; NO - when not in loop mode, no simulated bailout to be done + decf best_gas_number,W ; YES - get best gas number -1 into WREG. If not available, WREG will be 255 now. If not computed yet, WREG will be 254 now. + btfsc WREG,7 ; - WREG < 128 (a bailout gas is available)? + bra calc_deko_engine_alt_2 ; NO - no simulated bailout possible because no bailout gas available to switch to + bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan + bsf lo,DECO_BAILOUT_FLAG ; - set bailout mode flag (enables gas changes before 1st stop) + movf best_gas_number,W ; - put number of best gas into WREG + call deco_setup_oc_gases_pre ; - set up deco calculations in OC mode with OC gases + bra calc_deko_engine_start ; - start in alternative plan mode + +calc_deko_engine_alt_2: bcf lo,DECO_PLAN_FLAG ; clear flag for alternative plan bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation bcf lo,DECO_VOLUME_FLAG ; clear flag for gas needs calculation + IFDEF _cave_mode + bcf hi,DECO_CAVE_MODE ; clear flag for cave mode + ENDIF + call inval_alternative_plan_data ; invalidate all alternative (bailout) plan data because they are not applicable any more + +calc_deko_engine_start: + IFDEF _cave_mode + movff hi,char_O_main_status ; write-back char_O_main_status to deco engine interface + ENDIF movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface - ; check if a switchback from CCR or pSCR bailout calculation is to be done - btfsc FLAG_ccr_mode ; may a switchback from a CCR bailout calculation be needed? - bra calc_deko_divemode2a ; in CCR mode, so may need to switch back from bailout calculation - btfsc FLAG_pscr_mode ; may a switchback from a pSCR bailout calculation be needed? - bra calc_deko_divemode2a ; in pSCR mode, so may need to switch back from bailout calculation - bra calc_deko_divemode2e ; not in CCR nor pSCR, so no switchback needed, start normal plan now - ; (first cycle omits gas needs calculation in OC without delayed ascent) - - ; switch back to loop calculation if last cycle was doing a bailout calculation -calc_deko_divemode2a: - movff opt_calc_asc_gasvolume,hi ; get the gas volume needs calculation setting - movf hi,W ; are gas volume calculations turned on? - bz calc_deko_divemode2e ; NO - can't have done a bailout calculation then, start normal plan - 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 - - ; 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 - - ; 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 - 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) - 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, ... - 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 - call deco_calc_hauptroutine ; calc_tissue +calc_deko_engine_cont: + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine + clrf TMR5L ; restart timer used to preempt stops calculation + clrf TMR5H ; + call deco_calc_hauptroutine ; invoke the deco engine (p2_deco.c) banksel common - ; 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 + ; check if display shall be updated due to deco engine restart + btfsc FLAG_TFT_display_ndl_or_deko; shall update immediately? + bra calc_deko_engine_update ; YES + + ; check if new calculation results for normal plan mode are available + movff char_O_main_status,WREG ; get deco status of deco engine + btfss WREG,DECO_COMPLETED_NORM ; new calculation results for normal plan available? + return ; NO - done +calc_deko_engine_update: + bcf FLAG_TFT_display_ndl_or_deko; YES - reset flag for immediate update + movff char_O_deco_info,WREG ; - get deco info vector + btfsc WREG,deco_ceiling ; - ceiling depth > 0 ? + bra calc_deko_engine_update_deco; YES - in deco + ;bra calc_deko_engine_update_NDL ; NO - within NDL + +calc_deko_engine_update_NDL: ; within NDL + btfsc decostop_active ; been in deco mode before? + bsf FLAG_TFT_display_ndl_mask ; YES - clear deco data, display NDL time bsf FLAG_TFT_display_ndl ; display NDL time - bcf decostop_active ; clear flag (again) + bcf decostop_active ; clear flag for been in deco mode before return -calc_deko_divemode3: - ; YES - in deco - btfss decostop_active ; already in deco mode ? +calc_deko_engine_update_deco: ; in deco + btfss decostop_active ; already been in deco mode before? 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) + bsf decostop_active ; set flag for being in deco mode return ; -------------------------------------------------------------------------------------- @@ -521,71 +590,57 @@ 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 + 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 - +calc_deko_divemode_sensor_analog: + btfss analog_o2_input ; do we have an analog input? + bra calc_deko_divemode_sensor_opt ; NO - check if we have an optical interface + call get_analog_inputs ; YES - get the analog voltages and continue with the common part + bra calc_deko_divemode_sensor_common calc_deko_divemode_sensor_opt: - btfss optical_input ; do we have an optical input? - return ; No, return (We have no sensors at all. Not analog, not S8 and not optical) - ;o2_ppo2_sensor1, o2_ppo2_sensor2 and o2_ppo2_sensor3 are already filled in ISR - ;clear use_O2_sensorX for timeout case - btfss sensor1_active - bcf use_O2_sensor1 - btfss sensor2_active - bcf use_O2_sensor2 + btfss optical_input ; do we have an optical input? + return ; NO - return (we have no sensors at all: not analog, not S8 and not optical) + btfss sensor1_active ; YES - o2_ppo2_sensor1, o2_ppo2_sensor2 and o2_ppo2_sensor3 are already filled in ISR + bcf use_O2_sensor1 ; check HUD status data and eventually clear use_O2_sensorX + btfss sensor2_active + bcf use_O2_sensor2 btfss sensor3_active - bcf use_O2_sensor3 - bra calc_deko_divemode_sensor1 - -calc_deko_divemode_sensor_analog: - btfss analog_o2_input ; do we have an analog input? - bra calc_deko_divemode_sensor_opt ; NO - check if we have an optical interface - call get_analog_inputs ; YES - get the analog voltages and continue with the common part + bcf use_O2_sensor3 + bra calc_deko_divemode_sensor_A ; continue with calculating sensor average 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 + ; Check 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 - ; Check min_mv of sensor 1 + ; check 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 - movff o2_mv_sensor1+1, sub_a+1 - movlw LOW min_mv ; load minimum mV value - movwf sub_b+0 - movlw HIGH min_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv + ; check min threshold + movff o2_mv_sensor1+0,sub_a+0 ; load sensor mV value + movff o2_mv_sensor1+1,sub_a+1 + rcall check_min_threshold 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 - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv + ; check max_threshold + rcall check_max_threshold 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 + ; check HUD data, if available 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 - + btfss sensor1_active ; YES - HUD status ok? + bra check_sensor_1_fail ; NO - HUD reports a fail check_sensor_1_ok: - ; o2_ppo2_sensor1 := o2_mv_sensor1:2 * opt_x_s1:2 / 1000 + ; o2_ppo2_sensor1 = o2_mv_sensor1:2 * opt_x_s1:2 / 1000 movff o2_mv_sensor1+0,xA+0 movff o2_mv_sensor1+1,xA+1 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 + movff xC+0,o2_ppo2_sensor1 ; result in 0.01 bar bra check_sensor_2 ; continue with next sensor - check_sensor_1_fail: clrf WREG movff WREG,o2_ppo2_sensor1 ; set ppO2 reading to zero @@ -594,46 +649,34 @@ 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 - -check_sensor_2: ; Check min_mv of sensor 2 + +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 - movwf sub_b+0 - movlw HIGH min_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv + ; check min threshold + movff o2_mv_sensor2+0,sub_a+0 ; load sensor mV value + movff o2_mv_sensor2+1,sub_a+1 + rcall check_min_threshold 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 - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv + ; check max_threshold + rcall check_max_threshold 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 + ; check HUD data, if available 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 - + btfss sensor2_active ; YES - HUD status ok? + bra check_sensor_2_fail ; NO - HUD reports a fail check_sensor_2_ok: - ; o2_ppo2_sensor2 := o2_mv_sensor2:2 * opt_x_s2:2 / 1000 + ; o2_ppo2_sensor2 = o2_mv_sensor2:2 * opt_x_s2:2 / 1000 movff o2_mv_sensor2+0,xA+0 movff o2_mv_sensor2+1,xA+1 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 + movff xC+0,o2_ppo2_sensor2 ; result in 0.01 bar bra check_sensor_3 ; continue with next sensor - check_sensor_2_fail: clrf WREG movff WREG,o2_ppo2_sensor2 ; set ppO2 reading to zero @@ -642,186 +685,191 @@ 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 - -check_sensor_3: ; Check min_mv of sensor 2 + +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 - movwf sub_b+0 - movlw HIGH min_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - min_mv + ; check min threshold + movff o2_mv_sensor3+0,sub_a+0 ; load sensor mV value + movff o2_mv_sensor3+1,sub_a+1 + rcall check_min_threshold 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 - movwf sub_b+0 - movlw HIGH max_mv - movwf sub_b+1 - call sub16 ; sub_c = sensor_mv - max_mv + ; check max threshold + rcall check_max_threshold 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 + ; check HUD data, if available 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 - + btfss sensor3_active ; YES - HUD status ok? + bra check_sensor_3_fail ; NO - HUD reports a fail check_sensor_3_ok: - ; o2_ppo2_sensor3 := o2_mv_sensor3:2 * opt_x_s1:2 / 1000 + ; o2_ppo2_sensor3 = o2_mv_sensor3:2 * opt_x_s1:2 / 1000 movff o2_mv_sensor3+0,xA+0 movff o2_mv_sensor3+1,xA+1 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.01 bar + bra calc_deko_divemode_sensor_A ; 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 + call check_sensor_custview_helper; YES - show custom view 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 - ; exit here if not in divemode + +calc_deko_divemode_sensor_A: ; calculate sensor average + ; exit here if not in dive mode btfss divemode return - ; compute sensor_setpoint := average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true + ; 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 +divemode_setup_sensor_1_value: + btfss use_O2_sensor1 ; sensor1 active? + bra divemode_setup_sensor_2_value ; NO movf o2_ppo2_sensor1,W - addwf xA+0 + addwf xA+0,F 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 + addwfc xA+1,F ; add into xA:2 + incf xB+0,F ; add a sensor +divemode_setup_sensor_2_value: + btfss use_O2_sensor2 ; sensor2 active? + bra divemode_setup_sensor_3_value ; NO movf o2_ppo2_sensor2,W - addwf xA+0 + addwf xA+0,F 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 + addwfc xA+1,F ; add into xA:2 + incf xB+0,F ; add a sensor +divemode_setup_sensor_3_value: + btfss use_O2_sensor3 ; sensor3 active? + bra divemode_setup_sensor_mean ; NO movf o2_ppo2_sensor3,W - addwf xA+0 + addwf xA+0,F 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 - - ; set default value for pSCR mode: 0 = let p2_deco.c compute the ppO2 based on current dil gas and depth + addwfc xA+1,F ; 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_mean: + clrf xC+0 ; set zero as default result + tstfsz xB+0 ; pending div/0 ? + call div16x16 ; NO - execute xC = xA / xB = summed ppO2 / number of sensors + movff xC+0,sensor_setpoint ; copy result (or its default) + + ; 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 - 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 + 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 FLAG_bailout_mode ; check if we are in bailout + bra calc_deko_divemode_sensor_V ; YES - no sensor data transfer to char_I_const_ppO2 in this case + movff opt_ccr_mode,WREG ; NO - get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) + sublw .1 ; - in sensor mode? + bnz calc_deko_divemode_sensor_V ; NO - not in sensor mode - no transfer of sensor data to char_I_const_ppO2 + tstfsz xB+0 ; YES - check if we have found at least one usable sensor + bra divemode_setup_sensor_mean1 ; 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_sensor_V ; 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_sensor_V ; - continue with voting logic flags + ; we have at least one usable sensor with a ppO2 value > 0 +divemode_setup_sensor_mean1: + 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 - -calc_deko_divemode_sensor2: + ; vote sensors +calc_deko_divemode_sensor_V: 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 + tstfsz WREG ; sensor within range (WREG = 0)? + bcf voting_logic_sensor1 ; NO - vote out 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 + tstfsz WREG ; sensor within range (WREG = 0)? + bcf voting_logic_sensor2 ; NO - vote out 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 + tstfsz WREG ; sensor within range (WREG = 0)? + bcf voting_logic_sensor3 ; NO - vote out 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 + bra check_warn_sensor_0 ; 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 + bra check_warn_sensor_0 ; YES - continue with further checks + bra check_warn_sensor_done ; not in CCR and not in pSCR, so no warning +check_warn_sensor_0: ; we are in CCR or pSCR mode + btfsc FLAG_bailout_mode ; check if we are in bailout + bra check_warn_sensor_done ; YES - no warning in this case + movff opt_ccr_mode,WREG ; get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) + sublw .1 ; in sensor mode? + bnz check_warn_sensor_done ; NO - not in sensor mode - no warning in this case + ; check sensor 1 +check_warn_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 + 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 + ; check sensor 2 +check_warn_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 + 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 + ; check sensor 3 +check_warn_sensor_3: 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 + 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 - + ; no need for a warning +check_warn_sensor_done: check_warn_sensor_agree: bsf sensors_agree return + +check_min_threshold: + movlw LOW min_mv ; load minimum mV value + movwf sub_b+0 + movlw HIGH min_mv + movwf sub_b+1 + goto sub16 ; sub_c = sensor_mv - min_mv (and return) + +check_max_threshold: + movlw LOW max_mv + movwf sub_b+0 + movlw HIGH max_mv + movwf sub_b+1 + goto sub16 ; sub_c = sensor_mv - max_mv (and return) + compute_ppo2_helper: call mult16x16 ; xA:2*xB:2=xC:4 movlw LOW .1000 @@ -834,75 +882,83 @@ movlw d'0' 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. + setf xC+0 ; YES return check_sensor_custview_helper: - btfss divemode ; check if we are in divemode + btfss divemode ; check if we are in dive mode 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: + movff opt_ccr_mode,WREG ; YES - =0: Fixed SP, =1: Sensor, =2: Auto SP + decfsz WREG,W ; - opt_ccr_mode = 1 (sensors)? + return ; NO - not using the sensors in the moment + btfsc alternative_divelayout ; YES - in alternative layout? + call switch_layout_to_normal ; YES - switch to normal layout + movlw index_ppo2_sensors-1 ; custom view number one below ppO2 sensors + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> ppO2 sensors return - check_sensor_voting_helper: movf lo,W cpfsgt sensor_setpoint - bra check_sensor_voting_common2 ; lo < sensor_setpoint + bra check_sensor_voting_helper2 ; 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 +check_sensor_voting_helper1: + 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: - ; lo 99 m/min ? + bra calc_velocity3 ; NO + movwf divA+0 ; YES - set divA = 99 calc_velocity3: ; Copy old speeds @@ -948,19 +1003,19 @@ ; addwf divA+0,F ; add old speed ; bcf STATUS,C ; rrcf divA+0,F ; /2 - goto TFT_display_velocity ; With divA+0 = m/min..., and return... + goto TFT_display_velocity ; with divA+0 = m/min..., and return... ;============================================================================= -set_reset_safety_stop: ; Set flags for safety stop and/or reset safety stop - TSTOSS opt_enable_safetystop ; =1: A safety stop is shown - bra delete_safety_stop ; No, don't show safety stop - - btfsc decostop_active ; Is a deco stop displayed? - bra delete_safety_stop ; Yes, don't show safety stop - - ; Below "opt_safety_stop_reset"? Set flag and reset count-down timer +set_reset_safety_stop: ; set flags for safety stop and/or reset safety stop + TSTOSS opt_enable_safetystop ; safety stop enabled? (=1: show safety stop) + bra delete_safety_stop ; NO - don't show safety stop + + btfsc decostop_active ; is a deco stop displayed? + bra delete_safety_stop ; YES - don't show safety stop + + ; Below "opt_safety_stop_reset"? if yes, set flag and reset count-down timer SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] movff lo,sub_a+0 @@ -971,51 +1026,43 @@ movff PRODH,sub_b+1 call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - bra reset_safety_stop ; Below 10m, reset safety stop - - ; Above "opt_safety_stop_end"? Clear flag. - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - movff lo,sub_a+0 - movff hi,sub_a+1 + bra reset_safety_stop ; below 10m, reset safety stop + + ; Above "opt_safety_stop_end"? if yes ,clear flag movff opt_safety_stop_end,WREG ; [cbar] mullw .10 ; mbar in PRODL:H - movff PRODL,sub_b+0 + movff PRODL,sub_b+0 ; sub_a is still loaded with adjusted rel_pressure movff PRODH,sub_b+1 call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra delete_safety_stop ; Above 3m, remove safety stop - - ; Above "opt_safety_stop_start"? Activate safety stop - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - movff lo,sub_a+0 - movff hi,sub_a+1 + bra delete_safety_stop ; above 3m, remove safety stop + + ; Above "opt_safety_stop_start"? if yes, activate safety stop movff opt_safety_stop_start,WREG ; [cbar] mullw .10 ; mbar in PRODL:H - movff PRODL,sub_b+0 + movff PRODL,sub_b+0 ; sub_a is still loaded with adjusted rel_pressure movff PRODH,sub_b+1 call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra acivate_safety_stop ; Above 5m, activate safety stop - bra reset_safety_stop2 ; Pause safety stop + bra acivate_safety_stop ; above 5m, activate safety stop + bra reset_safety_stop2 ; pause safety stop acivate_safety_stop: - tstfsz safety_stop_countdown ; Countdown at zero? - bsf show_safety_stop ; No, Set flag! + tstfsz safety_stop_countdown ; countdown at zero? + bsf show_safety_stop ; NO - set flag return delete_safety_stop: clrf safety_stop_countdown ; reset timer - bra reset_safety_stop2 ; Remove safety stop from display + bra reset_safety_stop2 ; remove safety stop from display reset_safety_stop: movff opt_safety_stop_length,safety_stop_countdown ; reset timer reset_safety_stop2: - bcf show_safety_stop ; Clear flag - btfss safety_stop_active ; Safety stop shown - return ; No, don't delete it - bcf safety_stop_active ; Clear flag + bcf show_safety_stop ; clear flag + btfss safety_stop_active ; safety stop shown? + return ; NO - don't delete it + bcf safety_stop_active ; clear flag bsf FLAG_TFT_clear_safety_stop ; Clear safety stop return @@ -1023,27 +1070,28 @@ ;============================================================================= timeout_menuview: - decfsz timeout_counter2,F ; timeout for menuview - return ; No timeout, return + decfsz timeout_counter2,F ; timeout for menu view? + return ; NO - done ; Timeout, clear e.g. "Menu?" - goto menuview_toggle_reset ; "returns" + goto menuview_toggle_reset ; ...and return timeout_divemode_menu: decfsz timeout_counter2,F ; timeout for divemode menu return global timeout_divemode_menu2 -timeout_divemode_menu2: ; Called from divemenu_tree.asm - bcf divemode_menu ; Timeout! Clear flag - call TFT_clear_divemode_menu ; Clear menu - bsf FLAG_TFT_active_gas_divemode; Redraw gas/setpoint/diluent - bcf blinking_better_gas ; Clear flag to have temperature updated once - bsf FLAG_TFT_temp_divemode ; Displays temperature - call TFT_draw_gassep_line ; Gas separator grid in spec mode only - - btfss decostop_active ; In deco mode ? - bra timeout_divemode_menu_ndl ; No, show NDL again - ; Show deco +timeout_divemode_menu2: ; called from divemenu_tree.asm + bcf divemode_menu ; timeout, clear flag + call TFT_clear_divemode_menu ; clear menu + bsf FLAG_TFT_active_gas_divemode; redraw gas/setpoint/diluent + bcf blinking_better_gas ; clear flag to have temperature updated once + bcf blinking_better_dil ; clear flag to have temperature updated once + bsf FLAG_TFT_temp_divemode ; display temperature + call TFT_draw_gassep_line ; gas separator grid in spec mode only + + btfss decostop_active ; in deco mode ? + bra timeout_divemode_menu_ndl ; NO - show NDL again + ; Show deco data bsf FLAG_TFT_display_deko_mask bsf FLAG_TFT_display_deko bsf FLAG_TFT_display_tts @@ -1056,37 +1104,37 @@ return timeout_divemode: - btfsc divemode_menu ; Divemode menu active? - rcall timeout_divemode_menu ; Yes, check the timeout for it... - - btfsc menuview ; is a menuview shown? - rcall timeout_menuview ; Yes, check the timeout for it... - - btfss realdive ; Dive longer then one minute - return - - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra timeout_divemode2 ; Yes, use apnoe_timeout [min] for timeout - - ifndef __DEBUG - btfsc simulatormode_active ; In Simulator mode? - bra timeout_divemode3 ; Yes, use simulator timeout - endif - - bcf divemode - infsnz timeout_counter1+0,F + btfsc divemode_menu ; divemode menu active? + rcall timeout_divemode_menu ; YES - check the timeout for it... + + btfsc menuview ; is a menu view shown? + rcall timeout_menuview ; YES - check the timeout for it... + + btfss realdive ; dive longer than one minute? + return ; NO - done + + btfsc FLAG_apnoe_mode ; in apnoe mode? + bra timeout_divemode2 ; YES - use apnoe_timeout [min] for timeout + + IFNDEF __DEBUG + btfsc simulatormode_active ; in simulator mode? + bra timeout_divemode3 ; YES - use simulator timeout + ENDIF + + bcf divemode ; terminate divemode my default + infsnz timeout_counter1+0,F ; increment timeout counter incf timeout_counter1+1,F ; timeout is 16 bit counter - movff opt_diveTimeout,WREG ; in [min] - mullw .60 + movff opt_diveTimeout,WREG ; get timeout in minutes + mullw .60 ; convert into seconds movff PRODL,sub_a+0 - movff PRODH,sub_a+1 ; in [s] + movff PRODH,sub_a+1 movff timeout_counter1+0,sub_b+0 movff timeout_counter1+1,sub_b+1 call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Result negative? - bsf divemode ; No, set flag + btfss neg_flag ; result negative, i.e. timeout? + bsf divemode ; NO - set divemode flag again return timeout_divemode2: @@ -1113,36 +1161,59 @@ update_divemode60: ; update any minute call get_battery_voltage ; gets battery voltage - rcall set_powersafe ; Battery low? - call customview_minute ; Do every-minute tasks for the custom view area + rcall set_powersafe ; check if battery low + ;call customview_minute ; do every-minute tasks for the custom view area bcf oneminupdate - + IFDEF _cave_mode + movlw .1 ; prepare to add backtrack data for 1 minute + btfsc FLAG_cave_mode ; cave mode enabled? + rcall update_backtrack ; YES - make it so + ENDIF btfss simulatormode_active ; in simulator mode? - return ; No - ; Yes, quite dive mode simulation after 21*256s=89min:36s - movlw .20 - cpfsgt total_divetime_seconds+1 ; Timeout? - return ; No - - ifdef __DEBUG - return ; No simulator timeout in debug mode - endif - - bra divemode_option1 ; Yes, set to 0m and "return" + return ; NO - done + movlw .20 ; YES - quite dive mode simulation after 21 * 256 sec = 89 min : 36 sec + cpfsgt total_divetime_seconds+1 ; timeout? + return ; NO - done + IFDEF __DEBUG + return ; YES - but no timeout in debug mode + ENDIF + bra divemode_option1 ; YES - set depth to 0 m and "return" + + IFDEF _cave_mode +update_backtrack: + btfsc FLAG_dive_turned ; dive turned? + return ; YES - done + movwf lo ; store minutes to add in lo + lfsr FSR1,char_I_backtrack_depth ; load FSR1 with base address of backtrack storage + movff char_I_backtrack_time,FSR1L ; adjust FSR1 to last index +update_backtrack_loop: + btfsc FLAG_cave_mode_shutdown ; backtrack storage full? + return ; YES - done + movff curr_depth,PREINC1 ; NO - increment index and write current depth to backtrack storage + incfsz FSR1L,W ; - did a wrap-around of the index occur (backtrack storage full)? + bra update_backtrack_loop_1 ; NO - continue loop + bsf FLAG_cave_mode_shutdown ; YES - flag backtrack storage as being full + return +update_backtrack_loop_1: + decfsz lo,F ; decrement loop counter, did it became zero? + bra update_backtrack_loop ; NO - loop + movff FSR1L,char_I_backtrack_time ; YES - read-back index + return ; - done + ENDIF set_max_depth: movff max_pressure+0,sub_a+0 movff max_pressure+1,sub_a+1 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 + ; max_pressure < rel_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 + ; minimum_temperature < T -> neg_flag=1 + ; T <= minimum_temperature -> neg_flag=0 btfsc neg_flag return ; minimum_temperature >= T @@ -1161,8 +1232,8 @@ global set_dive_modes set_dive_modes: - btfsc high_altitude_mode ; In high altitude (Fly) mode? - bra set_dive_modes3 ; Yes! + btfsc high_altitude_mode ; in high altitude (fly) mode? + bra set_dive_modes3 ; YES set_dive_modes0: movlw LOW start_dive_threshold @@ -1177,23 +1248,22 @@ btfss neg_flag bra set_dive_modes2 ; too shallow (rel_pressure < dive_threshold) - btfsc realdive ; Dive longer than one minute? - clrf timeout_counter1+0 ; Yes, reset timeout counter +++ - - bsf divemode ; (Re-)Set divemode flag + btfsc realdive ; dive longer than one minute? + clrf timeout_counter1+0 ; YES - reset timeout counter + + bsf divemode ; (re-)set divemode flag bsf divemode2 ; displayed divetime is running return set_dive_modes2: - bcf divemode2 ; Stop time + bcf divemode2 ; stop time btfss realdive ; dive longer then one minute? - bcf divemode ; no -> this was no real dive - return ; No, return - - -set_dive_modes3: ; High-altitude mode + bcf divemode ; NO - this was no real dive + return ; YES - return + +set_dive_modes3: ; high-altitude mode btfsc realdive ; dive longer then one minute? - bra set_dive_modes0 ; Yes -> this is a real dive -> Use start_dive_threshold or ascend + bra set_dive_modes0 ; YES - this is a real dive -> Use start_dive_threshold or ascend movlw LOW high_altitude_dive_threshold movwf sub_a+0 @@ -1206,181 +1276,181 @@ cpfslt batt_percent return - movlw d'7' ; Type of Alarm (Battery Low) - movwf AlarmType ; Copy to Alarm Register + 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 + movff WREG,opt_brightness ; set brightness to ECO return ; return + +reset_average: + bcf reset_average_depth ; clear reset-average flag + clrf average_depth_hold+0 ; clear the depth accumulator + clrf average_depth_hold+1 ; ... + clrf average_depth_hold+2 ; ... + clrf average_depth_hold+3 ; ... + clrf average_divesecs+0 ; clear the time accumulator + clrf average_divesecs+1 ; ... + SAFE_2BYTE_COPY rel_pressure,avg_rel_pressure ; prime result with current rel.pressure/depth + return + + calc_average_depth: - btfsc reset_average_depth ; Reset the Average depth? - 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... + ; 1. compute rel_pressure x 2, because this routine is called every 2nd second only + SAFE_2BYTE_COPY rel_pressure,xB ; copy current rel pressure to xB bcf STATUS,C - rlcf xB+0,F - rlcf xB+1,F ; x2 - - movf xB+0,w + rlcf xB+0,F ; multiply rel pressure x 2 (via shift left) + rlcf xB+1,F ; ... + + ; 2a add (rel_pressure x 2) to the resettable depth accumulator + movf xB+0,W addwf average_depth_hold+0,F - movf xB+1,w + movf xB+1,W addwfc average_depth_hold+1,F - movlw d'0' + movlw .0 addwfc average_depth_hold+2,F - 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 + addwfc average_depth_hold+3,F ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) + + ; 2b add (rel_pressure x 2) to the total depth accumulator + movf xB+0,W addwf average_depth_hold_total+0,F - movf xB+1,w + movf xB+1,W addwfc average_depth_hold_total+1,F - movlw d'0' + movlw .0 addwfc average_depth_hold_total+2,F - 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 - movff average_divesecs+1,xB+1 ; Copy + addwfc average_depth_hold_total+3,F ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) + + ; 3a compute avg_rel_pressure on base of average_divesecs:2 movff average_depth_hold+0,xC+0 movff average_depth_hold+1,xC+1 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 + movff average_depth_hold+3,xC+3 ; copy accumulated depth + movff average_divesecs+0,xB+0 + movff average_divesecs+1,xB+1 ; copy accumulated time + 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) - - ; 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 xC+1,avg_rel_pressure+1 ; store result + + btfss divemode2 ; displayed divetime is running? + return ; NO (e.g. too shallow) + + ; 3b compute avg_rel_pressure_total on base of average_divesecs_total:2 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 + movff average_depth_hold_total+3,xC+3 ; copy accumulated depth + movff average_divesecs_total+0,xB+0 + movff average_divesecs_total+1,xB+1 ; copy accumulated time + 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 + movff xC+1,avg_rel_pressure_total+1 ; store result + + btfsc reset_average_depth ; reset the resettable average depth? + rcall reset_average ; YES - reset the resettable average depth + + TSTOSS opt_2ndDepthDisp ; drawing avg depth instead of max depth? + return ; NO - done + bsf FLAG_TFT_max_depth ; YES - flag to update display return -reset_average1: - clrf average_depth_hold+0 - clrf average_depth_hold+1 - clrf average_depth_hold+2 - clrf average_depth_hold+3 ; Clear average depth register - movlw d'2' - movwf average_divesecs+0 - clrf average_divesecs+1 - bcf reset_average_depth ; Clear flag - return - -test_switches_divemode: ; checks switches in divemode - 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... - 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 + +test_switches_divemode: ; checks switches in divemode + btfsc divemode_menu ; divemode menu shown? + bra test_switches_divemode_menu ; YES - use menu processor + btfsc switch_left ; NO - left button pressed? + goto menuview_toggle ; YES - menu or simulator tasks; and return... + btfss switch_right ; NO - right button pressed? + return ; NO - done + tstfsz menupos2 ; YES - any option shown? + bra test_switches_divemode1 ; YES - do option tasks + bsf toggle_customview ; NO - toggle custom view + return ; - done test_switches_divemode_menu: btfsc switch_left - 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_menu2 ; move cursor + btfsc switch_right ; left button pressed? + bra test_switches_divemode_menu3 ; YES - enter submenu or do something + return ; NO - done test_switches_divemode_menu1: clrf menupos1 test_switches_divemode_menu2: 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 + 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 + movlw divemode_menu_timeout ; reload timeout + movwf timeout_counter2 ; timeout for divemode menu return -test_switches_divemode_menu3: ; Enter submenu or do something +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: + goto do_line_menu ; Warning! trashes STKPTR and returns to diveloop_loop4: test_switches_divemode1: bcf switch_right movlw divemode_menuview_timeout - movwf timeout_counter2 ; Reload 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 the "better gas" / "better diluent" 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? + bra divemode_option1 ; quit simulation? dcfsnz WREG,F - bra divemode_option2 ; Descent 1m + bra divemode_option2 ; descent 1m dcfsnz WREG,F - bra divemode_option3 ; Ascend 1m + bra divemode_option3 ; ascend 1m dcfsnz WREG,F - bra divemode_option4 ; Quit Apnoe mode + bra divemode_option4 ; quit Apnoe mode dcfsnz WREG,F - bra divemode_option5 ; Reset Stopwatch (In Gauge mode) + bra divemode_option5 ; reset stopwatch (gauge mode only) dcfsnz WREG,F bra divemode_option6 ; +5mins simulation dcfsnz WREG,F - bra divemode_option7 ; Store heading + bra divemode_option7 ; store heading dcfsnz WREG,F - bra divemode_option8 ; Switch to alt. layout + bra divemode_option8 ; switch to alternative layout return gas_switched_common: - bcf divemode_gaschange ; Clear flag + 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 + movff active_dil,menupos1 ; reload last diluent bra gas_switched_common1 ; continue with common part gas_switched_common0: - tstfsz menupos1 ; menupos1=0? + tstfsz menupos1 ; menupos1 = 0 ? bra gas_switched_common1 ; NO - valid gas return ; YES - something went wrong, invalid gas, abort gas_switched_common1: movf menupos1,W ; get selected gas into WREG (1-6) - - btfsc FLAG_ccr_mode ; in CCR mode? - bra gas_switched_common2 ; YES - configure diluent or bailout - 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 + btfsc FLAG_oc_mode ; in OC mode? + bra gas_switched_common_OC ; YES + btfsc FLAG_bailout_mode ; in bailout? + bra gas_switched_common_OC ; YES +gas_switched_common_loop: ; NO to both - must be loop mode then + rcall setup_dil_registers ; with WREG = diluent 1-6 + rcall deco_setup_cc_diluents ; with WREG = diluent 1-6 bra gas_switched_common3 - - ; 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 - +gas_switched_common_OC: + rcall setup_gas_registers ; with WREG = Gas 1-6 + rcall deco_setup_oc_gases ; with WREG = Gas 1-6 gas_switched_common3: - bsf FLAG_TFT_active_gas_divemode ; Redraw gas/setpoint/diluent + 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 + ; 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) + btfsc FLAG_bailout_mode ; choose OC Bailouts (OC Gases) + bsf bailoutgas_event ; bailout gas change + btfss FLAG_bailout_mode ; choose OC Bailouts (OC Gases) bsf stored_gas_changed ; OC gas change return @@ -1388,165 +1458,130 @@ ; Code to pass all parameters to the C code 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 +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 gas 0 get_first_gas_to_WREG2: movf lo,W - movf PLUSW1,W ; Get Type of Gas #lo + 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! + 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 + cpfseq lo ; all done? + bra get_first_gas_to_WREG2 ; NO - not yet + ; no first gas found, use #1 movlw .0 - movff WREG,opt_gas_type+0 ; Set Gas1 to First + movff WREG,opt_gas_type+0 ; set gas 1 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 + return ; done 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 +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 dil 0 get_first_dil_to_WREG2: movf lo,W - movf PLUSW1,W ; Get Type of Dil #lo + 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! + 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 + cpfseq lo ; all done? + bra get_first_dil_to_WREG2 ; NO - not yet + ; no first dil found, use #1 movlw .0 - movff WREG,opt_dil_type+0 ; Set Dil1 to First + movff WREG,opt_dil_type+0 ; set dil 1 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 - - global deco_setup_oc_gases + return ; done + + 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 - - 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 - - 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 - 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 - 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 - 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 - - ; switch to oc mode movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common +deco_setup_oc_gases_pre: ; entry point with lo preloaded + movff WREG,char_I_current_gas ; set gas to start with when doing the deco calculations + ; + ; Memory Map: + ; --------------------------------------------------------------------------------- + ; opt_gas_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS + ; opt_dil_O2_ratio res NUM_GAS | + ; opt_gas_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS + ; opt_dil_He_ratio res NUM_GAS | + ; opt_gas_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS + ; opt_dil_type res NUM_GAS | + ; opt_gas_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS + ; opt_dil_change res NUM_GAS | + ; + lfsr FSR2,char_I_deco_O2_ratio ; Load FSR2 with base address of char_I_deco_O2_ratio. + ; FSR2 will step through all char_I_deco_... vars. + lfsr FSR1,opt_gas_O2_ratio ; load FSR1 with base address of opt_gas_O2_ratio + rcall deco_setup_copy ; copy all OC O2 ratios + lfsr FSR1,opt_gas_He_ratio ; load FSR1 with base address of opt_gas_He_ratio + rcall deco_setup_copy ; copy all OC He ratios + lfsr FSR1,opt_gas_type ; load FSR1 with base address of opt_gas_type + rcall deco_setup_copy ; copy all gas types + lfsr FSR1,opt_gas_change ; load FSR1 with base address of opt_gas_change + rcall deco_setup_copy ; copy all gas change depths + ; switch to oc mode 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+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+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 - - ; 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 - - ; switch to CCR / pSCR mode +deco_setup_cc_diluents: ; with currently breathed diluent in WREG (1-5 or 6) movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common +deco_setup_cc_diluents_pre: ; entry point with lo preloaded + btfsc FLAG_bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- + bra deco_setup_oc_gases_pre ; YES - revert to setting up OC gases | This branch should never happen to be taken... + movff WREG,char_I_current_gas ; NO - set diluent to start with when doing the deco calculations + ; + ; Memory Map: + ; --------------------------------------------------------------------------------- + ; opt_gas_O2_ratio res NUM_GAS | + ; opt_dil_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS + ; opt_gas_He_ratio res NUM_GAS | + ; opt_dil_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS + ; opt_gas_type res NUM_GAS | + ; opt_dil_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS + ; opt_gas_change res NUM_GAS | + ; opt_dil_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS + ; + lfsr FSR2,char_I_deco_O2_ratio ; Load FSR2 with base address of char_I_deco_O2_ratio. + ; FSR2 will step through all char_I_deco_... vars. + lfsr FSR1,opt_dil_O2_ratio ; load FSR1 with base address of opt_dil_O2_ratio + rcall deco_setup_copy ; copy all dil O2 ratios + lfsr FSR1,opt_dil_He_ratio ; load FSR1 with base address of opt_dil_He_ratio + rcall deco_setup_copy ; copy all dil He ratios + lfsr FSR1,opt_dil_type ; load FSR1 with base address of opt_dil_type + rcall deco_setup_copy ; copy all dil types + lfsr FSR1,opt_dil_change ; load FSR1 with base address of opt_dil_change + rcall deco_setup_copy ; copy all dil change depths + ; switch to CCR / pSCR mode 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_deco_status ; bank safe write-back of char_O_deco_status - + movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status return +deco_setup_copy: + movlw NUM_GAS ; load loop counter with number of gases (5) +deco_setup_copy_loop: + movff POSTINC1,POSTINC2 ; copy from (FSR1) to (FSR2) + decfsz WREG ; decrement loop counter and check if it became 0 + bra deco_setup_copy_loop ; NO - not yet, loop + return ; YES - done + + global setup_gas_registers setup_gas_registers: ; with currently breathed gas in WREG (1-5 or 6) movwf active_gas ; set as current gas @@ -1554,76 +1589,92 @@ 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 + movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine + movlw .3 ; declare gas6 as a deco gas + movff WREG,char_I_current_gas_type; copy gas type to deco engine + movff curr_depth,char_I_gas6_depth; set current depth as change depth bra setup_gas_registers_com ; continue with common part setup_gas_registers_15: decf active_gas,W ; 1-5 -> 0-4 - lfsr FSR1,opt_gas_O2_ratio+0 + lfsr FSR1,opt_gas_O2_ratio movff PLUSW1,char_I_O2_ratio ; copy gas 1-5 O2 ratio to deco engine - lfsr FSR1,opt_gas_He_ratio+0 + lfsr FSR1,opt_gas_He_ratio 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 + lfsr FSR1,opt_gas_type ; + movff PLUSW1,char_I_current_gas_type ; copy gas 1-5 type (0=Disabled, 1=First, 2=Travel, 3=Deco) +setup_gas_registers_com: 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!) + movf active_gas,W ; reload WREG with gas 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 + btfsc FLAG_bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- + bra setup_gas_registers ; revert to setting up OC gases in bailout condition | This branch should never happen to be taken... + movwf active_dil ; set as current diluent movlw .6 - cpfseq active_gas ; diluent = gas6 ? + cpfseq active_dil ; 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 + movlw .2 ; declare gas6 as a normal diluent + movff WREG,char_I_current_gas_type; copy gas type to deco engine + movff curr_depth,char_I_gas6_depth; set current depth as change depth bra setup_dil_registers_com ; continue with common part setup_dil_registers_15: - decf active_gas,W ; 1-5 -> 0-4 - lfsr FSR1,opt_dil_O2_ratio+0 + decf active_dil,W ; 1-5 -> 0-4 + lfsr FSR1,opt_dil_O2_ratio movff PLUSW1,char_I_O2_ratio ; copy diluent 1-5 O2 ratio to deco engine - lfsr FSR1,opt_dil_He_ratio+0 + lfsr FSR1,opt_dil_He_ratio movff PLUSW1,char_I_He_ratio ; copy diluent 1-5 He ratio to deco engine + lfsr FSR1,opt_dil_type ; + movff PLUSW1,char_I_current_gas_type ; copy dil type (0=Disabled, 1=First, 2=Normal) 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!) + movf active_dil,W ; reload WREG with diluent 1-5 or 6 (important!) return -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 + +divemode_option_gaschange: ; switch to the "better gas" / "better diluent" + btfsc FLAG_oc_mode ; in OC mode? + bra divemode_option_gaschange_oc; YES + btfsc FLAG_bailout_mode ; in bailout? + bra divemode_option_gaschange_oc; YES +divemode_option_gaschange_loop: ; in CCR/pSCR mode and not in bailout + movff best_dil_number,menupos1 ; NO - select best diluent + bcf better_dil_available ; - clear flag immediately + bra divemode_option_gaschange3 ; - continue with common part +divemode_option_gaschange_oc: ; in OC or bailout + movff best_gas_number,menupos1 ; select best gas + bcf better_gas_available ; clear flag immediately +divemode_option_gaschange3 ; common part + bsf divemode_gaschange ; command a gas/diluent change + call menuview_toggle_reset ; terminate the options menu return -divemode_option0: ; Start/Setup Divemode menu - call TFT_clear_divemode_menu ; Clear menu area +divemode_option0: ; start/setup dive mode menu + call TFT_clear_divemode_menu ; clear menu area bcf menuview call do_main_divemenu global divemode_option0_return divemode_option0_return: ; movlw .1 -; movwf menupos1 ; Set to first option in divemode menu - call TFT_divemode_menu_cursor ; Show the cursor +; movwf menupos1 ; set to first option in dive mode menu + call TFT_divemode_menu_cursor ; show the cursor movlw divemode_menu_timeout - 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!) + movwf timeout_counter2 ; timeout for dive mode menu + bsf divemode_menu ; set flag + clrf menupos2 ; clear option counter + goto diveloop_loop4 ; go back to dive loop (menu processor trashes STKPTR!) divemode_option4: movlw d'58' ; two seconds left @@ -1631,18 +1682,20 @@ movlw apnoe_timeout-1 ; apnoe timeout [min] movwf apnoe_timeout_counter btfss simulatormode_active ; in simulator mode? - return ; No -divemode_option1: ; Quit simulation mode + return ; NO + ;bra divemode_option1 ; YES + +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 + 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 + call menuview_toggle_reset ; reset to zero (zero = no menu view) + + btfss FLAG_apnoe_mode ; in apnoe mode? + return ; NO - done movlw d'58' ; two seconds left movwf timeout_counter1+0 movlw apnoe_timeout-1 ; apnoe timeout [min] @@ -1662,51 +1715,74 @@ divemode_option2: ; plus 1m banksel isr_backup movlw d'100' - addwf sim_pressure+0 + addwf sim_pressure+0,F movlw .0 - addwfc sim_pressure+1 + addwfc sim_pressure+1,F rcall divemode_simulator_check_limits banksel common return divemode_option5: - call menuview_toggle_reset ; Reset to zero (Zero=no menuview) - bsf reset_average_depth ; Set Flag + call menuview_toggle_reset ; reset to zero (zero = no menu view) + bsf reset_average_depth ; set flag return divemode_option6: - bcf divemode2 ; Stop divetime + ; advance tissues and deco by 5 minutes + movlw .5 ; + 5 minutes + movff WREG,char_I_sim_advance_time; copy to mailbox + call restart_deco_engine + + ; stop divetime incrementing in ISR + bcf divemode2 + + ; add 5 minutes to divemins movlw .5 addwf divemins+0,F movlw .0 - addwfc divemins+1,F ; Add 5 mins + addwfc divemins+1,F + + ; add 5 minutes (5 * 60 seconds) to total_divetime_seconds + movlw LOW (.5*.60) + addwf total_divetime_seconds+0,F + movlw HIGH (.5*.60) + addwfc total_divetime_seconds+1,F + + ; continue dive time incrementing in ISR + bsf divemode2 + + ; add 5 minutes (5 * 60 seconds) to resettable time accumulator movlw LOW (.5*.60) addwf average_divesecs+0,F movlw HIGH (.5*.60) - addwfc average_divesecs+1,F ; Add 5*60 seconds + addwfc average_divesecs+1,F + + ; add 5 minutes (5 * 60 seconds) to total time accumulator movlw LOW (.5*.60) - addwf total_divetime_seconds+0,F + addwf average_divesecs_total+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... + addwfc average_divesecs_total+1,F + + + ; calculate 300 x depth in mbar (300 = 5 min * 60 sec/min) + SAFE_2BYTE_COPY rel_pressure, xB movlw LOW (.5*.60) movwf xA+0 movlw HIGH (.5*.60) movwf xA+1 call mult16x16 ; xA*xB=xC - movf xC+0,w + ; add to the resettable depth accumulator + movf xC+0,W addwf average_depth_hold+0,F - movf xC+1,w + movf xC+1,W addwfc average_depth_hold+1,F - movf xC+2,w + movf xC+2,W addwfc average_depth_hold+2,F - 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) + movf xC+3,W + addwfc average_depth_hold+3,F + + ; add to the total depth accumulator movf xC+0,w addwf average_depth_hold_total+0,F movf xC+1,w @@ -1714,12 +1790,14 @@ movf xC+2,w addwfc average_depth_hold_total+2,F movf xC+3,w - addwfc average_depth_hold_total+3,F; Will work up to 9999mbar*60*60*24=863913600mbar - - movlw .5 ; + 5 minutes - movff WREG,char_I_sim_advance_time; copy to mailbox - bsf divemode2 ; continue divetime - call restart_deco_engine + addwfc average_depth_hold_total+3,F + + IFDEF _cave_mode + ; update backtracking data + movlw .5 ; add backtrack data for 5 minutes + call update_backtrack ; make it so + ENDIF + goto menuview_toggle_reset ; and return... divemode_option7: @@ -1727,38 +1805,42 @@ 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... - + goto menuview_toggle_reset ; 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 alternative layout mode + call menuview_toggle_reset ; terminate the pre-menu + call TFT_ClearScreen ; clear the whole screen + bsf FLAG_TFT_divemode_mask_alt ; set flag to draw the alternative mask + movff menupos3,customview_divemode; back-up the custom view shown in normal layout + clrf menupos3 ; select the default alternative layout + call customview_mask_alternative ; draw the default alternative layout + return ; done + divemode_simulator_check_limits: - ; Check limits (150m and 0m) - movlw LOW d'16000' ; Compare to 16bar=16000mbar (150m). + ; check limits (150m and 0m) + movlw LOW d'16000' ; compare to 16 bar = 16000 mbar (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 + bnc divemode_simulator_check_limits2 ; no carry = borrow = not deeper + + ; too deep, limit to 150m movlw LOW d'16000' movwf sim_pressure+0 movlw HIGH d'16000' movwf sim_pressure+1 return + divemode_simulator_check_limits2: - movlw LOW d'1000' ; Compare to 1bar == 0m == 1000 mbar. + movlw LOW d'1000' ; compare to 1 bar == 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 + btfsc STATUS,C ; no carry = borrow = not deeper + return ; deeper than 0 m == ok + ; too shallow, limit to 0m movlw LOW d'1000' movwf sim_pressure+0 movlw HIGH d'1000' @@ -1766,291 +1848,383 @@ return ;============================================================================= -; Compare all enabled gas in list, to see if a better one is available. +; Find the best gas and diluent for the current depth +; and check if a gas/diluent change is to be advised. +; +; Output: best_gas_number : number of best gas, 0= none avail, 255= not computed +; best_dil_number : number of best dil, 0= none avail, 255= not computed +; better_gas_available : flag indicating if a change is advised +; better_dil_available : flag indicating if a change is advised +; +; +; in CCR and pSCR mode: - checks both, gases and diluents for respective best gas / best diluent +; - if not in bailout, sets better_dil_available on diluents +; - if in bailout, sets better_gas_available on OC gases +; +; in OC mode : - checks only gases for best gas +; - sets better_gas_available on OC gases ; -; Output: better_gas_available, better_gas_number +check_gas_best: + movff amb_press_10+0,xA+0 ; copy ambient pressure / 10 into xA:2, will be used by ppO2 min/max checks later + movff amb_press_10+1,xA+1 ; ... + ; set maximum ppO2 allowed + movff char_I_ppO2_max,ppO2_max ; max ppO2 for working phase (default) + movff char_O_deco_info,lo ; bank-safe copy of deco info vector + btfsc lo,deco_flag ; is the ppo2 deco limit enabled? + movff char_I_ppO2_max_deco,ppO2_max ; YES - replace by max ppO2 for deco phase + ; check dive mode + btfsc FLAG_oc_mode ; in OC mode? + bra check_gas_best_gas ; YES - skip diluents, check for best gas only + +check_gas_best_dil: + ; set minimum ppO2 required + movff char_I_ppO2_min,WREG ; min ppO2 for pure diluent in CCR mode (default) + btfsc FLAG_pscr_mode ; in pSCR mode? + movff char_I_ppO2_min_loop,ppO2_min ; YES - replace by min ppO2 for pure diluent in pSCR mode + ; preset results to nothing found + clrf best_gas_num ; initialize best diluent as 0 = nothing found yet + bcf better_dil_available ; =1: a better diluent is available and a gas change is advised in divemode +; ; current diluent = 'gas6' ? +; movlw .6 ; +; cpfseq active_dil ; using 'gas6' as current diluent? +; bra check_gas_best_dil0 ; NO - continue +; bra check_gas_best_dil3 ; YES - suppress better diluent search in this case +;check_gas_best_dil0: + ; check all diluents + lfsr FSR1,opt_dil_O2_ratio ; set base address for diluent arrays + movff active_dil,lo ; number of currently used diluent + setf best_gas_depth ; initialize change depth of best dil found so far to 255 meter +; original code + clrf check_gas_num + incf check_gas_num,F + rcall check_gas_best_common ; check diluent 1 + incf check_gas_num,F + rcall check_gas_best_common ; check diluent 2 + incf check_gas_num,F + rcall check_gas_best_common ; check diluent 3 + incf check_gas_num,F + rcall check_gas_best_common ; check diluent 4 + incf check_gas_num,F + rcall check_gas_best_common ; check diluent 5 +; alternative code +; movlw .5 +; movwf check_gas_num +;check_gas_best_dil_loop: +; rcall check_gas_best_common +; decfsz check_gas_num +; bra check_gas_best_dil_loop ; -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 - movlw d'100' - movwf xB+0 - clrf xB+1 - 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 -check_gas_change2: - 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_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 - -check_gas_change_exit: - 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 + ; store result + movff best_gas_num,best_dil_number ; store new best diluent found (1-5 or 0 of no usable diluent available) + ; check if change advices shall be given in general + btfsc FLAG_bailout_mode ; in bailout? + bra check_gas_best_gas ; YES - no better diluent advice when in bailout +check_gas_best_dil1: + ; check if a change advice shall be given right now + movf best_dil_number,W ; load number of best diluent into WREG (1-5) + bz check_gas_best_dil3 ; has a best diluent been found at all? NO - nothing to signal for + cpfseq active_dil ; is this the currently used diluent? + bra check_gas_best_dil2 ; NO + bra check_gas_best_dil3 ; YES - no need to signal a better diluent if this diluent is already in use +check_gas_best_dil2: + btfsc setpoint_fallback ; is a fallback warning active? + bra check_gas_best_dil3 ; YES - suppress better diluent prompt in this case + ; not using the best gas - show better diluent hint whenever a better diluent is available + bsf better_dil_available ; signal that a better diluent is available + bsf FLAG_TFT_active_gas_divemode ; redraw gas/setpoint/diluent +check_gas_best_dil3: + btfss better_dil_available ; shall a better diluent be signaled for? + bcf blinking_better_dil ; NO - clear blinking flag + ; continue with checking for best bailout gas + +check_gas_best_gas: + ; set minimum ppO2 required + movff char_I_ppO2_min,ppO2_min ; min ppO2 for OC/Bailout + ; preset results to nothing found + clrf best_gas_num ; initialize best gas as 0 = nothing found yet + bcf better_gas_available ; =1: a better gas is available and a gas change is advised in divemode +; ; current gas = 'gas6' ? +; movlw .6 ; +; cpfseq active_gas ; using 'gas6' as current gas? +; bra check_gas_best_gas0 ; NO - continue +; bra check_gas_best_gas3 ; YES - suppress better gas search in this case +;check_gas_best_gas0: + ; check all gases + lfsr FSR1,opt_gas_O2_ratio ; set base address for gas arrays + movff active_gas,lo ; number of currently used gas + setf best_gas_depth ; initialize change depth of best gas found so far to 255 meter +; original code + clrf check_gas_num + incf check_gas_num,F + rcall check_gas_best_common ; check gas 1 + incf check_gas_num,F + rcall check_gas_best_common ; check gas 2 + incf check_gas_num,F + rcall check_gas_best_common ; check gas 3 + incf check_gas_num,F + rcall check_gas_best_common ; check gas 4 + incf check_gas_num,F + rcall check_gas_best_common ; check gas 5 +; alternative code +; movlw .5 +; movwf check_gas_num +;check_gas_best_gas_loop: +; rcall check_gas_best_common +; decfsz check_gas_num +; bra check_gas_best_gas_loop +; + ; store result + movff best_gas_num,best_gas_number ; store new best gas found (1-5 or 0 of no usable gas available) + ; check if change advices shall be given in general + btfsc FLAG_oc_mode ; in OC mode? + bra check_gas_best_gas1 ; YES + btfsc FLAG_bailout_mode ; in bailout? + bra check_gas_best_gas1 ; YES + return ; NO - no better (OC) gas advice when not in OC or bailout mode +check_gas_best_gas1: ; check if we are already on the best gas + ; check if a change advice shall be given right now + movf best_gas_number,W ; load number of best gas into WREG (1-5) + bz check_gas_best_gas3 ; has a best gas been found at all? NO - nothing to signal for + cpfseq active_gas ; is this the currently used gas? + bra check_gas_best_gas2 ; NO + bra check_gas_best_gas3 ; YES - no need to signal a better gas if this gas is already in use +check_gas_best_gas2: + ; not using the best gas - show better gas hint whenever a better gas is available + bsf better_gas_available ; YES - signal that a better gas is available + bsf FLAG_TFT_active_gas_divemode ; YES - redraw gas/setpoint/diluent +check_gas_best_gas3: + btfss better_gas_available ; shall a better gas be signaled for? + bcf blinking_better_gas ; NO - clear blinking flag 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_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 - 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 - 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 ppO2 (0-4) into WREG to be used as index + movff PLUSW1,check_gas_O2_ratio ; load O2 ratio (%) of current gas/dil into check_gas_O2_ratio + addlw .20 ; add offset of 20 bytes to index type in opt_gas_type/opt_dil_type + movff PLUSW1,check_gas_type ; load type of current gas/dil into check_gas_type (0=disabled, 1=first, 2=travel/normal, 3=deco/-) + addlw .10 ; add offset of 10 bytes to index change depth in opt_gas_change/opt_dil_change + movff PLUSW1,check_gas_depth ; load change depth of current gas/dil into check_gas_depth + ; check if gas is usable (i.e. not disabled) + tstfsz check_gas_type ; type = disabled (0)? + bra check_gas_best_common0 ; NO - continue checks + movf check_gas_num,W ; YES - get the number of the gas to be checked (1-5) + cpfseq lo ; - is this the currently used gas? + return ; NO - skip disabled gases which are not the current gas + bra check_gas_best_common1 ; YES - a gas in use overrides it's disabled status, therefore treat it as available +check_gas_best_common0: + ; skip deco gases (type=3) if not in deco mode, but search among all enabled gases when in loop or bailout mode + movlw .3 + cpfseq check_gas_type ; type = deco (3)? + bra check_gas_best_common1 ; NO - proceed + btfsc FLAG_bailout_mode ; YES - in bailout? + bra check_gas_best_common1 ; YES - proceed, include deco gases + movff char_O_main_status,WREG ; NO - get main deco mode + btfsc WREG,DECO_MODE_LOOP_FLAG ; - in loop mode? + bra check_gas_best_common1 ; YES - proceed, include deco gases + movff char_O_deco_info,WREG ; NO - get deco info vector + btfss WREG,deco_flag ; - in deco mode (deco_flag set), i.e. use of deco gases allowed? + return ; NO - skip deco gas while not in deco mode +check_gas_best_common1: ; YES - proceed +; ; check if gas change depth is below minimum change depth +; movlw minimum_change_depth ; for value see definition in hwos.inc +; cpfsgt check_gas_depth ; change depth of checked gas > minimum_change_depth? +; return ; NO - change depth not deep enough, skip and check next gas + ; check if gas is usable, i.e. its change depth is below or equal to the current depth + movf curr_depth,W ; load current depth (in m) into WREG + cpfslt check_gas_depth ; change depth of checked gas < (shallower than) current depth? + bra check_gas_best_common2 ; NO - gas is usable + return ; YES - gas is not usable +check_gas_best_common2: + ; check if this gas is the first best gas candidate + movf best_gas_num,W ; get best gas found so far (1-5) or 0 if none found yet + tstfsz WREG ; has a best gas candidate been found yet? + bra check_gas_best_common3 ; YES - check if the new one is better than the one we have so far + bra check_gas_best_common4 ; NO - no need to do the above mentioned check +check_gas_best_common3: + ; check if the change depth of the checked gas is < (shallower) than the change depth of the best gas found so far + movf best_gas_depth,W ; load change depth of best gas so far into WREG + cpfslt check_gas_depth ; change depth of checked gas < (shallower than) change depth of best gas so far? + return ; NO - this gas is not better than the best already found +check_gas_best_common4: + ; check if the gas fits into the ppO2 limits + movff check_gas_O2_ratio,xB+0 ; xB = O2 ratio, xA is still loaded with (p_amb / 10) clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 - movff lo,xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; lo * p_amb/10 - - ; 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 - 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 PRODL,sub_a+0 - movff PRODH,sub_a+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - return ; Done (Too low). - - ;check if we are within our warning thresholds! + call mult16x16 ; xC = O2 ratio * (p_amb / 10) + ; check for very high ppO2 + tstfsz xC+2 ; O2_ratio * p_amb / 10 > 65536, i.e. ppO2 > 6.55 bar ? + return ; YES - gas is not usable + btfsc xC+1,7 ; check if ppO2 > 3.30 bar + return ; YES - gas is not usable + ; check for low ppO2 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 + movf ppO2_min,W + mullw .100 ; char_I_ppO2_min * 100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 - 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. - - -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 -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 - 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 - 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 + btfsc sp2_switched ; SP 2 used so far? + bra check_dive_autosp3 ; YES - continue with SP 3 + movff char_I_setpoint_change+1,lo ; NO - get depth in m + tstfsz lo ; - SP change depth = 0 ? + bra check_dive_autosp2a ; NO - continue + bra check_dive_autosp3 ; YES - continue with SP 3 check_dive_autosp2a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp3 ; lower depth, do not switch + decf lo,W ; SP change depth -1 -> WREG + cpfsgt curr_depth ; current depth > change depth - 1 ? + bra check_dive_autosp3 ; NO - continue with SP 3 ; 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 + movff char_I_setpoint_cbar+1,char_I_const_ppO2 ; YES - use SP + rcall xmit_sp_set_flag ; - send SP to external devices + bsf sp2_switched ; - set SP 2 used 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 + btfsc sp3_switched ; SP 3 used so far? + bra check_dive_autosp4 ; YES - continue with SP 4 + movff char_I_setpoint_change+2,lo ; NO - get depth in m + tstfsz lo ; - SP change depth = 0 ? + bra check_dive_autosp3a ; NO - continue + bra check_dive_autosp4 ; YES - continue with SP 4 check_dive_autosp3a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp4 ; lower depth, do not switch + decf lo,W ; SP change depth -1 -> WREG + cpfsgt curr_depth ; current depth > change depth - 1 ? + bra check_dive_autosp4 ; NO - continue with SP 4 ; 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 + movff char_I_setpoint_cbar+2,char_I_const_ppO2 ; YES - use SP + rcall xmit_sp_set_flag ; - send SP to external devices + bsf sp3_switched ; - set SP 3 used 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 + btfsc sp4_switched ; SP 4 used so far? + bra check_dive_autosp5 ; YES - continue with SP 5 + movff char_I_setpoint_change+3,lo ; NO - get depth in m + tstfsz lo ; - SP change depth = 0 ? + bra check_dive_autosp4a ; NO - continue + bra check_dive_autosp5 ; YES - continue with SP 5 check_dive_autosp4a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp5 ; lower depth, do not switch + decf lo,W ; SP change depth -1 -> WREG + cpfsgt curr_depth ; current depth > change depth - 1 ? + bra check_dive_autosp5 ; NO - continue with SP 5 ; 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 + movff char_I_setpoint_cbar+3,char_I_const_ppO2 ; YES - use SP + rcall xmit_sp_set_flag ; - send SP to external devices + bsf sp4_switched ; - set SP 4 used 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 + btfsc sp5_switched ; SP 5 used so far? + bra check_dive_autosp6 ; YES - done + movff char_I_setpoint_change+4,lo ; NO - get depth in m + tstfsz lo ; - SP change depth = 0 ? + bra check_dive_autosp5a ; NO - continue + bra check_dive_autosp6 ; YES - done check_dive_autosp5a: - decf lo,W ; -1 -> WREG - cpfsgt xC+0 ; Compare with depth - bra check_dive_autosp6 ; lower depth, do not switch + decf lo,W ; SP change depth -1 -> WREG + cpfsgt curr_depth ; current depth > change depth - 1 ? + bra check_dive_autosp6 ; NO - done ; 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 + movff char_I_setpoint_cbar+4,char_I_const_ppO2 ; YES - use SP + rcall xmit_sp_set_flag ; - send SP to external devices + bsf sp5_switched ; - set SP 5 used flag check_dive_autosp6: 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 event flag + 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 + 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. +; Setup everything to enter dive mode ; + global dive_boot_oc_bail +dive_boot_oc_bail: + ; 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 + ; done + return + + global dive_boot_oc dive_boot_oc: - rcall get_first_gas_to_WREG ; Gets first gas (1-5) into WREG + ; set-up registers + rcall get_first_gas_to_WREG ; get 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 + global dive_boot_cc 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 - + ; copy opt_dil_types into backup (for "lost diluent" 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 + ; clear flags + bcf FLAG_bailout_mode ; =1: bailout + bcf setpoint_fallback ; =1: fallback to SP1 due to external O2 sensor failure + ; set-up registers + rcall get_first_dil_to_WREG ; get first diluent (1-5) into WREG + rcall setup_dil_registers ; set-up of diluent parameters for currently breathed diluent (with WREG = current diluent 1-5) + rcall deco_setup_cc_diluents ; set-up of diluent list for deco calculations (with WREG = current diluent 1-5) + ; done + return + +dive_boot_cc_part2: ; revoke sensors from usage if they do not have a valid calibration bsf use_O2_sensor1 bsf use_O2_sensor2 @@ -2061,108 +2235,120 @@ bcf use_O2_sensor2 btfss sensor3_calibrated_ok bcf use_O2_sensor3 - + ; check for external HUD/ppO2 Monitor btfss optical_input ; do we have an optical input? - bra dive_boot_cc_0 ; No - ; Copy (initial) valid flags from HUD/ppO2 Monitor + bra dive_boot_cc_part2_1 ; NO + ; copy (initial) valid flags from HUD/ppO2 Monitor btfsc sensor1_active - bsf use_O2_sensor1 - btfsc sensor2_active - bsf use_O2_sensor2 + bsf use_O2_sensor1 + btfsc sensor2_active + bsf use_O2_sensor2 btfsc sensor3_active - bsf use_O2_sensor3 - -dive_boot_cc_0: + bsf use_O2_sensor3 +dive_boot_cc_part2_1: ; 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. + ; 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 + bra dive_boot_cc_part2_2 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 + bnz dive_boot_cc_part2_2 movlw .0 movff WREG,opt_ccr_mode - -dive_boot_cc_1: +dive_boot_cc_part2_2: 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) - + 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 ; 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 + btfsc FLAG_ccr_mode ; are we in CCR mode? 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) + diveloop_boot: + + ; do the basic initialization call restart_set_modes_and_flags - call I2C_sleep_accelerometer ; stop accelerometer - call I2C_sleep_compass ; stop compass + ; stop accelerometer and compass + call I2C_sleep_accelerometer + call I2C_sleep_compass + + ; reset max pressure aka max depth + clrf WREG + movff WREG,max_pressure+0 + movff WREG,max_pressure+1 + + ; initialize press needs to zero and invalid (not yet computed) state + clrf WREG ; set WREG to 0 + IFDEF _cave_mode + movff WREG,char_I_backtrack_time ; clear backtracking time (index to char_I_backtrack_depth) + movff WREG,char_I_backtrack_depth ; prime first entry with depth 0 + ENDIF + bsf WREG,int_is_zero ; set zero flag + bsf WREG,int_invalid_flag ; set invalid flag (additionally) + banksel int_O_ascent_pres_need ; select bank with shared output vars + movwf int_O_ascent_pres_need+1 ; Set flags for tank pressure needs = 0 before p2_deco.c + movwf int_O_ascent_pres_need+3 ; can do it. If this is not done here and the gas needs + movwf int_O_ascent_pres_need+5 ; custom view is shown before p2_deco.c completes the first + movwf int_O_ascent_pres_need+7 ; deco calculation, some rubbish numbers from last dive or + movwf int_O_ascent_pres_need+9 ; simulation may be shown + banksel common ; back to bank common + + ; configure the deco engine + clrf hi + bsf hi,DECO_Z_FACTOR_FLAG ; enable Z factor mode by default + TSTOSS opt_ZfactorUse ; shall use Z factor mode? + bcf hi,DECO_Z_FACTOR_FLAG ; NO - disable again + IFDEF _rx_functions + bsf hi,DECO_TR_FUNCTIONS ; enable TR mode by default + btfss FLAG_tr_enabled ; shall use TR mode? + bcf hi,DECO_TR_FUNCTIONS ; NO - disable again + ENDIF + movff hi,char_O_main_status ; bank-safe copy to deco engine + + movff char_O_deco_status,lo ; bank-safe read + bsf lo,DECO_STATUS_0_FLAG ; set init- | ATTENTION: The deco engine must be started in init state! If omitted, it may + bsf lo,DECO_STATUS_1_FLAG ; state, | enter an infinite loop at some point in time and brick the OSTC! + bcf lo,DECO_PLAN_FLAG ; normal plan mode, + bcf lo,DECO_VOLUME_FLAG ; disable gas volume calculation, and + bcf lo,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff lo,char_O_deco_status ; bank-safe copy back to deco engine clrf WREG - 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 - - ; 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 - - clrf WREG - 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 - + movff WREG,char_O_deco_warnings ; clear any deco warnings remaining from last dive + movff WREG,char_O_deco_info ; clear any deco infos remaining from last dive + + movlw deco_distance ; load distance between actual depth and depth used for deco calculation + movff WREG,char_I_deco_distance ; write distance to the deco engine + + movff opt_last_stop,char_I_depth_last_deco ; write last stop depth to deco engine + movff opt_GF_low,char_I_GF_Low_percentage ; write GF low to deco engine + movff opt_GF_high,char_I_GF_High_percentage ; write GF high to deco engine + + bcf onesectoggle ; clear toggle bit for calculation phasing + bcf use_agf ; start with normal GF set + bcf divemode_menu ; clear dive mode 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 + bcf blinking_depth_warning ; clear flag for blinking depth as warning + bcf blinking_depth_attention ; clear flag for blinking depth as attention + bcf max_depth_greater_100m ; clear flag for last max/avg depth was > 100 m movlw d'1' movwf apnoe_max_pressure+0 clrf apnoe_max_pressure+1 ; clrf apnoe_surface_mins ; clrf apnoe_surface_secs - clrf apnoe_mins - clrf divemins+0 - clrf divemins+1 - - ; Copy date and time for logbook + + ; copy date and time for logbook movff year,start_year movff month,start_month movff day,start_day @@ -2171,146 +2357,187 @@ 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 - bcf WREG,int_attention_flag ; clear attention flag + bcf WREG,int_warning_flag ; clear warning flag + bcf WREG,int_attention_flag ; clear attention flag 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 dive mode bcf divemode_menu_active 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 - -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 - - 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 menupos2 ; reset to zero (Zero=no pre-menu or simulator task) + bsf sensors_agree ; init of sensors disagree warning system + + bcf show_safety_stop ; =1: show the safety stop + clrf safety_stop_countdown ; clear count-down + + clrf samplesecs ; timer for data logging clrf apnoe_timeout_counter ; timeout in minutes 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_divesecs_total+0 ; clear non-resettable time accumulator + clrf average_divesecs_total+1 + clrf average_depth_hold_total+0 ; clear non-resettable average depth 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 - call ghostwriter_short_header ; Write short header with divenumber into profile memory + clrf average_depth_hold_total+3 + call reset_average ; reset the resettable average depth + + IFDEF _rx_functions + btfss FLAG_tr_enabled ; TR functions enabled? + bra diveloop_boot_0 ; NO - skip TR function initialization + ; YES - initialize TR function variables + banksel int_O_sac_rate + clrf int_O_sac_rate+0 ; clear low byte of SAC rate + clrf int_O_pressure_need+0 ; clear low byte of 1st pressure need value + clrf int_O_pressure_need+2 ; clear low byte of 2nd pressure need value + banksel int_IO_pressure_value + clrf int_IO_pressure_value+0 ; clear low byte of 1st pressure reading value + clrf int_IO_pressure_value+2 ; clear low byte of 2nd pressure reading value + clrf int_I_pressure_drop+0 ; clear low byte of 1st pressure drop value + clrf int_I_pressure_drop+2 ; clear low byte of 2nd pressure drop value + clrf char_I_pressure_gas+0 ; clear gas selection of 1st pressure reading + clrf char_I_pressure_gas+1 ; clear gas selection of 2nd pressure reading + clrf char_I_pressure_age+0 ; clear age of 1st pressure reading + clrf char_I_pressure_age+1 ; clear age of 2nd pressure reading + clrf char_I_pressure_stat+0 ; clear status of 1st pressure reading + clrf char_I_pressure_stat+1 ; clear status of 2nd pressure reading + clrf WREG ; clear WREG + bsf WREG,int_not_avail_flag ; set WREG to coding for integer numbers -> data not available + banksel int_O_sac_rate + movwf int_O_sac_rate+1 ; copy to high byte of SAC rate + movwf int_O_pressure_need+1 ; copy to high byte of 1st pressure need value + movwf int_O_pressure_need+3 ; copy to high byte of 1st pressure need value + banksel int_IO_pressure_value + movwf int_IO_pressure_value+1 ; copy to high byte of 1st pressure reading value + movwf int_IO_pressure_value+3 ; copy to high byte of 2nd pressure reading value + movwf int_I_pressure_drop+1 ; copy to high byte of 1st pressure drop value + movwf int_I_pressure_drop+3 ; copy to high byte of 1st pressure drop value + banksel gas__last_1st ; select bank with vars for pressure drop calculation + setf gas__last_1st ; invalidate last gas of 1st reading + setf gas__last_2nd ; invalidate last gas of 2nd reading + banksel common ; back to bank common + ENDIF + +diveloop_boot_0: + bcf decostop_active ; clear flag for being in deco + setf best_gas_number ; initialize best gas as not computed yet (255) + setf best_dil_number ; initialize best diluent as not computed yet (255) + bcf better_gas_available ; =1: a better gas is available and a gas change is advised + bcf better_dil_available ; =1: a better diluent is available and a gas change is advised + + rcall dive_boot_oc_bail ; basic settings required for all modes + + btfsc FLAG_oc_mode ; in OC mode? + rcall dive_boot_oc ; YES - add OC mode settings + + btfsc FLAG_ccr_mode ; in CCR mode? + rcall dive_boot_cc ; YES - add CC mode settings + btfsc FLAG_ccr_mode ; in CCR mode? + rcall dive_boot_cc_part2 ; YES - add CC sensor and SP settings + + btfsc FLAG_pscr_mode ; in pSCR mode? + rcall dive_boot_cc ; YES - add CC mode settings + btfsc FLAG_pscr_mode ; in pSCR mode? + rcall dive_boot_cc_part2 ; YES - add CC sensor and SP settings + + call ghostwriter_short_header ; write short header with dive number into profile memory 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 + + ; normal mode = surface pressure is the pressure 30 minutes before dive + SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ;copy surface pressure to deco routine + SAFE_2BYTE_COPY last_surfpressure_30min, last_surfpressure ;copy surface pressure to last_surfpressure for correct depth 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 surface pressure to deco routine + ; simulator mode: set surface pressure to 1 bar because simulated depths are also based on 1 bar surface pressure + 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 minimum temperature registers call init_recording_params ; set up all the divisors - 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 + bsf FLAG_diluent_setup ; for CCR mode (required to have better gas working) + btfsc FLAG_ccr_mode ; =1: CCR mode (fixed ppO2 or Sensor) active + bra diveloop_boot_3 btfsc FLAG_pscr_mode - bra divemode_boot2 - bcf ccr_diluent_setup ; For OC mode (Required to have better gas working) - -divemode_boot2: + bra diveloop_boot_3 + bcf FLAG_diluent_setup ; for OC mode (required to have better gas working) + +diveloop_boot_3: bcf LEDg ; switch off green LED / release reset to RX circuitry - bcf LEDr ; switch off red LED + 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 + btfss simulatormode_active ; in simulator mode? + call disable_rs232 ; NO - disable RS232 + + IFDEF _screendump + btfsc enable_screen_dumps ; =1: ignore vin_usb, wait for "l" command (screen dump) + call enable_rs232 ; also sets to speed_normal + ENDIF + + ; reset dive time seconds +; movlw .2 ; start at 2 seconds +; movwf total_divetime_seconds+0 +; clrf total_divetime_seconds+1 +; movwf divesecs +; movwf apnoe_secs +; bsf divemode2 ; displayed dive time is running (dive time starts HERE) + + ; clear the timers (start dive times at zero) + clrf 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 - + clrf divesecs + clrf divemins+0 + clrf divemins+1 + clrf apnoe_secs + clrf apnoe_mins + + ; divemode2 flag will be set by pressure & timeout evaluation in function set_dive_modes + + return ; done with dive mode boot + + +;============================================================================= divemode_check_for_warnings: - movlw .1 ; One warning at a time in alt. layout mode + movlw .1 ; one message at a time in alternative layout 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... + movlw .2 ; two messages at a time in default layout + cpfsgt message_counter ; only one (or two) messages active? + bra divemode_check_for_warnings1; YES - update every second + + btfss secs,0 ; every two seconds... return - btfss secs,1 ; Every four seconds... + btfss secs,1 ; every four seconds... return divemode_check_for_warnings1: - 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 - - 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 + bcf message_advice ; clear flag for messages of level advice + bcf message_attention ; clear flag for messages of level attention + bcf message_warning ; clear flag for messages of level warning + clrf message_counter ; clear message counter + + ; messages sorted by severity: highest severity warnings first, then attentions, advices and last info + + ; warnings for all modes + call check_warn_battery ; check if the battery level should be displayed/warned + call check_divetimeout ; check and show the dive mode timeout (not actually a warning) + + btfsc FLAG_apnoe_mode ; in Apnoe mode? + bra divemode_check_for_warnings2; YES + btfsc FLAG_gauge_mode ; in gauge mode? + bra divemode_check_for_warnings2; YES + + ; warnings applicable 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? @@ -2318,118 +2545,133 @@ 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 + rcall check_outside ; check of ZHL16 model violation 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_OC_gas_avail ; check if a breathable OC gas is available + + btfsc decostop_active ; in deco mode? + rcall check_and_store_gf_violation; YES - sets warnings, if required + + rcall check_mbubbles ; check for micro bubbles 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 - - 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 setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - rcall warn_fallback ; Show the warning + rcall check_gas_needs_ascent ; show gas needs warning if any gas need for ascent is > threshold + + rcall check_eod_cns_violation ; check CNS values for end-of-dive and display warning, if required + + rcall check_display_ftts ; show @+x time + + IFDEF _cave_mode + btfsc FLAG_cave_mode ; cave mode enabled? + rcall check_cavemode ; YES - check cave mode status + ENDIF + + btfsc use_agf ; in aGF mode? + rcall warn_agf ; YES - show memo + + btfsc setpoint_fallback ; fallback to SP1 due to external O2 sensor failure? + rcall warn_fallback ; YES - show a warning + + btfsc better_dil_available ; is a better diluent available? + rcall advice_gas_change ; YES - display an advice + btfsc better_gas_available ; is a better gas available? + rcall advice_gas_change ; YES - display an advice 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 - -; Setup warning_page number - incf warning_page,F - movf warning_page,W + IFDEF _rx_functions + btfss FLAG_tr_enabled ; TR functions enabled? + bra divemode_check_for_warnings3 ; NO - skip + call check_tr_functions ; YES - check transmitter functions + call check_tr_messages ; - check SAC attention and switch advice + ENDIF + +divemode_check_for_warnings3: + ; Display the attention or warning icon? + btfsc message_advice ; any message of level advice? + bsf FLAG_TFT_divemode_warning ; YES + btfsc message_attention ; any message of level attention? + bsf FLAG_TFT_divemode_warning ; YES + btfsc message_warning ; any message of level warning? + bsf FLAG_TFT_divemode_warning ; YES + btfss FLAG_TFT_divemode_warning ; any message of above levels? + bsf FLAG_TFT_divemode_warning_clear ; NO - clear warning icon + + ; Setup message page number + incf message_page,F + movf message_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 + btfss alternative_divelayout ; in alternative layout? + rlcf message_page,W ; NO - *2 + cpfsgt message_counter ; > message_counter? + clrf message_page ; NO - clear + + ; Clear both rows of messages if there is nothing to show at all + tstfsz message_counter ; any messages? + bra divemode_check_for_warnings4 ; 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. + +divemode_check_for_warnings4: + ; Clear 2nd row of messages 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 global check_warn_battery check_warn_battery: movff batt_percent,lo movlw battery_show_level+1 - cpfslt lo - return ; No Display, no warning + cpfslt lo ; battery percentage ok? + return ; YES - 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) + cpfsgt lo ; battery percent below warning threshold? + bsf message_warning ; YES - set warning flag + btfsc alternative_divelayout ; in alternative layout? + bra check_warn_battery2 ; YES - show warning + movlw index_clock_batt_surfpress ; NO - index of custom view clock, battery and surface pressure + cpfseq menupos3 ; - battery shown in custom view? + bra check_warn_battery2 ; NO - show warning + return ; YES - do not show twice (in custom view and in message area) check_warn_battery2: - incf warning_counter,F ; increase counter - goto TFT_update_batt_percent_divemode ; Show percent (And return) + incf message_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 ; dive time running? + return ; YES - do nothing + incf message_counter,F ; increase counter + goto TFT_divetimeout ; show timeout counter (and return) check_ppO2: - 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 - bra check_ppO2_oc_1 ; NO - neither CCR nor pSCR -check_ppO2_loop: - 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_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_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) - btfsc WREG,int_low_flag ; breathed ppO2 to low? + btfsc FLAG_oc_mode ; are we in OC mode? + bra check_ppO2_1 ; YES - continue with breathed gas + btfsc FLAG_bailout_mode ; NO - in bailout? + bra check_ppO2_1 ; YES - continue with breathed gas + ; CCR / pSCR mode - checks on pure diluent + movff int_O_pure_ppO2+0,lo ; get value and attention/warning flags for the pure diluent + movff int_O_pure_ppO2+1,hi ; + btfsc hi,int_warning_flag ; ppO2 of the pure diluent to low or high? + rcall check_ppO2_dw ; YES - show warning and return on next line + btfsc hi,int_attention_flag ; ppO2 of the pure diluent in attention state? + rcall check_ppO2_da ; YES - show attention and return on next line + ; all modes - checks on breathed gas (OC or from loop) +check_ppO2_1: + movff int_O_breathed_ppO2+0,lo ; get value and attention/warning flags for the breathed gas + movff int_O_breathed_ppO2+1,hi ; get warnings for breathed gas + btfsc hi,int_attention_flag ; breathed ppO2 in attention state (when in loop mode, no attention will be generated)? + bra check_ppo2_display_a ; YES - set attention flag and show ppO2 + btfsc hi,int_low_flag ; breathed ppO2 to low? bra check_ppO2_low ; YES - record the warning and show ppO2 - btfsc WREG,int_high_flag ; breathed ppO2 to high? + btfsc hi,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) - return ; NO - no warnings, no show - bra check_ppo2_display ; YES - just show ppO2 + return ; NO - no warnings, no show - done + bra check_ppO2_common_2 ; YES - but only when in OC or bailout... check_ppO2_low: movlw d'4' ; set type of alarm (ppO2 low) bra check_ppO2_common ; continue with common part @@ -2437,37 +2679,47 @@ 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 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? - 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) -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) + bsf event_occured ; set event flag + bsf message_warning ; show warning sign +check_ppO2_common_2: + btfsc FLAG_oc_mode ; are we in OC mode? + bra check_ppo2_display ; YES + btfsc FLAG_bailout_mode ; are we in bailout mode? + bra check_ppo2_display ; YES + return ; NO - in loop mode, ppO2 is already shown via setpoint display +check_ppo2_display_a: + bsf message_attention ; show attention sign +check_ppo2_display: + btfsc alternative_divelayout ; in alternative layout? + bra check_ppO2_d ; YES - show warning + movlw index_ppo2_ead_end_cns ; NO - index of custom view ppO2, EAD/END and CNS) + cpfseq menupos3 ; ppO2 shown? + 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) -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) + movlw index_pscr_info ; index of custom view with pSCR data + cpfseq menupos3 ; ppO2 shown? + bra check_ppO2_d ; NO - show warning + return ; YES - do not show twice (in custom view and in warning area) +check_ppO2_dw: + bsf message_warning ; show warning sign +check_ppO2_da: + bsf message_attention ; show attention sign (no problem if a warning sign is set as well, as it will take priority) check_ppO2_d: - incf warning_counter,F ; increase counter - goto TFT_display_ppo2 ; show breathed gas or diluent ppO2 warning (and return) + incf message_counter,F ; increase counter + goto TFT_display_ppo2_warning ; show breathed gas or diluent ppO2 warning (and return) + + +check_display_ftts: + movff char_I_extra_time,lo ; get extra time + tstfsz lo ; extra time > 0 ? + bra check_display_ftts_1 ; YES - continue checking bailout condition + return ; NO - done +check_display_ftts_1: + btfsc FLAG_bailout_mode ; in bailout mode? + return ; YES - in bailout no fTTS will be computed, so nothing to display + incf message_counter,F ; NO - increase counter + goto TFT_display_ftts ; - show @+x time global check_cns_violation @@ -2475,32 +2727,35 @@ ; 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 -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) -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) -display_cns_violation3: - incf warning_counter,F ; increase counter - goto TFT_display_cns ; Show CNS (and return) + bra check_cns_violation_1 ; YES - issue warning + btfsc WREG,int_attention_flag ; NO - attention flag set? + bra check_cns_violation_2 ; YES - issue attention + return ; NO - done +check_cns_violation_1: + bsf message_warning ; show warning sign +check_cns_violation_2: + bsf message_attention ; show attention sign + btfsc alternative_divelayout ; in alternative layout? + bra check_cns_violation_4 ; YES - show attention + movlw index_ppo2_ead_end_cns ; NO - index of custom view ppO2, EAD/END and CNS + cpfseq menupos3 ; - CNS shown? + bra check_cns_violation_3 ; NO + return ; YES - do not show twice (in custom view and in warning area) +check_cns_violation_3: + movlw index_CNS ; index of custom view with CNS values + cpfseq menupos3 ; CNS shown? + bra check_cns_violation_4 ; NO + return ; YES - do not show twice (in custom view and in warning area) +check_cns_violation_4: + incf message_counter,F ; increase counter + goto TFT_display_cns ; show CNS (and return) 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 + return ; YES - inhibit end-of-dive 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 @@ -2511,16 +2766,18 @@ 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 + 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 - return ; YES - do not show twice (in custom view and in warning area) +check_eod_cns_violation2: ; issue warning (actually only on attention level) + bsf message_attention ; show attention sign + btfsc alternative_divelayout ; in alternative layout? + bra display_eod_cns_violation ; YES - show warning + movlw index_CNS ; NO - index of custom view with CNS values + cpfseq menupos3 ; - CNS values shown? + 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 + incf message_counter,F ; increase counter goto TFT_display_eod_cns ; issue CNS at end-of-dive warning (and return) @@ -2532,7 +2789,7 @@ 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 + bsf message_warning ; set warning flag bra check_and_store_gf_violation3 ; show gf warning check_and_store_gf_violation2: btfsc WREG,int_attention_flag ; check if the attention flag is set @@ -2543,56 +2800,268 @@ 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 + bsf message_attention ; show attention sign + incf message_counter,F ; increase counter goto TFT_warning_gf ; show GF (and return) check_and_store_gf_violation4: ; check for deco info - btfss divemode ; in divemode? + btfss divemode ; in dive mode? 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 - - -warn_outside: - incf warning_counter,F ; increase counter - 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) - + btfsc FLAG_bailout_mode ; YES - in bailout mode? + return ; YES - done, return (deco_decreasing flag is not updated when in bailout mode) + movff char_O_deco_info,WREG ; NO - get the deco info vector + btfss WREG,deco_decreasing ; check if the deco_decreasing flag is set + return ; NO - done, return + incf message_counter,F ; YES - increase counter + goto TFT_info_deco ; - show deco info + + +check_outside: + movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings + btfss WREG,outside_warning_lock ; are we outside of the ZH-L16 model? + return ; NO - done + incf message_counter,F ; YES - increase counter + bsf message_attention ; - show attention sign + btfsc WREG,outside_warning ; - are we outside the ZH-L16 model right now (-> warning)? + bsf message_warning ; - set warning flag + goto TFT_warning_outside ; - show outside-ZHL-model warning/attention (and return) + + + global check_mbubbles +check_mbubbles: + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning ; are we in micro bubbling zone right now? + bra check_mbubbles_warn ; YES + btfss WREG,mbubble_warning_lock ; were we in micro bubbling zone? + return ; NO - done +check_mbubble_att ; YES - attention level + incf message_counter,F ; increase counter + bsf message_attention ; show attention sign + goto TFT_warning_mbubbles ; show micro bubble attention (and return) - TFT_warning_mbubbles switches by itself between attention and warning +check_mbubbles_warn: ; locked micro bubbles - warning level if at issue, attention level if locked + incf message_counter,F ; increase counter + bsf message_warning ; set warning flag + goto TFT_warning_mbubbles ; show micro bubbles warning (and return) + + IFDEF _cave_mode +check_cavemode: + incf message_counter,F ; increase counter + btfsc FLAG_dive_turned ; dive turned? + goto TFT_info_dive_turned ; YES - show info that dive is turned + btfsc FLAG_cave_mode_shutdown ; NO - has cave mode shut down? + goto TFT_warn_cave_shutdown ; YES - show that cave mode has shut down + goto TFT_info_cave_mode ; NO - show that cave mode is active + ENDIF + warn_agf: - incf warning_counter,F ; increase counter - goto TFT_warning_agf ; Show aGF warning (and return) + incf message_counter,F ; increase counter + 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) - - -check_gas_needs: - banksel int_O_tank_pres_need - 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) + incf message_counter,F ; increase counter + bsf message_warning ; set warning flag + goto TFT_warning_fallback ; show fallback warning (and return) + + + IFDEF _rx_functions + +check_tr_messages: + movff int_O_sac_rate+1,WREG ; bank-safe copy of current SAC rate + btfss WREG,int_attention_flag ; attention flag set? + bra check_tr_messages2 ; NO - skip + btfsc WREG,int_not_avail_flag ; SAC rate available? + bra check_tr_messages2 ; NO - continue with swap advice + bsf message_attention ; YES - show attention sign + btfsc alternative_divelayout ; - in alternative layout? + bra check_tr_messages1 ; YES - show attention message + movlw index_pressures_SAC ; NO - index of custom view with SAC rate + cpfseq menupos3 ; - SAC rate shown right now? + bra check_tr_messages1 ; NO - show attention message + bra check_tr_messages2 ; YES - do not show twice, continue with swap advice +check_tr_messages1: + incf message_counter,F ; increase counter + call TFT_attention_sac ; show SAC attention +check_tr_messages2: + movff char_O_deco_info,WREG ; bank-safe copy of deco info vector + btfss WREG,ind_double_switch ; swap tank flag set? + return ; NO + incf message_counter,F ; YES - increase counter + bsf message_advice ; - show advice sign + goto TFT_advice_switch ; - show swap advice + + +#DEFINE show_custview ul,0 ; show pressure readings custom view +#DEFINE show_transmitter ul,1 ; show transmitter attention +#DEFINE show_pres_warning ul,2 ; show transmitter pressure warning +#DEFINE show_pres_attention ul,3 ; show transmitter pressure attention + +check_tr_functions: + clrf ul ; set all messages as not shown yet + btfsc alternative_divelayout ; in alternative layout? + bra check_tr_functions_tr1 ; YES - continue with checking transmitter 1 + movlw index_pressures_SAC ; NO - index of custom view pressure readings + cpfseq menupos3 ; - pressure readings shown? + bra check_tr_functions_tr1 ; NO - continue with checking transmitter 1 + bsf show_custview ; YES - suppress redraw by faking it has already been redrawn +check_tr_functions_tr1: + movff char_I_pressure_stat+0,WREG ; get status of 1st pressure reading + rcall check_tr_functions_helper1 ; check for transmitter 1 lost + rcall check_tr_functions_helper2 ; check for transmitter 1 low battery + movff int_IO_pressure_value+1,WREG ; get high byte of 1st pressure reading + rcall check_tr_functions_helper3 ; check for transmitter 1 pressure warning + rcall check_tr_functions_helper4 ; check for transmitter 1 pressure attention +check_tr_functions_tr2: + movff char_I_pressure_stat+1,WREG ; get status of 2nd pressure reading + rcall check_tr_functions_helper5 ; check for transmitter 2 lost + rcall check_tr_functions_helper6 ; check for transmitter 2 low battery + movff int_IO_pressure_value+3,WREG ; get high byte of 2nd pressure reading + rcall check_tr_functions_helper7 ; check for transmitter 2 pressure warning + rcall check_tr_functions_helper8 ; check for transmitter 2 pressure attention +check_tr_functions_show_xmtr: + btfss show_transmitter ; shall show transmitter message? + bra check_tr_functions_show_warn ; NO - continue with pressure warning + bsf message_attention ; YES - set flag for attention + incf message_counter,F ; - increase counter + call TFT_attention_transmitter ; - show transmitter attention message +check_tr_functions_show_warn: + btfss show_pres_warning ; shall show pressure warning? + bra check_tr_functions_show_att ; NO - continue with pressure attention + bsf message_warning ; YES - set flag for warning + incf message_counter,F ; - increase counter + goto TFT_warning_pres_reading ; - pressure reading warning message and done then +check_tr_functions_show_att: + btfss show_pres_attention ; shall show pressure attention? + return ; NO - done + bsf message_attention ; YES - set flag for attention + incf message_counter,F ; - increase counter + goto TFT_attention_pres_reading ; - pressure reading warning message and done then + +check_tr_functions_helper1: + btfsc WREG,char_transmitter_lost ; transmitter 1 lost? + bra check_tr_functions_helper1a ; YES - show transmitter attention message + bcf transmitter1_lost ; NO - clear flag for old lost attention + return ; - done +check_tr_functions_helper1a: + bsf show_transmitter ; show transmitter attention + btfsc transmitter1_lost ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter1_lost ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper2: + btfsc WREG,char_transmitter_low_bat ; transmitter 1 low battery? + bra check_tr_functions_helper2a ; YES - show transmitter attention message + bcf transmitter1_battery ; NO - clear flag for old battery attention + return ; - done +check_tr_functions_helper2a: + bsf show_transmitter ; show transmitter attention + btfsc transmitter1_battery ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter1_battery ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper3: + btfsc WREG,int_warning_flag ; transmitter 1 pressure warning? + bra check_tr_functions_helper3a ; YES - show pressure reading message as warning + bcf transmitter1_pres_warn ; NO - clear flag for old warning + return ; - done +check_tr_functions_helper3a: + bsf show_pres_warning ; show pressure warning + btfsc transmitter1_pres_warn ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter1_pres_warn ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper4: + btfsc WREG,int_attention_flag ; transmitter 1 pressure attention? + bra check_tr_functions_helper4a ; YES - show pressure reading message as attention + bcf transmitter1_pres_att ; NO - clear flag for old attention + return ; - done +check_tr_functions_helper4a + bsf show_pres_attention ; show pressure attention + btfsc transmitter1_pres_att ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter1_pres_att ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper5: + btfsc WREG,char_transmitter_lost ; transmitter 2 lost? + bra check_tr_functions_helper5a ; YES - show transmitter attention message + bcf transmitter2_lost ; NO - clear flag for old lost attention + return ; - done +check_tr_functions_helper5a: + bsf show_transmitter ; show transmitter attention + btfsc transmitter2_lost ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter2_lost ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper6: + btfsc WREG,char_transmitter_low_bat ; transmitter 2 low battery? + bra check_tr_functions_helper6a ; YES - show transmitter attention message + bcf transmitter2_battery ; NO - clear flag for old battery attention + return ; - done +check_tr_functions_helper6a: + bsf show_transmitter ; show transmitter attention + btfsc transmitter2_battery ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter2_battery ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper7: + btfsc WREG,int_warning_flag ; transmitter 2 pressure warning? + bra check_tr_functions_helper7a ; YES - show pressure reading message as warning + bcf transmitter2_pres_warn ; NO - clear flag for old warning + return ; - done +check_tr_functions_helper7a: + bsf show_pres_warning ; show pressure warning + btfsc transmitter2_pres_warn ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter2_pres_warn ; YES - memorize it's an old message now + bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_helper8: + btfsc WREG,int_attention_flag ; transmitter 2 pressure attention? + bra check_tr_functions_helper8a ; YES - show pressure reading message as attention + bcf transmitter2_pres_att ; NO - clear flag for old attention + return ; - done +check_tr_functions_helper8a + bsf show_pres_attention ; show pressure attention + btfsc transmitter2_pres_att ; is it a new message? + return ; NO - do not show the pressure readings custom view again + bsf transmitter2_pres_att ; YES - memorize it's an old message now + ;bra check_tr_functions_show_cv ; - show custom view + +check_tr_functions_show_cv: + btfsc show_custview ; is the pressure readings custom view not shown yet shown? + return ; NO - already shown, done + bsf show_custview ; YES - mark as shown + btfsc alternative_divelayout ; - in alternative layout? + call switch_layout_to_normal ; YES - switch to normal layout + movlw index_pressures_SAC-1 ; custom view number one below pressure readings + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> pressure readings view will be shown + return ; done + + ENDIF + + +check_gas_needs_ascent: + banksel int_O_ascent_pres_need + movf int_O_ascent_pres_need+1,w ; get high byte from pres need of 1st tank + iorwf int_O_ascent_pres_need+3,w ; inclusive or with high byte from pres need of 2nd tank + iorwf int_O_ascent_pres_need+5,w ; inclusive or with high byte from pres need of 3rd tank + iorwf int_O_ascent_pres_need+7,w ; inclusive or with high byte from pres need of 4th tank + iorwf int_O_ascent_pres_need+9,w ; inclusive or with high byte from pres need of 5th tank banksel common 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 + btfsc WREG,int_warning_flag ; check if any gas has a pres_need >= pres_fill + bsf message_warning ; YES - set warning flag + btfsc WREG,int_warning_flag ; check if any gas has a pres_need >= pres_fill goto TFT_warning_gas_needs_warn ; Yes - show a warning - btfsc WREG,int_attention_flag ; NO - check if any gas has a pres_need >= pres_fill * threshold + btfsc WREG,int_attention_flag ; check if any gas has a pres_need >= pres_fill * threshold + bsf message_attention ; YES - set attention flag + btfsc WREG,int_attention_flag ; 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 @@ -2600,8 +3069,8 @@ check_warn_sensors_disagree: - incf warning_counter,F ; increase counter - bsf warning_active ; YES - set Warning flag + incf message_counter,F ; increase counter + bsf message_warning ; YES - set warning flag goto TFT_warning_sensor_disagree ; show sensor disagree warning (and return) @@ -2611,75 +3080,119 @@ 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 + incf message_counter,F ; YES - increase counter goto TFT_warning_IBCD ; write warning to display +check_OC_gas_avail: + tstfsz best_gas_number ; is a breathable gas available? + return ; > 0 : a breathable gas is available + btfsc FLAG_ccr_mode ; = 0 : problem - in CCR mode? + bra check_OC_gas_avail_1 ; YES - real problem + btfsc FLAG_pscr_mode ; NO - in PSCR mode? + bra check_OC_gas_avail_1 ; YES - real problem + return ; NO - neither CCR nor pSCR mode, suppress warning +check_OC_gas_avail_1: + btfsc FLAG_bailout_mode ; in bailout? + return ; YES - suppress warning + incf message_counter,F ; NO - increase counter + bsf message_attention ; set attention flag + goto TFT_warning_no_BO_gas ; show message (and return) + + +advice_gas_change: + bsf message_advice ; show advice sign + incf message_counter,F ; increase counter + goto TFT_advice_gas_change + + global restart_deco_engine global restart_deco_engine_wo_ceiling restart_deco_engine: - ; make bank save copies and set flags for invalid data + ; invalidate ceiling movff int_O_ceiling+1,WREG bsf WREG,char_invalid_flag ; int_O_ceiling has its invalid flag on a char's position! movff WREG,int_O_ceiling+1 restart_deco_engine_wo_ceiling: - ; make more bank save copies and set more flags for invalid data + ; invalidate deco data (stop table data) movff char_O_deco_gas+0,WREG bsf WREG,char_invalid_flag movff WREG,char_O_deco_gas+0 + ; invalidate ascent time (normal plan) movff int_O_ascenttime+1,WREG bsf WREG,int_invalid_flag movff WREG,int_O_ascenttime+1 - movff int_O_alternate_ascenttime+1,WREG - bsf WREG,int_invalid_flag - movff WREG,int_O_alternate_ascenttime+1 - + ; invalidate CNS at end of dive in normal plan movff int_O_normal_CNS_fraction+1,WREG bsf WREG,int_invalid_flag movff WREG,int_O_normal_CNS_fraction+1 + ; restart deco engine + movff char_O_main_status,WREG ; get current main engine configuration + bcf WREG,DECO_COMPLETED_NORM ; eventually clear flag stating completion of normal plan + bsf WREG,DECO_COMPLETED_ALT ; fake we came from alternative plan to force normal plan to be done next + movff WREG,char_O_main_status ; write back new configuration + movff char_O_deco_status,WREG ; get current deco engine status + bcf WREG,DECO_STATUS_0_FLAG ; set status flags to... + bcf WREG,DECO_STATUS_1_FLAG ; ... DECO_STATUS_START + movff WREG,char_O_deco_status ; write back new configuration to restart deco computations + +inval_alternative_plan_data: + ; invalidate ascent time (alternative plan) + movff int_O_alternate_ascenttime+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_alternate_ascenttime+1 + + ; invalidate CNS at end of dive in alternative plan movff int_O_alternate_CNS_fraction+1,WREG bsf WREG,int_invalid_flag movff WREG,int_O_alternate_CNS_fraction+1 - movff int_O_tank_pres_need+1,WREG + ; invalidate ascent gas needs + movff int_O_ascent_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 WREG,int_O_ascent_pres_need+1 + + IFDEF _rx_functions + ; invalidate pressure needs (TR functions) + movff int_O_pressure_need+1,WREG + bsf WREG,int_not_avail_flag + movff WREG,int_O_pressure_need+1 + movff int_O_pressure_need+3,WREG + bsf WREG,int_not_avail_flag + movff WREG,int_O_pressure_need+3 + ENDIF + + ; update display depended on NDL or deco mode + bsf FLAG_TFT_display_ndl_or_deko return ;============================================================================= -; simulator mode +; Simulator Mode ; global do_demo_divemode do_demo_divemode: - call option_save_all ; Save all settings into EEPROM before starting simulation + call TFT_ClearScreen ; blank screen + 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 + banksel common ; bank 1 + + ; +++ COMMENT OUT FOR TESTING PURPOSE ONLY !!! +++ + bsf restore_deco_data ; restore tissue and CNS after simulator use + ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ bcf pressure_refresh - btfss pressure_refresh ; Wait for sensor + btfss pressure_refresh ; wait for sensor bra $-2 - bsf simulatormode_active ; Set Flag - ; Compute dive ambient conditions - banksel char_I_bottom_depth + bsf simulatormode_active ; set flag + + banksel char_I_bottom_depth ; compute dive ambient conditions movf char_I_bottom_depth,W mullw .100 movff PRODL,rel_pressure+0 @@ -2690,9 +3203,9 @@ movlw HIGH (.1000) addwfc PRODH,W movff WREG,sim_pressure+1 - banksel common ; Bank1 + banksel common ; bank 1 bsf divemode - goto diveloop ; Switch into Divemode! + goto diveloop ; switch into dive mode END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/divemode.inc --- a/src/divemode.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/divemode.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.inc REFACTORED VERSION V2.97 +; File divemode.inc REFACTORED VERSION V2.99d ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -15,17 +15,17 @@ ; Divemode layout: -; row=0...239 -; column=0...159 (x2) +; row =0...239 +; column =0...159 (x2) ; Divemode has multiple layouts but basicly splits the screen into 3 rows: -; - upper content row: depth, max depth, dive time, etc. +; - upper content row: depth, max depth, dive time, etc. ; - custom content view with selectable views ; - bottom content: temp, gas, ndl, tts, etc. -; I. The upper content row. (0-99) -; The top row can be divided 2 areas: -; - header: has the titles (mask) +; I. The upper content row (0-99) +; The top row can be divided 2 areas: +; - header : has the titles (mask) ; - content: has the values ;******* Upper content / header row ******* #DEFINE dm_mask_depth_row .0 @@ -43,85 +43,85 @@ ; 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_row dm_offset ; TOP - 14 - start position of the depth 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_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_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_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_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 +#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_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_row dm_warning_row ; 50 +#DEFINE dm_warning1_column dm_warning_column ; 64 +#DEFINE dm_warning1_bot dm_warning1_row+.23 ; 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_row dm_warning_row+.24 ; 74 +#DEFINE dm_warning2_column dm_warning_column ; 64 +#DEFINE dm_warning2_bot dm_warning2_row+.23 ; 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_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_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_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 +#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_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_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_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_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_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_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_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) @@ -129,66 +129,84 @@ #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 -; 1. Stopwatch with avarage depth -; 2. Decoplan - decompression stops up to 6 stops -; 3. Time, EAD/END and tissue saturation (graph) -; 4. GF and aGF pairs -; 5. Compass -; 6. HUD - 3 sensor readings -; 7. Gas list -; 8. Ceiling (for GF_hi) -;******* Custom content / Global ******* +; The custom view display area is: 101,163,0,159 (t,b,l,r), or 0,101->159,163 + +;******* Custom View: Global ******* #DEFINE dm_customview_row dm_offset+.87 ; 101 -#DEFINE dm_customview_column .0 ; 0 +#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 +;******* Custom View: Avg depth, stopwatch and avg depth ******* #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_column1 .0 ; 0 +#DEFINE dm_custom_avr_stop_column2 .54 ; 54 #DEFINE dm_custom_avr_stop_column3 .118 ; 118 -;******* Custom content / #2 - Decompressions stops ******* +;******* Custom View: 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_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_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_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 ; 115 +#DEFINE dm_cust_dstop_4th_stop_column .56 ; 56 +#DEFINE dm_cust_dstop_5th_stop_row dm_cust_dstop_3rd_stop_row ; 138 +#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_row dm_cust_dstop_2nd_stop_row ; 115 #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_row dm_cust_dstop_3rd_stop_row ; 138 #DEFINE dm_cust_dstop_7th_stop_column dm_cust_dstop_6th_stop_column ; 111 -;******* Custom content / #3 - Time, EAD/END and tissue saturation ******* +;******* Custom View: Time, Battery, Surface Pressure ******* ; 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 -; EAD/AND +#DEFINE dm_custom_clock_column .0 ; 0 +; Battery +#DEFINE dm_custom_battery_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_battery_volt_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_battery_percent_row dm_custom_ead_row+.23 ; 140 +#DEFINE dm_custom_battery_column .62 ; 62 +; Surface Pressure +#DEFINE dm_custom_surfpres_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_surfpres_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_surfpres_column .95 ; 95 + +;****** Custom View: ppO2, EAD/ENDS and CNS ******* +; ppO2 +#DEFINE dm_custom_ppo2_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_ppo2_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_ppo2_column .2 ; 2 +; EAD/END #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_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_end_column dm_custom_ead_column ; 50 +; CNS +#DEFINE dm_custom_cns_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_cns_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_cns_column .115 ; 115 + +;****** Custom View: tripple CNS ******* +#DEFINE dm_custom_cns3_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_cns3_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_cns3_column1 .8 ; 8 +#DEFINE dm_custom_cns3_column2 .62 ; 62 +#DEFINE dm_custom_cns3_column3 .115 ; 115 + +;****** Custom View: Ceiling, Tissues, (current GF) +; Ceiling +#DEFINE dm_custom_ceiling_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_ceiling_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_ceiling_column .62 ; 62 ; Tissue title #DEFINE dm_custom_tissue_title_row dm_customview_row+.1 ; 102 #DEFINE dm_custom_tissue_title_column .120 ; 120 @@ -201,100 +219,72 @@ #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_frame_spacing .8 ; 8 -;******* Custom content / #4 - GF-lo/hi, aGF-lo/hi, current GF value ******* +;******* Custom View: 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 -; GF #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 -; Current GF -#DEFINE dm_custom_currentgf_row dm_custom_gf_row ; 119 -#DEFINE dm_custom_currentgf_column .118 ; 118 +#DEFINE dm_custom_gf_column1 .0 ; 0 +#DEFINE dm_custom_gf_column2 .60 ; 60 +#DEFINE dm_custom_gf_column3 .118 ; 118 -;******* Custom content / #5 - Compass ******* +;******* Custom View: 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_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_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_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_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 +;******* Custom View: O2 Sensor Values ******* +#DEFINE dm_custom_hud_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_hud_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 -; col #1 -#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 +;******* Custom View: Gas Needs ******* +#DEFINE dm_custom_gas_mask_row dm_customview_row ; 101 +#DEFINE dm_custom_gas_row1 dm_customview_row+.14 ; 115 +#DEFINE dm_custom_gas_row2 dm_customview_row+.37 ; 138 +#DEFINE dm_custom_gas_column_title .29 ; 29 +#DEFINE dm_custom_gas_column1 .5 ; 5 +#DEFINE dm_custom_gas_column2 .85 ; 85 -;******* 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 - -; 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 +; ******* Custom View: Tank Pressures ******* +#DEFINE dm_custom_tankdata_mask_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_tankdata_row dm_customview_row+.16 ; 117 +#DEFINE dm_custom_tankdata_pres1_col .2 ; 2 +#DEFINE dm_custom_tankdata_pres2_col .115 ; 115 +#DEFINE dm_custom_tankdata_SAC_col .56 ; 56 -;******* 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 -; 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 ******* -; 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 -; 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 +;******* Custom View: Sensor Check ******* +#DEFINE dm_custom_s_check_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_s_check_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_s_check_title_column .50 ; 50 +#DEFINE dm_custom_ppO2_column .115 ; 115 +#DEFINE dm_custom_ppDil_column .2 ; 2 -; II. End of the custom content row. (101-163) +;******* Custom View: PSCR Info ******* +#DEFINE dm_custom_pscr_title_row dm_customview_row+.1 ; 102 +#DEFINE dm_custom_pscr_row dm_customview_row+.18 ; 119 +#DEFINE dm_custom_pscr_drop_column .55 ; 55 +#DEFINE dm_custom_pscr_ratio_column .105 ; 105 + +; 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 @@ -304,83 +294,83 @@ ; simulator menu, active/dil gas, decostop, Apnea surface time and max depth ; The content row contains 2 columns: ; - temperature, gas names -; - NDL/TTS, DecoStop +; - 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_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_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+.18 ; 183 +#DEFINE dm_simtext_column .36 ; 35 ; Diluent gas #DEFINE dm_active_dil_row dm_3rdrow_top+.19 ; 185 -#DEFINE dm_active_dil_column .0 ; 0 +#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_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_column .82 ; 82 ; Safety 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"!!! +#DEFINE dm_safetystop_text_column .80 ; 80 for the 4 chars "Stop" ; TTS -#DEFINE dm_tts_value_row dm_3rdrow_top+.32; ; 197 (pre: 207) +#DEFINE dm_tts_value_row dm_3rdrow_top+.32; ; 197 #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_text_row dm_tts_value_row+.5 ; 202 +#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_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_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_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_surface_time_text_row .192 ; 192 +#DEFINE dm_apnoe_surface_time_text_col .30 ; 30 +#DEFINE dm_apnoe_surface_time_row .207 ; 207 +#DEFINE dm_apnoe_surface_time_column .15 ; 15 +#DEFINE dm_apnoe_last_max_depth_text_row .192 ; 192 #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_row .207 ; 207 #DEFINE dm_apnoe_last_max_depth_column .100 ; 100 -; IV. The last set of parameters are for the menus displayed in dive mode +; IV. The last set of parameters is 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_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_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_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_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_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_item6_column dm_menu_item4_column ; 89 diff -r 00b24fb4324d -r ca4556fb60b9 src/eeprom_rs232.asm --- a/src/eeprom_rs232.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/eeprom_rs232.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File eeprom_rs232.asm V2.98 +; File eeprom_rs232.asm V2.99a ; ; Internal EEPROM, RS232 ; @@ -25,8 +25,8 @@ endm ;============================================================================= -eeprom code 0xF00000+0x10 -; Skip SERIAL number. Should not be overwritten. +eeprom code 0xF00000+0x10 +; skip SERIAL number - it should not be overwritten global eeprom_serial_save global eeprom_opt_backup @@ -35,50 +35,24 @@ eeprom_opt_backup res 0x3E ;============================================================================= -basic CODE +ee_rs232 CODE global write_int_eeprom_1 write_int_eeprom_1: movwf EEADR -; 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 - + bra write_eeprom ; writes and "returns" after write 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 -; Input: EEADRH:EEADR = EEPROM address. -; Output: EEDATA. -; Trashed: NONE. +; reads from internal EEPROM +; Input: EEADRH:EEADR = EEPROM address +; Output: EEDATA +; Trashed: NONE global read_eeprom read_eeprom: bcf EECON1,EEPGD @@ -86,6 +60,32 @@ 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 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 disable_ir_s8 disable_ir_s8: banksel TXSTA2 @@ -93,8 +93,8 @@ clrf RCSTA2 banksel common bcf ir_power ; IR off - bcf mcp_power ; Power-down instrumentation amp - bsf s8_npower ; Power-down S8 HUD + bcf mcp_power ; power-down instrumentation amp + bsf s8_npower ; power-down S8 HUD return @@ -102,28 +102,28 @@ enable_ir_s8: ;init serial port2 (TRISG2) btfsc analog_o2_input - bra enable_s8 ; Start S8 + bra enable_s8 ; start S8 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 + movlw .102 ; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16 MHz movwf SPBRG2 movlw b'10010000' movwf RCSTA2 banksel common - bsf ir_power ; Power-up IR + 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 instrumentation amp + 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 @@ -132,21 +132,21 @@ 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 + bcf s8_npower ; power S8 HUD + WAITMS d'1' ; very short delay btfsc PORTG,2 ; RX2=1? - bra enable_s8_2 ; Yes, digital + bra enable_s8_2 ; YES - digital WAITMS d'30' btfsc PORTG,2 ; RX2=1? - bra enable_s8_2 ; Yes, digital + 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 + bsf s8_npower ; power-down S8 HUD + bcf s8_digital ; clear flag return enable_s8_2: ; S8 Digital @@ -155,24 +155,24 @@ movwf BAUDCON2 movlw b'00100000' ; BRGH=0, SYNC=0 movwf TXSTA2 - movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16MHz + movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16 MHz movwf SPBRG2 movlw b'10010000' movwf RCSTA2 banksel common - bsf s8_digital ; Set flag + bsf s8_digital ; set flag return ;============================================================================= global enable_rs232 enable_rs232: - call speed_normal ; 16MHz + call speed_normal ; 16 MHz enable_rs232_2: movlw T2CON_NORMAL cpfseq T2CON - bra enable_rs232_2 ; Wait until speed is normal - bcf PORTE,0 ; Start comms + 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 @@ -186,42 +186,43 @@ clrf RCSTA1 clrf TXSTA1 ; UART disable bcf PORTC,6 ; TX hard to GND - bsf PORTE,0 ; Stop comms + bsf PORTE,0 ; stop comms return global rs232_wait_tx rs232_wait_tx: btfss TXSTA1,TRMT ; RS232 Busy? - bra rs232_wait_tx ; yes, wait... + bra rs232_wait_tx ; YES - wait... btfss ble_available ; ble available? - return ; No, done. + return ; NO - done - btfsc NRTS ; Wait for Bluetooth module - bra rs232_wait_tx ; yes, wait... - return ; Done. + btfsc NRTS ; wait for Bluetooth module + bra rs232_wait_tx ; YES - wait... + return ; done global rs232_wait_tx2 rs232_wait_tx2: banksel TXSTA2 rs232_wait_tx2_1: - btfss TXSTA2,TRMT ; RS232 Busy? - bra rs232_wait_tx2_1 ; yes, wait... + btfss TXSTA2,TRMT ; RS232 busy? + bra rs232_wait_tx2_1 ; YES - wait... banksel common - return ; Done. + return ; done global rs232_get_byte rs232_get_byte: bcf rs232_receive_overflow ; clear flag - movlw .10 - movwf uart1_temp + clrf uart1_temp ; set uart1_temp to .10 without using WREG: first clear to 0, then... + bsf uart1_temp,1 ; set bit 1 (value 2), + bsf uart1_temp,3 ; and bit 3 (value 8). clrf uart2_temp clrf uart3_temp rs232_get_byte2: btfsc PIR1,RCIF ; data arrived? - return ; Yes + return ; YES decfsz uart3_temp,F bra rs232_get_byte2 decfsz uart2_temp,F @@ -231,7 +232,7 @@ ; 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 @@ -239,12 +240,10 @@ 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 + movlw 0x26 + cpfslt hi ; is offset < 0x26?? (decimal 9983 at max, hence save for another +10) ? + return ; NO - abort + movff lo,EEDATA ; YES - proceed writing offset to EEPROM write_int_eeprom 0x0D movff hi,EEDATA write_int_eeprom 0x0E @@ -256,7 +255,7 @@ read_int_eeprom 0x0D movff EEDATA,lo read_int_eeprom 0x0E - movff EEDATA,hi ; Existing logbook offset into lo:hi + movff EEDATA,hi ; existing logbook offset into lo:hi return @@ -335,8 +334,8 @@ movff POSTINC1,EEDATA call write_eeprom ; EEDATA into EEPROM@EEADR incf EEADR,F - decfsz lo,F ; All done? - bra vault_decodata_into_eeprom2 ; No + decfsz lo,F ; all done? + bra vault_decodata_into_eeprom2 ; NO clrf EEADRH return @@ -386,13 +385,13 @@ movwf EEADR movlw .128 movwf lo - lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128Bytes + lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128 Bytes 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 + decfsz lo,F ; all done? + bra restore_decodata_from_eeprom2 ; NO clrf EEADRH return @@ -400,7 +399,7 @@ global reset_battery_internal_only reset_battery_internal_only: clrf EEADRH - clrf EEDATA ; Delete to zero + clrf EEDATA ; delete to zero write_int_eeprom 0x07 write_int_eeprom 0x08 write_int_eeprom 0x09 @@ -422,15 +421,15 @@ global eeprom_reset_logbook_pointers eeprom_reset_logbook_pointers: - clrf EEADRH ; Make sure to select EEPROM bank 0 + 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 .2 ; also delete total dive counter write_int_eeprom .3 write_int_eeprom .16 - write_int_eeprom .17 ; And the backup counter, too + write_int_eeprom .17 ; ...and the backup counter, too return END diff -r 00b24fb4324d -r ca4556fb60b9 src/external_flash.asm --- a/src/external_flash.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/external_flash.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File external_flash.asm ## V2.98 +; File external_flash.asm ## V2.98c ; ; External flash ; @@ -12,7 +12,8 @@ #include "hwos.inc" #include "wait.inc" -basic CODE +ext_flash CODE + ;============================================================================= global incf_ext_flash_address_p1 diff -r 00b24fb4324d -r ca4556fb60b9 src/gaslist.asm --- a/src/gaslist.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/gaslist.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File gaslist.asm ## V2.98 +; File gaslist.asm REFACTORED VERSION V2.99e ; ; Managing OSTC gas list ; @@ -9,378 +9,589 @@ ; HISTORY ; 2011-08-11 : [jDG] Creation. -#include "hwos.inc" ; Mandatory header +#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 "wait.inc" + + IFDEF _rx_functions +#include "rx_ops.inc" + ENDIF extern convert_mbar_to_feet extern customview_show_mix + extern tSetup_GasDepth extern tGasDisabled extern tDilDisabled + extern tLiter + extern tbar10 extern tbar -gui CODE +gaslist CODE ;============================================================================= -; Append gas description to current string. +; Helper Functions for divemenu_tree.asm +; +; They need to be put in a different file than +; where the MENU_DYNAMIC macros uses them. + + global do_toggle_gf_label +do_toggle_gf_label: + 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_toggle_gf_label_1 ; NO - print in disabled color + movff opt_enable_aGF,WREG ; =1: aGF can be selected underwater + decfsz WREG,W ; aGF enabled? + bra do_toggle_gf_label_1 ; NO - print in disabled color + bra do_toggle_gf_label_2 ; YES to both - print in standard color +do_toggle_gf_label_1: + call TFT_disabled_color +do_toggle_gf_label_2: + STRCAT_TEXT tDivemenu_ToggleGF + return + + + IFDEF _cave_mode + global do_turn_dive_label +do_turn_dive_label: + btfss FLAG_cave_mode ; in cave mode? + call TFT_disabled_color ; NO - print in disabled color + btfsc FLAG_dive_turned ; dive already turned? + call TFT_attention_color ; YES - print in attention color + STRCAT_TEXT tDivemenu_TurnDive ; output label + return + ENDIF + + + global do_toggle_max_pres_diff_label +do_toggle_max_pres_diff_label: + movff opt_TR_mode,WREG ; get TR mode + xorlw .2 ; compare with 2 (ind.double) + tstfsz WREG ; equal? + call TFT_disabled_color ; NO - print in disabled color + STRCAT_TEXT tTrMaxDeltaP ; output label + movff char_I_max_pres_diff,lo + output_99 + STRCAT_TEXT tbar ; " bar" + return + + global gaslist_copy_dil_to_oc +gaslist_copy_dil_to_oc: +; +; Memory Map: +; ----------------------------------------- +; opt_gas_O2_ratio res 5 +; opt_dil_O2_ratio res 5 +; opt_gas_He_ratio res 5 +; opt_dil_He_ratio res 5 +; opt_gas_type res 5 +; opt_dil_type res 5 +; opt_gas_change res 5 +; opt_dil_change res 5 +; +; char_I_tank_size res 10 +; char_I_tank_pres_fill res 10 +; + bcf aux_flag ; clear aux_flag by default + movf gaslist_gas,W ; copy current gas or diluent number to WREG + btfss FLAG_diluent_setup ; in CCR menus? + bra gaslist_copy_dil_to_oc_1 ; NO - gaslist_gas is already pointing to an OC gas + addlw -.5 ; YES - subtract offset between diluents and gases + movwf gaslist_gas ; - let gaslist_gas point to the corresponding OC gas + bsf aux_flag ; - remember we came from a CCR menu + bcf FLAG_diluent_setup ; - pretend we came from an OC gas menu +gaslist_copy_dil_to_oc_1: + lfsr FSR0,opt_dil_O2_ratio ; load base address of diluents settings, ASM variables + lfsr FSR1,opt_gas_O2_ratio ; load base address of gas settings, ASM variables + movff PLUSW0,PLUSW1 ; copy O2 ratio + addlw .10 ; add offset from O2 ratios to He ratios + movff PLUSW0,PLUSW1 ; copy He ratio + addlw .10 ; add offset from He ratios to types + movff PLUSW0,PLUSW1 ; copy type + addlw .10 ; add offset from type to change depth + movff PLUSW0,PLUSW1 ; copy change depth + addlw -.30 ; wind back to initial gas number + lfsr FSR0,char_I_tank_size+5 ; load base address of diluents settings, shared variables + lfsr FSR1,char_I_tank_size+0 ; load base address of gas settings, shared variables + movff PLUSW0,PLUSW1 ; copy tank size + addlw .10 ; add offset from tank sizes to pressure budget + movff PLUSW0,PLUSW1 ; copy pressure budget + call gaslist_cleanup_list ; make sure that there will be just one first gas + btfss aux_flag ; did we came from a CCR menu? + return ; NO - done + bsf FLAG_diluent_setup ; YES - restore proper origin again + movlw .5 ; - offset between OC gases and diluents + addwf gaslist_gas,F ; - let gaslist_gas point to the diluent again + WIN_BOX_BLACK .30,.239,.0,.159 ; - create some visual effect to show activity + WAITMS .200 ; - pause for 200 ms + return ; - done + + +;============================================================================= +; Append gas description to current string +; ; Input: PRODL : gas number (0..4) -; FSR2 : Current string position. -; Output: Text appended into buffer pointed by FSR2. +; FSR2 : Current string position +; Output: Text appended into buffer pointed by FSR2 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: -gaslist_strcat_gas_0: - 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 + global gaslist_strcat_gas_WREG +gaslist_strcat_gas: ; entry point with gas/dil in PRODL (0-4) and FLAG_diluent_setup + movff PRODL,gaslist_gas ; get current menu item (0-4) + movlw .5 ; offset between gases and diluents + btfsc FLAG_diluent_setup ; in CCR menus? + addwf gaslist_gas,F ; YES - add the offset + movf gaslist_gas,W ; copy to WREG +gaslist_strcat_gas_WREG: ; entry point with gas/dil in WREG (0-9) + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movff PLUSW1,lo ; read O2 ratio + lfsr FSR1,opt_gas_He_ratio ; load base address of opt_gas_He_ratio + movff PLUSW1,hi ; read 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. +; 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 +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 + movff gas6_O2_ratio,hi ; TFT_color_code_gaslist needs O2 ratio in hi + call TFT_color_code_gaslist ; color-code according to O2 ratio and depth + movff gas6_O2_ratio,lo ; customview_show_mix needs O2 ratio in lo + movff gas6_He_ratio,hi ; ... and He ratio in hi + goto customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and return +;============================================================================= +; Helper functions for menu_tree + global gaslist_GasDepth +gaslist_GasDepth: + movf gaslist_gas,W ; load gas/dil index into WREG (0-9) + lfsr FSR1,opt_gas_change ; load base address of change depths + tstfsz PLUSW1 ; change depth = 0 ? + bra gaslist_GasDepth_1 ; NO + lfsr FSR1,opt_gas_type ; YES - load base address of opt_gas_type + tstfsz PLUSW1 ; - type = disabled ? + call TFT_attention_color ; NO - print in attention color (yellow) +gaslist_GasDepth_1: + STRCAT_TEXT tSetup_GasDepth + return global gaslist_show_type gaslist_show_type: movf gaslist_gas,W - lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] - movff PLUSW1,lo ; lo holds gas type + lfsr FSR1,opt_gas_type ; load base address of opt_gas_type + movff PLUSW1,lo ; read gas type STRCAT_TEXT tType - lfsr FSR1,tGasDisabled ; Base text number - btfsc ccr_diluent_setup ; In CCR setup? - lfsr FSR1,tDilDisabled ; Base text number + lfsr FSR1,tGasDisabled ; load base address of gas type labels + btfsc FLAG_diluent_setup ; in CCR setup? + lfsr FSR1,tDilDisabled ; YES - load base address of diluent type labels movff lo,WREG ; 0-3 rlncf WREG ; x2 - addwf FSR1L,F + addwf FSR1L,F ; adjust address pointer to required text movlw .0 addwfc FSR1H,F - call strcat_text + call strcat_text ; copy label text return + global gaslist_toggle_type gaslist_toggle_type: 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 + lfsr FSR1,opt_gas_type ; load base address of opt_gas_type + movff PLUSW1,lo ; read gas type + incf lo,F ; increment type + btfsc FLAG_diluent_setup ; in CCR setup? + bra gaslist_toggle_type2 ; YES - diluents + btfsc lo,2 ; NO - gases, type index > 3 ? + clrf lo ; YES - clear to zero + movff lo,PLUSW1 ; - copy back result return gaslist_toggle_type2: movlw .3 - cpfslt lo ; >2? - clrf lo ; Clear to zero - movf gaslist_gas,W - movff lo,PLUSW1 ; Copy back result - return - - global gaslist_setSP -gaslist_setSP: - movff PRODL,gaslist_gas ; 0-4 + cpfslt lo ; index > 2 ? + clrf lo ; YES - clear to zero + movf gaslist_gas,W ; restore gaslist_gas in WREG + movff lo,PLUSW1 ; copy back result return global gaslist_strcat_setpoint global gaslist_strcat_setpoint_0 -gaslist_strcat_setpoint: - call gaslist_setSP -gaslist_strcat_setpoint_0: +gaslist_strcat_setpoint: ; entry point with setpoint index in PRODL + movff PRODL,gaslist_gas ; get current menu item (0-4) +gaslist_strcat_setpoint_0: ; entry point with setpoint index in gaslist_gas 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 + btfsc short_gas_decriptions ; shall use short versions of gaslist_strcat_setpoint? + bra gaslist_strcat_setpoint2 ; YES - use short version + STRCAT_TEXT tSP ; "SP" + incf gaslist_gas,W ; (0-4) -> (1-5) into WREG movwf lo - output_8 + output_8 ; print SP number bcf leftbind PUTC ":" -gaslist_strcat_setpoint2: ; Short version +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 " " + movf gaslist_gas,W ; (0-4) into WREG + bnz gaslist_strcat_setpoint3 ; SP index = 0 ? + PUTC "*" ; YES - print * + bra gaslist_strcat_setpoint4 ; - continue with cbar value +gaslist_strcat_setpoint3: ; NO + PUTC " " ; - print a space gaslist_strcat_setpoint4: - movf gaslist_gas,W - lfsr FSR1,char_I_setpoint_cbar - movf PLUSW1,W + movf gaslist_gas,W ; (0-4) into WREG + lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint cbar values + movf PLUSW1,W ; read cbar value movwf lo clrf hi bsf leftbind - output_16dp d'3' - btfsc divemode - bra gaslist_strcat_setpoint5 ; Skip text in divemode - STRCAT_TEXT tbar + output_16dp d'3' ; print as X.XX + btfsc divemode ; in divemode? + bra gaslist_strcat_setpoint5 ; YES - skip text in divemode + STRCAT_TEXT tbar ; NO - print "bar" gaslist_strcat_setpoint5: - PUTC " " - ; Read switch depth - movf gaslist_gas,W - lfsr FSR1,char_I_setpoint_change - movff PLUSW1,lo + PUTC " " ; print a space + movf gaslist_gas,W ; (0-4) into WREG + lfsr FSR1,char_I_setpoint_change ; load base address of switch depths + movff PLUSW1,lo ; read switch depth into lo + bra gaslist_strcat_depth ; print depth in meters or ft - 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. -; Output: Text appended into buffer pointed by FSR2. +; Append gas description to current string +; +; Prints gas number, * if first, = if deco gas, gas composition and change depth, +; including fancy color-coding ; -; 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 - 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 +; Input: PRODL gas number (0..4) +; FSR2 current string position +; Output: text appended to buffer pointed by FSR2 +; +; NOTE: used in the menu-tree for the MENU_CALLBACK entry - 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 - + global gaslist_strcat_gas_cd 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 +gaslist_strcat_gas_cd: ; entry point with gas in PRODL (0-4) and usage of FLAG_diluent_setup + movff PRODL,gaslist_gas ; get current menu item (0-4) + movlw .5 ; offset between gases and diluents + btfsc FLAG_diluent_setup ; in diluent menus? + addwf gaslist_gas,F ; YES - add the offset +gaslist_gastitle: ; entry point with gas/dil in gaslist_gas (0-4 for gases, 5-9 for diluents) + bcf win_invert ; clear flag for inverted output by default + btfsc short_gas_decriptions ; shall use short versions of gaslist_strcat_gas_cd? + bra gaslist_gastitle1 ; YES - use short version + incf gaslist_gas,W ; (0-9) -> (1-10) into WREG 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 + movlw .6 ; diluents start with 6 + cpfslt lo ; gas number < 6 ? + bra gaslist_gastitle_dil ; NO - it's a diluent + STRCAT_TEXT tGas ; YES - it's a gas + bra gaslist_gastitle0 +gaslist_gastitle_dil: + STRCAT_TEXT tDil + movlw .5 ; offset between gases and diluents + subwf lo,F ; subtract offset from diluent number (6-10) -> (1-5) gaslist_gastitle0: bsf leftbind - output_8 + output_8 ; print gas/dil number (1-5) 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_gastitle1: ; short version of gaslist_strcat_gas_cd + btfsc divemode ; in divemode? + bra gaslist_gastitle3 ; YES - no "*" and "=" in front of gas composition, no highlighting for transmitters paired + + IFDEF _rx_functions + btfss FLAG_tr_enabled ; NO - TR functions enabled? + bra gaslist_gastitle2 ; NO - continue with gas type + lfsr FSR1,opt_transmitter_id_1 ; YES - load base address of transmitter ID table + movf gaslist_gas,W ; - (0-4 for OC/Bailout, 5-9 for Diluents) + rlncf WREG,W ; - index x2 because IDs are 2 byte + tstfsz PLUSW1 ; - transmitter ID low byte <> 0 ? + bsf win_invert ; YES - flag transmitter paired by inverting output + incf WREG,W ; - increment index + tstfsz PLUSW1 ; - transmitter ID high byte <> 0 ? + bsf win_invert ; YES - flag transmitter paired by inverting output + ENDIF + gaslist_gastitle2: - PUTC " " + rcall gaslist_strcat_gas_type ; print "*" for first gas/dil, "=" for a deco gas or " " else 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 - 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: - 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,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: + btfsc divemode ; in divemode? + rcall gaslist_strcat_gas_better ; YES - check if this is a "better gas" + lfsr FSR1,opt_gas_type ; load base address of gas types + movf gaslist_gas,W ; load index into WREG (0-4 for gases, 5-9 for diluents) + movf PLUSW1,W ; read gas/dil type into WREG + bnz gaslist_gastitle4 ; type = disabled? NO - keep color + call TFT_disabled_color ; YES - switch color to disabled + bra gaslist_gastitle5 ; - skip ppO2 check for disabled gases +gaslist_gastitle4: + btfss divemode ; in divemode? + bra gaslist_gastitle5 ; NO - no ppO2 check if not in divemode + lfsr FSR1,opt_gas_O2_ratio ; YES - load base address of opt_gas_O2_ratio + movf gaslist_gas,W ; - load index into WREG (0-4 for gases, 5-9 for diluents) + movff PLUSW1,hi ; - read O2 ratio into hi + call TFT_color_code_gaslist ; - set color according to ppO2 limits +gaslist_gastitle5: + movf gaslist_gas,W ; copy gas/dil index to WREG (0-9) + rcall gaslist_strcat_gas_WREG ; print gas composition + btfss divemode ; in divemode? + bra gaslist_gastitle6 ; NO - continue printing a space + rcall gaslist_strcat_gas_type ; YES - print "*" for first gas/dil, "=" for a deco gas, or a space else + bra gaslist_gastitle7 ; - continue with change depth +gaslist_gastitle6: + PUTC " " ; print a space +gaslist_gastitle7: + lfsr FSR1,opt_gas_change ; load base address of change depths + movf gaslist_gas,W ; load gas/dil index into WREG (0-9) + movff PLUSW1,lo ; read change depth into lo +gaslist_strcat_depth: ; entry point for general printing of depths with value in meters in lo + TSTOSS opt_units ; check depth units + bra gaslist_strcat_depth_metric ; 0 - use Meters +gaslist_strcat_depth_imperial: ; 1 - use Feet 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" + ;bsf leftbind + output_16_3 ; limit to 999 and display only 0-999 + STRCAT_TEXT tFeets ; append "ft" REMARK: still one char to long for space available in divemode menu! + return +gaslist_strcat_depth_metric: + PUTC " " ; print a space + output_99 + STRCAT_TEXT tMeters ; "m" 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,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" + +gaslist_strcat_gas_better: ; color-code output if this is the best gas/diluent + btfss better_gas_hint ; shall better gas hints be given? + return ; NO - return + movf best_gas_number,W ; get best gas number into WREG + btfsc FLAG_diluent_setup ; in CCR (pSCR) menus? + movf best_dil_number,W ; YES - overwrite with best diluent number + tstfsz WREG ; is a best gas/dil available? + bra gaslist_strcat_gas_better1 ; YES - proceed + return ; NO - return +gaslist_strcat_gas_better1: + decf WREG,W ; (1-5) -> (0-4) + btfsc FLAG_diluent_setup ; in diluent menus? + addlw .5 ; YES - add offset between gases and diluents (0-4) -> (5-9) + cpfseq gaslist_gas ; compare with given gas/dil (0-4 for OC bailout gases, 5-9 for diluents) + return ; not equal - return + bsf win_invert ; equal - invert + movlw color_green ; - select green color (gas is something "good") + goto TFT_set_color ; - activate color and return + +gaslist_strcat_gas_type: + lfsr FSR1,opt_gas_type ; load base address of gas types + movf gaslist_gas,W ; load index to WREG (0-4 for gases, 5-9 for diluents) + decf PLUSW1,W ; read gas/dil type into WREG and... + ; ...decrement by 1 (-1 for disabled, 0 for first, 1 for travel/normal, 2 for deco) + bnz gaslist_strcat_gas_type_1 ; type = first? NO - continue with checking for deco gas + PUTC "*" ; YES - print "*" for first + return ; - done +gaslist_strcat_gas_type_1: + decf WREG,W ; decrement gas type (-2 for disabled, -1 for first, 0 for travel/normal, 1 for deco) + decf WREG,W ; decrement gas type (-3 for disabled, -2 for first, -1 for travel/normal, 0 for deco) + bnz gaslist_strcat_gas_type_2 ; type = deco? NO - neither first nor deco + PUTC "=" ; YES - print "=" for a deco gas + return ; - done +gaslist_strcat_gas_type_2: + PUTC " " ; neither first nor deco, print a space 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. +; Housekeeping for the gas/dil settings, e.g. making sure there is one FIRST only +; +; Input: gaslist_gas last edited gas/dil (0-9) + + global gaslist_cleanup_list +gaslist_cleanup_list: + lfsr FSR1,opt_gas_type ; load base address of opt_gas_type + movlw .5 ; offset between gases and diluents + btfsc FLAG_diluent_setup ; in CCR-Menu? + subwf gaslist_gas,F ; YES - subtract offset from gaslist_gas: (5-9) -> (0-4) +gaslist_cleanup_list0: + bcf ignore_last_edited_gas +gaslist_cleanup_list1: + clrf lo ; counter for number of "firsts" found + movlw .5 ; initialize hi as loop counter for checking 5 gases/diluents + movwf hi +gaslist_cleanup_list2: ; loop body + decf hi,W ; WREG = current gas/dil (0-4) + btfsc FLAG_diluent_setup ; in CCR-Menu? + addlw .5 ; YES - add offset from gases to diluents -> (5-9) + movff PLUSW1,WREG ; read type into WREG + decfsz WREG ; is type = first (ex type code 1)? + bra gaslist_cleanup_list3 ; NO - done with this gas/dil + incf lo,F ; YES - increment number of "firsts" found + btfss ignore_last_edited_gas ; - shall we ignore the last edited gas/dil? + bra gaslist_cleanup_list2b ; NO - continue remembering the "last first" gas/dil (do a shortcut) + decf hi,W ; YES - get the current gas/dil as (0-4) + cpfseq gaslist_gas ; - is this the last edited gas/dil? +gaslist_cleanup_list2b: + movff hi,up ; (NO) - remember the last "first gas" found +gaslist_cleanup_list3: + decfsz hi,F ; decrement loop counter + bra gaslist_cleanup_list2 ; loop counter became 0 ? NO - loop + tstfsz lo ; YES - any first gas/dil at all? + bra gaslist_cleanup_list4 ; YES - at least one first gas/dil existing + btfsc FLAG_diluent_setup ; NO - in CCR-Menu? + lfsr FSR1,opt_dil_type ; YES - load base address of opt_gas_type + movlw .1 ; - load coding for first gas + movwf INDF1 ; - make gas/dil 1 the first gas + return ; - done +gaslist_cleanup_list4: + movlw .1 + cpfsgt lo ; more then one "first gas" found? + return ; NO - done + decf up,W ; YES - WREG = last found "first gas" - 1 (0-4) + cpfseq gaslist_gas ; - is this the last edited gas/dil? + bra gaslist_cleanup_list4b ; NO - disable it + bsf ignore_last_edited_gas ; YES - do not disable last edited gas, search again but ignore the last edited gas + bra gaslist_cleanup_list1 ; - loop until only one "first" is left over +gaslist_cleanup_list4b: + btfsc FLAG_diluent_setup ; in CCR-Menu? + addlw .5 ; YES - adjust offset + clrf PLUSW1 ; disable gas + bra gaslist_cleanup_list0 ; redo from start until only one "first" is left over + return + +;---------------------------------------------------------------------------- +; Tank Settings +; +; Inputs: char_I_tank_size size of the tank, using unit text tLiter ("l") +; char_I_tank_pres_fill fill pressure in multiples of 10 bar, using unit text tbar10 ("0 bar") - 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 + global gaslist_tank_size_pres +gaslist_tank_size_pres: ; dynamic title: xx l, xx0 bar + lfsr FSR1,char_I_tank_size ; load base address of char_I_tank_size + movf gaslist_gas,W ; load index (0-9) + movff PLUSW1,lo ; read char_I_tank_size[WREG] into lo + lfsr FSR1,char_I_tank_pres_fill ; load base address of char_I_tank_pres_fill + movff PLUSW1,hi ; read char_I_tank_pres_fill[WREG] into hi + STRCAT " " ; print 5 leading spaces for alignment + output_8 ; print tank size + STRCAT_TEXT tLiter ; print unit (" l") + movff hi,lo ; copy fill pressure into lo + output_8 ; print fill pressure (it is stored in multiples of 10 bar) + STRCAT_TEXT tbar10 ; print unit ("0 bar") + return + + global gaslist_tank_size +gaslist_tank_size: ; adjust char_I_tank_size between min_tank_size and max_tank_size + lfsr FSR1,char_I_tank_size ; load base address of char_I_tank_size + movf gaslist_gas,W ; load index (0-9) + movff PLUSW1,lo ; read char_I_tank_size[WREG] into lo + incf lo,F ; increment tank size by 1 liter + movlw max_tank_size ; load max. allowed value into WREG + cpfsgt lo ; tank size <= max value? + bra gaslist_tank_size_1 ; YES - new value can be used + movlw min_tank_size ; NO - wrap-around to min value + movwf lo ; - and write to lo +gaslist_tank_size_1: + movf gaslist_gas,W ; re-load index + movff lo,PLUSW1 ; write back tank size to char_I_tank_size[WREG] + return + + global gaslist_tank_pres +gaslist_tank_pres: ; adjust char_I_tank_pres_fill between 5(0) and 29(0) bar + lfsr FSR1,char_I_tank_pres_fill ; load base address of char_I_tank_pres_fill + movf gaslist_gas,W ; load index (0-9) + movff PLUSW1,lo ; read char_I_tank_pres_fill[WREG] into lo + incf lo,F ; increment fill press by by 1(0) bar + movlw max_fill_press ; load max. allowed value into WREG + cpfsgt lo ; press <= max value? + bra gaslist_tank_pres_1 ; YES - new value can be used + movlw min_fill_press ; NO - wrap-around to min value + movwf lo ; - and write to lo +gaslist_tank_pres_1: + movf gaslist_gas,W ; re-load index + movff lo,PLUSW1 ; write back tank size to char_I_tank_pres_fill[WREG] + return + +;---------------------------------------------------------------------------- +; Transmitter functions + + IFDEF _rx_functions + + global gaslist_tank_id_pres +gaslist_tank_id_pres: ; dynamic title: shows ID and pressure from transmitter with ID opt_transmitter_id[gaslist_gas] + ; When changing layout, adapt output position TFT_menu_tank_pres! + STRCAT " ID: " ; print header + ; get ID ; + lfsr FSR1,opt_transmitter_id_1 ; load base address of opt_transmitter_id + movf gaslist_gas,W ; load index (0-9) + rlncf WREG,W ; multiply by 2 because IDs are 2 byte in size + movff PLUSW1,lo ; copy opt_transmitter_id+0[gaslist_gas] to lo + incf WREG,W ; increment index + movff PLUSW1,hi ; copy opt_transmitter_id+1[gaslist_gas] to hi + ; check if a transmitter is paired to this tank + tstfsz hi ; high byte of ID <> 0 ? + bra gaslist_tank_id_pres_1 ; YES - a transmitter is paired to the tank + tstfsz lo ; low byte of ID <> 0 ? + bra gaslist_tank_id_pres_1 ; YES - a transmitter is paired to the tank + ; no transmitter paired + STRCAT "----" ; + bcf menu_update_tank_pres ; stop imprinting of tank pressure updates + return +gaslist_tank_id_pres_1: + ; show ID + movf hi,W ; copy high byte of ID to WREG + output_hex ; print it + movf lo,W ; copy low byte of ID to WREG + output_hex ; print it + bsf menu_update_tank_pres ; start imprinting of tank pressure updates return - 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 -gaslist_cleanup_list1: - 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,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,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 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 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 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 -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 up,W - btfsc ccr_diluent_setup ; In CCR-Menu? - addlw .5 ; Yes, adjust offset - clrf PLUSW1 ; Set First gas to zero m - return + global gaslist_tank_pairing +gaslist_tank_pairing: + incf pairing_slot,F ; goto next RX data slot + btfsc pairing_slot,3 ; slot = 8? + bra gaslist_tank_pairing_none ; YES - offer unpairing + movf pairing_slot,W ; NO - copy slot to WREG + call get_transmitter_id_by_slot ; WREG = slot (0-7) -> hi:lo = transmitter ID + tstfsz hi ; transmitter found (probe on high byte)? + bra gaslist_tank_pairing_common ; YES - select this transmitter + tstfsz hi ; transmitter found (probe on low byte)? + bra gaslist_tank_pairing_common ; YES - select this transmitter + bra gaslist_tank_pairing ; NO - try next slot +gaslist_tank_pairing_common: + lfsr FSR1,opt_transmitter_id_1 ; load base address of opt_transmitter_id + movf gaslist_gas,W ; load index into WREG (0-9) + rlncf WREG,W ; multiply by 2 because IDs are 2 byte in size + movff lo,PLUSW1 ; copy lo to opt_transmitter_id+0[gaslist_gas] + incf WREG,W ; increment index + movff hi,PLUSW1 ; copy hi to opt_transmitter_id+1[gaslist_gas] + return ; done +gaslist_tank_pairing_none: + setf pairing_slot ; prime slot number with 255 aka -1 + clrf hi ; adjust "no transmitter" ID + clrf lo ; adjust "no transmitter" ID + bra gaslist_tank_pairing_common ; continue with common part + + ENDIF ;---------------------------------------------------------------------------- ; Increment/Decrement O2 ratio global gaslist_pO2 gaslist_pO2: - 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 + movf gaslist_gas,W ; load index (0-9) + lfsr FSR1,opt_gas_He_ratio ; load base address of opt_gas_He_ratio + movff PLUSW1,hi ; read He ratio into hi + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movff PLUSW1,lo ; read O2 ratio into lo incf lo,F ; O2++ movf hi,W ; get He ratio into WREG @@ -389,24 +600,23 @@ movlw .101 ; cpfslt up ; O2 + He < 101? decf lo,F ; O2-- (revoke ++) - movf gaslist_gas,W + movf gaslist_gas,W ; re-load index 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,lo ; lo holds O2 ratio + movf gaslist_gas,W ; load index (0-9) + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movff PLUSW1,lo ; read O2 ratio into lo 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 + movwf lo ; YES - copy minimum O2 ratio to lo gaslist_mO2_1: - movf gaslist_gas,W + movf gaslist_gas,W ; re-load index movff lo,PLUSW1 ; write back O2 ratio to opt_gas_O2_ratio[WREG] return @@ -415,11 +625,11 @@ global gaslist_pHe gaslist_pHe: - 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 ; load index (0-9) + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movff PLUSW1,lo ; read O2 ratio into lo + lfsr FSR1,opt_gas_He_ratio ; load base address of opt_gas_He_ratio + movff PLUSW1,hi ; read He ratio into hi incf hi,F ; He++ movf hi,W ; get He ratio into WREG @@ -428,21 +638,21 @@ movlw .101 ; cpfslt up ; O2 + He < 101? decf hi,F ; He-- (revoke ++) - movf gaslist_gas,W + movf gaslist_gas,W ; re-load index movff hi,PLUSW1 ; write back He ratio to opt_gas_He_ratio[WREG] return global gaslist_mHe gaslist_mHe: - movf gaslist_gas,W - lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] - movff PLUSW1,hi ; hi holds He ratio + movf gaslist_gas,W ; load index (0-9) + lfsr FSR1,opt_gas_He_ratio ; load base address of opt_gas_He_ratio + movff PLUSW1,hi ; read He ratio into hi decf hi,F ; He-- bnn gaslist_mHe_1 ; He ratio negative? - clrf hi ; YES - set He to 0 + clrf hi ; YES - set He ratio to 0 gaslist_mHe_1: - movf gaslist_gas,W + movf gaslist_gas,W ; re-load index movff hi,PLUSW1 ; write back He ratio to opt_gas_He_ratio[WREG] return @@ -451,46 +661,35 @@ 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 + lfsr FSR1,opt_gas_change ; load base address of opt_gas_change + movf gaslist_gas,W ; load index (0-4) + movff PLUSW1,lo ; read switch depth into lo + incf lo,F ; increment switch depth + movlw gaslist_max_change_depth ; get max change depth + cpfsgt lo ; above max change depth? + bra gaslist_pDepth_1 ; NO + movwf lo ; YES - revert to max change depth gaslist_pDepth_1: - movf gaslist_gas,W - movff lo,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + movf gaslist_gas,W ; re-load index + movff lo,PLUSW1 ; write back switch depth 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 - - movf gaslist_gas,W - 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 ; And write back to char_I_deco_gas_change[WREG] + lfsr FSR1,opt_gas_change ; load base address of opt_gas_change + movf gaslist_gas,W ; load index (0-4) + movff PLUSW1,lo ; read switch depth into lo + decf lo,F ; decrement switch depth + btfsc STATUS,N ; did depth became negative? + clrf lo ; YES - reset to zero + movff lo,PLUSW1 ; write back switch depth return global gaslist_spplus gaslist_spplus: movf gaslist_gas,W lfsr FSR1,char_I_setpoint_cbar - movff PLUSW1,lo ; Read char_I_setpoint_cbar[WREG] + movff PLUSW1,lo ; read setpoint movlw gaslist_sp_stepsize addwf lo,F movlw gaslist_sp_max @@ -500,165 +699,129 @@ movwf lo gaslist_spplus2: movf gaslist_gas,W - movff lo,PLUSW1 ; Write back to char_I_setpoint_cbar + movff lo,PLUSW1 ; write back setpoint 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,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 + movf gaslist_gas,W ; get setpoint number (0-4) + bz gaslist_spdepthplus2 ; setpoint number = 0? YES - force depth to always be 0m + lfsr FSR1,char_I_setpoint_change ; load base address of char_I_setpoint_change + movff PLUSW1,lo ; read setpoint depth into lo + incf lo,F ; increment depth + movlw gaslist_max_change_depth ; get max. depth + cpfsgt lo ; switch depth > max. depth? + bra gaslist_spdepthplus_1 ; NO + movwf lo ; YES - copy to lo gaslist_spdepthplus_1: - 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 + movf gaslist_gas,W ; re-load index + movff lo,PLUSW1 ; write back setpoint depth return 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,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] + movf gaslist_gas,W ; get setpoint number (0-4) + bz gaslist_spdepthminus2 ; setpoint number = 0? YES - force depth to always be 0m + lfsr FSR1,char_I_setpoint_change ; load base address of char_I_setpoint_change + movff PLUSW1,lo ; read setpoint depth into lo + decf lo,F ; decrement switch depth + btfsc STATUS,N ; did depth became negative? + clrf lo ; YES - reset to zero + movff lo,PLUSW1 ; write back setpoint depth return +gaslist_spdepthplus2: +gaslist_spdepthminus2: + movlw .0 + movff WREG,char_I_setpoint_change+0 ; hard reset to 0m + return + + ;---------------------------------------------------------------------------- -; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 Ratio. +; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 ratio ; ; Input: gaslist_gas = current gas index. ; opt_gas_O2_ratio[gaslist_gas] = current O2 ratio ; Output: WREG = MOD [m] ; gaslist_calc_mod: - 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 - - ; 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 - - 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 + movf gaslist_gas,W ; load index (0...9) + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movff PLUSW1,xB+0 ; read O2 ratio into xB+0 + lfsr FSR1,opt_gas_type ; load base address of opt_gas_type + movff PLUSW1,xA+0 ; read gas/dil type into xA+0 (used as temp here) + movff char_I_ppO2_max_deco,xB+1 ; get max ppO2 for deco into xB+1 (used as temp here) + movlw .3 ; type code for deco gases + cpfseq xA+0 ; is it a deco gas? + movff char_I_ppO2_max,xB+1 ; NO - overwrite ppO2 max with none-deco max + movf xB+1,W ; copy resulting ppO2 max into WREG + clrf xB+1 ; clear xB+1 for div16x16 operation + mullw .10 ; multiply ppO2 max value with 10 + movff PRODL,xA+0 ; copy result to xA movff PRODH,xA+1 - call div16x16 - - ; Prof = Pamb - 1 bar - movf xC+0,W - addlw -.10 - return - -gaslist_calc_mod_divemode: - 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 + call div16x16 ; xC = xA / xB with xA as remainder + movf xC+0,W ; copy result to WREG + addlw -.10 ; subtract 10 cbar + return ; return with final result in WREG ;---------------------------------------------------------------------------- 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 + lfsr FSR1,opt_gas_change ; load base address of opt_gas_change + movf gaslist_gas,W ; load index (0-9) + movf PLUSW1,W ; read change depth into WREG + mullw .10 ; PROD = depth in mbar/10 (100 = 1.00 bar) + movlw .100 ; add 1 bar addwf PRODL,F movlw .0 - addwfc PRODH,F ; add 1bar - movff PRODL,xA+0 + addwfc PRODH,F + movff PRODL,xA+0 ; copy result to xA 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 + lfsr FSR1,opt_gas_O2_ratio ; load base address of opt_gas_O2_ratio + movf gaslist_gas,W ; load index (0-9) + movff PLUSW1,xB+0 ; read O2 ratio into xB+0 + clrf xB+1 ; clear xB+1 + call mult16x16 ; calculate char_I_O2_ratio * (p_amb/10) + movff xC+0,xA+0 ; copy result to xA movff xC+1,xA+1 - movlw d'100' + movlw d'100' ; load 100 to xB 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 + call div16x16 ; xC = xA / xB = (char_I_O2_ratio * p_amb/10)/100 + ; check for very high ppO2 + tstfsz xC+2 ; xC+2 remains from mult16x16, xC+2 > 0 (-> ppO2 is > 6.55 bar) ? + bra gaslist_ppo2_1 ; YES - display a fixed max value + movff xC+0,lo ; copy result to lo, hi movff xC+1,hi bcf ignore_digit4 bsf leftbind - output_16dp d'3' ; x.xx - STRCAT_TEXT tbar ; bar + output_16dp d'3' ; print ppO2 as x.xx + STRCAT_TEXT tbar ; print "bar" return -gaslist_ppo2_2: +gaslist_ppo2_1: STRCAT ">6.6" return 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 -gaslist_MOD_metric: - 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 + STRCAT_TEXT tMOD ; print "MOD:" + rcall gaslist_calc_mod ; compute MOD into WREG + movwf lo ; copy result to lo + call gaslist_strcat_depth ; print depth in meters or feet as configured + PUTC "/" ; print "/" + STRCAT_TEXT tEND ; print "END:" + rcall gaslist_calc_mod ; compute MOD into WREG + addlw .10 ; compute 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 % + lfsr FSR1,opt_gas_He_ratio ; load base address of opt_gas_He_ratio + movf gaslist_gas,W ; load index (0...9) + movf PLUSW1,W ; read He ration into WREG + subwf xA+0,F ; xA+0 = 100 - He ratio in % clrf xA+1 call mult16x16 ; xA*xB=xC movff xC+0,xA+0 @@ -666,61 +829,36 @@ movlw d'100' movwf xB+0 clrf xB+1 - call div16x16 ; xA/xB=xC with xA as remainder + call div16x16 ; xC = xA / xB 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 + movlw d'10' ; subtract 10 m + subwf xC+0,F ; ... + movff xC+0,lo ; copy result to lo + bra gaslist_strcat_depth ; print depth in meters or feet as configured and return + + + global gaslist_reset_mod_title +gaslist_reset_mod_title: + STRCAT_TEXT tDepthReset + rcall gaslist_calc_mod ; compute MOD into WREG + movwf lo ; copy result to lo + lfsr FSR1,opt_gas_change ; load base address of opt_gas_change + movf gaslist_gas,W ; load index (0-9) + movf PLUSW1,W ; read change depth into WREG + cpfslt lo ; change depth > MOD ? + bra gaslist_strcat_depth ; NO - return + call TFT_warnings_color ; YES - use red color + bra gaslist_strcat_depth ; - return + + + global gaslist_reset_mod +gaslist_reset_mod: + rcall gaslist_calc_mod ; compute MOD into WREG + movwf lo ; copy result to lo + lfsr FSR1,opt_gas_change ; load base address of opt_gas_change + movf gaslist_gas,W ; load index (0-9) + movff lo,PLUSW1 ; write back new change depth return ;---------------------------------------------------------------------------- - global gaslist_reset_mod_title -gaslist_reset_mod_title: - STRCAT_TEXT tDepthReset - -gaslist_reset_mod_title2: - 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... - -;---------------------------------------------------------------------------- - global gaslist_reset_mod -gaslist_reset_mod: - 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/gaslist.inc --- a/src/gaslist.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/gaslist.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File gaslist.inc +; File gaslist.inc V2.99c ; ; Interface to OSTC gas list management. ; @@ -11,30 +11,49 @@ ; Utils extern gaslist_strcat_gas - extern gaslist_strcat_gas_mod + extern gaslist_strcat_gas_WREG + extern gaslist_strcat_gas_cd extern gaslist_strcat_setpoint - ;Setpoint Setup + extern do_toggle_gf_label + extern do_toggle_max_pres_diff_label + extern gaslist_copy_dil_to_oc + + ; Setpoint Setup extern gaslist_spplus extern gaslist_spdepthplus extern gaslist_spdepthminus - extern gaslist_setSP - ; Select currently edited gas - extern gaslist_setgas + ; Select currently edited Gas extern gaslist_gastitle - ; Main gaslist menu - extern gaslist_pO2, gaslist_mO2 - extern gaslist_pHe, gaslist_mHe + ; Main Gaslist Menu + extern gaslist_pO2 + extern gaslist_mO2 + extern gaslist_pHe + extern gaslist_mHe + extern gaslist_GasDepth 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 + extern gaslist_cleanup_list - ; Depth submennu + ; Depth Sub-Menu extern gaslist_pDepth extern gaslist_mDepth extern gaslist_MOD_END extern gaslist_ppo2 extern gaslist_reset_mod_title extern gaslist_reset_mod + + ; Tank Sub-Menu + extern gaslist_tank_size_pres + extern gaslist_tank_size + extern gaslist_tank_pres + IFDEF _rx_functions + extern gaslist_tank_id_pres + extern gaslist_tank_pairing + ENDIF + + IFDEF _cave_mode + extern do_turn_dive_label + ENDIF \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/ghostwriter.asm --- a/src/ghostwriter.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/ghostwriter.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File ghostwriter.asm REFACTORED VERSION 2.98 +; File ghostwriter.asm REFACTORED VERSION V2.99a ; ; Ghostwriter (Log profile recorder) ; @@ -20,10 +20,12 @@ #include "divemode.inc" #include "rtc.inc" + extern deco_pull_tissues_from_vault + ;---- Private local variables ------------------------------------------------- - CBLOCK local2 ; max size is 16 Byte !!! + CBLOCK local3 ; 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 @@ -40,7 +42,7 @@ ;============================================================================= - global init_recording_params ; Initialize profile recording parameters + 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 @@ -57,7 +59,7 @@ movwf divisor_cns movlw div_tank movwf divisor_tank - btfss FLAG_apnoe_mode ; In Apnoe mode? + 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 @@ -66,7 +68,7 @@ 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 + ; in all modes but CCR and pSCR, disable ppO2 logging movlw .0 movwf divisor_ppo2_sensors init_recording_params_2: @@ -78,97 +80,97 @@ bcf store_sample ; clear flag ifndef __DEBUG - btfsc simulatormode_active ; Are we in simulator mode? - return ; Yes, discard everything + 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 + 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.... +; First, find out how many bytes will be appended to this sample set clrf ProfileFlagByte ; clear number of bytes to append ; Check Extended informations - decfsz divisor_temperature,W ; Check divisor + decfsz divisor_temperature,W ; check divisor bra check_extended1 movlw infolength_temperature addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended1: - decfsz divisor_deco,W ; Check divisor + decfsz divisor_deco,W ; check divisor bra check_extended2 movlw infolength_deco addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended2: - decfsz divisor_gf,W ; Check divisor + decfsz divisor_gf,W ; check divisor bra check_extended3 movlw infolength_gf addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended3: - decfsz divisor_ppo2_sensors,W ; Check divisor + decfsz divisor_ppo2_sensors,W ; check divisor bra check_extended4 movlw infolength_ppo2_sensors addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended4: - decfsz divisor_decoplan,W ; Check divisor + decfsz divisor_decoplan,W ; check divisor bra check_extended5 movlw infolength_decoplan addwf ProfileFlagByte,F ; add to ProfileFlagByte check_extended5: - decfsz divisor_cns,W ; Check divisor + decfsz divisor_cns,W ; check divisor bra check_extended6 movlw infolength_cns 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 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 EventByte1) + incf ProfileFlagByte,F ; add one byte (the EventByte1) clrf EventByte1 ; reset EventByte1 clrf EventByte2 ; reset EventByte2 - movf AlarmType,W ; Type of Alarm Bit 0-3 - addwf EventByte1,F ; Copy to EventByte1 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 + movlw d'2' ; information length addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte1,4 ; Also set Flag in EventByte1! + 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 + movlw d'1' ; information length addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte1,5 ; Also set Flag in EventByte1! + 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 + movlw d'1' ; information length addwf ProfileFlagByte,F ; add to ProfileFlagByte - bsf EventByte1,6 ; Also set Flag in EventByte1! + bsf EventByte1,6 ; also set Flag in EventByte1! check_event4: btfss bailoutgas_event ; =1: bailout was selected or a gas change during bailout bra check_event5 - movlw d'2' ; Information length + 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 + bsf EventByte1,7 ; =1: another EventByte1 is available check_event5: ; more events? @@ -177,85 +179,89 @@ 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 EventByte1 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 EventByte1,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + 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 + 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 ; store gas 6 o2 ratio - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + 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 + 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_dil,W ; store active diluent (default, may be overwritten soon) + btfsc FLAG_oc_mode ; in OC mode? + movf active_gas,W ; YES - store active gas + btfsc FLAG_bailout_mode ; in bailout? + movf active_gas,W ; YES - store active OC = bailout 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 ; store setpoint - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - bcf setpoint_changed ; Clear this event + rcall ghostwrite_byte_profile ; WREG -> profile in ext. flash + bcf setpoint_changed ; clear this event store_dive_data3d: - btfss bailoutgas_event ; Check flag + 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 + 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 + 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 +; Store extended information + 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 + decfsz divisor_gf,F ; check divisor bra store_extended3 rcall store_dive_gf store_extended3: - decfsz divisor_ppo2_sensors,F ; Check divisor + decfsz divisor_ppo2_sensors,F ; check divisor bra store_extended4 rcall store_dive_ppO2_sensors store_extended4: - decfsz divisor_decoplan,F ; Check divisor + decfsz divisor_decoplan,F ; check divisor bra store_extended5 rcall store_dive_decoplan store_extended5: - decfsz divisor_cns,F ; Check divisor + 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 @@ -270,25 +276,26 @@ clrf divisor_tank store_dive_data5: - bcf event_occured ; Clear the global event flag + 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) + 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 - bcf WREG,int_warning_flag ; clear warning flag - bcf WREG,int_attention_flag ; clear attention flag - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + bcf WREG,int_warning_flag ; clear warning flag + bcf WREG,int_attention_flag ; clear attention flag + 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: + ; OSTC TR tank pressure logging movlw div_tank - movwf divisor_tank ; Reload divisor from CF + movwf divisor_tank ; reload divisor from CF return store_dive_decoplan: @@ -298,143 +305,143 @@ movwf lo store_dive_decoplan_loop: movf POSTINC1,W - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + 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.01 bar 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.1 mV steps + rcall ghostwrite_byte_profile ; WREG -> profile in ext. flash + movf hi,W ; in 0.1 mV 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.01 bar 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.1 mV steps + rcall ghostwrite_byte_profile ; WREG -> profile in ext. flash + movf hi,W ; in 0.1 mV 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.01 bar 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.1 mV steps + rcall ghostwrite_byte_profile ; WREG -> profile in ext. flash + movf hi,W ; in 0.1 mV 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: ; 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 + movff char_O_first_deco_depth,WREG ; get ceiling + tstfsz WREG ; ceiling < 0 m (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 + 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 + 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 + 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) + 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 + goto write_byte_ext_flash_plus ; writes byte and increases address with banking at 0x200000 ; returns... global ghostwriter_end_dive ghostwriter_end_dive: 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 + 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 custom view + movff menupos3,customview_divemode ; store last custom view - btfss realdive ; dive longer then one minute - goto ghostwriter_end_dive_common ; No, discard everything + btfss realdive ; dive longer then one minute + 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) + ; Dive finished (and longer than 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_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 ; .... 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 + 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 + 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 + 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 + 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 + 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 + 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. +; profile recording done ; Load total number of dives read_int_eeprom .2 @@ -471,66 +478,67 @@ ; 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 dive profile read_int_eeprom .4 movf EEDATA,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + 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 + 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 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 + 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 + 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 + 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 - 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 - movff start_mins,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + lfsr FSR0,start_year ; load base address of start-of-dive data + movf POSTINC0,W ; year + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; month + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; day + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; hour + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; minute + 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] 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+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + + movf lo,W ; max. depth, low byte + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf hi,W ; max. depth, high byte + rcall ghostwrite_byte_header ; WREG -> header in ext. flash bra end_dive2 ; skip normal max. depth end_dive1: @@ -540,133 +548,81 @@ 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 + movf lo,W ; max. depth, low byte + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf hi,W ; max. depth, high byte + rcall ghostwrite_byte_header ; WREG -> header in ext. flash end_dive2: movf divemins+0,W ; dive time minutes - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movf divemins+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movf divesecs,W ; dive time seconds - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movff minimum_temperature+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movff last_surfpressure_30min+0,WREG ; air pressure before dive - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movff last_surfpressure_30min+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + 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 + 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 + 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... - movff opt_dil_O2_ratio+0,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_dil_He_ratio+0,WREG - 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 + btfsc FLAG_ccr_mode ; in CCR mode? + bra end_dive_dil_gaslist ; YES - write diluent gas list + btfsc FLAG_pscr_mode ; in pSCR mode? + bra end_dive_dil_gaslist ; YES - write diluent gas list - movff opt_dil_O2_ratio+1,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_dil_He_ratio+1,WREG - 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 +end_dive_oc_gaslist: ; write OC gases + lfsr FSR0,opt_gas_O2_ratio-.1 ; set base address to (opt_gas_O2_ratio - 1) because of pre-increment statement + bra end_dive_gaslist ; write all 5 OC gases - movff opt_dil_O2_ratio+2,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_dil_He_ratio+2,WREG - 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 - - movff opt_dil_O2_ratio+3,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_dil_He_ratio+3,WREG - 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 +end_dive_dil_gaslist: ; write diluents + lfsr FSR0,opt_dil_O2_ratio-.1 ; set base address to (opt_dil_O2_ratio - 1) because of pre-increment statement + ;bra end_dive_gaslist ; write all 5 diluents - movff opt_dil_O2_ratio+4,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_dil_He_ratio+4,WREG - 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 - -end_dive_oc_gaslist: ; OC Gases... - movff opt_gas_O2_ratio+0,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_gas_He_ratio+0,WREG - 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 - - movff opt_gas_O2_ratio+1,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_gas_He_ratio+1,WREG - 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 - - movff opt_gas_O2_ratio+2,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_gas_He_ratio+2,WREG - 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 - - movff opt_gas_O2_ratio+3,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_gas_He_ratio+3,WREG - 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 - - movff opt_gas_O2_ratio+4,WREG - rcall ghostwrite_byte_header ; %O2 - movff opt_gas_He_ratio+4,WREG - 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 +end_dive_gaslist: ; helper function for writing gas list entries +; +; Memory Map: +; ------------------------- +; opt_gas_O2_ratio res 5 +; opt_dil_O2_ratio res 5 +; opt_gas_He_ratio res 5 +; opt_dil_He_ratio res 5 +; opt_gas_type res 5 +; opt_dil_type res 5 +; opt_gas_change res 5 +; opt_dil_change res 5 +; + movlw .5 ; 5 gases to store + movwf lo ; use lo as counter +end_dive_gaslist_loop: + movf PREINC0,W ; increment base address and get O2 ratio into WREG + rcall ghostwrite_byte_header ; store data + movlw .10 ; offset for H2 ratios + movf PLUSW0,W ; get H2 ratio into WREG + rcall ghostwrite_byte_header ; store data + movlw .30 ; offset for change depths + movf PLUSW0,W ; get change depth into WREG + rcall ghostwrite_byte_header ; store data + movlw .20 ; offset for types + movf PLUSW0,W ; get type into WREG + rcall ghostwrite_byte_header ; store data + decfsz lo ; decrement counter, did it became 0 ? + bra end_dive_gaslist_loop ; NO - loop + ;bra end_dive_oc_cc_common ; YES - done 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 @@ -674,92 +630,85 @@ 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash ; CNS at beginning of dive movff CNS_start+0,WREG - 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash ; Gradient factor movff GF_start,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + 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 ; Logbook offset call do_logoffset_common_read ; Read into lo:hi movf lo,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash movf hi,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + + ; Store the setpoints + lfsr FSR0,char_I_setpoint_cbar ; base address of ppO2 values + lfsr FSR1,char_I_setpoint_change ; base address of change depths + movlw .5 ; 5 setpoints to store + movwf lo ; use lo as counter +end_dive_sp_loop: + movf POSTINC0,W ; get ppO2 value + rcall ghostwrite_byte_header ; store ppO2 value + movf POSTINC1,W ; get change depth + rcall ghostwrite_byte_header ; store change depth + decfsz lo ; decrement counter, did it became 0 ? + bra end_dive_sp_loop ; NO - loop - 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 - bcf WREG,int_warning_flag ; clear warning flag - bcf WREG,int_attention_flag ; clear attention flag - rcall ghostwrite_byte_header ; Stores CNS% + ; Store further data + movff opt_salinity,WREG ; salinity (0-4%) + rcall ghostwrite_byte_header ; store salinity - movff avg_rel_pressure_total+0,WREG ; Average Depth - 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 + movff int_O_CNS_fraction+0,WREG ; CNS value, low byte + rcall ghostwrite_byte_header ; store CNS% + movff int_O_CNS_fraction+1,WREG ; CNS value, high byte + bcf WREG,int_warning_flag ; clear warning flag + bcf WREG,int_attention_flag ; clear attention flag + rcall ghostwrite_byte_header ; store CNS% - movff total_divetime_seconds+0,WREG ; Total dive time (Regardless of start_dive_threshold) - 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 + movff avg_rel_pressure_total+0,WREG ; average depth + 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 + + movff total_divetime_seconds+0,WREG ; total dive time (regardless of start_dive_threshold) + 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 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 + movff char_I_saturation_multiplier,WREG ; saturation multiplier + 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 + movff char_I_desaturation_multiplier,WREG ; desaturation multiplier + 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) read_int_eeprom .2 movf EEDATA,W - rcall ghostwrite_byte_header ; Total dive counter, low + 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 @@ -771,18 +720,18 @@ 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash decfsz lo,F - bra end_dive_store_tissues_N2 ; No + bra end_dive_store_tissues_N2 ; NO movlw .64 movwf lo - lfsr FSR1,0x700 ; pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes + lfsr FSR1,0x700 ; pres_tissue_N2+0 ; 16*4 Byte Float = 64 Bytes end_dive_store_tissues_N2_2: movf POSTINC1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash decfsz lo,F - bra end_dive_store_tissues_N2_2 ; No + bra end_dive_store_tissues_N2_2 ; NO movlw .16 movwf lo @@ -790,57 +739,58 @@ 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash decfsz lo,F - bra end_dive_store_tissues_He ; No + bra end_dive_store_tissues_He ; NO movlw .64 movwf lo - lfsr FSR1,0x740 ; pres_tissue_He+0 ; 16*4Byte Float = 64Bytes + lfsr FSR1,0x740 ; pres_tissue_He+0 ; 16*4 Byte Float = 64 Bytes end_dive_store_tissues_He_2: movf POSTINC1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> header in ext. flash decfsz lo,F - bra end_dive_store_tissues_He_2 ; No + 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 + 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 + 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 + 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 + lfsr FSR0,battery_gauge ; load base address of battery gauge register + movf POSTINC0,W ; get byte 0 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; get byte 1 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; get byte 2 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; get byte 3 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; get byte 4 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash + movf POSTINC0,W ; get byte 5 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash ; 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 + rcall ghostwrite_byte_header ; WREG -> header in ext. flash - call divemode_store_statistics ; Store/update statistics for this unit + 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 @@ -855,31 +805,31 @@ 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 - endif + ifndef __DEBUG + btfsc restore_deco_data ; restore decodata? + call deco_pull_tissues_from_vault + banksel common ; bank 1 + endif call update_battery_registers ; update battery registers into EEPROM 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 dive time to surface interval + 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 @@ -888,44 +838,44 @@ movff EEDATA,ext_flash_address+2 return -ghostwriter_short_header_init: ; Proceed one page forward +ghostwriter_short_header_init: ; proceed one page forward clrf EEDATA - write_int_eeprom .4 ; ext_flash_address+0 = 0 + 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 + 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 + 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 + 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. + write_int_eeprom .6 ; write new pointer + bra ghostwriter_short_header2 ; Done global ghostwriter_short_header -ghostwriter_short_header: ; Write short header with dive number 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 ext_flash_rw + 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 + 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 + 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 + rcall ghostwriter_load_pointer ; load ext_flash_address:3 from EEPROM .4-.6 ; Clear dive length counter clrf ext_flash_dive_counter+0 @@ -934,20 +884,20 @@ ; 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 @@ -956,82 +906,82 @@ ; - 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) + 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) + 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) + 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 + 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 deco data - 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 + 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 .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 + 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 + 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 +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 + call do_logoffset_common_read ; existing logbook offset into lo:hi tstfsz lo ; lo=0? - bra change_logbook_offset1 ; No, adjust offset + 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 + 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' diff -r 00b24fb4324d -r ca4556fb60b9 src/hwos.asm --- a/src/hwos.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/hwos.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,149 +1,153 @@ ;============================================================================= ; -; File hwos.asm +; File hwos.asm V2.98c ; ; Definition of the hwOS dive computer platform. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-05-24 : [jDG] Cleanups from initial Matthias code. -; 2011-06-24 : [MH] Added clock speeds. +; 2011-05-24 : [jDG] Cleanups from initial Matthias code +; 2011-06-24 : [MH] Added clock speeds + + #include "hwos.inc" ;============================================================================= ;----------------------------- CONFIG --------------------------------- - CONFIG RETEN = OFF ;Disabled - Controlled by SRETEN bit - CONFIG SOSCSEL = HIGH ;High Power SOSC circuit selected - CONFIG XINST = OFF ;Code won't excute in extended mode... - CONFIG FOSC = INTIO2 ;Internal RC oscillator, no clock-out - CONFIG PLLCFG = OFF - CONFIG IESO = OFF ;Disabled - CONFIG PWRTEN = OFF ;Disabled, because incompatible with ICD3 (Ri-400) - CONFIG BOREN = ON ;Controlled with SBOREN bit - CONFIG BORV = 2 ;2.0V - CONFIG BORPWR = MEDIUM ;BORMV set to medium power level - CONFIG WDTEN = ON ;WDT controlled by SWDTEN bit setting - CONFIG WDTPS = 128 ;1:128 - CONFIG RTCOSC = SOSCREF ;RTCC uses SOSC - CONFIG MCLRE = ON ;MCLR Enabled, RG5 Disabled - CONFIG CCP2MX = PORTBE ;RE7-Microcontroller Mode/RB3-All other modes + CONFIG RETEN = OFF ; disabled - controlled by SRETEN bit + CONFIG SOSCSEL = HIGH ; High Power SOSC circuit selected + CONFIG XINST = OFF ; code won't execute in extended mode + CONFIG FOSC = INTIO2 ; internal RC oscillator, no clock-out + CONFIG PLLCFG = OFF + CONFIG IESO = OFF ; disabled + CONFIG PWRTEN = OFF ; disabled, because incompatible with ICD3 (Ri-400) + CONFIG BOREN = ON ; controlled with SBOREN bit + CONFIG BORV = 2 ; 2.0V + CONFIG BORPWR = MEDIUM ; BORMV set to medium power level + CONFIG WDTEN = ON ; WDT controlled by SWDTEN bit setting + CONFIG WDTPS = 128 ; 1:128 + CONFIG RTCOSC = SOSCREF ; RTCC uses SOSC + CONFIG MCLRE = ON ; MCLR Enabled, RG5 Disabled + CONFIG CCP2MX = PORTBE ; RE7-microcontroller mode/RB3-all other modes + +hwos CODE + ;============================================================================= -boot CODE - global init_ostc + global init_ostc init_ostc: - banksel common ; Bank1 -;init oscillator + banksel common ; bank 1 +; init oscillator movlw b'01110010' - movwf OSCCON ; 16MHz INTOSC + movwf OSCCON ; 16 MHz INTOSC movlw b'00001000' - movwf OSCCON2 ; Secondary Oscillator running + movwf OSCCON2 ; secondary oscillator running movlw b'00000000' - movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) - bcf RCON,SBOREN ; Bown-Out off - bcf RCON,IPEN ; Priority Interrupts off - clrf CM1CON ; Disable - banksel WDTCON - movlw b'10000000' - movwf WDTCON ; Setup Watchdog + movwf OSCTUNE ; 4x PLL disable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz) + bcf RCON,SBOREN ; bown-out off + bcf RCON,IPEN ; priority interrupts off + clrf CM1CON ; disable + banksel WDTCON + movlw b'10000000' + movwf WDTCON ; setup watchdog ; I/O Ports - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. + banksel 0xF16 ; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM - clrf REFOCON ; No reference oscillator active on REFO pin - clrf ODCON1 ; Disable Open Drain capability - clrf ODCON2 ; Disable Open Drain capability - clrf ODCON3 ; Disable Open Drain capability - clrf CM2CON ; Disable - clrf CM3CON ; Disable + clrf REFOCON ; no reference oscillator active on REFO pin + clrf ODCON1 ; disable open drain capability + clrf ODCON2 ; disable open drain capability + clrf ODCON3 ; disable open drain capability + clrf CM2CON ; disable + clrf CM3CON ; disable - movlw b'11000000' ; ANSEL, AN7 and AN6 -> Analog inputs, PORTA is digital. + movlw b'11000000' ; ANSEL, AN7 and AN6 -> Analog inputs, PORTA is digital movwf ANCON0 - movlw b'00000111' ; ANSEL, AN8, AN9, AN10 -> Analog in + movlw b'00000111' ; ANSEL, AN8, AN9, AN10 -> Analog input movwf ANCON1 movlw b'00000010' ; ANSEL, AN17 -> Analog input movwf ANCON2 - banksel common + banksel common -; movlw b'00000000' ; 1= Input -> Data TFT_high +; movlw b'00000000' ; 1= input -> Data TFT_high clrf TRISA -; movlw b'00000000' ; Init port +; movlw b'00000000' ; init port clrf PORTA - movlw b'00000011' ; 1= Input, (RB0, RB1) -> Switches, RB2 -> Power_MCP, RB3 -> s8_npower, RB4 -> LED_green, RB5 -> /TFT_POWER + movlw b'00000011' ; 1= input, (RB0, RB1) -> switches, RB2 -> Power_MCP, RB3 -> s8_npower, RB4 -> LED_green/rx_nreset, RB5 -> /TFT_POWER movwf TRISB - movlw b'00101000' ; Init port + movlw b'00111000' ; init port, rx_nreset=1 -> hard reset RX movwf PORTB - movlw b'10011010' ; 1= Input, (RC0, RC1) -> SOSC, RC2 -> TFT_LED_PWM, (RC3,RC4) -> I²C, RC5 -> MOSI_MS5541, (RC6, RC7) -> UART1 + movlw b'10011010' ; 1= input, (RC0, RC1) -> SOSC, RC2 -> TFT_LED_PWM, (RC3,RC4) -> I²C, RC5 -> MOSI_MS5541, (RC6, RC7) -> UART1 movwf TRISC -; movlw b'00000000' ; Init port +; movlw b'00000000' ; init port clrf PORTC - movlw b'00100000' ; 1= Input, RD0 -> TFT_NCS, RD1 -> TFT_RS, RD2 -> TFT_NWR, RD3 -> TFT_RD, RD4 -> MOSI_Flash, RD5 -> MISO_Flash, RD6 -> CLK_Flash, RD7 -> TFT_NRESET + movlw b'00100000' ; 1= input, RD0 -> TFT_NCS, RD1 -> TFT_RS, RD2 -> TFT_NWR, RD3 -> TFT_RD, RD4 -> MOSI_Flash, RD5 -> MISO_Flash, RD6 -> CLK_Flash, RD7 -> TFT_NRESET movwf TRISD -; movlw b'00000000' ; Init port +; movlw b'00000000' ; init port clrf PORTD -; movlw b'00000000' ; 1= Input, RE1 -> Power_IR, RE2 -> CS_MCP, RE3 -> LED_blue, RE4 -> power_sw1, RE5 -> Set to 1 for cR hardware +; movlw b'00000000' ; 1= input, RE1 -> Power_IR, RE2 -> CS_MCP, RE3 -> LED_blue, RE4 -> power_sw1, RE5 -> Set to 1 for cR hardware clrf TRISE - movlw b'00110001' ; Init port + movlw b'00110001' ; init port movwf PORTE - movlw b'01111110' ; 1= Input, (RF1, RF2, RF3, RF4, RF5) -> Analog + movlw b'01111110' ; 1= input, (RF1, RF2, RF3, RF4, RF5) -> Analog movwf TRISF -; movlw b'00000000' ; Init port +; movlw b'00000000' ; init port clrf PORTF - movlw b'00001110' ; 1= Input, <7:6> not implemented, RG0 -> TX3_PIEZO_CFG, RG2 -> RX2, RG3 -> AN17_RSSI, RG4 -> SOSC_OUT, RG5 -> /RESET + movlw b'00001110' ; 1= input, <7:6> not implemented, RG0 -> TX3_PIEZO_CFG, RG2 -> RX2, RG3 -> AN17_RSSI, RG4 -> SOSC_OUT, RG5 -> /RESET movwf TRISG - movlw b'00000001' ; Init port + movlw b'00000001' ; init port movwf PORTG -; movlw b'00000000' ; 1= Input -> Data TFT_low +; movlw b'00000000' ; 1= input -> Data TFT_low clrf TRISH -; movlw b'00000000' ; Init port +; movlw b'00000000' ; init port clrf PORTH - movlw b'10011011' ; 1= Input, RJ4 -> vusb_in, RJ5 -> power_sw2, RJ6 -> CLK_MS5541, RJ7 -> MISO_MS5541 + movlw b'10011011' ; 1= input, RJ4 -> vusb_in, RJ5 -> power_sw2, RJ6 -> CLK_MS5541, RJ7 -> MISO_MS5541 movwf TRISJ - movlw b'00100000' ; Init port + movlw b'00100000' ; init port movwf PORTJ ; Timer 0 - movlw b'00000001' ; Timer0 with 1:4 prescaler + movlw b'00000001' ; timer0 with 1:4 prescaler movwf T0CON ; Timer 1 - Button hold-down timer - movlw b'10001100' ; 32768Hz clock source, 1:1 Prescaler -> ; 30,51757813µs/bit in TMR1L:TMR1H + movlw b'10001100' ; 32768Hz clock source, 1:1 prescaler -> ; 30.51757813 µs/bit in TMR1L:TMR1H movwf T1CON - banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM. + banksel 0xF16 ; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM ; RTCC - movlw 0x55 - movwf EECON2 - movlw 0xAA - movwf EECON2 - bsf RTCCFG,RTCWREN ; Unlock sequence for RTCWREN + movlw 0x55 + movwf EECON2 + movlw 0xAA + movwf EECON2 + bsf RTCCFG,RTCWREN ; unlock sequence for RTCWREN bsf RTCCFG,RTCPTR1 bsf RTCCFG,RTCPTR0 - bsf RTCCFG,RTCEN ; Module enable - bsf RTCCFG,RTCOE ; Output enable - movlw b'00000100' ; 32768Hz SOCS on RTCC pin (PORTG,4) Bit7-5: Pullups for Port D, E and J + bsf RTCCFG,RTCEN ; module enable + bsf RTCCFG,RTCOE ; output enable + movlw b'00000100' ; 32768 Hz SOCS on RTCC pin (PORTG,4) Bit7-5: pullups for Port D, E and J movwf PADCFG1 movlw b'11000100' movwf ALRMCFG ; 1 second alarm movlw d'1' - movwf ALRMRPT ; Alarm repeat counter - movlw 0x55 - movwf EECON2 - movlw 0xAA - movwf EECON2 - bcf RTCCFG,RTCWREN ; Lock sequence for RTCWREN + movwf ALRMRPT ; alarm repeat counter + movlw 0x55 + movwf EECON2 + movlw 0xAA + movwf EECON2 + bcf RTCCFG,RTCWREN ; lock sequence for RTCWREN banksel common ; A/D Converter @@ -151,37 +155,37 @@ movwf ADCON0 movlw b'00100000' ; 2.048V Vref+ movwf ADCON1 - movlw b'10001101' ; Right justified + movlw b'10001101' ; right aligned movwf ADCON2 -;init serial port1 (TRISC6/7) +; init serial port1 (TRISC6/7) movlw b'00001000' ; BRG16=1 movwf BAUDCON1 - movlw .34 ; SPBRGH:SPBRG = .34 : 114285 BAUD @ 16MHz (+0,79% Error to 115200 BAUD) - movwf SPBRG1 ; SPBRGH:SPBRG = .207 : 19230 BAUD @ 16MHz (-0,16% Error to 19200 BAUD) + movlw .34 ; SPBRGH:SPBRG = .34 : 114285 BAUD @ 16MHz (+0.79% Error to 115200 BAUD) + movwf SPBRG1 ; SPBRGH:SPBRG = .207 : 19230 BAUD @ 16MHz (-0.16% Error to 19200 BAUD) clrf SPBRGH1 ; clrf RCSTA1 - clrf TXSTA1 ; UART disable - bcf PORTC,6 ; TX hard to GND + clrf TXSTA1 ; UART disable + bcf PORTC,6 ; TX hard to GND -;init serial port2 (TRISG2) - banksel BAUDCON2 - movlw b'00100000' ; BRG16=0 ; inverted for IR +; init serial port2 (TRISG2) + 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'00100000' ; BRGH=0, SYNC=0 + movwf TXSTA2 + movlw .102 ; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16MHz + movwf SPBRG2 clrf SPBRGH2 - movlw b'10010000' - movwf RCSTA2 - banksel common + movlw b'10010000' + movwf RCSTA2 + banksel common ; Timer3 for IR-RX Timeout - clrf T3GCON ; Reset Timer3 Gate Control register - movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced + clrf T3GCON ; reset Timer3 gate control register + movlw b'10001001' ; 1:1 prescaler -> 2 seconds@32768Hz, synced ; 30,51757813µs/bit in TMR3L:TMR3H movwf T3CON @@ -196,54 +200,54 @@ ; -> 16MHz Bit clock @64MHz mode (Fastest) ; MSSP1 Module: I2C Master - movlw b'00101000' ; I2C Master Mode + movlw b'00101000' ; I2C master mode movwf SSP1CON1 ; movlw b'00000000' clrf SSP1CON2 movlw 0x27 - movwf SSP1ADD ; 100kHz @ 16MHz Fosc + movwf SSP1ADD ; 100kHz @ 16MHz Fosc ; PWM Module(s) ; PWM1 for LED dimming movlw b'00001100' movwf CCP1CON movlw b'00000001' - movwf PSTR1CON ; Pulse steering disabled + movwf PSTR1CON ; pulse steering disabled movlw d'255' - movwf PR2 ; Period - ; 255 is max brightness (300mW) - clrf CCPR1L ; Duty cycle - clrf CCPR1H ; Duty cycle + movwf PR2 ; period + ; 255 is max brightness (300 mW) + clrf CCPR1L ; duty cycle + clrf CCPR1H ; duty cycle movlw T2CON_NORMAL movwf T2CON ; Timer5 for ISR-independent wait routines - clrf T5GCON ; Reset Timer5 Gate Control register - movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced + clrf T5GCON ; reset Timer5 gate control register + movlw b'10001001' ; 1:1 prescaler -> 2 seconds@32768Hz, synced ; 30,51757813µs/bit in TMR5L:TMR5H movwf T5CON ; Timer7 for 62,5ms Interrupt (Sensor states) - 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'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced + 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'10001001' ; 1:1 prescaler -> 2 seconds@32768Hz, synced movwf T7CON clrf TMR7L movlw .248 movwf TMR7H ; -> Rollover after 2048 cycles -> 62,5ms - banksel common + banksel common ; Interrupts movlw b'11010000' movwf INTCON - movlw b'00001000' ; BIT7=1: Pullup for PORTB disabled + movlw b'00001000' ; BIT7=1: pullup for PORTB disabled movwf INTCON2 movlw b'00000000' movwf INTCON3 movlw b'00000001' ; Bit0: TMR1 movwf PIE1 movlw b'00000010' ; Bit1: TMR3 - movwf PIE2 + movwf PIE2 movlw b'00000000' ; Bit1: TMR5 movwf PIE5 movlw b'00100001' ; Bit0: RTCC, Bit5: UART2 @@ -251,16 +255,17 @@ movlw b'00001000' ; Bit3: TMR7 movwf PIE5 - bsf power_sw1 - btfss power_sw1 - bra $-4 - bsf power_sw2 - btfss power_sw2 - bra $-4 + bsf power_sw1 + btfss power_sw1 + bra $-4 + bsf power_sw2 + btfss power_sw2 + bra $-4 movlw d'2' - movff WREG,speed_setting ; Normal + movff WREG,speed_setting ; normal + bcf active_reset_ostc_rx ; start RX from RESET return @@ -268,23 +273,23 @@ global speed_eco speed_eco: movlw d'1' - movff WREG,speed_setting ; Bank-independent + movff WREG,speed_setting ; bank-independent ; Done in ISR return ;============================================================================= global speed_normal speed_normal: movlw d'2' - movff WREG,speed_setting ; Bank-independent + movff WREG,speed_setting ; bank-independent ; Done in ISR return ;============================================================================= global speed_fastest speed_fastest: movlw d'3' - movff WREG,speed_setting ; Bank-independent + movff WREG,speed_setting ; bank-independent ; Done in ISR return ;============================================================================= - END \ No newline at end of file + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/hwos.inc --- a/src/hwos.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/hwos.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,53 +1,94 @@ ;============================================================================= ; -; File hwos.inc REFACTORED VERSION V2.97 SP1 +; File hwos.inc REFACTORED VERSION V2.99e ; ; OSTC Platform definitions ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-05-24 : [jDG] Cleanups from initial Matthias code. - +; 2011-05-24 : [jDG] Cleanups from initial Matthias code ;============================================================================= - LIST P=18F87K22 ; change also: Configure->SelectDevice from Mplab +; Low Level Settings + LIST P=18F87K22 ; compiler settings, if changed, change also: Configure -> SelectDevice in MPLAB +#include ; processor definitions +#include ; Portmap definitions -;#DEFINE __DEBUG + +; Debug Mode +;#DEFINE __DEBUG ; if defined, compile firmware in debug mode -;#DEFINE french_italian ; If defined, use french and italian instead of english and german +; Conditional Compiles (note: not all options will fit at the same time) +#DEFINE _screendump ; if defined, compile screen dump into firmware (default: included ) +#DEFINE _rx_functions ; if defined, compile RX (OSTC TR) into firmware (default: included *) +;#DEFINE _ostc_logo ; if defined, compile OSTC logo into firmware (default: not included ) +;#DEFINE _cave_mode ; if defined, compile cave mode into firmware (default: not included *) ## OPTION IS UNDER CONSTRUCTION ## +; +; * option needs to be included / excluded in p2_deco.c, too! -#include -#include ; Portmap -; Firmware definition -#DEFINE softwareversion_x .2 ; Software version XX.YY -#DEFINE softwareversion_y .98 ; Software version XX.YY -#DEFINE softwareversion_beta .0 ; 0= release, 1=beta, 2=SP1, 3=SP2, ... +; Language Selection +#DEFINE none 0 ; no language selected +#DEFINE en 1 ; English +#DEFINE de 2 ; German +#DEFINE fr 3 ; French +#DEFINE it 4 ; Italian + +#DEFINE _language_1 en ; first or single language - must be set to en, de, fr, or it, defaults to en +#DEFINE _language_2 none ; second language or none + -; Firmware version will appear in "Change Firmware" style -#DEFINE firmware_expire_year .19 -#DEFINE firmware_expire_month .8 -#DEFINE firmware_expire_day .27 +; Firmware Version +#DEFINE softwareversion_x .2 ; Software Version, major (1 - 9) +#DEFINE softwareversion_y .99 ; Software Version, minor (1 - 99) +#DEFINE softwareversion_beta .0 ; 0= Release, 1= Beta-1, 2= Beta-2, ... (0 - 255) +; Firmware Expiration Date, will cause version to be displayed in "Update Firmware" style after the following date: +#DEFINE firmware_expire_year .18 +#DEFINE firmware_expire_month .12 +#DEFINE firmware_expire_day .31 + +; Magic Cookie Definition #DEFINE comm_service_key 0xABCDEF +; Logo Address Vectors +#DEFINE hw_logo_block 0x01E000 ; color image data for heinrichsweikamp logo +#DEFINE usb_ble_logo_block 0x01EEDE ; color image data for USB or BLE logo + + ;-----------------------------EEPROM DATA ------------------------------------ ; Automatic reset of all options when this is changed: -#define eeprom_opt_serial 0x0006 ; Version 0.6 +#DEFINE eeprom_opt_serial 0x0008 ; Version 0.8 ;----------------------------------------------------------------------------- #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 T2CON_ECO b'01111110' ; +#DEFINE T2CON_NORMAL b'01111110' ; +#DEFINE T2CON_FASTEST b'01111110' ; + +; Divemode Custom View Indexes - Attention: these numbers need to be in line with the jump tables in customview.asm! +#DEFINE index_avr_stopwatch .1 ; average depth and stopwatch +#DEFINE index_compass_dm .2 ; compass +#DEFINE index_ppo2_sensors .3 ; ppO2 sensors +#DEFINE index_sensor_check .4 ; sensor check +#DEFINE index_pscr_info .5 ; pSCR data +#DEFINE index_pressures_SAC .6 ; tank pressure and SAC rate +#DEFINE index_gas_needs_ascent .7 ; gas needs for ascent / cave return +#DEFINE index_decoplan .8 ; deco plan +#DEFINE index_ceiling_GF_tissue .9 ; ceiling, current GF and tissues +#DEFINE index_CNS .10 ; CNS values +#DEFINE index_ppo2_ead_end_cns .11 ; ppO2, END/EAD and CNS +#DEFINE index_gf_factors .12 ; GF factors +#DEFINE index_clock_batt_surfpress .13 ; clock, battery and surface pressure +#DEFINE index_cv_dm_max .13 ; highest index in use in dive mode custom view ; 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.8125 ms -> 1 s +#DEFINE TMR1H_VALUE_CONT .255-.32 ; in steps of 7.8125 ms -> 0.25 s +#DEFINE TMR1H_VALUE_CONT_DIVE .255-.64 ; in steps of 7.8125 ms -> 0.5 s -; Color Definitions: 8Bit RGB b'RRRGGGBB' +; Color Definitions: 8 bit 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) @@ -70,25 +111,25 @@ #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) +; External O2 cell input Parameters +#DEFINE min_mv .80 ; = 8 mV +#DEFINE max_mv .2500 ; = 250 mV +#DEFINE ignore_mv .3500 ; = 350 mV (to suppress ghost readings for long, open cables) -; Profile recording parameters +; Profile Recording Parameters #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] +; Attention: Divisors must be < 16 ! +#DEFINE div_temperature .6 ; x sampling rate [s] +#DEFINE div_deco .6 ; x sampling rate [s] +#DEFINE div_gf .12 ; x sampling rate [s] +#DEFINE div_ppo2_sensors .2 ; x sampling rate [s] +#DEFINE div_decoplan .12 ; x sampling rate [s] +#DEFINE div_cns .12 ; x sampling rate [s] +#DEFINE div_tank .0 ; x sampling rate [s] -; Warning: Information lengths must be <.16 ! +; Attention: Information Lengths must be < 16 ! #DEFINE infolength_temperature .2 ; [byte] #DEFINE infolength_deco .2 ; [byte] #DEFINE infolength_gf .1 ; [byte] @@ -97,82 +138,91 @@ #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 2.4Ah Battery -; or b) devide through 121 -> Result is in percent of a 0.8Ah Battery +; a) devide through 364 -> result is in percent of a 2.4 Ah battery +; or b) devide through 121 -> result is in percent of a 0.8 Ah battery -; For internal battery gauging +; internal Battery Gauging #DEFINE internal_saft_capacity .364 #DEFINE internal_panasonic_capacity .121 -; For gauge IC +; Gauge IC #DEFINE saft_capacity .281 ; 2.4Ah/0.085mAh/100 [%] #DEFINE saft_offset .37300 ; 65536-(2.4Ah/0.085mAh) @@ -194,7 +244,7 @@ #DEFINE current_ir_receiver .139 #DEFINE current_compass .28 -; Brightness thresholds (between zero (off) and 255 (max. power)) +; 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 @@ -204,164 +254,175 @@ #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 +; IR Link Timeout +#DEFINE ir_timeout_value .64 ; multiples of 62.5 ms -; Sp control constants +; Setpoint Control #DEFINE surface_sp .50 ; in cbar -; Gaslist hard-coded limits -#DEFINE gaslist_min_o2 .5 ; Minimum O2 [%] -#DEFINE gaslist_max_He .100-gaslist_min_o2 ; Maximum He [%] +; Gaslist hard-coded Limits +#DEFINE gaslist_min_o2 .6 ; 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] -#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 +; 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 -; Bit Masks for communication with p2_deco.c - char_O_deco_status -#define DECO_STATUS_MASK .3 -; 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 - -; Bit Flags for communication with p2_deco.c - char_O_main_status -; .0 ; unused -; .1 ; unused +; Bit Flags for Communication with p2_deco.c - char_O_main_status +#DEFINE DECO_COMPLETED_NORM .0 ; the calculation of a normal deco plan has just been completed +#DEFINE DECO_COMPLETED_ALT .1 ; the calculation of an alternative deco plan has just been completed ; 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 DECO_Z_FACTOR_FLAG .4 ; =1: figure in Z factor when converting gas volumes <-> pressures +#DEFINE DECO_CAVE_MODE .5 ; =1: compute ascent and gas needs using backtracking data +#DEFINE DECO_BOTTOM_FLAG .6 ; =1: compute with bottom time (deco calculator), =0: with extra time (dive mode) +#DEFINE DECO_TR_FUNCTIONS .7 ; =1: compute TR functions (pressure readings) -; 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 +; 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_BAILOUT_FLAG .5 ; =1: do a bailout calculation, i.e. allow gas switches before first deco stop +#DEFINE DECO_VOLUME_FLAG .6 +#DEFINE DECO_ASCENT_FLAG .7 -; 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 +; Bit Flags for Communication with p2_deco.c - 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 outside_attention .6 +#DEFINE stoptable_overflow .7 -; Bit Flags for status on CHARs -#define char_invalid_flag .7 +; Bit Flags for Communication with p2_deco.c - char_O_deco_info +#DEFINE deco_flag .0 ; =1: in deco mode, deco ppO2 levels permitted +#DEFINE ind_double_switch .1 ; =1: switch to other tank advice active +#DEFINE deco_steady .2 ; =1: fTTS is = TTS (not updated when in bailout mode) +#DEFINE deco_decreasing .3 ; =1: fTTS is < TTS (not updated when in bailout mode) +#DEFINE deco_ceiling .4 ; =1: ceiling depth > 0 +#DEFINE gas_needs_cave .5 ; =1: indicated gas needs are calculated in cave mode -; 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 +; Bit Flags for Status on Variables of Type char +#DEFINE char_transmitter_lost .6 +#DEFINE char_invalid_flag .7 +#DEFINE char_transmitter_low_bat .7 + +; Bit Flags for Status on Variables of Type int (Flags are placed in the upper byte) +#DEFINE int_invalid_flag .2 +#DEFINE int_not_yet_computed .3 +#DEFINE int_is_zero .3 +#DEFINE int_low_flag .4 +#DEFINE int_not_avail_flag .4 +#DEFINE int_high_flag .5 +#DEFINE int_outdated_flag .5 +#DEFINE int_attention_flag .6 +#DEFINE int_warning_flag .7 ;----------------------------------------------------------------------------- ; Flags -; 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 +; Hardware Descriptor 1 +#DEFINE battery_gauge_available hardware_flag1,0 ; =1: OSTC has rechargeable battery with battery management chip +#DEFINE ambient_sensor hardware_flag1,1 ; =1: OSTC has an ambient light sensor +#DEFINE analog_o2_input hardware_flag1,2 ; =1: OSTC has analog inputs and S8 digital +#DEFINE optical_input hardware_flag1,3 ; =1: OSTC has an digital optical input +#DEFINE ble_available hardware_flag1,4 ; =1: OSTC has an BLE module +#DEFINE ostc_rx_present hardware_flag1,5 ; =1: OSTC has RX circuity +; hardware_flag1,6 ; --- unused +; hardware_flag1,7 ; --- unused +; Hardware Descriptor 2 +#DEFINE screen_type hardware_flag2,0 ; =1: display 1, =0; display 0 +#DEFINE compass_type hardware_flag2,1 ; =1: compass 1, =0: compass 0 +#DEFINE compass_type2 hardware_flag2,2 ; =1: compass 2, =0: compass 0 or 1 +#DEFINE analog_switches hardware_flag2,3 ; =1: analog switches available +; hardware_flag2,4 ; --- unused +; hardware_flag2,5 ; --- unused +; hardware_flag2,6 ; --- unused +; hardware_flag2,7 ; --- unused + +; Control of numerical Output #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 +; cvt_flags+0,4 ; --- unused +; cvt_flags+0,5 ; --- unused +; cvt_flags+0,6 ; --- unused +; cvt_flags+0,7 ; --- unused -#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 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 +; cvt_flags+1,7 ; --- unused ; 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 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: sensor 1 is active +#DEFINE sensor2_active hud_status_byte,4 ; =1: sensor 2 is active +#DEFINE sensor3_active hud_status_byte,5 ; =1: sensor 3 is active +; hud_status_byte,6 ; --- unused in stand-alone HUD +; hud_status_byte,7 ; --- unused in stand-alone HUD +; General Flags #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 neg_flag flag1,2 ; =1: result is negative, e.g. by sub16 (sub_c = sub_a - sub_b) +#DEFINE pressure_refresh flag1,3 ; =1: s new pressure/temperature is available +#DEFINE sleepmode flag1,4 ; =1: in sleep mode #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 rs232_receive_overflow flag2,0 ; =1: a RS232 timeout overflow occoured -#DEFINE stored_gas_changed flag2,1 ; =1: Stored Gas changed +#DEFINE rs232_receive_overflow flag2,0 ; =1: a RS232 timeout overflow occurred +#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 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 premenu flag2,5 ; =1: pre-menu/dive menu selected #DEFINE menubit flag2,6 ; menu #DEFINE simulatormode_active flag2,7 ; =1: simulator mode active, override pressure sensor readings -#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 divemode_menu flag3,0 ; =1: dive mode menu is shown +#DEFINE onesecupdate flag3,1 ; =1: set any new second +#DEFINE onesectoggle flag3,2 ; used for phasing every-2-seconds tasks #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 oneminupdate flag3,4 ; =1: set any new minute +#DEFINE divemode flag3,5 ; =1: in dive mode +#DEFINE battery_is_36v flag3,6 ; =1: a 3.6 Volt battery is in use +#DEFINE message_warning flag3,7 ; =1: a warning is active in dive mode or surface mode #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 menuview flag4,2 ; =1: a menu view is shown in dive mode (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 depth_greater_100m flag4,6 ; =1: current depth > 100 meters +#DEFINE realdive flag4,7 ; =1: a real dive during dive mode #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 FLAG_active_descent flag5,4 ; used in apnoe mode +#DEFINE event_occured flag5,5 ; =1: an event occurred, store it! +#DEFINE divemode_menu_active flag5,6 ; =1: the dive mode menu is shown #DEFINE temp_changed flag5,7 ; =1: the temperature changed #DEFINE gas6_changed flag6,0 ; =1: gas 6 has been selected/changed underwater @@ -370,112 +431,154 @@ #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_back_to_loop flag6,6 ; =1: a switchback from bailout to loop occurred #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 better_gas_hint flag7,0 ; =1: mark a gas in yellow when it is a better gas +#DEFINE no_more_divesecs flag7,1 ; =1: do no longer show seconds in dive mode +#DEFINE FLAG_gauge_mode flag7,2 ; =1: in Gauge mode +#DEFINE ignore_last_edited_gas flag7,3 ; used in gaslist_cleanup_list +#DEFINE FLAG_diluent_setup flag7,4 ; =1: setting up Diluents ("Gas6-10") + IFDEF _rx_functions +#DEFINE FLAG_pairing_mode flag7,5 ; =1: in transmitter-to-tank pairing menu + ENDIF +#DEFINE short_gas_decriptions flag7,6 ; =1: use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint +#DEFINE max_depth_greater_100m flag7,7 ; =1: max. depth > 100 meters -#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 FLAG_bailout_mode flag8,0 ; =1: in bailout mode +#DEFINE is_bailout_menu flag8,1 ; =1: in bailout menu +#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 compass_enabled flag8,7 ; =1: the compass and accelerometer chip is active -#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 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 gas change 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 compass 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 s8_digital flag10,0 ; =1: digital I/O +#DEFINE menu_update_sensor_mv 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: fall-back to SP1 due to external O2 sensor failure + IFDEF _screendump +#DEFINE enable_screen_dumps flag10,6 ; =1: ignore vin_usb, wait for "l" command (screen dump) + ELSE +#DEFINE disable_comm_mode flag10,6 ; =1: ignore vin_usb + ENDIF +#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) +; flag11,* are not cleared on (re-)start +#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 neg_flag_velocity flag12,0 ; neg_flag backup for velocity logic -#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 flag12,0 ; neg_flag backup for velocity logic +#DEFINE compass_bearing_eq flag12,1 ; =1: bearing is in direction, do not show << or >> +#DEFINE compass_bearing_lft flag12,2 ; =1: bearing is to the left/<<, =0: to the right/>> +#DEFINE compass_bearing_vis flag12,3 ; =1: bearing is visible (either ahead or behind/-180°) +#DEFINE compass_bearing_ahd flag12,4 ; =1: bearing is ahead, =0: behind +#DEFINE blinking_depth_warning flag12,5 ; =1: warning color, set by the color_depth +#DEFINE blinking_depth_prev flag12,6 ; =1: prev display had warning color, set by the TFT_depth +#DEFINE blinking_depth_toggle flag12,7 ; toggle controlling blinking -#DEFINE compass_bearing_set flag13,0 ; bearing set -#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 +; flag13,* are not cleared on (re-)start +#DEFINE compass_bearing_set flag13,0 ; =1: compass bearing is set +#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 auto-selected already +#DEFINE sp3_switched flag13,4 ; =1: this setpoint has been auto-selected already +#DEFINE sp4_switched flag13,5 ; =1: this setpoint has been auto-selected already +#DEFINE sp5_switched flag13,6 ; =1: this setpoint has been auto-selected 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 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 alternative_divelayout flag14,6 ; =1: the alternative dive layout is used (aka "blind mode") +#DEFINE i2c_error_flag flag14,7 ; =1: an I2C error occurred + +#DEFINE better_dil_available flag15,0 ; =1: a better diluent is available +#DEFINE blinking_better_dil flag15,1 ; =1: diluent is blinking +#DEFINE FLAG_oc_mode flag15,2 ; =1: OC mode active +#DEFINE message_attention flag15,3 ; =1: an attention is active in divem ode or surface mode +#DEFINE message_advice flag15,4 ; =1: an advice is active in divem ode +#DEFINE blinking_depth_attention flag15,5 ; =1: attention color, set by the color_depth +#DEFINE aux_flag flag15,6 ; provided for local boolean storage +#DEFINE FLAG_tr_enabled flag15,7 ; =1: TR (pressure transmitter) functions enabled -#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 + IFDEF _cave_mode +#DEFINE FLAG_cave_mode flag16,0 ; =1: in cave mode +#DEFINE FLAG_cave_mode_shutdown flag16,1 ; =1: cave mode has shut down due to bracktrack memory full +#DEFINE FLAG_dive_turned flag16,2 ; =1: dive is turned +#DEFINE toggle_turn_dive flag16,3 ; =1: toggle dive turned status +#DEFINE gas_needs_mode_last flag16,4 ; =1: last reported gas needs where computed in cave mode + ENDIF + IFDEF _rx_functions +#DEFINE menu_update_tank_pres flag16,5 ; =1: update tank pressure data in menu mode + ENDIF +#DEFINE redraw_custview_mask flag16,6 ; =1: request to redraw the custom view mask +; flag16,7 ; --- unused + + IFDEF _rx_functions +#DEFINE transmitter1_lost flag17,0 ; =1: transmitter 1 lost is an old message +#DEFINE transmitter1_battery flag17,1 ; =1: transmitter 1 battery low is an old message +#DEFINE transmitter1_pres_warn flag17,2 ; =1: transmitter 1 pressure warning is an old message +#DEFINE transmitter1_pres_att flag17,3 ; =1: transmitter 1 pressure attention is an old message +#DEFINE transmitter2_lost flag17,4 ; =1: transmitter 2 lost is an old message +#DEFINE transmitter2_battery flag17,5 ; =1: transmitter 2 battery low is an old message +#DEFINE transmitter2_pres_warn flag17,6 ; =1: transmitter 2 pressure warning is an old message +#DEFINE transmitter2_pres_att flag17,7 ; =1: transmitter 2 pressure attention is an old message + ENDIF + +; Low-Level Display Control +#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 +#DEFINE use_custom_colors aa_flags,3 ; =1: override default pixel colors, used by color_image +; 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_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 +; Display Update Flags in Dive Mode +#DEFINE FLAG_TFT_divemode_mask tft_update_flags+0,0 ; =1: update the display +#DEFINE FLAG_TFT_display_ndl_mask tft_update_flags+0,1 ; =1: update the display +#DEFINE FLAG_TFT_depth tft_update_flags+0,2 ; =1: update the display +#DEFINE FLAG_TFT_divemins tft_update_flags+0,3 ; =1: update the display +#DEFINE FLAG_TFT_show_safety_stop tft_update_flags+0,4 ; =1: update the display +#DEFINE FLAG_TFT_display_ndl tft_update_flags+0,5 ; =1: update the display +#DEFINE FLAG_TFT_display_deko_mask tft_update_flags+0,6 ; =1: update the display +#DEFINE FLAG_TFT_display_deko tft_update_flags+0,7 ; =1: update the display +#DEFINE FLAG_TFT_display_tts tft_update_flags+1,0 ; =1: update the display +#DEFINE FLAG_TFT_temp_divemode tft_update_flags+1,1 ; =1: update the display +#DEFINE FLAG_TFT_divemode_warning tft_update_flags+1,2 ; =1: update the display +#DEFINE FLAG_TFT_divemode_warning_clear tft_update_flags+1,3 ; =1: update the display +#DEFINE FLAG_TFT_active_gas_divemode tft_update_flags+1,4 ; =1: update the display +#DEFINE FLAG_TFT_clear_safety_stop tft_update_flags+1,5 ; =1: update the display +#DEFINE FLAG_TFT_max_depth tft_update_flags+1,6 ; =1: update the display +#DEFINE FLAG_TFT_divemode_mask_alt tft_update_flags+1,7 ; =1: update the display +#DEFINE FLAG_TFT_dive_warning_text_clear tft_update_flags+2,0 ; =1: update the display +#DEFINE FLAG_TFT_dive_warning_text_clr2 tft_update_flags+2,1 ; =1: update the display +#DEFINE FLAG_TFT_big_deco_alt tft_update_flags+2,2 ; =1: update the display +#DEFINE FLAG_TFT_display_ndl_or_deko tft_update_flags+2,3 ; =1: update the display ; tft_update_flags+2,4 ; unused ; tft_update_flags+2,5 ; unused ; tft_update_flags+2,6 ; unused @@ -485,18 +588,18 @@ ;---------------------------- Macros ------------------------------------ TSTOSS macro opt_reg ; TeST Option Skip if not Zero - movff opt_reg,WREG - tstfsz WREG,A - bra $+4 - endm + movff opt_reg,WREG ; Attention: destroys WREG! + tstfsz WREG,A ; Attention: the following command must be a + bra $+4 ; plain machine command, do not let + endm ; follow a macro! -;---------------------------- C-code Routines ---------------------------- +;---------------------------- C-Code Routines ---------------------------- extern deco_calc_desaturation_time extern deco_calc_hauptroutine + extern deco_calc_dive_interval 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 @@ -504,20 +607,21 @@ ;---------------------------- Bank0 DATA ------------------------------------ isr_backup equ 0x60 -isr_backup udata_ovr isr_backup ; Reserved space for interupt data - -;---- Backup for general registers +isr_backup udata_ovr isr_backup ; reserved space for interrupt data + + +;---- Backup for general Registers isr_prod res 2 -;---- MS5541 subroutines +;---- MS5541 Subroutines amb_pressure res 2 temperature res 2 -C1 res 2 ; Decoded calibration data +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) +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 @@ -525,16 +629,16 @@ xdT2 res 2 OFF res 2 SENS res 2 -dLSB res 1 ; Pressure sensor interface +dLSB res 1 ; pressure sensor interface dMSB res 1 clock_count res 1 -sensor_state_counter res 1 ; counts to eight for state maschine +sensor_state_counter res 1 ; counts to eight for state machine 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_pressure_velocity res 2 ; for velocity last_surfpressure res 2 last_surfpressure_15min res 2 last_surfpressure_30min res 2 @@ -544,27 +648,27 @@ avg_rel_pressure res 2 avg_rel_pressure_total res 2 -;---- Data for ISR math subroutines +;---- Data for ISR Math Subroutines isr_xC res 4 isr_xA res 2 isr_xB res 2 -;---- Data for ISR routines +;---- 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 +;---- Display Brightness +max_CCPR1L res 1 ; max. brightness value for CCPR1L -; Battery gauge (nAs, nC) -battery_gauge res 6 ; 48Bit -> 78Ah max... +;---- Battery Gauge (nAs, nC) +battery_gauge res 6 ; 48 bit -> 78 Ah max -; IR/S8-Link +;---- 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 +ir_s8_timeout res 1 ; timeout for valid data -; Compass raw data +;---- Compass raw Data compass_DX res 2 compass_DY res 2 compass_DZ res 2 @@ -573,7 +677,7 @@ accel_DY res 2 accel_DZ res 2 -; Compass FILTERED data +;---- Compass filtered Data compass_DX_f res 2 compass_DY_f res 2 compass_DZ_f res 2 @@ -582,28 +686,29 @@ accel_DY_f res 2 accel_DZ_f res 2 -; Compass calibration data +;---- 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 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 +;---- Data for Logging CNS_start res 2 ; CNS value at beginning of dive -GF_start res 1 ; GF 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 +;---- CPU mode +speed_setting res 1 ; =1: eco, =2: normal, =3: fastest -;---- Data for graphical compass +;---- 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 @@ -640,15 +745,21 @@ flag12 res 1 flag13 res 1 flag14 res 1 -hardware_flag res 1 ; hardware descriptor flag +flag15 res 1 +flag16 res 1 +flag17 res 1 +hardware_flag1 res 1 ; hardware descriptor flags 1 +hardware_flag2 res 1 ; hardware descriptor flags 2 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 +lo res 1 ; nickname for "low" | Attention: do not change the +hi res 1 ; nickname for "high" | relative positioning of these +up res 1 ; nickname for "upper" | variables, lo will also be used +ex res 1 ; nickname for "extra" | as base address for a 8, 16 and +ul res 1 ; nickname for "ultra" | 32 bit buffer ignore_digits res 1 ;---- Interface to Graphic Functions @@ -663,31 +774,38 @@ ;---- 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 +math_loop res 1 ; internal variable used for loops ;---- 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 +message_counter res 1 ; counts amount of messages +message_page res 1 ; current # of message page +pairing_slot res 1 ; slot number, used in transmitter pairing + ;---- Dive Mode / General divemins res 2 divesecs res 1 total_divetime_seconds res 2 -average_divesecs res 2 ; for the resettable stopwatch +average_divesecs res 2 ; time accumulator for the resettable stopwatch / average depth +average_divesecs_total res 2 ; time accumulator for the total average depth +curr_depth res 1 ; current depth in meters +amb_press_10 res 2 ; ambient pressure divided by 10 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 +best_gas_number res 1 ; number of the "best gas": 0= none found, 1-5= gases 1-5, 255= not computed +best_dil_number res 1 ; number of the "best dil": 0= none found, 1-5= dils 1-5, 255= not computed +active_gas res 1 ; the currently used OC/bailout gas (1-5) +active_dil res 1 ; the currently used diluent (1-5) ;---- Dive Mode / Apnoe apnoe_surface_mins res 1 @@ -715,13 +833,13 @@ 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) +o2_ppo2_sensor1 res 1 ; sensor 1 ppO2 (in 0.01 bar steps) +o2_ppo2_sensor2 res 1 ; sensor 2 ppO2 (in 0.01 bar steps) +o2_ppo2_sensor3 res 1 ; sensor 3 ppO2 (in 0.01 bar steps) hud_status_byte res 1 -;========================= privte Variables =================================== +;========================= private Variables =================================== ; do not access from outside of the respective source files! ;---- aa_wordprocessor.asm @@ -760,10 +878,10 @@ i2c_temp2 res 1 ; temporary data ;---- menu_processor.asm -menupos1 res 1 ; logbook and divemode menu +menupos1 res 1 ; logbook and dive mode 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 +menupos3 res 1 ; used for custom views +menupos4 res 1 ; used for dive mode 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) @@ -792,19 +910,23 @@ 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 + IFDEF _screendump +;---- Screendump Function +ds_line res 1 ; current line (0..239) (dump screen function) +ds_column res 1 ; current columnx2 (0..159) (dump screen function) +ds_pixel res 2 ; current pixel color (dump screen function) +ds_count res 1 ; repetition count (dump screen function) + ENDIF + ;---- wait.asm wait_counter res 1 -; ==> 187 bytes used - 21 bytes free +; ==> 202 bytes used - 6 bytes free ;============================ LOCAL DATA ====================================== @@ -818,7 +940,7 @@ ; sleepmode sleepmode.asm (unused) (unused) ; surfmode surfmode.asm* (unused) (unused) ; simulator simulator.asm (unused) (unused) -; divemode divemode.asm ghostwriter.asm (unused) +; divemode divemode.asm divemode.asm ghostwriter.asm ; logbook logboock.asm logbook.asm logbook.asm ; ; * assigned to this slot, but currently no local memory used @@ -840,26 +962,24 @@ 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 +s8_rawdata_sensor1 res 3 ; 24 bit A/D raw data from S8 HUD sensor 1 +s8_rawdata_sensor2 res 3 ; 24 bit A/D raw data from S8 HUD sensor 2 +s8_rawdata_sensor3 res 3 ; 24 bit 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) +start_year res 1 ; at start of dive (for logbook) | ATTENTION: do not change the position of these +start_month res 1 ; at start of dive (for logbook) | variables relative to each other! +start_day 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 + +opt_gas_type_backup res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco | ATTENTION: do not change the position of these +opt_dil_type_backup res 5 ; 0=Disabled, 1=First, 2=Normal | arrays relative to each other! 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_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 @@ -868,22 +988,18 @@ 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) +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 +old_velocity res 4 ; stores the last 4 speeds (8 seconds) in m/min menustack res 5 ; menu stack from menu_processor.asm @@ -891,44 +1007,64 @@ gas6_He_ratio res 1 ; gas6 He ratio gas6_temp res 1 ; temp used in divemenu_tree.asm -; ==> 134 bytes used - 122 bytes free + IFDEF _rx_functions +; Data exchange +rx_buffer res .48 ; Buffer for RX data (slots 0-7) +rx_firmware res 2 ; RX firmware version xx.yy + +; Variables for SAC Calculation on Pressure Readings 1 & 2 +pres_accu_1st res 4 ; accumulator for pressure drop in 1/160 bar | ATTENTION: do not +pres_accu_2nd res 4 ; accumulator for pressure drop in 1/160 bar | change the +time_accu_1st res 1 ; accumulator for reading ages in seconds | position +gas__last_1st res 1 ; last gas assignment | of these +time_accu_2nd res 1 ; accumulator for reading ages in seconds | variables +gas__last_2nd res 1 ; last gas assignment | relative +pres_last_1st res 2 ; last pressure reading pressure in 1/160 bar | to each +pres_last_2nd res 2 ; last pressure reading pressure in 1/160 bar | other! +time_last_1st res 2 ; last pressure reading time in seconds | +time_last_2nd res 2 ; last pressure reading time in seconds | + ENDIF + +; ==> 138 bytes used - 118 bytes free -;---------------------------- Bank 2 general purpose buffer ------------------- +;----------------------- 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 +buffer res .256 ; used for string assembly / display output -;---------------------------- Bank 14 for options table ----------------------- +;---------------------- Bank 14 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 +opt_gas_O2_ratio res 5 ; O2 ratios of OC/bailout gases | ATTENTION: +opt_dil_O2_ratio res 5 ; O2 ratios of diluents | keep relative +opt_gas_He_ratio res 5 ; He ratios of OC/bailout gases | positioning of +opt_dil_He_ratio res 5 ; He ratios of diluents | all arrays in +opt_gas_type res 5 ; OC/bailout gas type: O=Disabled, 1=First, 2=Travel, 3=Deco | this block! +opt_dil_type res 5 ; dil type: 0=Disabled, 1=First, 2=Normal | +opt_gas_change res 5 ; change depths for OC/Bailout gases | +opt_dil_change res 5 ; change depths for diluents | + +opt_dive_mode res 1 ; main dive/deco mode: =0: OC, =1: CC, =2: Gauge, =3: Apnea, =4: pSCR +opt_ccr_mode res 1 ; CCR/pSCR sub mode: =0: fixed/calculated SP, =1: sensor, =2: auto SP ;---- 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 +#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_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_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 @@ -936,16 +1072,16 @@ 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_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_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_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 behavior 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 @@ -954,7 +1090,7 @@ 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_diveTimeout res 1 ; timeout for dive mode [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 @@ -963,5 +1099,26 @@ 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 +opt_ZfactorUse res 1 ; =1: figure in compression factor Z when converting gas volume <-> gas pressure +opt_ZfactorTemp res 1 ; temperature setpoint for compression factor Z +opt_2ndDepthDisp res 1 ; =1: show average depth instead of max depth + +; RX functions - no conditional compilation because used in options_table +opt_transmitter_id_1 res 2 ; 16 bit transmitter ID for Gas 1 +opt_transmitter_id_2 res 2 ; 16 bit transmitter ID for Gas 2 +opt_transmitter_id_3 res 2 ; 16 bit transmitter ID for Gas 3 +opt_transmitter_id_4 res 2 ; 16 bit transmitter ID for Gas 4 +opt_transmitter_id_5 res 2 ; 16 bit transmitter ID for Gas 5 +opt_transmitter_id_6 res 2 ; 16 bit transmitter ID for Dil 1 +opt_transmitter_id_7 res 2 ; 16 bit transmitter ID for Dil 2 +opt_transmitter_id_8 res 2 ; 16 bit transmitter ID for Dil 3 +opt_transmitter_id_9 res 2 ; 16 bit transmitter ID for Dil 4 +opt_transmitter_id_10 res 2 ; 16 bit transmitter ID for Dil 5 +opt_TR_mode res 1 ; TR functions - mode +opt_TR_1st_pres res 1 ; TR functions - 1st pressure assignment +opt_TR_2nd_pres res 1 ; TR functions - 2nd pressure assignment +opt_TR_Bail_pres res 1 ; TR functions - bailout pressure assignment + +; ==> 173 bytes used - 85 bytes free ;----------------------------------------------------------------------------- diff -r 00b24fb4324d -r ca4556fb60b9 src/i2c.asm --- a/src/i2c.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/i2c.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File i2c.asm V2.98 +; File i2c.asm V2.99c ; ; I2C Interface ; @@ -69,24 +69,24 @@ bsf i2c_error_flag ; set error flag return -I2CReset: ; Something went wrong (Slave holds SDA low?) +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 + 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 ; YES - =1, SDA has been released from slave + bcf PORTC,3 ; NO - set SCL = 0 nop nop bcf PORTC,3 @@ -96,8 +96,8 @@ 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 + 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' @@ -111,32 +111,32 @@ I2C_TX: movwf SSP1BUF rcall WaitMSSP - bra I2C_WaitforACK ; Returns... + bra I2C_WaitforACK ; returns... -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: ; 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 + 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 + 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 + 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 + btfsc hi,7 ; copy sign bit to carry bsf STATUS,C rrcf hi ; /16 rrcf lo @@ -144,46 +144,46 @@ 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 + bsf SSP1CON2,SEN ; start condition rcall WaitMSSP movlw 0x38 ; address rcall I2C_TX movlw 0x00 rcall I2C_TX - bsf SSP1CON2,RSEN ; Repeated start condition (!) + bsf SSP1CON2,RSEN ; repeated start condition rcall WaitMSSP movlw 0x39 ; address rcall I2C_TX - rcall I2C_OneByteRX ; Get Status Byte + rcall I2C_OneByteRX ; get status byte movf SSP1BUF,W ; Non-flipped screen: ; Chip orientation on the PCB requires - ; Original = Corrected + ; Original = corrected ; x = -x ; y = -y ; z = -z ; Flipped screen: ; Chip orientation on the PCB requires - ; Original = Corrected + ; Original = corrected ; x = x ; y = y ; z = -z - rcall I2C_TwoBytesRX_div16 ; Get two bytes and divide /16 (signed) + 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. + bra I2C_RX_accelerometer2 ; YES + comf hi ; 16 bit sign change negf lo - btfsc STATUS,C ; Carry to propagate ? - incf hi,F ; YES: do it. + 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 @@ -983,7 +983,7 @@ 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 + call div16x16 ; xC = xA / xB with xA as remainder movff xC+0,batt_percent return @@ -1036,15 +1036,23 @@ bra WaitMSSP ; (and return) +;----------------------------------------------------------------------------- +; Transmitter Functions + + IFDEF _rx_functions + global I2C_probe_OSTC_rx I2C_probe_OSTC_rx: + movlw .5 + movwf lo_temp +I2C_probe_OSTC_rx_1: bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP 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 ostc_rx_present ; ACK sent - OSTC_RX present! bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP btfss ostc_rx_present ; Do we have the RX? @@ -1075,7 +1083,7 @@ rcall WaitMSSP ; last byte in read from RX circuity always with a NACK! - bsf SSP1CON2, RCEN ; Enable receive mode + bsf SSP1CON2, RCEN ; Enable receive mode rcall WaitMSSP movff SSP1BUF,rx_firmware+1 bsf SSP1CON2,ACKDT @@ -1083,7 +1091,35 @@ rcall WaitMSSP bcf SSP1CON2,ACKDT ; Reset ACKDT flag bsf SSP1CON2,PEN ; Stop condition - bra WaitMSSP ;(and return) + rcall WaitMSSP + + ; test for RX part not being ready during this read + movff rx_firmware+1,i2c_temp1 + movlw .147 + cpfseq i2c_temp1 + bra I2C_probe_OSTC_rx_2 ; not equal + movff rx_firmware+0,i2c_temp1 + movlw .27 + cpfseq i2c_temp1 + bra I2C_probe_OSTC_rx_2 ; not equal + bsf active_reset_ostc_rx + WAITMS .5 + bcf active_reset_ostc_rx + WAITMS .250 + WAITMS .250 + WAITMS .250 + WAITMS .250 + WAITMS .250 + WAITMS .250 + WAITMS .250 + WAITMS .250 + clrf i2c_temp1 + decfsz lo_temp,F ; try max. 5 times + bra I2C_probe_OSTC_rx_1 + bcf ostc_rx_present ; Clear flag. Something is wrong +I2C_probe_OSTC_rx_2: + clrf i2c_temp1 + return global I2C_get_tankdata @@ -1216,4 +1252,6 @@ retlw .0 ; All ok retlw .255 ; an error occurred + ENDIF + END diff -r 00b24fb4324d -r ca4556fb60b9 src/i2c.inc --- a/src/i2c.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/i2c.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File i2c.inc +; File i2c.inc V2.99c ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,13 +8,19 @@ ; HISTORY ; 2012-10-24 : [mH] Creation - extern I2C_RX_accelerometer - extern I2C_init_accelerometer - extern I2C_sleep_accelerometer - extern I2C_init_compass - extern I2C_sleep_compass - extern I2C_RX_compass - extern lt2942_get_voltage ; Read battery voltage registers - extern lt2942_get_accumulated_charge ; Get battery gauge registers - extern lt2942_init ; Init - extern lt2942_get_status ; Get status \ No newline at end of file + extern I2C_RX_accelerometer + extern I2C_init_accelerometer + extern I2C_sleep_accelerometer + extern I2C_init_compass + extern I2C_sleep_compass + extern I2C_RX_compass + extern lt2942_get_voltage ; read battery voltage registers + extern lt2942_get_accumulated_charge ; get battery gauge registers + extern lt2942_init ; init + extern lt2942_get_status ; get status + + IFDEF _rx_functions + extern I2C_probe_OSTC_rx ; set ostc_rx_present bit if present + extern I2C_get_tankdata ; get the tank data + extern I2C_update_OSTC_rx ; load new firmware into RX processor + ENDIF diff -r 00b24fb4324d -r ca4556fb60b9 src/icons.asm --- a/src/icons.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/icons.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File icons.asm +; File icons.asm V2.99c ; ; Tables for all OSTC icons. ; @@ -9,16 +9,24 @@ ; HISTORY ; 2011-05-24 : [jDG] Creation with icons for demo menus. -icons_data CODE +#include "hwos.inc" ; Mandatory header + +icons_data CODE -; Dive mode warning icon +;============================================================================= + +; dive mode warning icon global dive_warning2_block -#include "../src/Icons/dive_warning2.inc" ;45x39 px +#include "../src/Icons/dive_warning2.inc" ; 45x39 px + ; small warning icon ; global warning_block -;#include "../src/Icons/warning.inc" ;25x22 px +;#include "../src/Icons/warning.inc" ; 25x22 px + + IFDEF _ostc_logo global ostc_logo_block -; OSTC scribble -#include "../src/Icons/ostc_logo.inc" ;220x61 px +; OSTC logo +#include "../src/Icons/ostc_logo.inc" ; 220x61 px + ENDIF - END + END diff -r 00b24fb4324d -r ca4556fb60b9 src/isr.asm --- a/src/isr.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/isr.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File isr.asm REFACTORED VERSION V2.98 +; File isr.asm REFACTORED VERSION V2.99d ; ; INTERUPT subroutines ; @@ -19,7 +19,7 @@ extern start -isr_high CODE 0x0008 ; High Priority Interrupts +isr_high CODE 0x0008 ; high priority interrupts bra HighInt nop nop @@ -29,68 +29,68 @@ nop bra HighInt -isr_low CODE 0x00018 ; Low Priority Interrupts +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 ; Buttons - btfsc PIR1,TMR1IF ; Timer1 INT (Button hold-down Timer) + btfsc PIR1,TMR1IF ; timer 1 INT (button hold-down timer) rcall timer1int - btfsc INTCON,INT0IF ; Buttons + btfsc INTCON,INT0IF ; buttons rcall isr_switch_right - btfsc INTCON3,INT1IF ; Buttons + btfsc INTCON3,INT1IF ; buttons rcall isr_switch_left ; 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 + btfsc PIR3,RC2IF ; UART 2 + 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 + 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! + 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 + retfie FAST ; restores BSR, STATUS and WREG isr_set_speed_to_normal: ; Set speed to normal movlw b'01110010' - movwf OSCCON ; 16MHz INTOSC + movwf OSCCON ; 16 MHz 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 OSCTUNE ; 4x PLL disable (bit 6) - only works with 8 or 16 MHz (=32 or 64 MHz) + movlw T2CON_NORMAL movwf T2CON btfss OSCCON,HFIOFS - bra $-2 ; Wait until clock is stable + bra $-2 ; wait until clock is stable return -isr_dimm_tft: ; Adjust until max_CCPR1L=CCPR1L ! +isr_dimm_tft: ; adjust until max_CCPR1L=CCPR1L banksel common - btfsc tft_is_dimming ; Ignore while dimming + 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 + cpfsgt CCPR1L ; CCPR1L > max_CCPR1L ? + bra isr_dimm_tft2 ; NO - dimm up ; dimm down 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 + 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 @@ -100,21 +100,21 @@ 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 -isr_routines ; CODE +isr_routines ; CODE ;============================================================================= -isr_uart2: ; IR/S8-Link +isr_uart2: ; IR/S8 link banksel RCREG2 movf RCREG2,W - bcf RCSTA2,CREN ; Clear receiver status + 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 + 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 @@ -152,31 +152,31 @@ dcfsnz isr1_temp,F movwf ir_s8_buffer+.17 - clrf TMR3L ; Preload timer + clrf TMR3L ; preload timer movlw .253 movwf TMR3H - bsf T3CON,TMR3ON ; (Re)Start Timeout counter + 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. +isr_timer3: ; IR/S8 link timeout + bcf T3CON,TMR3ON ; stop timer 3 + banksel isr_backup ; select bank 0 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 + cpfseq ir_s8_counter ; got exactly 15 bytes? + bra isr_timer3_1 ; NO - test for 16bytes + bra isr_timer3_ir ; YES - 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 + cpfseq ir_s8_counter ; got exactly 16 bytes? + bra isr_timer3_2 ; NO - test for 17 bytes + tstfsz ir_s8_buffer+.15 ; YES - last byte = 0x00 ? + bra isr_timer3_exit ; No - exit + bra isr_timer3_ir ; YES - 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 + cpfseq ir_s8_counter ; got exactly 17 bytes? + bra isr_timer3_exit ; NO - exit + bra isr_timer3_s8 ; YES - S8 data isr_timer3_ir: ; IR input movff ir_s8_buffer+.0,PRODL @@ -208,11 +208,11 @@ ; Compare checksum movf ir_s8_buffer+.13,W - cpfseq PRODL ; Checksum ok? - bra isr_timer3_exit ; No, exit + 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 + cpfseq PRODH ; checksum ok? + bra isr_timer3_exit ; NO - exit ; Checksum OK, copy results movff ir_s8_buffer+.1,hud_status_byte @@ -228,16 +228,16 @@ 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.5 ms + 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. + bsf hud_connection_ok ; set manually for hwHUD w/o the HUD module... + banksel isr_backup ; select bank 0 for ISR data isr_timer3_exit: - clrf ir_s8_counter ; Clear pointer - bcf PIR2,TMR3IF ; Clear flag + clrf ir_s8_counter ; clear pointer + bcf PIR2,TMR3IF ; clear flag return isr_timer3_checksum: @@ -280,11 +280,11 @@ ; Compare checksum movf ir_s8_buffer+.15,W - cpfseq PRODL ; Checksum ok? - bra isr_timer3_exit ; No, exit + 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 + cpfseq PRODH ; checksum ok? + bra isr_timer3_exit ; NO - exit ; Checksum OK, copy results movff ir_s8_buffer+.3,hud_status_byte @@ -292,8 +292,8 @@ 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 + 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 @@ -309,21 +309,21 @@ 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 + movlw ir_timeout_value ; multiples of 62.5ms + movwf ir_s8_timeout ; reload timeout + bra isr_timer3_exit ; exit ;============================================================================= -isr_tmr7: ; each 62,5ms +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. + 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 - call get_analog_switches ; Get analog readings + call get_analog_switches ; get analog readings btfss INTCON3,INT1IE bra isr_tmr7_a btfsc analog_sw2_pressed @@ -336,31 +336,31 @@ 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 + btfss no_sensor_int ; sensor interrupt (because it's addressed during sleep)? + bra isr_tmr7_c ; NO - continue + banksel isr_backup ; YES - back to bank 0 ISR data return isr_tmr7_c: banksel isr_backup - movf max_CCPR1L,W ; Dimm value + movf max_CCPR1L,W ; dimm value cpfseq CCPR1L ; = current PWM value? - rcall isr_dimm_tft ; No, adjust until max_CCPR1L=CCPR1L ! + 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 + 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 + 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+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 @@ -380,58 +380,58 @@ 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 + btfss no_sensor_int ; sensor interrupt (because it's addressed during sleep)? + bra isr_sensor_state2 ; NO - continue + banksel isr_backup ; YES - 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 + 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 + 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) -; State 3: Get temperature (51us) and start pressure integration (73,5us) -; State 4: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us) -; State 5: Get temperature (51us) and start pressure integration (73,5us) -; 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 +; State 1: Clear flags and average registers, get temperature (51 us) and start pressure integration (73.5 us) +; State 2: Get pressure (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us) +; State 3: Get temperature (51 us) and start pressure integration (73.5 us) +; State 4: Get pressure (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us) +; State 5: Get temperature (51 us) and start pressure integration (73.5 us) +; State 6: Get pressure (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us) +; State 7: Get temperature (51 us) and start pressure integration (73.5 us) +; State 8: Get pressure (51 us), start temperature integration (73.5 us), calculate temperature compensated pressure (233 us) and build average for half-second update of temperature and pressure movff sensor_state_counter,WREG ; WREG used as temp here... dcfsnz WREG,F - bra sensor_int_state1_plus_restart ; Do State 1 + bra sensor_int_state1_plus_restart ; do State 1 dcfsnz WREG,F - bra sensor_int_state2 ; Do State 2 + bra sensor_int_state2 ; do State 2 dcfsnz WREG,F - bra sensor_int_state1 ; Do State 3 + bra sensor_int_state1 ; do State 3 dcfsnz WREG,F - bra sensor_int_state2 ; Do State 4 + bra sensor_int_state2 ; do State 4 dcfsnz WREG,F - bra sensor_int_state1 ; Do State 5 + bra sensor_int_state1 ; do State 5 dcfsnz WREG,F - bra sensor_int_state2 ; Do State 6 + 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 + 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) + call get_pressure_value ; state 2: get pressure (51 us) + call get_temperature_start ; and start temperature integration (73.5 us) + call calculate_compensation ; calculate temperature compensated pressure (27 us) ; Build average - bcf STATUS,C ; clear carry bit. + 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. + bcf STATUS,C ; clear carry bit, twice rrcf amb_pressure_avg+1 ; amb_pressure sum / 4 rrcf amb_pressure_avg+0 @@ -439,82 +439,81 @@ movff amb_pressure_avg+0,amb_pressure+0 bcf STATUS,C - btfsc temperature_avg+1,7 ; Copy sign bit to carry + btfsc temperature_avg+1,7 ; copy sign bit to carry bsf STATUS,C - rrcf temperature_avg+1 ; Signed temperature /2 + rrcf temperature_avg+1 ; signed temperature /2 rrcf temperature_avg+0 bcf STATUS,C - btfsc temperature_avg+1,7 ; Copy sign bit to carry + btfsc temperature_avg+1,7 ; copy sign bit to carry bsf STATUS,C - rrcf temperature_avg+1 ; Signed temperature /4 + 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 - 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 bank 1 + bcf temp_changed ; clear flag for temperature update + bcf pressure_refresh ; clear flag for pressure update + banksel isr_backup ; back to bank 0 ISR data ; Temp changed? movf temperature+0,W cpfseq last_temperature+0 - bra isr_sensor_state2_2 ; Yes + bra isr_sensor_state2_2 ; YES movf temperature+1,W cpfseq last_temperature+1 - bra isr_sensor_state2_2 ; Yes + bra isr_sensor_state2_2 ; YES 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 bank 1 + bsf temp_changed ; YES + banksel isr_backup ; back to bank 0 ISR data isr_sensor_state2_3: - movff temperature+0,last_temperature+0 ; Copy for compare + 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 + 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_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 bank 1 + bsf pressure_refresh ; YES + banksel isr_backup ; back to bank 0 ISR data isr_sensor_state2_5: - movff amb_pressure+0,last_pressure+0 ; Copy for compare + 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 + clrf sensor_state_counter ; reset state counter + banksel common ; flag2 is in bank 1 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 + bra comp_air_pressure ; NO + bsf pressure_refresh ; always set pressure_refresh flag in simulator mode + banksel isr_backup ; back to bank 0 ISR data + movlw LOW d'1000' ; simulate 1000 mbar 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 + banksel isr_backup ; back to bank 0 ISR data movf last_surfpressure+0,W ; compensate air pressure subwf amb_pressure+0,W - movwf rel_pressure+0 ; rel_pressure stores depth! + 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 + btfss STATUS,N ; is result below zero? + bra sensor_int_state_exit ; NO + 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 @@ -525,63 +524,63 @@ clrf temperature_avg+1 sensor_int_state1: - call get_temperature_value ; State 1: Get temperature - call get_pressure_start ; and start pressure integration. + 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) + call get_pressure_value ; state 2: get pressure (51 us)... + call get_temperature_start ; ...and start temperature integration (73.5 us) + call calculate_compensation ; .. and calculate temperature compensated pressure (233 us) ;bra sensor_int_state_exit sensor_int_state_exit: - rcall isr_restore_clock ; Restore clock + 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. + 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 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 + 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 bank 0 ISR data ; Convert BCD to DEC and set registers movff mins, isr1_temp - rcall isr_rtcc_convert ; Converts to dec with result in WREG + 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 + 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 + 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 + 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 + 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 + 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 bank 1 + 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 @@ -591,30 +590,30 @@ addwfc uptime+2,F addwfc uptime+3,F - banksel common ; flag1 is in Bank1 - bsf onesecupdate ; A new second has begun + banksel common ; flag1 is in bank 1 + bsf onesecupdate ; a new second has begun btfsc divemode ; in divemode? - rcall isr_divemode_1sec ; Yes, do some divemode stuff in bank common + 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 + rcall isr_update_lastdive_time ; NO - update the last dive timer tstfsz secs ; secs == 0 ? - return ; No, Done. + 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 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 + tstfsz mins ; mins == 0 ? + bra isr_rtcc2 ; NP + bsf onehourupdate ; YES - set flag isr_rtcc2: - banksel isr_backup ; Back to Bank0 ISR data - return ; Done. + banksel isr_backup ; back to bank 0 ISR data + return ; done isr_update_lastdive_time: ; called every second when not in divemode ; update uptime @@ -628,17 +627,17 @@ 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 ; bank 0 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 consumption value into isr1_temp and isr2_temp + banksel common ; flag1 is in bank 1 + 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 + banksel isr_backup ; bank 0 ISR data + movf isr1_temp,W ; 48 Bit 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 @@ -653,9 +652,9 @@ ; set consumption rate in nAs for an one second interval ; Example: ; movlw LOW .55556 ; 0,2A/3600*1e9s = nAs - ; movwf isr1_temp ; Low byte + ; movwf isr1_temp ; low byte ; movlw HIGH .55556 ; 0,2A/3600*1e9s = nAs - ; movwf isr2_temp ; High byte + ; movwf isr2_temp ; high byte ; Current consumption for LED backlight is 47*CCPR1L+272 movf CCPR1L,W @@ -668,7 +667,7 @@ 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) + ; 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 @@ -695,7 +694,7 @@ isr_battery_gauge5: ; Add current if IR receiver is on btfss ir_power ; IR enabled? - bra isr_battery_gauge6 ; no + bra isr_battery_gauge6 ; NO movlw LOW current_ir_receiver addwf isr1_temp,F movlw HIGH current_ir_receiver @@ -703,7 +702,7 @@ isr_battery_gauge6: ; Add current for compass/accelerometer btfss compass_enabled ; compass active? - bra isr_battery_gauge7 ; no + bra isr_battery_gauge7 ; NO movlw LOW current_compass addwf isr1_temp,F movlw HIGH current_compass @@ -714,23 +713,20 @@ 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 + cpfsgt samplesecs ; done? + bra isr_divemode_1sec2 ; NO 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) + ; 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) + 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) + return ; NO (e.g. too shallow) - ; increase divetime registers (Displayed dive time) + ; increase divetime registers (displayed dive time) incf divesecs,F movlw d'59' cpfsgt divesecs @@ -742,13 +738,13 @@ incf divemins+1,F ; increase divemins isr_divemode_1sec2a: - btfss FLAG_apnoe_mode ; Are we in Apnoe mode? - return ; No + 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 + return ; NO clrf apnoe_secs incf apnoe_mins,F ; increase descent mins return @@ -769,82 +765,82 @@ ;============================================================================= isr_switch_right: - bcf INTCON,INT0IE ; Disable INT0 - banksel common ; flag1 is in Bank1 + bcf INTCON,INT0IE ; disable INT0 + banksel common ; flag1 is in bank 1 btfss flip_screen ; 180° flipped? - bsf switch_right ; Set flag + bsf switch_right ; set flag btfsc flip_screen ; 180° flipped? - bsf switch_left ; Set flag - bra isr_switch_common ; Continue... + bsf switch_left ; set flag + bra isr_switch_common ; continue... isr_switch_left: - bcf INTCON3,INT1IE ; Disable INT1 - banksel common ; flag1 is in Bank1 + bcf INTCON3,INT1IE ; disable INT1 + banksel common ; flag1 is in bank 1 btfss flip_screen ; 180° flipped? - bsf switch_left ; Set flag + bsf switch_left ; set flag btfsc flip_screen ; 180° flipped? - bsf switch_right ; Set flag + bsf switch_right ; set flag isr_switch_common: ; load timer1 for first press clrf TMR1L - movlw TMR1H_VALUE_FIRST ; in steps of 7,8125ms + movlw TMR1H_VALUE_FIRST ; in steps of 7.8125 ms 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 + bsf T1CON,TMR1ON ; start timer 1 + banksel isr_backup ; select bank 0 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 bank 1 + 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 + 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 + 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 + bsf switch_left ; (re-)set flag btfsc flip_screen ; 180° flipped? - bsf switch_right ; (Re-)Set flag - bra timer1int_common ; Continue + bsf switch_right ; (re-)set flag + bra timer1int_common ; continue timer1int_right: btfss flip_screen ; 180° flipped? - bsf switch_right ; Set flag + bsf switch_right ; set flag btfsc flip_screen ; 180° flipped? - bsf switch_left ; Set flag + bsf switch_left ; set flag timer1int_common: ; load timer1 for next press clrf TMR1L - movlw TMR1H_VALUE_CONT ; Surface mode + movlw TMR1H_VALUE_CONT ; surface mode btfsc divemode - movlw TMR1H_VALUE_CONT_DIVE ; Dive mode + movlw TMR1H_VALUE_CONT_DIVE ; sive mode movwf TMR1H - return ; Return from timer1int with timer1 kept running + return ; return from timer1int with timer1 kept running ;============================================================================= 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 ? + movf int_O_desaturation_time+0,W ; is Desat null ? iorwf int_O_desaturation_time+1,W - bz check_nofly_desat_time_1 ; yes... + bz check_nofly_desat_time_1 ; YES ; 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 @@ -855,13 +851,13 @@ banksel common infsnz surface_interval+0,F incf surface_interval+1,F - return ; Done + return ; done check_nofly_desat_time_1: banksel common clrf surface_interval+0 - clrf surface_interval+1 ; Clear surface interval timer - return ; Done. + clrf surface_interval+1 ; clear surface interval timer + return ; done ;============================================================================= @@ -872,9 +868,9 @@ 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) + movwf OSCTUNE ; 4x PLL Ddsable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz) movlw b'00110010' - movwf OSCCON ; 1MHz INTOSC + movwf OSCCON ; 1 MHz INTOSC movlw T2CON_ECO movwf T2CON bra isr_restore_exit @@ -884,19 +880,19 @@ bra isr_restore_speed3 ; Reset to normal movlw b'01110010' - movwf OSCCON ; 16MHz INTOSC + movwf OSCCON ; 16 MHz INTOSC movlw b'00000000' - movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movwf OSCTUNE ; 4x PLL disable (Bit 6) - 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 + movlw b'01110010' ; 16 MHz INTOSC movwf OSCCON movlw b'01000000' - movwf OSCTUNE ; 4x PLL Enable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz) + movwf OSCTUNE ; 4x PLL enable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz) movlw T2CON_FASTEST movwf T2CON ;bra isr_restore_exit @@ -907,7 +903,7 @@ return -restore_flash: ; Restore first flash page from eeprom +restore_flash: ; restore first flash page from EEPROM banksel common ; Start address in internal flash movlw 0x00 @@ -915,36 +911,36 @@ 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 + movwf lo ; byte counter clrf EEADR movlw .3 - movwf EEADRH ; Setup backup address + 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 + tblwt+* ; table write with pre-increment + decfsz lo,F ; 128 bytes done? + bra restore_flash_loop ; NO - loop - 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 + movwf EECON1 ; type of memory to write in movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 - bsf EECON1,WR ; Write + bsf EECON1,WR ; write nop nop return diff -r 00b24fb4324d -r ca4556fb60b9 src/isr.inc --- a/src/isr.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/isr.inc Thu Nov 22 19:47:26 2018 +0100 @@ -8,13 +8,13 @@ ; HISTORY ; 2011-08-06 : [mH] moving from OSTC code -SAFE_2BYTE_COPY MACRO from, to - local retry +SAFE_2BYTE_COPY MACRO from,to + local retry retry: - movff from+1,WREG ; High byte in W. - movff WREG,to+1 ; and destination. - movff from+0,to+0 ; Copy low byte. - movff from+1,TABLAT ; another bank-safe read. - xorwf TABLAT,W ; High byte changed ? - bnz retry - ENDM + movff from+1,WREG ; high byte in WREG, ... + movff WREG,to+1 ; ... and destination + movff from+0,to+0 ; copy low byte + movff from+1,TABLAT ; another bank-safe read + xorwf TABLAT,W ; did the high byte changed? + bnz retry ; YES - retry + ENDM diff -r 00b24fb4324d -r ca4556fb60b9 src/logbook.asm --- a/src/logbook.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/logbook.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File logbook.asm REFACTORED VERSION V2.98 +; File logbook.asm REFACTORED VERSION V2.99e ; ; Logbook ; @@ -12,7 +12,7 @@ ;============================================================================= -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; mandatory header #include "tft.inc" #include "external_flash.inc" #include "math.inc" @@ -99,15 +99,15 @@ ; 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 @@ -225,7 +225,7 @@ movwf ext_flash_address+0 endm -logbook code +logbook CODE ;============================================================================= @@ -235,7 +235,7 @@ WIN_LEFT logbook_list_left-.8 WIN_FONT FT_SMALL -; bcf win_invert ; Reset invert flag +; bcf win_invert ; reset invert flag call TFT_standard_color movff menupos1,lo @@ -266,18 +266,18 @@ logbook: clrf logbook_flags clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + 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 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 + 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 + 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 ;----------------------------------------------------------------------------- @@ -295,13 +295,13 @@ ; call speed_fastest incf logbook_temp,F ; increase dive counter incf logbook_temp,W ; = 0x..FF ? - bz logbook_reset ; Yes: FF --> loop. + 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 ; 2nd: 201000h-201FFFh -> logbook_max_dive_counter=1 ; 3rd: 202000h-202FFFh -> logbook_max_dive_counter=2 - ; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (And hi>0...) + ; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (and hi>0...) decf logbook_max_dive_counter,F ; -1 @@ -317,52 +317,52 @@ 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 ext_flash_rw + 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 + bra logbook3b ; NO - abort incf logbook_divenumber,F ; new header found, increase logbook_divenumber - bra logbook4 ; Done with searching, display the header! + 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. + 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? + tstfsz logbook_divenumber ; was there at least one dive? bra logbook_reset2 - bra logbook3b ; No, Nothing to do + 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 - display first page again call display_listdive ; display short header for list on current list position movlw logbook_row_number cpfseq menupos1 ; first dive on list (top place)? - bra logbook_display_loop1 ; no, so skip saving of address + bra logbook_display_loop1 ; NO - skip saving of address ; 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_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 menupos1,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... @@ -373,23 +373,23 @@ WIN_TOP logbook_row_offset*(logbook_row_number+.1) STRCPY_TEXT_PRINT tExit ; "Exit" - movlw d'1' ; Set cursor to position 1... + 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 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 + 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? @@ -397,15 +397,15 @@ 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 screen-shot 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 ; NO - wait for something to do display_profile_or_exit: movlw logbook_row_number+.2 ; exit? cpfseq menupos1 - bra display_profile_or_exit2 ; No, check for "Next Page" + bra display_profile_or_exit2 ; NO - check for "Next Page" exit_logbook: ; call TFT_DisplayOff @@ -413,19 +413,19 @@ goto do_main_menu2 ; jump-back to menu_tree.asm display_profile_or_exit2: - movlw logbook_row_number+.1 ; Next page? + movlw logbook_row_number+.1 ; next page? cpfseq menupos1 - bra display_profile ; No, show details/profile - goto next_logbook2 ; Next page! + bra display_profile ; NO - show details/profile + goto next_logbook2 ; next page display_profile: - bcf is_bailout - bcf gas6_changed ; Clear event flags + bcf FLAG_bailout_mode + 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 + movf logbook_page_number,W ; number of page mullw logbook_row_number movf PRODL,W addwf menupos1,W ; page * logbook_row_number + menupos1 = @@ -434,14 +434,14 @@ display_profile2: ; call speed_fastest clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + bcf PORTC,2 ; pull PWM out to GND call TFT_boot -; call TFT_ClearScreen ; Clear screen -; Set ext_flash pointer to "#divenumber-oldest" dive +; 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 +; read required header data for profile display ; 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 +; set pointer (ext_flash_log_pointer:3) to this address, start drawing decf divenumber,F ;-1 read_int_eeprom .2 @@ -469,22 +469,22 @@ ; Now, show profile LOG_POINT_TO log_samplingrate - call ext_flash_byte_read ; Read sampling rate + 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 + 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 + 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 + 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 call TFT_standard_color - call logbook_show_divenumber ; Show the dive number in medium font + call logbook_show_divenumber ; show the dive number in medium font WIN_SMALL logbook_date_column, logbook_date_row LOG_POINT_TO log_date @@ -499,9 +499,9 @@ 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) + call ext_flash_byte_read_plus ; read dive mode + movff ext_flash_rw,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR + call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, Gauge, Apnea or pSCR) WIN_SMALL logbook_time_column, logbook_time_row LOG_POINT_TO log_time @@ -513,13 +513,13 @@ PUTC ':' movff hi,lo output_99x ; minute - STRCAT_PRINT "" ; Display 1st row of details + STRCAT_PRINT "" ; display 1st row of details LOG_POINT_TO log_profile_version - call ext_flash_byte_read_plus ; Profile version + call ext_flash_byte_read_plus ; profile version movlw 0x24 - cpfslt ext_flash_rw ; <0x24? - bra log_skip_extra_icon ; Yes, skip + 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 @@ -535,7 +535,7 @@ movlw profile_height_pixels ; pixel height available for profile movwf xB+0 clrf xB+1 - call div16x16 ; does xA/xB=xC + call div16x16 ; xC = xA / xB with xA as remainder 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 @@ -549,17 +549,17 @@ movwf xC+2 clrf xC+3 - movff lo,xB+0 ; Max. Depth in mbar - movff hi,xB+1 ; Max. Depth in mbar + 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 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 + 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 @@ -580,14 +580,14 @@ STRCAT_TEXT_PRINT tMeters display_profile_offset4_common: - call ext_flash_byte_read_plus ; divetime in minutes + 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... + movlw d'60' ; 60 seconds are one minute movwf xB+0 clrf xB+1 call mult16x16 ; result is in xC:2 ! @@ -599,7 +599,7 @@ movwf xA+0 movlw HIGH d'600' movwf xA+1 ; a vertical line every 600 seconds - movff samplesecs_value,xB+0 ; Copy sampling rate + 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 @@ -609,9 +609,9 @@ ; 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 + 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 + call ext_flash_byte_read_plus ; total sample time in seconds movff ext_flash_rw,xC+1 PUTC ':' @@ -623,16 +623,16 @@ movlw profile_width_pixels ; pix width available movwf xB+0 clrf xB+1 - call div16x16 ; xA/xB=xC + call div16x16 ; xC = xA / xB with xA as remainder movff xC+0,xA+0 movff xC+1,xA+1 - movf samplesecs_value,W ; divide through sample interval! + movf samplesecs_value,W ; divide through sample interval movwf xB+0 clrf xB+1 - call div16x16 ; xA/xB=xC + call div16x16 ; xC = xA / xB with xA as remainder 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 + infsnz profile_temp1+0,F ; increase by one, there might be a remainder incf profile_temp1+1,F bsf leftbind @@ -640,53 +640,53 @@ call TFT_standard_color STRCAT_PRINT "" - call ext_flash_byte_read_plus ; Read min. Temperature + 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 + 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 ext_flash_rw,W ; =1 (="First")? - bra logbook_find_first_gas2 ; No. + 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 ext_flash_rw,W ; =1 (="First")? - bra logbook_find_first_gas3 ; No. + 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 ext_flash_rw,W ; =1 (="First")? - bra logbook_find_first_gas4 ; No. + 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 ext_flash_rw,W ; =1 (="First")? - bra logbook_find_first_gas5 ; No. + 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 + movlw .5 ; must be Gas 5 movwf ext_flash_rw logbook_find_first_gas_done: 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. + call TFT_color_code_gas ; back to normal profile color ; Pointer is now trashed! ; Point to profile portion of this dive @@ -694,16 +694,16 @@ 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 ext_flash_rw (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 + 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! + 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 @@ -711,84 +711,84 @@ ; Skip number of divisors: 1Byte incf_ext_flash_address_0x20 d'8' -; Divisor temp +; 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 +; 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 + 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 +; 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 + 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 ext_flash_rw,divisor_gf ; Store divisor -; Divisor ppO2 Sensors +; 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 ext_flash_rw,divisor_ppo2_sensors ; Store divisor -; Divisor decoplan +; 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 ext_flash_rw,divisor_decoplan ; Store divisor -; Divisor CNS +; 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 ext_flash_rw,divisor_cns ; Store divisor -; Divisor Tank data +; 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 ext_flash_rw,divisor_tank ; Store divisor +; 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 + ; Start profile display movlw color_deepblue - call TFT_set_color ; Make this configurable? + call TFT_set_color ; 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) + 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) + movwf win_width+0 ; right border (0-159) clrf win_width+1 - bra display_profile2f ; No 0m line + 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 carry 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 gaslist_gas ; here: used as counter for depth readings + 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 @@ -796,23 +796,23 @@ 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 + movlw profile_top+.1 ; zero-m row movwf fill_between_rows - movwf logbook_last_tp ; Initialize for Tp° curve too. + movwf logbook_last_tp ; initialize for Tp° curve, too - movlw LOW(-.100) ; Initialize max tp° to -10.0 °C. + 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+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. + 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 + 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 + movwf logbook_max_temp_pos ; initialize for displaying the highest temperature movlw profile_left movwf win_leftx2 @@ -835,77 +835,77 @@ call pixel_write_col320 movff profile_temp1+0,profile_temp2+0 - movff profile_temp1+1,profile_temp2+1 ; 16Bit x-scaler + 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! + 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 btfsc end_of_profile ; end-of profile reached? - bra profile_display_loop_done ; Yes, skip all remaining pixels + bra profile_display_loop_done ; YES - skip all remaining pixels ;---- Draw Ceiling curve, if any --------------------------------------------- movf divisor_deco,W bz profile_display_skip_deco - movf logbook_ceiling,W ; Any deco ceiling ? + movf logbook_ceiling,W ; any deco ceiling? bz profile_display_skip_deco - mullw .100 ; Yes: convert to mbar + 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+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, + movlw color_dark_green ; dark green if ok btfss neg_flag - movlw color_dark_red ; Or dark red if ceiling overflown. + movlw color_dark_red ; dark red if ceiling is violated call TFT_set_color 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 + call div16x16 ; xC = xA / xB with xA as remainder - movlw profile_top+.1 ; Starts right after the top line. + 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 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 + 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 - movf logbook_cur_tp+0,W ; Did we had already a valid Tp°C record ? + 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. + 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 - movf logbook_cur_tp+0,W ; Current Tp° - (-2.0°C) == Tp° + 20. - addlw LOW(.20) ; Low byte. + 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 + 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) + sublw profile_top+profile_height_pixels-.10 ; upside-down: Y = .75 + (.153 - result) movwf xC+0 ; Check limits @@ -917,10 +917,10 @@ 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. + 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) + 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 @@ -929,7 +929,7 @@ 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. + 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 --------------------------------------------------- @@ -937,26 +937,26 @@ 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 + call div16x16 ; xC = xA / xB with xA as remainder movlw profile_top+.1 addwf xC+0,F ; add 75 pixel offset to result - btfsc STATUS,C ; Ignore potential profile errors + btfsc STATUS,C ; ignore potential profile errors movff fill_between_rows,xC+0 movff backup_color1,WREG ; copy gas number to WREG for color-coding - call TFT_color_code_gas ; Back to normal profile color. + call TFT_color_code_gas ; back to normal profile color. 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 + 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 + btfss log_marker_found ; any marker to draw? + bra profile_display_skip_marker ; NO ; tiny "m" incf fill_between_rows,W ; increase row (Y) @@ -977,7 +977,7 @@ WIN_FONT FT_TINY lfsr FSR2,buffer STRCPY_PRINT "m" - bcf log_marker_found ; Clear flag + bcf log_marker_found ; clear flag movlw profile_left movwf win_leftx2 @@ -996,7 +996,7 @@ movf divisor_cns,W bz profile_display_skip_cns ; - ; TODO HERE + ; add further code here... ; profile_display_skip_cns: @@ -1004,60 +1004,60 @@ movf divisor_gf,W bz profile_display_skip_gf ; - ; TODO HERE + ; add further code here... ; profile_display_skip_gf: - ;---- All curves done. + ;---- All curves done -profile_display_skip_loop1: ; skips readings! +profile_display_skip_loop1: ; skips readings dcfsnz profile_temp2+0,F - bra profile_display_loop3 ; check 16bit.... + bra profile_display_loop3 ; check 16bit 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 + bra profile_display_loop_done ; YES - skip all remaining pixels 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! + 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. + 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" + btfss FLAG_bailout_mode ; 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 + STRCPY_TEXT_PRINT tDiveBailout ; bailout profile_display_loop_done_nobail: btfss gas6_changed ; Gas6 - bra profile_display_loop_done_nogas6 ; No + 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 + STRCPY_TEXT tGas ; gas STRCAT_PRINT " 6!" profile_display_loop_done_nogas6: - decf divenumber,F ;-1 + decf divenumber,F ; -1 read_int_eeprom .2 movf EEDATA,W bcf STATUS,C - subfwb divenumber,W ; max. dives (low value) - divenumber + subfwb divenumber,W ; max. dives (low value) - dive number movwf lo ; result - incf divenumber,F ;+1 - ; Set ext_flash_address:3 to TOC entry of this dive + 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 @@ -1080,7 +1080,7 @@ cpfslt win_leftx2 ; limit left border to 130 movwf win_leftx2 WIN_FONT FT_TINY - movlw color_orange ; Use same color as tp° curve + movlw color_orange ; use same color as tp° curve call TFT_set_color movff logbook_min_tp+0,lo @@ -1092,8 +1092,8 @@ ;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 + lfsr FSR2,buffer ; overwrite "-" + bsf ignore_digit5 ; full degrees only output_16 STRCAT_TEXT_PRINT tLogTunitF ; Now, the max. temperature @@ -1121,7 +1121,7 @@ ; Now, the max. temperature movlw .15 subwf logbook_max_temp_pos,W - movwf win_top ; Y position at max temperature + movwf win_top ; Y position at max temperature movff logbook_max_tp+0,lo movff logbook_max_tp+1,hi lfsr FSR2,buffer @@ -1142,64 +1142,59 @@ bsf leftbind WIN_TINY log_gas_column1, log_gas_row - movlw .1 ; Color for Gas 1 + movlw .1 ; color for gas 1 call log_show_gas WIN_TINY log_gas_column2, log_gas_row - movlw .2 ; Color for Gas 2 + movlw .2 ; color for gas 2 call log_show_gas WIN_TINY log_gas_column3, log_gas_row - movlw .3 ; Color for Gas 3 + movlw .3 ; color for gas 3 call log_show_gas WIN_TINY log_gas_column4, log_gas_row - movlw .4 ; Color for Gas 4 + movlw .4 ; color for gas 4 call log_show_gas WIN_TINY log_gas_column5, log_gas_row - movlw .5 ; Color for Gas 5 + movlw .5 ; color for gas 5 call log_show_gas bcf leftbind - 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_profile_loop: btfsc switch_right - bra logbook_page2 ; Show more information + bra logbook_page2 ; show more information 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? + 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 global log_screendump_and_onesecond -log_screendump_and_onesecond: ; Check if we need to make a screen-shot and check for new second +log_screendump_and_onesecond: ; check if we need to make a screen-shot and check for new second btfsc onesecupdate - call timeout_surfmode ; Timeout + call timeout_surfmode ; timeout btfsc onesecupdate - call set_dive_modes ; Check, if divemode must be entered + call set_dive_modes ; check if divemode needs to be entered bcf onesecupdate ; one second update btfsc divemode - goto restart ; Enter divemode if required + goto restart ; enter divemode if required - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - bra log_screendump_and_onesecond2 + IFDEF _screendump + btfsc enable_screen_dumps ; screendump enabled? + call TFT_dump_screen_check ; YES - check if requested and do it + ENDIF + btfsc vusb_in ; USB plugged in? - call comm_mode ; Start COMM mode + goto comm_mode ; YES - start COMM mode and return + 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. @@ -1210,11 +1205,11 @@ profile_display_fill: ; First, check if 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: +profile_display_fill2: ; Make sure to init X position. movf logbook_pixel_x_pos,W mullw 2 @@ -1224,26 +1219,26 @@ call pixel_write_col320 movf xC+0,W - cpfsgt xC+1 ; fill_between_rows > 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 ; 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 = fill_between_rows + cpfseq xC+1 ; loop until xC+1 = fill_between_rows bra profile_display_fill_up return ; fill_between_rows and xC+0 are untouched @@ -1252,7 +1247,7 @@ profile_view_get_depth: infsnz logbook_sample_counter+0,F - incf logbook_sample_counter+1,F ; Count read pixels + incf logbook_sample_counter+1,F ; count read pixels movf logbook_sample_counter+0,W cpfseq vertical_interval+0 @@ -1266,16 +1261,16 @@ ; Vertical lines... movlw color_deepblue - call TFT_set_color ; Make this configurable? + call TFT_set_color 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) + 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 + 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 @@ -1283,30 +1278,30 @@ 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 + movff ext_flash_rw,gaslist_gas ; store Profile Flag Byte 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) + 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? + 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! + 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) + 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 + ;---- 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 gaslist_gas,F @@ -1314,10 +1309,10 @@ 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. + 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+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 @@ -1326,8 +1321,8 @@ 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 + 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 @@ -1336,7 +1331,7 @@ 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 ---------------- + ;---- 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 @@ -1346,95 +1341,97 @@ 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 + 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 ------------------ + ;---- read GF, if any AND divisor=0 AND bytes available ------------------ profile_view_get_depth_no_deco: ; 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 + 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 + 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 + decf gaslist_gas,F ; reduce counter - 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 + btfss EventByte1,7 ; another event byte? + bra profile_no_second_eventbyte ; NO + call ext_flash_byte_read_plus_0x20 ; read EventByte2 + 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 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! + 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,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 ; 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 gaslist_gas,F ; reduce counter +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 + 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: ; Gas 6 used +logbook_event1: ; gas 6 used bsf gas6_changed - movlw .6 ; Use Gas6 color + 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 + 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 backup_color1,backup_color2 ; Backup last gas color in case we return to CCR - movlw .6 ; Use Gas6 color +logbook_event2: ; bailout + bsf FLAG_bailout_mode ; 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 + 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 gaslist_gas,F ; reduce counter - btfss is_bailout ; Are we in bailout? - return ; No, return +logbook_event3: ; setpoint change + incf_ext_flash_address_0x20 .1 ; skip one byte + decf gaslist_gas,F ; reduce counter + btfss FLAG_bailout_mode ; 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,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 + call TFT_color_code_gas ; back to normal profile color return +; ------------------------------------------------------------------------ + exit_profileview: ; call speed_fastest bcf sleepmode - clrf gaslist_gas ; restore all registers to build same page again + 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 @@ -1447,7 +1444,7 @@ ; call TFT_DisplayOff call TFT_boot clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + bcf PORTC,2 ; pull PWM out to GND call TFT_boot ; call TFT_ClearScreen ; clear details/profile goto logbook2 ; start search @@ -1459,9 +1456,9 @@ movlw logbook_row_number movwf menupos1 incf logbook_page_number,F ; start new screen - bsf keep_cursor_new_page ; Keep cursor on "next page" + bsf keep_cursor_new_page ; keep cursor on "next page" clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + bcf PORTC,2 ; pull PWM out to GND call TFT_boot ; call TFT_ClearScreen goto logbook2 ; start search @@ -1469,8 +1466,8 @@ next_logbook3: incf menupos1,F ; +1 movlw logbook_row_number+.2 - cpfsgt menupos1 ; =logbook_row_number+.3? - bra next_logbook3a ; No + cpfsgt menupos1 ; = logbook_row_number+.3 ? + bra next_logbook3a ; NO movlw .1 movwf menupos1 bra next_logbook3b @@ -1478,13 +1475,13 @@ next_logbook3a: 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 + 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) + 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 @@ -1493,7 +1490,7 @@ goto logbook_loop display_listdive: - bsf logbook_page_not_empty ; Page not empty + bsf logbook_page_not_empty ; page not empty incf menupos3,F bsf leftbind @@ -1505,16 +1502,16 @@ 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 + 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 + movlw LOW d'1000' ; compare to 1000 subwf lo,W movlw HIGH d'1000' subwfb hi,W @@ -1538,16 +1535,16 @@ 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 + LOG_POINT_TO log_date+1 ; point to month call ext_flash_byte_read_plus ; read month - movff ext_flash_rw,hi ; month + movff ext_flash_rw,hi ; month call ext_flash_byte_read_plus ; read day - movff ext_flash_rw,lo ; 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 + 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 @@ -1576,21 +1573,23 @@ 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) + 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 + 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 divenumber,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 @@ -1611,9 +1610,10 @@ STRCAT_PRINT "" 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 @@ -1627,7 +1627,7 @@ LOG_POINT_TO log_gf_lo WIN_SMALL .5,.90 STRCPY_TEXT tGF - call ext_flash_byte_read_plus ; Read GF lo + call ext_flash_byte_read_plus ; read GF lo movff ext_flash_rw,lo output_8 STRCAT "%/" @@ -1637,12 +1637,12 @@ STRCAT_PRINT "ZH-L16" LOG_POINT_TO log_sat_mult WIN_SMALL .5,.90 - call ext_flash_byte_read_plus ; Read sat_mult + 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 + call ext_flash_byte_read_plus ; read desat_mult or GF_hi movff ext_flash_rw,lo output_8 STRCAT_PRINT "%" @@ -1655,17 +1655,17 @@ movff ext_flash_rw,lo call ext_flash_byte_read_plus ; read cns high movff ext_flash_rw,hi - bcf hi,int_warning_flag ; clear warning flag (fix for cases were the flags already got stored to ext. Flash) - bcf hi,int_attention_flag ; clear attention flag (fix for cases were the flags already got stored to ext. Flash) + bcf hi,int_warning_flag ; clear warning flag (fix for cases were the flags already got stored to EEPROM) + bcf hi,int_attention_flag ; clear attention flag (fix for cases were the flags already got stored to EEPROM) 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 - bcf hi,int_warning_flag ; clear warning flag (fix for cases were the flags already got stored to ext. Flash) - bcf hi,int_attention_flag ; clear attention flag (fix for cases were the flags already got stored to ext. Flash) movff ext_flash_rw,hi + bcf hi,int_warning_flag ; clear warning flag (fix for cases were the flags already got stored to EEPROM) + bcf hi,int_attention_flag ; clear attention flag (fix for cases were the flags already got stored to EEPROM) output_16 STRCAT_PRINT "%" @@ -1696,8 +1696,8 @@ ; Last deco LOG_POINT_TO log_last_stop WIN_SMALL .5,.190 - STRCPY_TEXT tLastDecostop - call ext_flash_byte_read_plus ; Read last stop + STRCPY_TEXT tLastDecostopSurf + call ext_flash_byte_read_plus ; read last stop movff ext_flash_rw,lo output_8 STRCAT_PRINT "m" @@ -1716,10 +1716,10 @@ bsf neg_flag ; set flag for 2.15 or newer movlw .1 cpfsgt lo ; >1? - bcf neg_flag ; No, clear flag + 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)) + bcf neg_flag ; NO - clear flag (When unit was upgraded from hwOS Sport (10.xx)) bsf leftbind output_8 PUTC "." @@ -1727,7 +1727,7 @@ movff ext_flash_rw,lo movlw .14 cpfsgt lo ; >14 ? - bcf neg_flag ; No, clear flag + bcf neg_flag ; NO - clear flag output_99x STRCAT_PRINT "" @@ -1736,7 +1736,7 @@ ; Battery percent (for dives with 2.15 or newer) WIN_SMALL .110,.140 - LOG_POINT_TO log_batt_info ; Battery percent + LOG_POINT_TO log_batt_info ; battery percent call ext_flash_byte_read_plus ; read battery low movff ext_flash_rw,lo output_8 @@ -1748,7 +1748,7 @@ WIN_SMALL .110,.90 STRCAT_PRINT "Batt:" WIN_SMALL .110,.115 - LOG_POINT_TO log_battery ; Battery voltage... + 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 @@ -1765,7 +1765,7 @@ WIN_SMALL .110,.165 lfsr FSR2,buffer bsf leftbind - output_16 ; Air pressure before dive + output_16 ; air pressure before dive STRCAT_TEXT tMBAR clrf WREG movff WREG,buffer+7 ; limit to 7 chars @@ -1775,21 +1775,21 @@ 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 + rcall logbook_preloop_tasks ; clear some flags and set to Speed_eco display_details_loop: btfsc switch_right - bra logbook_page3 ; Details, 2nd page + 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? + 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 + movlw CCP1CON_VALUE ; see hwos.inc + movwf CCP1CON ; power-on backlight call TFT_standard_color bcf sleepmode ; clear some flags bcf switch_right @@ -1798,30 +1798,30 @@ goto speed_normal ; and return -logbook_page3: ; Show even more info +++ - rcall log_details_header ; Shows number, time/date and basic dive info +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 WIN_SMALL .5,.90 - movlw .1 ; Color for Gas 1 + movlw .1 ; color for gas 1 rcall log_show_gas WIN_SMALL .5,.115 - movlw .2 ; Color for Gas 2 + movlw .2 ; color for gas 2 rcall log_show_gas WIN_SMALL .5,.140 - movlw .3 ; Color for Gas 3 + movlw .3 ; color for gas 3 rcall log_show_gas WIN_SMALL .5,.165 - movlw .4 ; Color for Gas 4 + movlw .4 ; color for gas 4 rcall log_show_gas WIN_SMALL .5,.190 - movlw .5 ; Color for Gas 5 + movlw .5 ; color for gas 5 rcall log_show_gas ; OC/CC Gas List @@ -1838,26 +1838,26 @@ logbook_page3b: movlw color_lightblue call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.90 ; Top, Bottom, Left, Right + WIN_FRAME_COLOR16 .63,.220,.2,.90+.24 ; Top, Bottom, Left, Right (added .24 to the right as extra space needed for gas typ markings) - 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: btfsc switch_right - goto logbook_page4 ; Show more info + 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? + 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 +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 + rcall log_details_header ; shows number, time/date and basic dive info ; Setpoint list LOG_POINT_TO log_sp1 WIN_SMALL .5,.65 @@ -1879,14 +1879,14 @@ 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: btfsc switch_right - goto display_profile2 ; Show the profile view again + 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? + 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 @@ -1895,11 +1895,11 @@ clrf CCP1CON ; stop PWM bcf PORTC,2 ; Pull PWM out to GND call TFT_boot -; call TFT_ClearScreen ; Clear screen +; 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 +; 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 @@ -1907,9 +1907,9 @@ read_int_eeprom .2 movf EEDATA,W bcf STATUS,C - subfwb divenumber,W ; max. dives (low value) - divenumber + subfwb divenumber,W ; max. dives (low value) - dive number movwf lo ; result - incf divenumber,F ;+1 + 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 @@ -1991,15 +1991,16 @@ STRCAT_PRINT "s" ; ; Dive mode ; LOG_POINT_TO log_divemode -; call ext_flash_byte_read_plus ; Read 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: lfsr FSR2,buffer - call ext_flash_byte_read_plus ; Read setpoint + call ext_flash_byte_read_plus ; read setpoint movff ext_flash_rw,lo clrf hi bsf leftbind @@ -2017,11 +2018,13 @@ movff PRODL,lo movff PRODH,hi call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16 + output_16_3 + PUTC " " STRCAT_TEXT tFeets ; "ft" bra log_show_sp_common log_show_sp_metric: output_8 + PUTC " " STRCAT_TEXT tMeters ; "m" log_show_sp_common: STRCAT_PRINT "" @@ -2037,27 +2040,51 @@ 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 + movff ext_flash_rw,up + call ext_flash_byte_read_plus ; read gas type - just to increment the pointer + movff ext_flash_rw,ex 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 + ; NO - do the long version + PUTC " " ; put one space between gas composition and gas type marking + tstfsz ex ; gas disabled? + bra log_show_gas_1 ; NO - next check + PUTC "x" ; YES - mark with "x" + bra log_show_gas_4 ; - continue with change depth +log_show_gas_1: + decfsz ex,F ; now: -1 disabled, 0 first, 1 travel, 2 deco -> first? + bra log_show_gas_2 ; NO - next check + PUTC "*" ; YES - mark with "*" + bra log_show_gas_4 ; - continue with change depth +log_show_gas_2: + decf ex,F ; now: -2 disabled, -1 first, 0 travel, 1 deco + decfsz ex,F ; now: -3 disabled, -2 first, -1 travel, 0 deco -> deco? + bra log_show_gas_3 ; NO - nothing to mark + PUTC "=" ; YES - mark with "=" + bra log_show_gas_4 ; - continue with change depth +log_show_gas_3: + PUTC " " ; print a space in absence of any other marking +log_show_gas_4: + PUTC " " ; put one space between gas type marking and change depth TSTOSS opt_units ; 0=Meter, 1=Feet bra log_show_gas_metric - movf lo,W + movf up,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 + output_16_3 ; limit to 999 and display only 0-999 STRCAT_TEXT tFeets ; "ft" bra log_show_gas_common log_show_gas_metric: + movff up,lo 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 00b24fb4324d -r ca4556fb60b9 src/math.asm --- a/src/math.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/math.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File math.asm +; File math.asm REFACTORED VERSION V2.99d ; ; Math subroutines ; @@ -10,316 +10,265 @@ ; 2011-08-03 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; mandatory header -basic CODE +math CODE + ;============================================================================= - global convert_time -convert_time: ; converts hi:lo in minutes to hours (hi) and minutes (lo) - movff lo,xA+0 ; divide by 60... - movff hi,xA+1 ; - movlw d'60' ; - movwf xB+0 ; + + global convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) + ; also usable for conversion of seconds to minutes and seconds + ; trashes xA, xB, xC +convert_time: + movff lo,xA+0 ; copy hi:lo to xA + movff hi,xA+1 ; + movlw d'60' ; set divisor to 60 + movwf xB+0 ; write 60 to xB clrf xB+1 ; - rcall div16x16 ; xA/xB=xC with xA as remainder - movff xC+0,hi ; Hours - movff xA+0,lo ; =remaining minutes (0.....59) - return - - global div16 -div16: -; divA=divA/2^divB (divB: 8Bit only!) - bcf STATUS,C - rrcf divA+1 - rrcf divA+0 - decfsz divB - bra div16 + rcall div16x16 ; xC = xA / xB with xA as remainder + movff xC+1,up ; result is hours / minutes, copy to up (high byte) + movff xC+0,hi ; result is hours / minutes, copy to hi (low byte) + movff xA+0,lo ; remainder is minutes / seconds, copy to lo return - global sub16 -sub16: -; sub_c = sub_a - sub_b (with signed values) - bcf neg_flag - movf sub_b+0, W ; Get Value to be subtracted - subwf sub_a+0, W ; Do the High Byte - movwf sub_c+0 - movf sub_b+1, W ; Get the Value to be Subbed - subwfb sub_a+1, W - movwf sub_c+1 + + global div16 ; divA:2 = divA:2 / 2^WREG + ; trashes WREG +div16: + bcf STATUS,C ; clear carry + rrcf divA+1 ; rotate right high byte, carry into MSB, LSB into carry + rrcf divA+0 ; rotate right low byte, carry into MSB, LSB into carry + decfsz WREG ; decrement counter, done? + bra div16 ; NO - loop + return ; YES - done - btfss STATUS,N ; Negativ result ? - return ; NO: result positive done. - bsf neg_flag ; MARK result negative - - comf sub_c+1 ; 16bit sign change. - negf sub_c+0 - btfsc STATUS,C ; Carry to propagate ? - incf sub_c+1,F ; YES: do it. + global mult16 ; xA:2 = xA:2 * 2^WREG + ; trashes WREG +mult16: + bcf STATUS,C ; clear carry + rlcf divA+0,F ; rotate left low byte, carry into LSB, MSB into carry + rlcf divA+1,F ; rotate left high byte, carry into LSB, MSB into carry + decfsz WREG ; decrement counter, done? + bra mult16 ; NO - loop + return ; YES - done - return - global subU16 -subU16: -; sub_c = sub_a - sub_b (with UNSIGNED values) - bcf neg_flag - movf sub_b+0, W ; Get Value to be subtracted - subwf sub_a+0, W ; Do the High Byte - movwf sub_c+0 - movf sub_b+1, W ; Get the Value to be Subbed - subwfb sub_a+1, W - movwf sub_c+1 - btfsc STATUS,C ; Borrow to propagate ? (B == /CARRY) - return ; NO: result positive done. - bsf neg_flag ; MARK result negative - comf sub_c+1 ; 16bit sign change. - negf sub_c+0 - btfsc STATUS,C ; Carry to propagate ? - incf sub_c+1,F ; YES: do it. - return + global sub16 ; sub_c:2 = sub_a:2 - sub_b:2 with SIGNED values + ; sets neg_flag if result is < 0 + ; trashes WREG +sub16: + bcf neg_flag ; clear flag which will indicate if result is negative + movf sub_b+0,W ; get value to be subtracted, low byte + subwf sub_a+0,W ; execute subtraction on low byte + movwf sub_c+0 ; copy result to output variable, low byte + movf sub_b+1,W ; get value to be subtracted, high byte + subwfb sub_a+1,W ; execute subtraction on high byte, considering borrow flag + movwf sub_c+1 ; copy result to output variable, high byte + btfss STATUS,N ; result negative ? + return ; NO - result positive, done + bsf neg_flag ; YES - set flag + comf sub_c+1 ; - do a 16 bit sign change + negf sub_c+0 ; + btfsc STATUS,C ; - carry to be propagated ? + incf sub_c+1,F ; YES - do it + return ; - done + - global mult16x16 -mult16x16: ;xA*xB=xC - clrf xC+2 ; Clear the High-Order Bits - clrf xC+3 - movf xA, w ; Do the "L" Multiplication first - mulwf xB - movf PRODL, w ; Save result - movwf xC - movf PRODH, w - movwf xC+1 - movf xA, w ; Do the "I" Multiplication - mulwf xB+1 - movf PRODL, w ; Save the Most Significant Byte First - addwf xC+1, f - movf PRODH, w - addwfc xC+2, f ; Add to the Last Result - movf xA+1, w ; Do the "O" Multiplication - mulwf xB - movf PRODL, w ; Add the Lower Byte Next - addwf xC+1, f - movf PRODH, w ; Add the High Byte First - addwfc xC+2, f - btfsc STATUS, C ; Add the Carry - incf xC+3, f - movf xA+1, w ; Do the "F" Multiplication - mulwf xB+1 - movf PRODL, w - addwf xC+2, f - movf PRODH, w - addwfc xC+3, f - return + global subU16 ; sub_c:2 = sub_a:2 - sub_b:2 with UNSIGNED values + ; sets neg_flag if result is < 0 + ; trashes WREG +subU16: + bcf neg_flag ; clear flag which will indicate if result is negative + movf sub_b+0,W ; get Value to be subtracted, low byte + subwf sub_a+0,W ; execute subtraction on low byte + movwf sub_c+0 ; copy result to output variable, low byte + movf sub_b+1,W ; get value to be subtracted, high byte + subwfb sub_a+1,W ; execute subtraction on high byte, considering borrow flag + movwf sub_c+1 ; copy result to output variable, high byte + btfsc STATUS,C ; borrow to propagate (B == /CARRY) ? + return ; NO - result positive, done + bsf neg_flag ; YES - set flag + comf sub_c+1 ; - do a 16 bit sign change + negf sub_c+0 ; + btfsc STATUS,C ; - carry to be propagated ? + incf sub_c+1,F ; YES - do it + return ; - done + - global div16x16 -div16x16: ;xA/xB=xC with xA+0 as remainder - ;uses divB as temp variable - clrf xC+0 - clrf xC+1 - MOVF xB+0,W ; Check for zero - IORWF xB+1,W ; - BTFSC STATUS,Z ; Check for zero - RETLW H'FF' ; return 0xFF if illegal - MOVLW 1 ; Start count at 1 - MOVWF divB ; Clear Count -div16x16_1: - BTFSC xB+1,7 ; High bit set ? - bra div16x16_2 ; Yes then continue - INCF divB,F ; Increment count - - bcf STATUS,C - rlcf xB+0,F - rlcf xB+1,F - bra div16x16_1 -div16x16_2: - ; Shift result left - bcf STATUS,C - rlcf xC+0,F - rlcf xC+1,F - - ; Reduce Divisor - - MOVF xB,W ; Get low byte of subtrahend - SUBWF xA,F ; Subtract DST(low) - SRC(low) - MOVF xB+1,W ; Now get high byte of subtrahend - BTFSS STATUS,C ; If there was a borrow, rather than - INCF xB+1,W ; decrement high byte of dst we inc src - SUBWF xA+1,F ; Subtract the high byte and we're done + global mult16x16 ; xC:4 = xA:2 * xB:2 with UNSIGNED values + ; trashes PRODL, PRODH, WREG +mult16x16: + clrf xC+2 ; clear the high-order bits + clrf xC+3 + ; + movf xA+0,W ; do the "L" multiplication + mulwf xB+0 + movff PRODL,xC+0 ; copy result to xC + movff PRODH,xC+1 + ; + movf xA+0,W ; do the "I" multiplication + mulwf xB+1 + movf PRODL,W ; get the product's low byte... + addwf xC+1,F ; ... and add it to xC+1 + movf PRODH,W ; get the product's high byte... + addwfc xC+2,F ; ... and add it to xC+2 obeying carry bit from xC+1 + ; + movf xA+1,W ; do the "O" multiplication + mulwf xB+0 + movf PRODL,W ; get the product's low byte... + addwf xC+1,F ; ... and add it to xC+1 + movf PRODH,W ; get the product's high byte... + addwfc xC+2,F ; ... and add it to xC+2 obeying carry bit from xC+1 + clrf WREG ; clear WREG... + addwfc xC+3,F ; ... add add it to xC+3 obeying carry bit from xC+2 (can only happen in "O" multiplication) + ; + movf xA+1,W ; do the "F" multiplication + mulwf xB+1 + movf PRODL,W ; get the product's low byte... + addwf xC+2,F ; ... and add it to xC+2 + movf PRODH,W ; get the product's high byte... + addwfc xC+3,F ; ... and add it to xC+3 obeying carry bit from xC+2 + return - BTFSC STATUS, C ; Did it reduce? - bra div16x16_3 ; No, so it was less than - - movf xB+0,W ; Reverse subtraction - addwf xA+0,F - movf xB+1,W - addwfc xA+1,F - - bra div16x16_4 ; Continue the process + global div16x16 ; xC:2 = xA:2 / xB:2 with xA as remainder + ; trashes WREG +div16x16: + movlw .16 ; process 16 bits ... + movwf math_loop ; ... initialize loop counter + movff xA+0,xC+0 ; copy xA to xC + movff xA+1,xC+1 ; ... + clrf xA+0 ; clear xA, will now be used to hold the remainder + clrf xA+1 ; ... +div16x16_1: + bcf STATUS,C ; clear carry flag to shift in a zero bit + rlcf xC+0,F ; shift left xC + rlcf xC+1,F ; ... shifting MSB out of xC... + rlcf xA+0,F ; ... and into LSB of xA + rlcf xA+1,F ; ... + btfsc STATUS,C ; did the remainder overflow (carry set)? + bra div16x16_2 ; YES - directly generate a result bit = 1 + movf xB+0,W ; NO - compute remainder - divisor = xA - xB, trash result to WREG + subwf xA+0,W ; - ... + movf xB+1,W ; - ... + subwfb xA+1,W ; - ... + btfss STATUS,C ; - remainder < divisor (-> borrow flag set, equals carry flag cleared) ? + bra div16x16_3 ; YES - result bit = 0, keep LSB of xC+0 being 0 +div16x16_2: + bsf xC+0,0 ; NO - result bit = 1, set LSB of xC+0 to 1 + movf xB+0,W ; - subtract divisor from remainder "for real": xA = xA - xB + subwf xA+0,F ; - ... + movf xB+1,W ; - ... + subwfb xA+1,F ; - ... div16x16_3: - BSF xC+0,0 ; Yes it did, this gets a 1 bit -div16x16_4: - DECF divB,F ; Decrement N_COUNT - BTFSC STATUS,Z ; If its not zero then continue - return + decfsz math_loop,F ; decrement loop counter, all bits done? + bra div16x16_1 ; NO - loop + return ; YES - done - bcf STATUS,C - rrcf xB+1,F - rrcf xB+0,F - - bra div16x16_2 ; Next bit. - global div32x16 -div32x16: ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - ; Setup - movlw .32 ; setup shift counter - movwf divB - movff xC+3,xA+1 ; move ACCb to ACCf - movff xC+2,xA+0 - movff xC+1,sub_a+1 ; move ACCc to ACCe - movff xC+0,sub_a+0 - clrf xC+3 - clrf xC+2 - clrf xC+1 - clrf xC+0 - clrf sub_b+1 - clrf sub_b+0 + global div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + ; trashes WREG +div32x16: + movlw .32 ; process 32 bits ... + movwf math_loop ; ... initialize loop counter + clrf xA+0 ; clear xA, will be used to hold the remainder + clrf xA+1 ; ... +div32x16_1: + bcf STATUS,C ; clear carry flag to shift in a zero bit + rlcf xC+0,F ; shift left xC + rlcf xC+1,F ; ... + rlcf xC+2,F ; ... + rlcf xC+3,F ; ... shifting MSB out of xC... + rlcf xA+0,F ; ... and into LSB of xA + rlcf xA+1,F ; ... + btfsc STATUS,C ; did the remainder overflow (carry set)? + bra div32x16_2 ; YES - directly generate a result bit = 1 + movf xB+0,W ; NO - compute remainder - divisor = xA - xB, trash result to WREG + subwf xA+0,W ; - ... + movf xB+1,W ; - ... + subwfb xA+1,W ; - ... + btfss STATUS,C ; - remainder < divisor (-> borrow flag set, equals carry flag cleared) ? + bra div32x16_3 ; YES - result bit = 0, keep LSB of xC+0 being 0 div32x16_2: - bcf STATUS,C - rlcf sub_a+0,F - rlcf sub_a+1,F - rlcf xA+0,F - rlcf xA+1,F - rlcf sub_b+0,F - rlcf sub_b+1,F - movf xB+1,W - subwf sub_b+1,W ; check if a>d - btfss STATUS,Z - bra div32x16_3 - movf xB+0,W - subwf sub_b+0,W ; if msb equal then check lsb + bsf xC+0,0 ; NO - result bit = 1, set LSB of xC+0 to 1 + movf xB+0,W ; - subtract divisor from remainder "for real": xA = xA - xB + subwf xA+0,F ; - ... + movf xB+1,W ; - ... + subwfb xA+1,F ; - ... div32x16_3: - btfss STATUS,C ; carry set if d>a - bra div32x16_4 - movf xB+0,W ; d-a into d - subwf sub_b+0,F - btfss STATUS,C - decf sub_b+1,F - movf xB+1,W - subwf sub_b+1,F - bsf STATUS,C ; shift a 1 into b (result) -div32x16_4: - rlcf xC+0,F - rlcf xC+1,F - rlcf xC+2,F - rlcf xC+3,F - decfsz divB,F ; loop until all bits checked - bra div32x16_2 + decfsz math_loop,F ; decrement loop counter, all bits done? + bra div32x16_1 ; NO - loop + return ; YES - done + + +;============================================================================= + +; ISR math functions + + global isr_shift_C31 ; 24 bit shift, repeated WREG times, dedicated to a specific usage: + ; Because less than 8 bits are shifted and only C[2:1] is needed, + ; we don't care what bit is inserted. +isr_shift_C31: + rrcf isr_xC+3,F ; shift three bytes + rrcf isr_xC+2,F + rrcf isr_xC+1,F + decfsz WREG ; decrement loop counter, done? + bra isr_shift_C31 ; NO - loop + return ; YES - done + + + global isr_unsigned_mult16x16 ; isr_xC = isr_xA * _isr_xB with UNSIGNED values + ; trashes PRODL, PRODH, WREG +isr_unsigned_mult16x16: + movf isr_xA+0,W ; multiply a[0] * b[0] + mulwf isr_xB+0 + movff PRODL,isr_xC+0 ; store product to c[1]:c[0] + movff PRODH,isr_xC+1 + ; + movf isr_xA+1,W ; multiply a[1] * b[1] + mulwf isr_xB+1 + movff PRODL, isr_xC+2 ; store product to c[3]:c[2] + movff PRODH, isr_xC+3 + ; + movf isr_xA+0,W ; multiply a[0] * b[1] + mulwf isr_xB+1 + movf PRODL,W ; add cross product to c[3]:c[2]:c[1] + addwf isr_xC+1,F + movf PRODH,W + addwfc isr_xC+2,F ; propagate carry + clrf WREG + addwfc isr_xC+3,F ; propagate carry + ; + movf isr_xA+1,W ; multiply a[1] * b[0] + mulwf isr_xB+0 + movf PRODL,W ; add cross product + addwf isr_xC+1,F + movf PRODH,W + addwfc isr_xC+2,F ; propagate carry + clrf WREG + addwfc isr_xC+3,F ; propagate carry return -;;============================================================================= -;; u16 * u16 --> 32bit multiply (xA * xB --> xC) -;; Used in interupt service routines, to compute temperature and pressure. -;; -; global isr_mult16x16 -;isr_mult16x16: -; clrf isr_xC+2 ; Clear the High-Order Bits -; clrf isr_xC+3 -; movf isr_xA, w ; Do the "L" Multiplication first -; mulwf isr_xB -; movf PRODL, w ; Save result -; movwf isr_xC+0 -; movf PRODH, w -; movwf isr_xC+1 -; movf isr_xA+0, w ; Do the "I" Multiplication -; mulwf isr_xB+1 -; movf PRODL, w ; Save the Most Significant Byte First -; addwf isr_xC+1, f -; movf PRODH, w -; addwfc isr_xC+2, f ; Add to the Last Result -; movf isr_xA+1, w ; Do the "O" Multiplication -; mulwf isr_xB -; movf PRODL, w ; Add the Lower Byte Next -; addwf isr_xC+1, f -; movf PRODH, w ; Add the High Byte First -; addwfc isr_xC+2, f -; btfsc STATUS, C ; Add the Carry -; incf isr_xC+3, f -; movf isr_xA+1, w ; Do the "F" Multiplication -; mulwf isr_xB+1 -; movf PRODL, w -; addwf isr_xC+2, f -; movf PRODH, w -; addwfc isr_xC+3, f -; return -;============================================================================= -; 24bit shift, repeted WREG times. -; Because we shift less than 8bits, and keep only C[2:1], we don't care what -; bit is inserted... -; - global isr_shift_C31 -isr_shift_C31: - rrcf isr_xC+3,F ; Shift the three bytes... - rrcf isr_xC+2,F - rrcf isr_xC+1,F - decfsz WREG - bra isr_shift_C31 + global isr_signed_mult16x16 ; isr_xC = isr_xA * _isr_xB with SIGNED values + ; trashes PRODL, PRODH, WREG +isr_signed_mult16x16: + rcall isr_unsigned_mult16x16 ; do an unsigned multiplication first + ; ; manage sign extension of operand B + btfss isr_xB+1,7 ; is B negative ? + bra isr_signed_mult_checkA ; NO - continue checking operand A + movf isr_xA+0,W ; Yes - add -65536 * A + subwf isr_xC+2,F + movf isr_xA+1,W + subwfb isr_xC+3,F +isr_signed_mult_checkA ; manage sign extension of operand B + btfss isr_xA+1,7 ; is A negative ? + return ; NO - done + movf isr_xB+0,W ; Yes - add -65536 * B + subwf isr_xC+2,F + movf isr_xB+1,W + subwfb isr_xC+3,F return -;============================================================================= -; s16 * s16 --> 32bit multiply (xA * xB --> xC) -; Signed multiplication. -; Code from... the Pic18F documentation ;-) - global isr_unsigned_mult16x16 -isr_unsigned_mult16x16: - MOVF isr_xA+0, W ; Lowest is simply a[0] * b[0] - MULWF isr_xB+0 - MOVFF PRODL, isr_xC+0 - MOVFF PRODH, isr_xC+1 - ; - MOVF isr_xA+1, W ; And highest a[1] * b[1] - MULWF isr_xB+1 - MOVFF PRODL, isr_xC+2 - MOVFF PRODH, isr_xC+3 - ; - MOVF isr_xA+0, W ; Intermediates do propagate: - MULWF isr_xB+1 - MOVF PRODL, W - ADDWF isr_xC+1, F ; Add cross products - MOVF PRODH, W - ADDWFC isr_xC+2, F ; with propagated carry - CLRF WREG - ADDWFC isr_xC+3, F ; on the three bytes. - ; - MOVF isr_xA+1, W ; And the second one, similarly. - MULWF isr_xB+0 - MOVF PRODL, W - ADDWF isr_xC+1, F ; Add cross products - MOVF PRODH, W - ADDWFC isr_xC+2, F - CLRF WREG - ADDWFC isr_xC+3, F - return - - global isr_signed_mult16x16 -isr_signed_mult16x16: - rcall isr_unsigned_mult16x16 - - ; Manage sign extension of operand B - BTFSS isr_xB+1,7 ; Is B negatif ? - BRA isr_signed_mult_checkA ; No: check ARG1 - MOVF isr_xA+0, W ; Yes: add -65536 * A - SUBWF isr_xC+2, F - MOVF isr_xA+1, W - SUBWFB isr_xC+3, F - ; And of operand A -isr_signed_mult_checkA - BTFSS isr_xA+1, 7 ; Is A negatif ? - RETURN ; No: done - MOVF isr_xB+0, W - SUBWF isr_xC+2, F - MOVF isr_xB+1, W - SUBWFB isr_xC+3, F - RETURN - - END \ No newline at end of file + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/math.inc --- a/src/math.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/math.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File math.inc +; File math.inc REFACTORED VERSION V2.99d ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,14 +8,38 @@ ; HISTORY ; 2011-08-03 : [mH] moving from OSTC code - extern convert_time - extern div16 - extern sub16 - extern subU16 - extern mult16x16 - extern div16x16 - extern div32x16 -; extern isr_mult16x16 - extern isr_shift_C31 - extern isr_unsigned_mult16x16 - extern isr_signed_mult16x16 + extern convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) + ; also usable for conversion of seconds to minutes and seconds + ; trashes xA, xB, xC + + extern div16 ; divA:2 = divA:2 / 2^WREG + ; trashes WREG + + extern mult16 ; divA:2 = divA:2 * 2^WREG + ; trashes WREG + + extern sub16 ; sub_c:2 = sub_a:2 - sub_b:2 with SIGNED values + ; sets neg_flag if result is < 0 + ; trashes WREG + + extern subU16 ; sub_c:2 = sub_a:2 - sub_b:2 with UNSIGNED values + ; sets neg_flag if result is < 0 + ; trashes WREG + + extern mult16x16 ; xC:4 = xA:2 * xB:2 with UNSIGNED values + ; trashes PRODL, PRODH, WREG + + extern div16x16 ; xC:2 = xA:2 / xB:2 with xA as remainder + ; trashes xB, WREG + + extern div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + ; trashes WREG + + extern isr_shift_C31 ; 24 bit shift, repeated WREG times, + ; dedicated to a specific usage + + extern isr_unsigned_mult16x16 ; isr_xC = isr_xA * _isr_xB with UNSIGNED values + ; trashes PRODL, PRODH, WREG + + extern isr_signed_mult16x16 ; isr_xC = isr_xA * _isr_xB with SIGNED values + ; trashes PRODL, PRODH, WREG diff -r 00b24fb4324d -r ca4556fb60b9 src/mcp.asm --- a/src/mcp.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/mcp.asm Thu Nov 22 19:47:26 2018 +0100 @@ -13,16 +13,14 @@ #include "hwos.inc" #include "wait.inc" -mcp code +mcp code - global mcp_sleep + global mcp_sleep mcp_sleep: - bcf INTCON3,INT3IE ; Disable INT3 - bcf mcp_power ; RX off - btfsc mcp_power - bra $-4 - return + bcf INTCON3,INT3IE ; disable INT3 + bcf mcp_power ; RX off + btfsc mcp_power + bra $-4 + return - - - END + END diff -r 00b24fb4324d -r ca4556fb60b9 src/mcp.inc --- a/src/mcp.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/mcp.inc Thu Nov 22 19:47:26 2018 +0100 @@ -8,5 +8,5 @@ ; HISTORY ; 2012-09-03 : [mH] creation - extern mcp_sleep ; Power down RX + extern mcp_sleep ; power down RX diff -r 00b24fb4324d -r ca4556fb60b9 src/menu_processor.asm --- a/src/menu_processor.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/menu_processor.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_processor.asm REFACTORED VERSION V2.98 +; File menu_processor.asm REFACTORED VERSION V2.99d ; ; Routines to handle all hwOS graphic/text menus. ; @@ -10,8 +10,8 @@ ; 2012-11-02 : [jDG] Cleanup for hwOS: removed icons. Added scrolling. ; But need a font with lower/upper alpha chars... +#include "hwos.inc" #include "convert.inc" -#include "hwos.inc" #include "strings.inc" #include "tft.inc" #include "varargs.inc" @@ -22,16 +22,17 @@ #include "tft_outputs.inc" #include "eeprom_rs232.inc" #include "adc_lightsensor.inc" +#include "i2c.inc" -;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 +; NOTE: needs to be identical in .inc and .asm ! +#define MENU_LINES_MAX .7 ; number of lines per screen? +#define MENU_TITLE_FONT WIN_STD ; font needs to contain lower and UPPER chars +#define MENU_LINE_FONT WIN_SMALL ; font needs to contain lower and UPPER chars +#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 @@ -46,7 +47,7 @@ extern TFT_fillup_with_spaces -basic CODE +menu_proc CODE ;============================================================================= ; menu handler. @@ -54,36 +55,36 @@ ; Input: TBLPTR = addr of menu block. global menu_processor menu_processor: - banksel common ; Bank1 - btfss divemode ; Not in divemode - call speed_fastest ; Make it quick ! + banksel common ; bank 1 + btfss divemode ; in divemode? + call speed_fastest ; NO - 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 + VARARGS_BEGIN ; read inline PROM data + clrf STKPTR ; never return from here + 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 + btfss divemode ; in divemode? + bra menu_processor0 ; NO + ; Required for menus with less entries than 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! + 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 - bra menu_processor1 ; Yes, skip some lines here + bra menu_processor1 ; skip next code segment in divemode menu_processor0: ;---- draw menu title ------------------------------------------------ clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + bcf PORTC,2 ; pull PWM out to GND call TFT_ClearScreen rcall menu_processor_title rcall menu_processor_bottom_line @@ -95,50 +96,57 @@ ;---- Select menu type ----------------------------------------------- bra menu_vertical - global menu_processor_bottom_line + +;============================================================================= +; draw menu bottom line +; + global menu_processor_bottom_line,menu_processor_bottom_line_comm 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 +menu_processor_bottom_line_comm: + ; Serial Number and Firmware Version + WIN_TINY .32,.240-.16 STRCPY "#" call TFT_cat_serial STRCAT " v" call TFT_cat_firmware + STRCAT " " + call TFT_cat_beta_release STRCAT_PRINT "" call TFT_standard_color bcf win_invert return ;============================================================================= -; (re-)draw menu title. +; (re-)draw menu 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. + 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 ; static title + rcall menu_processor_call_title ; dynamic 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+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 + 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 + 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.) + movwf win_leftx2 ; aligned to center + movlw .0 ; string termination code + movff WREG,buffer+.17 ; limit to 17 chars (std font max.) call aa_wordprocessor call TFT_standard_color return @@ -147,13 +155,14 @@ ; Call dynamic proc for menu title: menu_processor_call_title: - movff menu_title+2,PCLATU ; Just execute computed goto. + movff menu_title+2,PCLATU ; execute computed goto movff menu_title+1,PCLATH movf menu_title+0,W movwf PCL ;============================================================================= -; Restart with first icon/line selected. +; Restart with first icon/line selected +; global menu_processor_reset menu_processor_reset: banksel menustack @@ -195,13 +204,13 @@ ;---- 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. + 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 ; (destroys PROD) + movff selected_item,PRODL ; pass along selected line + rcall menu_processor_push ; remember where we got 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 @@ -209,14 +218,13 @@ ;============================================================================= ; Get current item from table. ; -; Input : Item number in WREG, menu_block. -; -; Output: icon_large, text_item, proc_item 16bits pointers. +; Input : Item number in WREG, menu_block. +; Output : icon_large, text_item, proc_item 16bits pointers. +; Trashed: PROD, WREG ; -; Trashed: PROD, WREG menu_read_item: - mullw .10 ; 10 bytes per item. - movf PRODL,W ; Then do a 24bits add + mullw .10 ; 10 bytes per item + movf PRODL,W ; then do a 24 bits add addwf menu_block+0,W ; with menu_block, and movwf TBLPTRL ; setup TBLPTR movf PRODH,W @@ -225,41 +233,41 @@ movlw 0 addwfc menu_block+2,W movwf TBLPTRU - VARARGS_GET8 value_type ; Read 10 bytes of item data + 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_GET8 WREG ; skip dummy byte VARARGS_GET16 text_item return ;============================================================================= -; Vertical menu : set of line/value to choose from. -; Entry point to update lines already shown. +; Vertical menu - set of line/value to choose from, +; entry point to update lines already shown ; global menu_vertical menu_vertical: - btfss divemode ; Not in divemode - clrf timeout_counter2 ; Reset timeout + btfss divemode ; in divemode? + clrf timeout_counter2 ; NO - 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 ; in divemode? + movwf CCP1CON ; NO - power-on backlight menu_vertical_1: - movf selected_item,W ; Get current item data + movf selected_item,W ; get current item data rcall menu_read_item - movf proc_item+0,W ; Check if pro address is NULL ? + movf proc_item+0,W ; check if proc 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 + bz next_line_menu ; YES - not selectable + btfss divemode ; in divemode? + rcall menu_draw_selected_line ; NO + btfsc in_color_menu ; 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 @@ -286,92 +294,97 @@ dcfsnz lo,F movlw .31 cpfsgt day ; day ok? - bra menu_line_loop_pre1 ; OK! - movlw .1 ; not OK, set to 1st + bra menu_line_loop_pre1 ; YES + movlw .1 ; NO - 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 + btfss divemode ; in divemode? + call speed_normal ; NO menu_line_loop_pre3: - 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 + 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 + bra menu_line_loop1 ; NO - not yet... + btfsc menu_update_sensor_mv ; 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... + btfss onesecupdate ; new second? + bra menu_line_loop2 ; NO - not yet... + + IFDEF _rx_functions + btfsc FLAG_tr_enabled ; TR functions enabled? + call I2C_get_tankdata ; YES - get new tank data + btfsc menu_update_tank_pres ; in tank setup menu? + call TFT_menu_tank_pres ; YES - update tank press + ENDIF + call timeout_surfmode ; timeout on timeout_counter2 - call set_dive_modes ; check, if divemode must be entered + 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 + 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 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 + goto restart ; enter divemode if required + + IFDEF _screendump + btfsc enable_screen_dumps ; screendump enabled? + call TFT_dump_screen_check ; YES - check if requested and do it + ELSE + btfsc disable_comm_mode ; COMM mode disabled (happens during new battery procedure)? + bra menu_line_loop ; YES - loop + ENDIF + 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_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 + call comm_mode ; YES - start COMM mode + + bra menu_line_loop ; loop + ;---- Move to menu's next line next_line_menu: 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 ? + 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. + 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 do_line_menu: - btfss divemode ; not in divemode - call speed_fastest -; bcf switch_right ; Avoid looping. - decf menupos1,W ; menu_processor needs 0-5... + btfss divemode ; in divemode? + call speed_fastest ; NO +; 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 + movf selected_item,W ; read selected descriptor rcall menu_read_item - movf value_type,W ; Switch on data type + 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 @@ -379,22 +392,22 @@ 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... + 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+0,FSR0L ; get option handle movff option_item+1,FSR0H call option_inc ; increment - movff selected_item,PRODL ; Pass selection to callback. + movff selected_item,PRODL ; pass selection to callback. rcall menu_text_call - bra menu_vertical_2 ; redraw all lines... + bra menu_vertical_2 ; redraw all lines ;----------------------------------------------------------------------------- @@ -404,15 +417,15 @@ movlw dm_menu_item1_column movff WREG,win_leftx2 clrf start_item - movff item_max,menupos4 ; Copy item_max for divemode cursor routine + 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. - MENU_LINE_FONT MENU_LEFT, 0 ; Init start position/font + 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. ; Does the menu have more than 6 lines ? @@ -423,20 +436,20 @@ bra menu_draw_lines_2 menu_draw_long_menu: - movf selected_item,W ; Start at selected-6 + 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. + btfsc STATUS,N ; is this < 0 ? + clrf WREG ; YES - start from top instead movwf start_item menu_draw_lines_2: movff start_item, menu_item menu_draw_lines_1: - call TFT_standard_color ; Restore color after disabled lines. + 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 + movf value_type,W ; switch on data type bz menu_draw_line_call dcfsnz WREG bra menu_draw_line_string @@ -447,97 +460,98 @@ bra menu_draw_line_none menu_draw_line_string: - movff text_item+0,TBLPTRL ; Read not-translated string from PROM. + movff text_item+0,TBLPTRL ; read not-translated string from PROM movff text_item+1,TBLPTRH - call strcpy_prom ; Copy in buffer + 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+0,FSR1L ; read string from PROM movff text_item+1,FSR1H - call strcpy_text ; Copy in buffer + 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+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. + 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... + 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. + 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 + 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... + 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 ! + movwf PCL ; ...and jump menu_draw_line_none: - btfsc divemode ; In divemode? - bra menu_draw_line_none_divemode ; 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) + call TFT_fillup_with_spaces ; fill up 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 + 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 + bcf win_invert ; clear flag for inverted output by default + 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) + movf start_item,W ; first line (scrolled) subwf menu_item,W ; current - first - xorlw MENU_LINES_MAX ; Already done 6 lines ? + 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 ? + movf menu_item,W ; done item_max lines? xorwf item_max,W btfss STATUS,Z - bra menu_draw_lines_1 ; No: loop... + bra menu_draw_lines_1 ; NO - loop... return menu_draw_line_none_divemode: movlw .10 - call TFT_fillup_with_spaces ; Fill up FSR2 with spaces (Total string length in #WREG) + 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! + call aa_wordprocessor ; draw the line banksel common - bcf win_invert ; Reset invert flag + 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 + cpfseq menu_item ; at pos 4? + bra menu_draw_line_none2 ; NO movlw dm_menu_item4_row - movff WREG,win_top ; Reset row + movff WREG,win_top ; reset row movlw dm_menu_item4_column - movff WREG,win_leftx2 ; New column - bra menu_draw_line_none2 ; Done. + 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 + 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) + 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/menu_tree.asm --- a/src/menu_tree.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/menu_tree.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_tree.asm REFACTORED VERSION V2.98 +; File menu_tree.asm REFACTORED VERSION V2.99e ; ; OSTC menus ; @@ -9,7 +9,7 @@ ; HISTORY ; 2011-07-11 : [jDG] Creation. -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; mandatory header #include "gaslist.inc" #include "menu_processor.inc" #include "start.inc" @@ -18,7 +18,7 @@ #include "tft.inc" #include "eeprom_rs232.inc" #include "external_flash.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "shared_definitions.h" ; mailbox from/to p2_deco.c #include "isr.inc" #include "ghostwriter.inc" #include "adc_lightsensor.inc" @@ -39,15 +39,16 @@ extern rtc_set_rtc extern surfloop extern oColorSetDive + extern option_cleanup_oCCRMode -gui CODE +menu_tree CODE ;============================================================================= ; Main Menu do_return_main_menu: - call menu_processor_double_pop ; drop exit line and back to last line + call menu_processor_double_pop ; drop exit line and back to last line bra do_main_menu_common global do_main_menu @@ -79,7 +80,8 @@ call menu_processor_double_pop ; drop exit line and back to last line do_ccr_menu: - bcf menu_show_sensors2 ; stop imprinting of live sensor values + bcf menu_update_sensor_mv ; stop imprinting of live sensor values + call option_cleanup_oCCRMode ; in pSCR mode, revert AutoSP (2) to calculated SP (0) btfsc analog_o2_input bra do_ccr_menu_cR @@ -94,7 +96,7 @@ 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_CALL tBack, do_return_main_menu MENU_END @@ -106,7 +108,7 @@ 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_CALL tBack, do_return_main_menu MENU_END ; COMMENTED OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu @@ -117,13 +119,13 @@ ; 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_CALL tBack, do_return_main_menu ; MENU_END do_calibrate_menu: - call enable_ir_s8 ; Enable IR/S8-Port - bsf menu_show_sensors2 ; start imprinting of live sensor values + call enable_ir_s8 ; enable IR/S8-Port + bsf menu_update_sensor_mv ; start imprinting of live sensor values do_calibrate_menu2: MENU_BEGIN tCalibrateMenu, .6 @@ -132,30 +134,31 @@ MENU_CALL tDiveHudMask3, 0 MENU_OPTION tCalibrationGas,oCalGasO2, 0 MENU_CALL tCalibrate, do_calibrate_mix - MENU_CALL tExit, do_return_ccr_menu + MENU_CALL tBack, do_return_ccr_menu MENU_END do_calibrate_mix: - call calibrate_mix ; Calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected - WAITMS d'250' ; Wait for HUD v3 + 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 + 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 + bsf FLAG_diluent_setup ; setting up diluents + bcf short_gas_decriptions ; do not use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bcf better_gas_hint ; do not mark the best gas/diluent (to be used in dive mode only) + call gaslist_cleanup_list ; take care that only one gas can be first 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_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_CALL tBack, do_return_ccr_menu MENU_END @@ -163,7 +166,8 @@ 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 + bcf short_gas_decriptions ; =1: use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bcf better_gas_hint ; do not mark the best gas/diluent (to be used in dive mode only) MENU_BEGIN tFixedSetpoints, .6 MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu @@ -171,27 +175,27 @@ 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_CALL tBack, do_return_ccr_menu MENU_END do_edit_sp_menu: - call gaslist_setSP ; Save current item. + movff PRODL,gaslist_gas ; get menu item we came from (0-4) 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_CALL tBack, do_return_fixed_setpoints MENU_END do_PSCR_menu: - MENU_BEGIN tPSCRMenu, .3 ; 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_CALL tBack, do_return_ccr_menu MENU_END ;============================================================================= @@ -200,45 +204,53 @@ 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 FLAG_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 + bcf FLAG_diluent_setup ; not setting up diluents + bcf short_gas_decriptions ; do not use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bcf better_gas_hint ; do not mark the best gas/diluent (to be used in dive mode only) + call gaslist_cleanup_list ; takes care that only one gas can be first 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_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_DYNAMIC gaslist_strcat_gas_cd, do_edit_gas_menu + MENU_CALL tBack, do_return_main_menu MENU_END do_return_edit_gas_menu: + IFDEF _rx_functions + bcf menu_update_tank_pres ; stop imprinting of tank pressure updates + bcf FLAG_pairing_mode ; not in pairing menu any more (back to normal timeout) + ENDIF 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: + movff PRODL,gaslist_gas ; get menu item we came from (0-4) + movlw .5 ; offset between gases and diluents + btfsc FLAG_diluent_setup ; in CCR menu? + addwf gaslist_gas,F ; YES - add the offset -do_edit_gas_menu: - call gaslist_setgas ; set gaslist_gas - -do_edit_gas_menu_common: ; keep current gas - MENU_BEGIN tGasEdit, .6 +do_edit_gas_menu_common: + MENU_BEGIN tGasEdit, .7 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_CALL tSetup_GasMix, do_setup_mix_menu + MENU_DYNAMIC gaslist_GasDepth, do_setup_depth_menu + MENU_CALL tSetup_Tank, do_setup_tank_menu + MENU_CALL tBack, do_return_gas_menu MENU_END -do_setup_mix: +do_setup_mix_menu: MENU_BEGIN tGasEdit, .7 MENU_DYNAMIC gaslist_gastitle, 0 MENU_DYNAMIC gaslist_MOD_END, 0 @@ -246,19 +258,46 @@ MENU_CALL tO2Minus, gaslist_mO2 MENU_CALL tHePlus, gaslist_pHe MENU_CALL tHeMinus, gaslist_mHe - MENU_CALL tExit, do_return_edit_gas_menu + MENU_CALL tBack, do_return_edit_gas_menu + MENU_END + + +do_setup_tank_menu: + IFDEF _rx_functions + btfsc FLAG_tr_enabled ; TR functions enabled? + bra do_setup_tank_menu_rx ; YES + ENDIF + + MENU_BEGIN tSetup_Tank, .6 + MENU_DYNAMIC gaslist_gastitle, 0 + MENU_DYNAMIC gaslist_tank_size_pres, 0 + MENU_CALL tTankSize, gaslist_tank_size + MENU_CALL tTankUsablePress, gaslist_tank_pres + MENU_CALL tCopyDilToOC, gaslist_copy_dil_to_oc + MENU_CALL tBack, do_return_edit_gas_menu MENU_END -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 do_abort_gas_depth_menu ; Non-Deco gas or "Normal" Diluent, abort! + IFDEF _rx_functions + +do_setup_tank_menu_rx: + setf pairing_slot ; prime slot number with 255 aka -1, used in pairing function + bsf FLAG_pairing_mode ; in pairing menu (longer timeout) + + MENU_BEGIN tSetup_Tank, .7 + MENU_DYNAMIC gaslist_gastitle, 0 + MENU_DYNAMIC gaslist_tank_id_pres, 0 ; when changing position, adopt TFT_menu_tank_pres! + MENU_DYNAMIC gaslist_tank_size_pres, 0 + MENU_CALL tTankPairing, gaslist_tank_pairing + MENU_CALL tTankSize, gaslist_tank_size + MENU_CALL tTankUsablePress, gaslist_tank_pres + MENU_CALL tBack, do_return_edit_gas_menu + MENU_END + + ENDIF + + +do_setup_depth_menu: MENU_BEGIN tGasEdit, .7 MENU_DYNAMIC gaslist_gastitle, 0 @@ -267,12 +306,12 @@ 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_CALL tBack, do_return_edit_gas_menu MENU_END ;============================================================================= -; Simulator menus +; Simulator Menus do_return_planner_menu: call menu_processor_pop ; drop exit line and ... @@ -286,15 +325,32 @@ ; 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 + ; 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 + lfsr FSR0,oSimAGF + call option_reset do_planner_common: + movff opt_dive_mode,WREG ; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + dcfsnz WREG,W ; subtract one, became zero? + bra do_planner_common_ccr ; YES - use CCR version + + 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_OPTION tuseAGF, oSimAGF, 0 + MENU_CALL tDeco, do_demo_planner + MENU_CALL tBack, do_return_main_menu + MENU_END + +do_planner_common_ccr: MENU_BEGIN tPlan, .7 MENU_OPTION tIntvl, odiveInterval, 0 MENU_OPTION tBtDep, obottomDepth, 0 @@ -302,20 +358,19 @@ 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_CALL tBack, 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_return_planner_menu + MENU_CALL tBack, do_return_planner_menu MENU_END ;============================================================================= -; Divemode menu +; Divemode Menu do_return_divemode_menu: call menu_processor_double_pop ; drop exit line and back to last line @@ -326,9 +381,9 @@ MENU_OPTION tDkMode, oDecoMode, 0 MENU_CALL tppO2settings, do_ppo2_menu MENU_OPTION tsafetystopmenu, oSafetyStop, 0 + MENU_CALL tDecoparameters, do_decoparameters_menu MENU_CALL t2ndDecoPlanMenu, do_2nd_deco_plan_menu - MENU_CALL tDecoparameters, do_decoparameters_menu - MENU_CALL tExit, do_return_main_menu + MENU_CALL tBack, do_return_main_menu MENU_END @@ -339,7 +394,7 @@ 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_CALL tBack, do_return_divemode_menu MENU_END @@ -349,71 +404,55 @@ 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! + bra do_decoparameters_menu_gf ; <> 0 -> GF menu! ; NON-GF menu - MENU_BEGIN tDecoparameters, .4 + MENU_BEGIN tDecoparameters, .6 + MENU_OPTION tSetBotUse, obottom_usage, 0 + MENU_OPTION tSetDecoUse, odeco_usage, 0 MENU_OPTION tSaturationMult, osatmult, 0 MENU_OPTION tDesaturationMult, odesatmult, 0 - MENU_OPTION tLastDecostop, oLastDeco, 0 - MENU_CALL tExit, do_return_divemode_menu + MENU_CALL tMore, do_decoparameters_menu_more + MENU_CALL tBack, do_return_divemode_menu MENU_END -do_decoparameters_menugf: +do_decoparameters_menu_gf: ; 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 tSetBotUse, obottom_usage, 0 + MENU_OPTION tSetDecoUse, odeco_usage, 0 + MENU_CALL tGFMenu, do_GF_menu MENU_OPTION tSaturationMult, osatmultgf, 0 MENU_OPTION tDesaturationMult, odesatmultgf, 0 - MENU_OPTION tLastDecostop, oLastDeco, 0 - MENU_CALL tExit, do_return_divemode_menu + MENU_CALL tMore, do_decoparameters_menu_more + MENU_CALL tBack, do_return_divemode_menu MENU_END -do_return_2nd_deco_plan_menu: - 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 +do_decoparameters_menu_more: + MENU_BEGIN tDecoparameters, .4 + MENU_OPTION tLastDecostop, oLastDeco, 0 + MENU_OPTION tAscentSpeed, oAscentSpeed, 0 + MENU_OPTION tGasChangeTime, oGasChangeTime, 0 + MENU_CALL tBack, do_return_decoparameters_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 +do_2nd_deco_plan_menu: + MENU_BEGIN t2ndDecoPlanMenu, .3 + MENU_OPTION tFTTSMenu, oExtraTime, 0 + MENU_OPTION tCalcAscGas, oCalcAscGas, 0 + MENU_CALL tBack, do_return_divemode_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 - - -do_aGF_menu: - MENU_BEGIN taGFMenu, .4 +do_GF_menu: + MENU_BEGIN tGFMenu, .6 + MENU_OPTION tGF_low, oGF_low, 0 + MENU_OPTION tGF_high, oGF_high, 0 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_CALL tBack, do_return_decoparameters_menu MENU_END @@ -426,40 +465,143 @@ do_return_settings: call menu_processor_double_pop ; drop exit line and back to last line + IFDEF _rx_mode + bcf FLAG_tr_enabled ; clear TR functions flag by default + movff opt_TR_mode,WREG ; get TR functions mode + tstfsz WREG ; TR functions enabled? + bsf FLAG_tr_enabled ; YES + ENDIF do_settings_menu: btfsc ble_available ; ble available? bra do_settings_menu_ble ; YES - MENU_BEGIN tSystSets, .6 + MENU_BEGIN tSystSets, .5 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_CALL tBack, do_return_main_menu MENU_END do_settings_menu_ble: - MENU_BEGIN tSystSets, .7 + IFDEF _rx_functions + btfsc ostc_rx_present ; RX model? + bra do_settings_menu_rx ; YES + ENDIF + + MENU_BEGIN tSystSets, .6 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_CALL tBack, do_return_main_menu MENU_END + IFDEF _rx_functions +do_settings_menu_rx: + MENU_BEGIN tSystSets, .7 + MENU_CALL tInfoMenu, do_info_menu + MENU_CALL tBleTitle, comm_mode0 + MENU_CALL tTrSettings, do_settings_menu_TR + MENU_CALL tSetTimeDate, do_date_time_menu + MENU_CALL tDispSets, do_dispsets_menu + MENU_CALL tMore, do_settings_menu_more + MENU_CALL tBack, do_return_main_menu + MENU_END + ENDIF + + do_info_menu: + IFDEF _rx_functions + btfsc ostc_rx_present ; TR model? + bra do_info_menu_TR ; YES + ENDIF + 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_CALL tBack, do_return_settings + MENU_END + + IFDEF _rx_functions +do_info_menu_TR: + MENU_BEGIN tInfoMenu, .7 + MENU_DYNAMIC info_menu_serial, 0 + MENU_DYNAMIC info_menu_firmware, 0 + MENU_DYNAMIC info_menu_firmware_rx, 0 + MENU_DYNAMIC info_menu_total_dives, 0 + MENU_DYNAMIC info_menu_battery_volts, 0 + MENU_DYNAMIC info_menu_uptime, 0 + MENU_CALL tBack, do_return_settings MENU_END + ENDIF + + + IFDEF _rx_functions +do_settings_menu_TR: + movff opt_dive_mode,WREG ; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + incf WREG,W ; add 1 + dcfsnz WREG,W ; subtract one, became zero? + bra do_settings_menu_TR_MaxDelta; YES - OC + dcfsnz WREG,W ; subtract one, became zero? + bra do_settings_menu_TR_BailPres; YES - CCR + dcfsnz WREG,W ; subtract one, became zero? + bra do_settings_menu_TR_MaxDelta; YES - Gauge + dcfsnz WREG,W ; subtract one, became zero? + bra do_settings_menu_TR_abort ; YES - Apnea, abort + dcfsnz WREG,W ; subtract one, became zero? + bra do_settings_menu_TR_both ; YES - pSCR +do_settings_menu_TR_abort: + call menu_processor_pop ; drop last menu selection + bra do_settings_menu ; back to last menu + +do_settings_menu_TR_MaxDelta: ; menu with oTrMaxDeltaPres + MENU_BEGIN tTrSettings, .5 + MENU_OPTION tTrMode, oTrMode, 0 + MENU_OPTION tTr1stPres, oTr1stPres, 0 + MENU_OPTION tTr2ndPres, oTr2ndPres, 0 + MENU_DYNAMIC do_toggle_max_pres_diff_label,do_toggle_max_pres_diff + MENU_CALL tBack, do_return_settings + MENU_END + +do_settings_menu_TR_BailPres: ; menu with oTrBailPres + MENU_BEGIN tTrSettings, .5 + MENU_OPTION tTrMode, oTrMode, 0 + MENU_OPTION tTr1stPres, oTr1stPres, 0 + MENU_OPTION tTr2ndPres, oTr2ndPres, 0 + MENU_OPTION tTrBailPres, oTrBailPres, 0 + MENU_CALL tBack, do_return_settings + MENU_END + +do_settings_menu_TR_both: ; menu with oTrBailPres and oTrMaxDeltaPres + MENU_BEGIN tTrSettings, .6 + MENU_OPTION tTrMode, oTrMode, 0 + MENU_OPTION tTr1stPres, oTr1stPres, 0 + MENU_OPTION tTr2ndPres, oTr2ndPres, 0 + MENU_OPTION tTrBailPres, oTrBailPres, 0 + MENU_DYNAMIC do_toggle_max_pres_diff_label,do_toggle_max_pres_diff + MENU_CALL tBack, do_return_settings + MENU_END + + +do_toggle_max_pres_diff: ; add 5 bar, with hard-coded max. + movff char_I_max_pres_diff,lo ; get current value + movlw .5 ; load increment + addwf lo,F ; add increment + movlw max_pres_diff_max ; load maximum value + cpfsgt lo ; above maximum value? + bra do_toggle_max_pres_diff_1 ; NO - store new value + movlw max_pres_diff_min ; YES - load minimum value + movwf lo ; - into lo +do_toggle_max_pres_diff_1: + movff lo,char_I_max_pres_diff ; write back new value + return ; done + ENDIF do_return_settings_more_deeper: ; entry point for returns from reset sub-menu @@ -477,46 +619,46 @@ 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 tAltMode, oAltMode, 0 ; oder to not mess 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_CALL tBack, do_return_settings MENU_END do_return_settings_menu_more_pz: call TFT_ClearScreen - 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_CALL tCompassMenu, do_compass_menu ; see above + 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_CALL tResetMenu, do_reset_menu ; + MENU_CALL tMore, do_settings_piezo_menu ; + MENU_CALL tBack, do_return_settings MENU_END -do_settings_menu_more_ostc3p: ; Menu with BLE feature +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_CALL tCompassMenu, do_compass_menu ; see above + 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_CALL tResetMenu, do_reset_menu ; + MENU_CALL tBack, do_return_settings MENU_END do_settings_piezo_menu: ; 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 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_CALL tBack, do_return_settings_menu_more_pz MENU_END @@ -527,64 +669,63 @@ 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_CALL tBack, do_return_settings_more MENU_END ;============================================================================= -; Reset and confirmation menu. +; Reset and confirmation menu do_reset_menu: 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_CALL tBack, 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_return_settings_more_deeper - MENU_CALL tReboot, do_reboot ; Reboot + MENU_CALL tReboot, do_reboot ; reboot MENU_END do_reset_menu3: MENU_BEGIN tResetMenu2, .2 MENU_CALL tAbort, do_return_settings_more_deeper - MENU_CALL tResetDeco, do_reset_deco ; Reset Deco + MENU_CALL tResetDeco, do_reset_deco ; reset deco MENU_END do_reset_menu4: MENU_BEGIN tResetMenu2, .2 MENU_CALL tAbort, do_return_settings_more_deeper - MENU_CALL tResetSettings, do_reset_settings ; Reset all settings + MENU_CALL tResetSettings, do_reset_settings ; reset all settings MENU_END do_reset_menu5: MENU_BEGIN tResetMenu2, .2 MENU_CALL tAbort, do_return_settings_more_deeper - MENU_CALL tResetLogbook, do_reset_logbook ; Reset logbook + 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 + write_int_eeprom .17 ; copy number of dives clrf EEDATA write_int_eeprom .2 - write_int_eeprom .3 ; Clear total dives + 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_return_settings_more_deeper + write_int_eeprom .6 ; reset logbook pointers + call ext_flash_erase_logbook ; and complete logbook + bra do_return_settings_more_deeper do_reset_deco: @@ -595,18 +736,16 @@ 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 + bra do_return_settings_more_deeper do_reset_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 + call TFT_ClearScreen ; clear screen + 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 @@ -615,7 +754,7 @@ MENU_CALL tSetTime, do_time_menu MENU_CALL tSetDate, do_date_menu MENU_OPTION tDateFormat,oDateFormat, 0 - MENU_CALL tExit, do_return_settings + MENU_CALL tBack, do_return_settings MENU_END @@ -626,7 +765,7 @@ MENU_OPTION tSetDay, oSetDay, 0 MENU_OPTION tSetMonth, oSetMonth, 0 MENU_OPTION tSetYear, oSetYear, 0 - MENU_CALL tExit, do_return_settings_deeper + MENU_CALL tBack, do_return_settings_deeper MENU_END @@ -643,11 +782,11 @@ MENU_OPTION tSetHours, oSetHours, 0 MENU_OPTION tSetMinutes, oSetMinutes, 0 MENU_CALL tSetSeconds, do_reset_seconds - MENU_CALL tExit, do_return_settings_deeper + MENU_CALL tBack, do_return_settings_deeper MENU_END -do_toggle_ppo2_max: ; add 0.1bar, with hard-coded max. +do_toggle_ppo2_max: ; add 0.1 bar, with hard-coded max. movff char_I_ppO2_max,lo ; banksafe movlw .10 addwf lo,F @@ -660,7 +799,7 @@ movff lo,char_I_ppO2_max return -do_toggle_ppo2_max_deco: ; add 0.1bar, with hard-coded max. +do_toggle_ppo2_max_deco: ; add 0.1 bar, with hard-coded max. movff char_I_ppO2_max_deco,lo ; banksafe movlw .10 addwf lo,F @@ -673,7 +812,7 @@ movff lo,char_I_ppO2_max_deco return -do_toggle_ppo2_min: ; sub 0.1bar, with hard-coded min. +do_toggle_ppo2_min: ; sub 0.1 bar, with hard-coded min. movff char_I_ppO2_min,lo ; banksafe incf lo,F movlw ppo2_warning_low_highest @@ -685,7 +824,7 @@ movff lo,char_I_ppO2_min return -do_toggle_ppo2_min_cc: ; sub 0.1bar, with hard-coded min. +do_toggle_ppo2_min_cc: ; sub 0.1 bar, with hard-coded min. movff char_I_ppO2_min_loop,lo ; banksafe incf lo,F movlw ppo2_warning_loop_highest @@ -706,60 +845,75 @@ 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_CALL tBack, do_return_settings_more MENU_END do_logoffset_minus1: - call do_logoffset_common_read ; Read into lo:hi + call do_logoffset_common_read ; read into lo:hi movlw .1 subwf lo movlw .0 subwfb hi - btfss hi,7 ; <0? - goto do_logoffset_common_write ; Store and return + btfss hi,7 ; < 0 ? + bra do_logoffset_exit ; store and return clrf lo clrf hi - goto do_logoffset_common_write ; Store and return + bra do_logoffset_exit ; store and return do_logoffset_minus10: - call do_logoffset_common_read ; Read into lo:hi + call do_logoffset_common_read ; read into lo:hi movlw .10 subwf lo movlw .0 subwfb hi - btfss hi,7 ; <0? - goto do_logoffset_common_write ; Store and return + btfss hi,7 ; < 0 ? + bra do_logoffset_exit ; store and return clrf lo clrf hi - goto do_logoffset_common_write ; Store and return + bra do_logoffset_exit ; store and return do_logoffset_plus1: - call do_logoffset_common_read ; Read into lo:hi + call do_logoffset_common_read ; read into lo:hi infsnz lo,F incf hi,F - goto do_logoffset_common_write ; Store and return + bra do_logoffset_exit ; store and return do_logoffset_plus10: - call do_logoffset_common_read ; Read into lo:hi + call do_logoffset_common_read ; read into lo:hi movlw .10 addwf lo movlw .0 addwfc hi - goto do_logoffset_common_write ; Store and return +do_logoffset_exit: + goto do_logoffset_common_write ; store and return 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 + + IF _language_2!=none + MENU_BEGIN tDispSets, .7 MENU_OPTION tBright, oBrightness, 0 + MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tUnits, oUnits, 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_CALL tBack, do_return_settings MENU_END + ELSE + MENU_BEGIN tDispSets, .6 + MENU_OPTION tBright, oBrightness, 0 + MENU_OPTION tUnits, oUnits, 0 + MENU_CALL tColorScheme, do_color_scheme + MENU_OPTION tFlip, oFlipScreen, 0 + MENU_CALL tMore, do_dispsets_menu_more + MENU_CALL tBack, do_return_settings + MENU_END + ENDIF do_dispsets_menu_more: @@ -769,8 +923,8 @@ 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_OPTION t2ndDepth, o2ndDepthDisp, 0 + MENU_CALL tBack, do_return_dispsets_menu MENU_END @@ -779,7 +933,7 @@ MENU_BEGIN tColorScheme, .2 MENU_OPTION tColorSetDive, oColorSetDive, 0 - MENU_CALL tExit, do_return_dispsets_menu + MENU_CALL tBack, do_return_dispsets_menu MENU_END @@ -793,13 +947,19 @@ 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 + + IFDEF _screendump + bsf enable_screen_dumps ; to prevent exiting into COMM mode immediately + ELSE + bsf disable_comm_mode ; to prevent exiting into COMM mode immediately + ENDIF + + 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 + ; Default (in cases of timeout or USB): use old battery clrf EEADRH read_int_eeprom 0x07 movff EEDATA,battery_gauge+0 @@ -814,9 +974,9 @@ read_int_eeprom 0x0C movff EEDATA,battery_gauge+5 - call menu_processor_reset ; restart from first icon. + call menu_processor_reset ; restart from first item - ; hardware_flag: + ; hardware_flag1: ; 3: 0x0A or 0x13 (2016) ; cR: 0x05 ; 2 with BLE: 0x11 @@ -824,27 +984,27 @@ ; 3 with BLE: 0x1A movlw 0x0A - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_AA movlw 0x13 - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_AA_16650 movlw 0x12 - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_AA movlw 0x1A - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_AA movlw 0x11 - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_18650 movlw 0x05 - cpfseq hardware_flag + cpfseq hardware_flag1 bra $+4 bra menu_new_battery_18650 bra use_old_batteries ; any unsupported value @@ -880,15 +1040,15 @@ 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. + incfsz EEDATA,F ; was 0xFF? + return ; NO - done - call lt2942_get_status ; Check for gauge IC + 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 + movlw .1 ; assume a Saft movwf EEDATA - write_int_eeprom 0x0F ; Store the new battery type into EEPROM + write_int_eeprom 0x0F ; store the new battery type into EEPROM return @@ -910,28 +1070,33 @@ 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 - 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 + rcall setup_new_panasonic ; =2 dcfsnz EEDATA,F - rcall setup_new_18650 ;=3 + rcall setup_new_18650 ; =3 dcfsnz EEDATA,F - rcall setup_new_16650 ;=4 + rcall setup_new_16650 ; =4 bcf use_old_batt_flag ; clear flag - goto surfloop ; Jump to Surfaceloop! + + IFNDEF _screendump + bcf disable_comm_mode ; re-enable COMM mode again + ENDIF + + goto surfloop ; jump to surface loop setup_new_15v: bsf charge_disable bcf TRISE,2 movlw .100 - movwf batt_percent ; To have 1,5V batteries right after firmware update + movwf batt_percent ; to have 1.5V batteries right after firmware update movlw .0 movff WREG,battery_type return @@ -960,7 +1125,7 @@ setup_new_panasonic: - banksel battery_capacity + banksel battery_capacity movlw LOW internal_panasonic_capacity movwf internal_battery_capacity+0 movlw HIGH internal_panasonic_capacity @@ -1023,21 +1188,28 @@ use_16650_battery: rcall setup_new_16650 - bra use_new_36V_2 + bra use_batt_exit use_18650_battery: rcall setup_new_18650 - bra use_new_36V_2 + bra use_batt_exit use_new_36V_batteries: rcall setup_new_saft - bra use_new_36V_2 + bra use_batt_exit use_new_15V_batteries: 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! +use_batt_exit: + call reset_battery_pointer ; resets battery pointer 0x07-0x0C and battery_gauge:5 +use_batt_exit1: + + IFNDEF _screendump + bcf disable_comm_mode ; re-enable COMM mode again + ENDIF + + goto surfloop ; jump to surface loop + use_36V_rechargeable: rcall setup_new_panasonic call reset_battery_internal_only - goto surfloop ; Jump to Surface loop! + bra use_batt_exit1 ; jump to surface loop END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/ms5541.asm --- a/src/ms5541.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/ms5541.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File ms5541.asm +; File ms5541.asm V2.98c ; ; Sensor subroutines ; @@ -9,241 +9,241 @@ ; HISTORY ; 2011-08-03 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "math.inc" ; Math routines +#include "hwos.inc" ; Mandatory header +#include "math.inc" ; Math routines -sensors CODE +ms5541 CODE ;============================================================================= ; Expose internal variables, to ease debug: - global D1, D2 - global C1, C2, C3, C4, C5, C6 - global xdT, xdT2, OFF, SENS, amb_pressure_avg, temperature_avg + global D1, D2 + global C1, C2, C3, C4, C5, C6 + global xdT, xdT2, OFF, SENS, amb_pressure_avg, temperature_avg ;============================================================================= global calculate_compensation calculate_compensation: - ; xdT = D2 - C5 (s16 range -11.400 .. +12.350) - movf C5+0,W ; Get Value to be subtracted - subwf D2+0,W ; Do the Low Byte - movwf xdT+0 - movf C5+1,W ; Then the high byte. - subwfb D2+1,W - movwf xdT+1 + ; xdT = D2 - C5 (s16 range -11.400 .. +12.350) + movf C5+0,W ; Get Value to be subtracted + subwf D2+0,W ; Do the Low Byte + movwf xdT+0 + movf C5+1,W ; Then the high byte. + subwfb D2+1,W + movwf xdT+1 - ; Second order temperature calculation - ; xdT/128 is in range -89..+96, hence signed 8bit. dT/128 = (2*dT)/256 - rlcf xdT+0,W ; put hit bit in carry. - rlcf xdT+1,W ; inject in high byte. - movwf isr_xA+0 ; and put result in low byte. - clrf isr_xA+1 - btfsc xdT+1,7 ; If dT < 0 - setf isr_xA+1 ; then signextend to -1 - movff isr_xA+0,isr_xB+0 ; copy A to B + ; Second order temperature calculation + ; xdT/128 is in range -89..+96, hence signed 8bit. dT/128 = (2*dT)/256 + rlcf xdT+0,W ; put hit bit in carry. + rlcf xdT+1,W ; inject in high byte. + movwf isr_xA+0 ; and put result in low byte. + clrf isr_xA+1 + btfsc xdT+1,7 ; If dT < 0 + setf isr_xA+1 ; then signextend to -1 + movff isr_xA+0,isr_xB+0 ; copy A to B movff isr_xA+1,isr_xB+1 - call isr_signed_mult16x16 ; dT*dT --> xC (32 bits) + call isr_signed_mult16x16 ; dT*dT --> xC (32 bits) ; dT >= 0: divide by 8, ie. 3 shifts rights. ; dT < 0: divide by 2, ie. 1 shifts rights. - movlw .3 - btfss xdT+1,7 ; Was dT negative ? - movlw .1 + movlw .3 + btfss xdT+1,7 ; Was dT negative ? + movlw .1 calc_loop_1: - bcf STATUS,C ;dT^2 is positive, so injected zeros. - rrcf isr_xC+1,F - rrcf isr_xC+0,F - decfsz WREG - bra calc_loop_1 + bcf STATUS,C ; dT^2 is positive, so injected zeros. + rrcf isr_xC+1,F + rrcf isr_xC+0,F + decfsz WREG + bra calc_loop_1 - movf isr_xC+0,W ; dT2 = dT - (dT/128)*(dT/128)/(2 ...or... 8) - subwf xdT+0,W - movwf xdT2+0 - movf isr_xC+1,W - subwfb xdT+1,W - movwf xdT2+1 + movf isr_xC+0,W ; dT2 = dT - (dT/128)*(dT/128)/(2 ...or... 8) + subwf xdT+0,W + movwf xdT2+0 + movf isr_xC+1,W + subwfb xdT+1,W + movwf xdT2+1 + + ; Calculate OFF = C2 + ((C4-250)*dT2)/2^12 + 10000 + ; (range +9.246 .. +18.887) + movff C4+0,isr_xA+0 ; C4 - 250 --> A + movff C4+1,isr_xA+1 + movff xdT2+0,isr_xB+0 ; dT2 --> B + movff xdT2+1,isr_xB+1 + call isr_signed_mult16x16 - ; Calculate OFF = C2 + ((C4-250)*dT2)/2^12 + 10000 - ; (range +9.246 .. +18.887) - movff C4+0,isr_xA+0 ; C4 - 250 --> A - movff C4+1,isr_xA+1 - movff xdT2+0,isr_xB+0 ; dT2 --> B - movff xdT2+1,isr_xB+1 - call isr_signed_mult16x16 + movlw .12-.8 ; A 12bit shift = 1 byte + 4 bits. + call isr_shift_C31 - movlw .12-.8 ; A 12bit shift = 1 byte + 4 bits. - call isr_shift_C31 + movlw LOW(.10000) ; Add 10000 + addwf isr_xC+1,F + movlw HIGH(.10000) + addwfc isr_xC+2,F - movlw LOW(.10000) ; Add 10000 - addwf isr_xC+1,F - movlw HIGH(.10000) - addwfc isr_xC+2,F - - movf C2+0,W ; Add C2, and save into OFF - addwf isr_xC+1,W - movwf OFF+0 + movf C2+0,W ; Add C2, and save into OFF + addwf isr_xC+1,W + movwf OFF+0 movf C2+1,W - addwfc isr_xC+2,W - movwf OFF+1 + addwfc isr_xC+2,W + movwf OFF+1 + + ; Calculate SENS = C1/2 + ((C3+200)*dT)/2^13 + 3000 + movlw LOW(.200) ; C3+200 --> A + addwf C3+0,W + movwf isr_xA+0 + movlw HIGH(.200) + addwfc C3+1,W + movwf isr_xA+1 + ; B still contains dT2 + call isr_signed_mult16x16 ; A*B --> C + movlw .13-.8 ; A 13bit shift = 1 byte + 5 bits. + call isr_shift_C31 - ; Calculate SENS = C1/2 + ((C3+200)*dT)/2^13 + 3000 - movlw LOW(.200) ; C3+200 --> A - addwf C3+0,W - movwf isr_xA+0 - movlw HIGH(.200) - addwfc C3+1,W - movwf isr_xA+1 - ; B still contains dT2 - call isr_signed_mult16x16 ; A*B --> C - movlw .13-.8 ; A 13bit shift = 1 byte + 5 bits. - call isr_shift_C31 - - bcf STATUS,C ; SENS = C1 / 2 - rrcf C1+1,W - movwf SENS+1 - rrcf C1+0,W - movwf SENS+0 + bcf STATUS,C ; SENS = C1 / 2 + rrcf C1+1,W + movwf SENS+1 + rrcf C1+0,W + movwf SENS+0 + + movlw LOW(.3000) ; Add 3000 + addwf isr_xC+1,F + movlw HIGH(.3000) + addwfc isr_xC+2,F - movlw LOW(.3000) ; Add 3000 - addwf isr_xC+1,F - movlw HIGH(.3000) - addwfc isr_xC+2,F + movf isr_xC+1,W ; And sum into SENS + addwf SENS+0,F + movf isr_xC+2,W + addwfc SENS+1,F - movf isr_xC+1,W ; And sum into SENS - addwf SENS+0,F - movf isr_xC+2,W - addwfc SENS+1,F + ; calculate amb_pressure = (sens * (d1-off))/2^12 + 1000 + movf OFF+0,W ; d1-off --> a + subwf D1+0,W + movwf isr_xA+0 + movf OFF+1,W + subwfb D1+1,W + movwf isr_xA+1 - ; calculate amb_pressure = (sens * (d1-off))/2^12 + 1000 - movf OFF+0,W ; d1-off --> a - subwf D1+0,W - movwf isr_xA+0 - movf OFF+1,W - subwfb D1+1,W - movwf isr_xA+1 + movff SENS+0,isr_xB+0 ; sens --> b + movff SENS+1,isr_xB+1 + call isr_signed_mult16x16 + movlw .12-.8 ; a 12bit shift = 1 byte + 4 bits. + call isr_shift_C31 - movff SENS+0,isr_xB+0 ; sens --> b - movff SENS+1,isr_xB+1 - call isr_signed_mult16x16 - movlw .12-.8 ; a 12bit shift = 1 byte + 4 bits. - call isr_shift_C31 + movlw LOW(.1000) ; add 1000 + addwf isr_xC+1,F + movlw HIGH(.1000) + addwfc isr_xC+2,F - movlw LOW(.1000) ; add 1000 - addwf isr_xC+1,F - movlw HIGH(.1000) - addwfc isr_xC+2,F + ; Add opt_pressure_adjust to result (SIGNED!) + movff opt_pressure_adjust,isr_xC+0 - ; Add opt_pressure_adjust to result (SIGNED!) - movff opt_pressure_adjust,isr_xC+0 - - btfss isr_xC+0,7 ; <0? - bra pressure_extra_add ; No - ; Yes - comf isr_xC+0,F - incf isr_xC+0,F - ; Check for max. of 20mbar - movlw .22 - cpfslt isr_xC+0 - clrf isr_xC+0 - ; Subtract - movf isr_xC+0,W - subwf isr_xC+1,F - movlw .0 - subwfb isr_xC+2,F - bra pressure_extra_common + btfss isr_xC+0,7 ; < 0 ? + bra pressure_extra_add ; No + ; Yes + comf isr_xC+0,F + incf isr_xC+0,F + ; Check for max. of 20mbar + movlw .22 + cpfslt isr_xC+0 + clrf isr_xC+0 + ; Subtract + movf isr_xC+0,W + subwf isr_xC+1,F + movlw .0 + subwfb isr_xC+2,F + bra pressure_extra_common pressure_extra_add: - ; Check for max. of 20mbar - movlw .21 - cpfslt isr_xC+0 - clrf isr_xC+0 - ; Add - movf isr_xC+0,W - addwf isr_xC+1,F - movlw .0 - addwfc isr_xC+2,F + ; Check for max. of 20mbar + movlw .21 + cpfslt isr_xC+0 + clrf isr_xC+0 + ; Add + movf isr_xC+0,W + addwf isr_xC+1,F + movlw .0 + addwfc isr_xC+2,F pressure_extra_common: - banksel common ; flag2 is in bank 1 + banksel common ; flag2 is in bank 1 btfss simulatormode_active ; are we in simulator mode? bra calc_compensation_2 ; no - banksel isr_xC+2 - movlw .5 - cpfsgt isr_xC+2 ; >1280mbar ? - bra pressure_extra_common2 ; No - ; Yes, reset sim_pressure:2 to 1000mbar (End of sim) - movlw LOW .1000 - movwf sim_pressure+0 - movlw HIGH .1000 - movwf sim_pressure+1 + banksel isr_xC+2 + movlw .5 + cpfsgt isr_xC+2 ; > 1280 mbar ? + bra pressure_extra_common2 ; No + ; Yes, reset sim_pressure:2 to 1000mbar (End of sim) + movlw LOW .1000 + movwf sim_pressure+0 + movlw HIGH .1000 + movwf sim_pressure+1 pressure_extra_common2: - movff sim_pressure+0,isr_xC+1 ; override readings with simulator values + movff sim_pressure+0,isr_xC+1 ; override readings with simulator values movff sim_pressure+1,isr_xC+2 - + calc_compensation_2: banksel isr_backup - movf isr_xC+1,W ; Then sum_up to pressure averaging buffer. - addwf amb_pressure_avg+0,F - movf isr_xC+2,W - addwfc amb_pressure_avg+1,F + movf isr_xC+1,W ; Then sum_up to pressure averaging buffer. + addwf amb_pressure_avg+0,F + movf isr_xC+2,W + addwfc amb_pressure_avg+1,F - ; calculate temp = 200 + dT*(C6+100)/2^11 - movlw LOW(.100) ; C6 + 100 --> A - addwf C6+0,W - movwf isr_xA+0 - movlw HIGH(.100) - addwfc C6+1,W - movwf isr_xA+1 + ; calculate temp = 200 + dT*(C6+100)/2^11 + movlw LOW(.100) ; C6 + 100 --> A + addwf C6+0,W + movwf isr_xA+0 + movlw HIGH(.100) + addwfc C6+1,W + movwf isr_xA+1 - movff xdT2+0,isr_xB+0 ; dT2 --> B - movff xdT2+1,isr_xB+1 - call isr_signed_mult16x16 ; A*B - movlw .11-.8 ; A 12bit shift = 1 byte + 3 bits. - call isr_shift_C31 + movff xdT2+0,isr_xB+0 ; dT2 --> B + movff xdT2+1,isr_xB+1 + call isr_signed_mult16x16 ; A*B + movlw .11-.8 ; A 12 bit shift = 1 byte + 3 bits + call isr_shift_C31 - movlw LOW(.200) ; Add 200 - addwf isr_xC+1,F - movlw HIGH(.200) - addwfc isr_xC+2,F + movlw LOW(.200) ; Add 200 + addwf isr_xC+1,F + movlw HIGH(.200) + addwfc isr_xC+2,F - ; Add opt_temperature_adjust to result (SIGNED!) - movff opt_temperature_adjust,isr_xC+0 + ; Add opt_temperature_adjust to result (SIGNED!) + movff opt_temperature_adjust,isr_xC+0 - btfss isr_xC+0,7 ; <0? - bra temperature_extra_add ; No - ; Yes - comf isr_xC+0,F - incf isr_xC+0,F - ; Check for max. of 2.0°C - movlw .22 - cpfslt isr_xC+0 - clrf isr_xC+0 - ; Subtract - movf isr_xC+0,W - subwf isr_xC+1,F - movlw .0 - subwfb isr_xC+2,F - bra temperature_extra_common + btfss isr_xC+0,7 ; < 0 ? + bra temperature_extra_add ; No + ; Yes + comf isr_xC+0,F + incf isr_xC+0,F + ; Check for max. of 2.0°C + movlw .22 + cpfslt isr_xC+0 + clrf isr_xC+0 + ; Subtract + movf isr_xC+0,W + subwf isr_xC+1,F + movlw .0 + subwfb isr_xC+2,F + bra temperature_extra_common temperature_extra_add: - ; Check for max. of 2.0°C - movlw .21 - cpfslt isr_xC+0 - clrf isr_xC+0 - ; Add - movf isr_xC+0,W - addwf isr_xC+1,F - movlw .0 - addwfc isr_xC+2,F + ; Check for max. of 2.0°C + movlw .21 + cpfslt isr_xC+0 + clrf isr_xC+0 + ; Add + movf isr_xC+0,W + addwf isr_xC+1,F + movlw .0 + addwfc isr_xC+2,F temperature_extra_common: - movf isr_xC+1,W - addwf temperature_avg+0,F - movf isr_xC+2,W - addwfc temperature_avg+1,F + movf isr_xC+1,W + addwf temperature_avg+0,F + movf isr_xC+2,W + addwfc temperature_avg+1,F - return ; Done. + return ; Done. ;============================================================================= global get_pressure_start @@ -258,8 +258,8 @@ global get_pressure_value get_pressure_value: - btfsc MS5541_miso ; Conversion done? - return ; No, Return + btfsc MS5541_miso ; Conversion done? + return ; No, Return rcall get_2bytes_MS5541 movff dMSB,D1+1 movff dLSB,D1+0 @@ -274,8 +274,8 @@ global get_temperature_value get_temperature_value: - btfsc MS5541_miso ; Conversion done? - return ; No, Return + btfsc MS5541_miso ; Conversion done? + return ; No, Return rcall get_2bytes_MS5541 movff dMSB,D2+1 movff dLSB,D2+0 @@ -285,11 +285,11 @@ global get_calibration_data get_calibration_data: banksel common - bsf no_sensor_int ; disable sensor interrupts - banksel isr_backup ; Back to Bank0 ISR data + bsf no_sensor_int ; disable sensor interrupts + banksel isr_backup ; Back to Bank0 ISR data rcall reset_MS5541 - movlw b'01010100' ;+3*high as start and 1+low as stop! + movlw b'01010100' ;+3*high as start and 1+low as stop! movwf isr1_temp movlw d'13' rcall send_data_MS5541 @@ -297,7 +297,7 @@ movff dMSB,ir_s8_buffer+1 movff dLSB,ir_s8_buffer+0 - movlw b'01011000' ;+3*high as start and 1+low as stop! + movlw b'01011000' ;+3*high as start and 1+low as stop! movwf isr1_temp movlw d'13' rcall send_data_MS5541 @@ -305,7 +305,7 @@ movff dMSB,ir_s8_buffer+3 movff dLSB,ir_s8_buffer+2 - movlw b'01100100' ;+3*high as start and 1+low as stop! + movlw b'01100100' ;+3*high as start and 1+low as stop! movwf isr1_temp movlw d'13' rcall send_data_MS5541 @@ -313,7 +313,7 @@ movff dMSB,ir_s8_buffer+5 movff dLSB,ir_s8_buffer+4 - movlw b'01101000' ;+3*high as start and 1+low as stop! + movlw b'01101000' ;+3*high as start and 1+low as stop! movwf isr1_temp movlw d'13' rcall send_data_MS5541 @@ -405,7 +405,7 @@ bsf C3+1,1 btfsc ir_s8_buffer+5,6 bsf C3+1,0 - + ; calculate C4 (16Bit) movff ir_s8_buffer+7,C4+0 bsf STATUS,C @@ -417,14 +417,14 @@ bsf C4+1,0 ; C4=C4-250 - movlw LOW(-.250) ; C4 - 250 --> C4 + movlw LOW(-.250) ; C4 - 250 --> C4 addwf C4+0,W - movwf C4+0 - movlw -1 ; HIGH(- .250) is not understood... - addwfc C4+1,W - movwf C4+1 - -; calculate C5 (16Bit) + movwf C4+0 + movlw -1 ; HIGH(- .250) is not understood... + addwfc C4+1,W + movwf C4+1 + +; calculate C5 (16Bit) movff ir_s8_buffer+4,C5+0 bcf C5+0,6 btfsc ir_s8_buffer+2,0 @@ -442,46 +442,46 @@ btfsc ir_s8_buffer+2,5 bsf C5+1,3 - ; calculate C5 = UT1 - ; C5 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) + ; calculate C5 = UT1 + ; C5 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) clrf isr_xA+1 movlw d'8' movwf isr_xA+0 movff C5+0,isr_xB+0 movff C5+1,isr_xB+1 - call isr_unsigned_mult16x16 ;isr_xA*isr_xB=isr_xC - movff isr_xC+0,C5+0 - movff isr_xC+1,C5+1 - movlw LOW d'10000' - addwf C5+0,F - movlw HIGH d'10000' - addwfc C5+1,F ; = 8*C5 + 10000 + call isr_unsigned_mult16x16 ;isr_xA*isr_xB=isr_xC + movff isr_xC+0,C5+0 + movff isr_xC+1,C5+1 + movlw LOW d'10000' + addwf C5+0,F + movlw HIGH d'10000' + addwfc C5+1,F ; = 8*C5 + 10000 -; calculate C6 (16Bit) +; calculate C6 (16Bit) clrf C6+1 movff ir_s8_buffer+6,C6+0 bcf C6+0,7 banksel common - bcf no_sensor_int ; enable sensor interrupts - bcf pressure_refresh ; Clear flag - banksel isr_backup ; Back to Bank0 ISR data + bcf no_sensor_int ; enable sensor interrupts + bcf pressure_refresh ; Clear flag + banksel isr_backup ; Back to Bank0 ISR data - clrf sensor_state_counter ; Then reset State counter + clrf sensor_state_counter ; Then reset State counter return ;============================================================================= reset_MS5541_one: bsf MS5541_mosi - bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return + bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return reset_MS5541_zero: bcf MS5541_mosi - bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return + bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return reset_MS5541: - rcall reset_MS5541_one ;0 + rcall reset_MS5541_one ; 0 rcall reset_MS5541_zero rcall reset_MS5541_one rcall reset_MS5541_zero @@ -496,12 +496,12 @@ rcall reset_MS5541_one rcall reset_MS5541_zero rcall reset_MS5541_one - rcall reset_MS5541_zero ;15 - rcall reset_MS5541_zero - rcall reset_MS5541_zero - rcall reset_MS5541_zero - rcall reset_MS5541_zero - rcall reset_MS5541_zero ;20 + rcall reset_MS5541_zero ; 15 + rcall reset_MS5541_zero + rcall reset_MS5541_zero + rcall reset_MS5541_zero + rcall reset_MS5541_zero + rcall reset_MS5541_zero ; 20 return get_2bytes_MS5541: @@ -514,11 +514,11 @@ movwf clock_count rcall recieve_loop movff isr1_temp,dLSB - bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return + bra send_clk_pulse ; Send one high-low sequence on MS5541_clk -> and return ;return recieve_loop: - rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk + rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk btfss MS5541_miso ;MSB first bcf STATUS,C btfsc MS5541_miso ;MSB first @@ -541,29 +541,29 @@ nop nop nop - return + return send_data_MS5541: - movwf clock_count ; From WREG + movwf clock_count ; From WREG ; send three startbits first bcf MS5541_clk nop nop bsf MS5541_mosi movlw d'3' - subwf clock_count,F ; total bit counter - rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk - rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk - rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk + subwf clock_count,F ; total bit counter + rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk + rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk + rcall send_clk_pulse ; Send one high-low sequence on MS5541_clk ; now send 8 bytes from isr_temp1 and fill-up with zeros send_data_MS5541_2: bcf MS5541_clk nop nop - btfss isr1_temp,7 ;MSB first + btfss isr1_temp,7 ; MSB first bcf MS5541_mosi - btfsc isr1_temp,7 ;MSB first + btfsc isr1_temp,7 ; MSB first bsf MS5541_mosi bsf MS5541_clk @@ -583,4 +583,4 @@ bcf MS5541_clk return - END \ No newline at end of file + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/ms5541.inc --- a/src/ms5541.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/ms5541.inc Thu Nov 22 19:47:26 2018 +0100 @@ -13,4 +13,4 @@ extern get_pressure_value extern get_temperature_start extern get_temperature_value - extern get_calibration_data + extern get_calibration_data diff -r 00b24fb4324d -r ca4556fb60b9 src/option_table.asm --- a/src/option_table.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/option_table.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,8 +1,8 @@ ;============================================================================= ; -; File option_table.asm REFACTORED VERSION V2.98 +; File option_table.asm REFACTORED VERSION V2.99e ; -; The option table +; The Option Table ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= @@ -10,7 +10,7 @@ ; 2014-08-03 : mH creation ; -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; Mandatory Header #include "eeprom_rs232.inc" ;============================================================================= @@ -20,7 +20,7 @@ OPTION_UINT8 MACRO lbl, min, max, default, unit, eeprom, register global lbl -lbl: db 0, default ; Type0 = INT8 +lbl: db 0, default ; type0 = INT8 db 1, min db max, eeprom dw unit @@ -29,7 +29,7 @@ OPTION_UINT8p2 MACRO lbl, min, max, default, unit, eeprom, register global lbl -lbl: db 0, default ; Type0 = INT8 +lbl: db 0, default ; type0 = INT8 db 2, min db max, eeprom dw unit @@ -38,7 +38,7 @@ OPTION_UINT8p3 MACRO lbl, min, max, default, unit, eeprom, register global lbl -lbl: db 0, default ; Type0 = INT8 +lbl: db 0, default ; type0 = INT8 db 3, min db max, eeprom dw unit @@ -47,7 +47,7 @@ OPTION_UINT8p5 MACRO lbl, min, max, default, unit, eeprom, register global lbl -lbl: db 0, default ; Type0 = INT8 +lbl: db 0, default ; type0 = INT8 db .5, min db max, eeprom dw unit @@ -56,7 +56,7 @@ OPTION_UINT8p10 MACRO lbl, min, max, default, unit, eeprom, register global lbl -lbl: db 0, default ; Type0 = INT8 +lbl: db 0, default ; type0 = INT8 db .10, min db max, eeprom dw unit @@ -66,10 +66,10 @@ OPTION_ENUM8 MACRO lbl, max, default, tValue, eeprom, register global lbl extern tValue -lbl: db 1, default ; Type1 = ENUM +lbl: db 1, default ; type1 = ENUM db LOW(tValue), HIGH(tValue) db max, eeprom - dw 0 ; No unit + dw 0 ; no unit dw register ENDM @@ -80,21 +80,20 @@ OPTION_STRING MACRO lbl, length, defText, eeprom, register global lbl -lbl: db 2, LOW(defText) ; Type2 = STRING +lbl: db 2, LOW(defText) ; type2 = STRING db HIGH(defText), 0 db length, eeprom - dw 0 ; No unit + 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, char_I_dil_change + extern tPercent, tMeters, tMinutes, tGasDisabled, tbar, tNo, tTrModeOff, tTrPresNone, tDefName, tblank, tLogTunitC + extern 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 extern char_I_PSCR_drop, char_I_PSCR_lungratio extern char_I_tank_size, char_I_tank_pres_fill, tLiter, tbar10 @@ -102,22 +101,28 @@ 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 + extern char_I_gas_change_time + extern char_I_max_pres_diff + -; Option table -; OPTION_UINT8 Label, min, max, default, text-string, EEPROM location, RAM location +; Option Table - Format: +; ---------------------- +; OPTION_UINT8 Label, min, max, default, unit text, EEPROM location, RAM location +; OPTION_ENUM8 Label, number of enums default, unit text, EEPROM location, RAM location ; number of enums = 2, 3, ..., default starts with 0 +; OPTION_BOOL Label, default, 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, volatile, char_I_dive_interval - OPTION_UINT8p2 obottomTime, .1, .60, .5, tMinutes, volatile, char_I_bottom_time + OPTION_UINT8p2 obottomTime, .2, .60, .10, 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 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 @@ -138,12 +143,7 @@ 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 oLanguage, .2, .0, tLang1, .26, opt_language ; language selection 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 @@ -173,11 +173,11 @@ 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 oGas1Depth, .0, gaslist_max_change_depth, .56, tMeters, .50, opt_gas_change+0 + OPTION_UINT8 oGas2Depth, .0, gaslist_max_change_depth, .56, tMeters, .51, opt_gas_change+1 + OPTION_UINT8 oGas3Depth, .0, gaslist_max_change_depth, .56, tMeters, .52, opt_gas_change+2 + OPTION_UINT8 oGas4Depth, .0, gaslist_max_change_depth, .56, tMeters, .53, opt_gas_change+3 + OPTION_UINT8 oGas5Depth, .0, gaslist_max_change_depth, .56, tMeters, .54, opt_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 @@ -203,11 +203,11 @@ 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_UINT8 oDil1Depth, .0, gaslist_max_change_depth, .56, tMeters, .80, opt_dil_change+0 + OPTION_UINT8 oDil2Depth, .0, gaslist_max_change_depth, .56, tMeters, .81, opt_dil_change+1 + OPTION_UINT8 oDil3Depth, .0, gaslist_max_change_depth, .56, tMeters, .82, opt_dil_change+2 + OPTION_UINT8 oDil4Depth, .0, gaslist_max_change_depth, .56, tMeters, .83, opt_dil_change+3 + OPTION_UINT8 oDil5Depth, .0, gaslist_max_change_depth, .56, tMeters, .84, opt_dil_change+4 ;============================================================================= ; opt_name from 85 to 145 @@ -215,10 +215,10 @@ ;============================================================================= ; Misc - OPTION_ENUM8 oColorSetDive, .4, .0, tColorSetName0, .146, opt_dive_color_scheme ; Color scheme divemode + 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_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 @@ -233,38 +233,84 @@ 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] + 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 oTankSize1, min_tank_size, max_tank_size, .11, tLiter, .173, char_I_tank_size+0 ; size of OC gas tank 1, in liters + OPTION_UINT8 oTankSize2, min_tank_size, max_tank_size, .11, tLiter, .174, char_I_tank_size+1 ; size of OC gas tank 2, in liters + OPTION_UINT8 oTankSize3, min_tank_size, max_tank_size, .11, tLiter, .175, char_I_tank_size+2 ; size of OC gas tank 3, in liters + OPTION_UINT8 oTankSize4, min_tank_size, max_tank_size, .11, tLiter, .176, char_I_tank_size+3 ; size of OC gas tank 4, in liters + OPTION_UINT8 oTankSize5, min_tank_size, max_tank_size, .11, tLiter, .177, char_I_tank_size+4 ; size of OC gas tank 5, in liters + OPTION_UINT8 oTankFillPres1, min_fill_press, max_fill_press, .20, tbar10, .178, char_I_tank_pres_fill+0 ; fill press of OC gas tank 1, in multiples of 10 bars + OPTION_UINT8 oTankFillPres2, min_fill_press, max_fill_press, .20, tbar10, .179, char_I_tank_pres_fill+1 ; fill press of OC gas tank 2, in multiples of 10 bars + OPTION_UINT8 oTankFillPres3, min_fill_press, max_fill_press, .20, tbar10, .180, char_I_tank_pres_fill+2 ; fill press of OC gas tank 3, in multiples of 10 bars + OPTION_UINT8 oTankFillPres4, min_fill_press, max_fill_press, .20, tbar10, .181, char_I_tank_pres_fill+3 ; fill press of OC gas tank 4, in multiples of 10 bars + OPTION_UINT8 oTankFillPres5, min_fill_press, max_fill_press, .20, tbar10, .182, char_I_tank_pres_fill+4 ; fill press of OC gas tank 5, in multiples of 10 bars 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 + IFDEF _cave_mode + OPTION_ENUM8 oCalcAscGas, .3, .0, tNo, .185, opt_calc_asc_gasvolume ; calculate OC gas volume needs for ascent + ELSE + OPTION_ENUM8 oCalcAscGas, .2, .0, tNo, .185, opt_calc_asc_gasvolume ; calculate OC gas volume needs for ascent + ENDIF 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_UINT8 oAscentSpeed, .5, .10, .10, tMeterMinute, .188, char_I_ascent_speed ; ascent speed + OPTION_UINT8 oGasChangeTime, .0, .3, .1, tMinutes, .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_UINT8 oTransID1_0, .0, .255, .0, notext, .192, opt_transmitter_id_1+0 ; ID of transmitter for gas 1 (LOW) + OPTION_UINT8 oTransID1_1, .0, .255, .0, notext, .193, opt_transmitter_id_1+1 ; ID of transmitter for gas 1 (HIGH) + OPTION_UINT8 oTransID2_0, .0, .255, .0, notext, .194, opt_transmitter_id_2+0 ; ID of transmitter for gas 2 (LOW) + OPTION_UINT8 oTransID2_1, .0, .255, .0, notext, .195, opt_transmitter_id_2+1 ; ID of transmitter for gas 2 (HIGH) + OPTION_UINT8 oTransID3_0, .0, .255, .0, notext, .196, opt_transmitter_id_3+0 ; ID of transmitter for gas 3 (LOW) + OPTION_UINT8 oTransID3_1, .0, .255, .0, notext, .197, opt_transmitter_id_3+1 ; ID of transmitter for gas 3 (HIGH) + OPTION_UINT8 oTransID4_0, .0, .255, .0, notext, .198, opt_transmitter_id_4+0 ; ID of transmitter for gas 4 (LOW) + OPTION_UINT8 oTransID4_1, .0, .255, .0, notext, .199, opt_transmitter_id_4+1 ; ID of transmitter for gas 4 (HIGH) + OPTION_UINT8 oTransID5_0, .0, .255, .0, notext, .200, opt_transmitter_id_5+0 ; ID of transmitter for gas 5 (LOW) + OPTION_UINT8 oTransID5_1, .0, .255, .0, notext, .201, opt_transmitter_id_5+1 ; ID of transmitter for gas 5 (HIGH) + OPTION_UINT8 oTransID6_0, .0, .255, .0, notext, .202, opt_transmitter_id_6+0 ; ID of transmitter for dil 1 (LOW) + OPTION_UINT8 oTransID6_1, .0, .255, .0, notext, .203, opt_transmitter_id_6+1 ; ID of transmitter for dil 1 (HIGH) + OPTION_UINT8 oTransID7_0, .0, .255, .0, notext, .204, opt_transmitter_id_7+0 ; ID of transmitter for dil 2 (LOW) + OPTION_UINT8 oTransID7_1, .0, .255, .0, notext, .205, opt_transmitter_id_7+1 ; ID of transmitter for dil 2 (HIGH) + OPTION_UINT8 oTransID8_0, .0, .255, .0, notext, .206, opt_transmitter_id_8+0 ; ID of transmitter for dil 3 (LOW) + OPTION_UINT8 oTransID8_1, .0, .255, .0, notext, .207, opt_transmitter_id_8+1 ; ID of transmitter for dil 3 (HIGH) + OPTION_UINT8 oTransID9_0, .0, .255, .0, notext, .208, opt_transmitter_id_9+0 ; ID of transmitter for dil 4 (LOW) + OPTION_UINT8 oTransID9_1, .0, .255, .0, notext, .209, opt_transmitter_id_9+1 ; ID of transmitter for dil 4 (HIGH) + OPTION_UINT8 oTransID10_0, .0, .255, .0, notext, .210, opt_transmitter_id_10+0 ; ID of transmitter for dil 5 (LOW) + OPTION_UINT8 oTransID10_1, .0, .255, .0, notext, .211, opt_transmitter_id_10+1 ; ID of transmitter for dil 5 (HIGH) + OPTION_UINT8 oTankSize6, min_tank_size, max_tank_size, .11, tLiter, .212, char_I_tank_size+5 ; size of DIL gas tank 1, in liters + OPTION_UINT8 oTankSize7, min_tank_size, max_tank_size, .11, tLiter, .213, char_I_tank_size+6 ; size of DIL gas tank 2, in liters + OPTION_UINT8 oTankSize8, min_tank_size, max_tank_size, .11, tLiter, .214, char_I_tank_size+7 ; size of DIL gas tank 3, in liters + OPTION_UINT8 oTankSize9, min_tank_size, max_tank_size, .11, tLiter, .215, char_I_tank_size+8 ; size of DIL gas tank 4, in liters + OPTION_UINT8 oTankSize10, min_tank_size, max_tank_size, .11, tLiter, .216, char_I_tank_size+9 ; size of DIL gas tank 5, in liters + OPTION_UINT8 oTankFillPres6, min_fill_press, max_fill_press, .20, tbar10, .217, char_I_tank_pres_fill+5 ; fill press of DIL gas tank 1, in multiples of 10 bars + OPTION_UINT8 oTankFillPres7, min_fill_press, max_fill_press, .20, tbar10, .218, char_I_tank_pres_fill+6 ; fill press of DIL gas tank 2, in multiples of 10 bars + OPTION_UINT8 oTankFillPres8, min_fill_press, max_fill_press, .20, tbar10, .219, char_I_tank_pres_fill+7 ; fill press of DIL gas tank 3, in multiples of 10 bars + OPTION_UINT8 oTankFillPres9, min_fill_press, max_fill_press, .20, tbar10, .220, char_I_tank_pres_fill+8 ; fill press of DIL gas tank 4, in multiples of 10 bars + OPTION_UINT8 oTankFillPres10, min_fill_press, max_fill_press, .20, tbar10, .221, char_I_tank_pres_fill+9 ; fill press of DIL gas tank 5, in multiples of 10 bars + OPTION_ENUM8 oTrMode, .4, .1, tTrModeOff, .222, opt_TR_mode ; TR functions - mode + OPTION_ENUM8 oTr1stPres, .15, .1, tTrPresNone, .223, opt_TR_1st_pres ; TR functions - 1st pressure assignment + OPTION_ENUM8 oTr2ndPres, .15, .0, tTrPresNone, .224, opt_TR_2nd_pres ; TR functions - 2nd pressure assignment + OPTION_ENUM8 oTrBailPres, .15, .1, tTrPresNone, .225, opt_TR_Bail_pres ; TR functions - bailout pressure assignment + OPTION_UINT8p5 oTrMaxDeltaPres, max_pres_diff_min,max_pres_diff_max,.5, tbar, .226, char_I_max_pres_diff ; TR functions - maximum delta pressure in independent double mode + OPTION_BOOL oRealGasFactorUse, .0, .227, opt_ZfactorUse ; =1: figure in compression factor Z when converting gas volume <-> gas pressure [future option, not used yet] + OPTION_UINT8p5 oRealGasFactorTemp, .0, .30, .15, tLogTunitC, .228, opt_ZfactorTemp ; temperature setpoint for compression factor Z + OPTION_ENUM8 o2ndDepthDisp, .2, .0, tMaxDepth, .229, opt_2ndDepthDisp ; =1: show average depth instead of max depth + ; +-----------------------+ + ; | add new options here! | + ; +-----------------------+ ; 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 oPPO2Min, ppo2_warning_low_lowest, ppo2_warning_low_highest, ppo2_warning_low_default, notext, .16, char_I_ppO2_min ; ppO2 min on OC and for pure diluent in CCR + 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 and for pure diluent in pSCR + 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, volatile, hours diff -r 00b24fb4324d -r ca4556fb60b9 src/options.asm --- a/src/options.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/options.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File options.asm REFACTORED VERSION V2.97 +; File options.asm REFACTORED VERSION V2.99e ; ; Manage all options data. ; @@ -9,79 +9,67 @@ ; HISTORY ; 2011-07-12 : [jDG] Creation. ; -; RATIONALS: -; -; Provides a centralized file with -#include "hwos.inc" ; Mandatory header +#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 "shared_definitions.h" 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. - - -gui CODE ; Appends to other GUI segment +options CODE ;============================================================================= -; Reset all options to factory defaults. +; Reset all options to factory defaults ; ; INPUT: none ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 - +; + global option_reset_all ; reset all options to factory default option_reset_all: clrf EEADRH read_int_eeprom .2 - tstfsz EEDATA ; Total dives=0? - bra option_reset_all2 ; No, skip resetting logbook + tstfsz EEDATA ; number of 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 + tstfsz EEDATA ; number of 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 .2 ; delete total dive counter, too write_int_eeprom .3 - call ext_flash_erase_logbook ; And complete logbook (!) + call ext_flash_erase_logbook ; complete logbook option_reset_all2: clrf lo clrf hi - call do_logoffset_common_write ; reset Logbook offset - - ; Point to option table begin - movlw LOW(option_table_begin) + call do_logoffset_common_write ; reset logbook offset + movlw LOW(option_table_begin) ; point to 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... - movlw HIGH(option_table_end) - cpfseq FSR0H - bra option_reset_all_2 ; Not yet done... - return ; All done. + movlw LOW(option_table_end) ; get low byte of end of table address + cpfseq FSR0L ; does it equal the current pointer position? + bra option_reset_all_2 ; NO - more options to process + movlw HIGH(option_table_end) ; get high byte of end of table address + cpfseq FSR0H ; does it equal the current pointer position? + bra option_reset_all_2 ; NO - more options to process + return ; YES to both - end of option table reached, 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 @@ -89,36 +77,38 @@ ; INPUT: none ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 +; + global option_check_all ; check all option and reset option if out of min/max boundary option_check_all: - ; Point to option table begin - movlw LOW(option_table_begin) + movlw LOW(option_table_begin) ; point to option table begin movwf FSR0L movlw HIGH(option_table_begin) movwf FSR0H option_check_all_1: - movlw LOW(option_table_end) - cpfseq FSR0L - 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. + movlw LOW(option_table_end) ; get low byte of end of table address + cpfseq FSR0L ; does it equal the current pointer position? + bra option_check_all_2 ; NO - more options to process + movlw HIGH(option_table_end) ; get high byte of end of table address + cpfseq FSR0H ; does it equal the current pointer position? + bra option_check_all_2 ; NO - more options to process + return ; YES to both - end of option table reached, 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 ; INPUT: FSR0 = option handle ; 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 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 ; we have the high byte movlw UPPER(option_table_begin) movwf TBLPTRU @@ -143,7 +133,7 @@ movff TABLAT,FSR1L tblrd*+ movff TABLAT,FSR1H - movff TBLPTRL,FSR0L ; Advance handle too, for reset_all + movff TBLPTRL,FSR0L ; advance handle, too, for reset_all movff TBLPTRH,FSR0H return @@ -158,75 +148,69 @@ rcall option_read ; 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 - - tstfsz opt_min ; opt_min=0? - bra option_check_both ; no - bra option_check_enum8 ; Check max only + movf opt_type,W ; get option type + xorlw 2 ; type == STRING ? + bz option_check_string ; YES + movf opt_type,W ; get option type (again) + xorlw 1 ; type == ENUM8 ? + bz option_check_enum8 ; YES - check if lower then max. value only + ; NO to all - must be integer then + tstfsz opt_min ; opt_min = 0 ? + bra option_check_both ; NO - check it + 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, ignore max. test - cpfslt INDF1 ; smaller then opt_max+1? - bra option_check_reset ; No, reset option - return ; in range, return + decf opt_min,W ; check against minimum value + cpfsgt INDF1 ; bigger then opt_min - 1 ? + bra option_check_reset ; NO - reset option +option_check_enum8: ; check against maximum value + infsnz opt_max,W ; max = 255? + return ; YES - ignore the max. test + cpfslt INDF1 ; NO - smaller then opt_max + 1 ? + bra option_check_reset ; NO - reset option + return ; YES - in range, return option_check_reset: movff opt_default,INDF1 ; reset option to default - return ; Done. + return ; done option_check_string: return ;============================================================================= -; Reset an option to its default value. +; Reset an option to its default value ; INPUT: FSR0 = option handle ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR1, FSR2 ; + global option_reset ; reset FSR0 option to factory default option_reset: ; 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 + rcall option_read ; read option data + movf opt_type,W ; get option type + xorlw 2 ; Type == STRING ? + bz opt_reset_string ; YES - special copy + movff opt_default,INDF1 ; NO - just a 8 bit indirect copy return - opt_reset_string: - 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 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 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 - - movff opt_backup_tbl+0,TBLPTRL - movff opt_backup_tbl+1,TBLPTRH - movff opt_backup_tbl+2,TBLPTRU + movff TBLPTRH,opt_backup_tbl+1 ; ... + movff TBLPTRU,opt_backup_tbl+2 ; ... + call strcat_text ; copy translated text to FSR2 + movff opt_backup_tbl+0,TBLPTRL ; restore TBLPTR + movff opt_backup_tbl+1,TBLPTRH ; ... + movff opt_backup_tbl+2,TBLPTRU ; ... return ;============================================================================= ; Save all options to EEPROM +; + global option_save_all ; save options to EEPROM option_save_all: ;---- Save option serial into EEPROM to detect reset and new version movlw LOW(eeprom_serial_save) @@ -250,53 +234,49 @@ option_save_all_1: 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 option_save: rcall option_read - incf opt_eeprom,W ; Should we save it ? + 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 + 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 + btfsc STATUS,C ; > 256 ? + addlw .1 ; YES - +1 movwf EEADRH - - 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 + movf opt_type,W ; get option type + xorlw 2 ; option type is string ? + bz option_save_string ; YES + movff INDF1,EEDATA ; one byte to be saved to EEPROM + 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 ; loop while not finished 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 - - return ;============================================================================= + global option_restore_all ; restore options from EEPROM option_restore_all: ;---- Read option serial from EEPROM movlw LOW(eeprom_serial_save) @@ -306,16 +286,16 @@ call read_eeprom movlw LOW(eeprom_opt_serial) xorwf EEDATA,W - bnz option_restore_bad ; Auto reset if changed. + 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. + 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 option_restore_ok: @@ -327,58 +307,54 @@ option_restore_all_1: 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 ? + incf opt_eeprom,W ; shall 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 + 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 + btfsc STATUS,C ; > 256 ? + addlw .1 ; YES - +1 movwf EEADRH - - 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. + movf opt_type,W ; get option type + xorlw 2 ; Option type is string? + bz option_restore_string ; YES + call read_eeprom ; read one byte from EEPROM + movff EEDATA, INDF1 ; restore option register return - option_restore_string: - call read_eeprom ; Read one byte, and - movff EEDATA,POSTINC1 ; restore it + 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 + decfsz opt_max ; decrement string length + bra option_restore_string ; loop while not finished return ;============================================================================= -; Increment an option, based on type, and boundary. +; Increment an option, based on type, and boundary ; INPUT: FSR0 = option handle ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 +; + global option_inc ; increment FSR0 option option_inc: - ; Read type, default and register from table + ; read type, default and register from table rcall option_read - ; Switch on type + ; switch on type movf opt_type,W bz option_inc_uint8 dcfsnz WREG @@ -386,51 +362,144 @@ dcfsnz WREG bra option_inc_string -option_inc_uint8: ; Defaults type too... +option_inc_uint8: ; default type too... movf INDF1,W addwf opt_inc,W cpfslt opt_max - bra option_inc_1 + bra option_inc_uint8_0 movf opt_min,W -option_inc_1: +option_inc_uint8_0: 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 - -option_inc_2: +option_inc_uint8_1: ; 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 + cpfseq opt_eeprom ; editing CalGasO2 right now? + return ; NO - done (or bra option_inc_uint8_2) + movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR + decfsz WREG,W ; - in CCR mode? + return ; NO - done + movlw .26 ; YES - + cpfseq INDF1 ; - option value = 26 ? + return ; NO - done + movlw .95 ; YES - advance it to 95 + movwf INDF1 ; - store it 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_enum8: ; Always +1 +option_inc_enum8: ; always +1 incf INDF1,W cpfsgt opt_max clrf WREG movwf INDF1 +option_inc_enum8_1: + ; Now some rather crude hack into this routine to unify CCR & pSCR mode setting + movlw .25 ; EEPROM address of option oCCRMode + cpfseq opt_eeprom ; editing oCCRMode right now? + bra option_inc_enum8_2 ; NO - check next option + btfsc analog_o2_input ; YES - does hosting OSTC have an analog interface? + bra option_inc_enum8_1a ; YES - setting 'sensor' allowed + btfsc optical_input ; does hosting OSTC have an optical interface? + bra option_inc_enum8_1a ; YES - setting 'sensor' allowed + movf INDF1,W ; NO to both - get mode (=0: fixed SP, =1: Sensor, =2: AutoSP) + xorlw .1 ; - in sensor mode? + bnz option_inc_enum8_1a ; NO - continue with next check + incf INDF1,F ; YES - advance option value to AutoSP +option_inc_enum8_1a: + movff opt_dive_mode,WREG ; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + xorlw .4 ; in pSCR mode? + bnz option_inc_enum8_1_exit ; NO - done + bcf INDF1,1 ; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP) +option_inc_enum8_1_exit: + return ; done +option_inc_enum8_2: + ; (unused) +option_inc_enum8_3: + + IFDEF _rx_functions + global option_cleanup_oTrMode_CCR ; embedded clean-up entry-point + global option_cleanup_oTrMode_no_CCR ; embedded clean-up entry-point + ; Now some rather crude hack to correct opt_TR_mode in dependency of opt_dive_mode + movlw .8 ; EEPROM address of option opt_dive_mode + cpfseq opt_eeprom ; editing opt_dive_mode right now? + bra option_inc_enum8_4 ; NO - check next option + movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + decfsz WREG,W ; dive mode = 1 CCR? + bra option_inc_enum8_3a ; NO - in any other mode +option_cleanup_oTrMode_CCR: ; entry point from cleanup during restart + movff opt_TR_mode,WREG ; YES - get TR mode + xorlw .2 ; - mode = 2 (ind.double)? + bnz option_inc_enum8_3_exit ; NO - done + bra option_inc_enum8_3_reset ; YES - revert mode to 1 (on) +option_inc_enum8_3a: ; any mode other than CCR +option_cleanup_oTrMode_no_CCR: ; entry point from cleanup during restart + movff opt_TR_mode,WREG ; get TR mode + xorlw .3 ; mode = 3 (CCR Dil+O2)? + bnz option_inc_enum8_3_exit ; NO - done +option_inc_enum8_3_reset: ; YES - revert to mode 1 (on) + movlw .1 ; load coding of mode "on" + movff WREG,opt_TR_mode ; write to option +option_inc_enum8_3_exit: + return ; done +option_inc_enum8_4: + ; Now some rather crude hack to advance opt_TR_mode in dependency of opt_dive_mode + movlw .222 ; EEPROM address of option opt_TR_mode + cpfseq opt_eeprom ; editing opt_TR_mode right now? + bra option_inc_enum8_5 ; NO - check next option + movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + decfsz WREG,W ; dive mode = 1 CCR? + bra option_inc_enum8_4a ; NO - in any other mode + movf INDF1,W ; YES - get option value (TR mode) + xorlw .2 ; - mode = 2 (ind.double)? + bnz option_inc_enum8_4_exit ; NO - done + incf INDF1,F ; YES - advance option value to 3 (CCR Dil+O2) + bra option_inc_enum8_4_exit ; - done +option_inc_enum8_4a: ; any mode other than CCR + movf INDF1,W ; get option value (TR mode) + xorlw .3 ; mode = 3 (CCR Dil+O2)? + bnz option_inc_enum8_4_exit ; NO - done + clrf INDF1 ; YES - advance option value to 0 "off" +option_inc_enum8_4_exit: + return ; done + ENDIF + +option_inc_enum8_5: return -option_inc_string: ; No editing yet... +option_inc_string: ; no editing available return + + global option_cleanup_oCCRMode + global option_cleanup_oCCRMode_pSCR + global option_cleanup_oCCRMode_CCR +option_cleanup_oCCRMode: ; in pSCR mode, revert AutoSP (2) to calculated SP (0), in pSCR and CCR revert Sensor to fixed SP if no sensor interface available + banksel opt_dive_mode ; select options bank + movf opt_dive_mode,W ; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR + xorlw .4 ; in pSCR mode? + bnz option_cleanup_oCCRMode_CCR ; NO - check if sensor is available on hosting OSTC +option_cleanup_oCCRMode_pSCR: ; jump-in from start.asm if known to be in pSCR mode + banksel opt_ccr_mode ; select options bank + bcf opt_ccr_mode,1 ; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP) +option_cleanup_oCCRMode_CCR: ; continue from above & jump-in from start.asm if known to be in CCR mode + banksel common ; flags are located in bank common + btfsc analog_o2_input ; does hosting OSTC have an analog interface? + bra option_cleanup_oCCRMode_exit ; YES - setting 'sensor' allowed + btfsc optical_input ; does hosting OSTC have an optical interface? + bra option_cleanup_oCCRMode_exit ; YES - setting 'sensor' allowed + banksel opt_ccr_mode ; NO to both - select options bank + movf opt_ccr_mode,W ; - get CCR mode + xorlw .1 ; - CCR mode = sensor? + bnz option_cleanup_oCCRMode_exit ; NO - ok + clrf opt_ccr_mode ; - YES - set CCR mode to fixed SP (0) +option_cleanup_oCCRMode_exit: + banksel common ; back to bank common + return ; done + + ;============================================================================= -; Strcat option into FSR2 buffer. +; Strcat option into FSR2 buffer +; + global option_draw ; STRCAT FRS0 option option_draw: ; Read type, default and register from table rcall option_read @@ -442,27 +511,30 @@ bra option_draw_enum8 dcfsnz WREG bra option_draw_string - return ; Unknown: return... + return ; unknown, return +option_draw_string: + movff POSTINC1,POSTINC2 + decfsz opt_max + bra option_draw_string + return + option_draw_uint8: - movff INDF1,lo ; Draw value. + 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 ? + 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_default,W ; Default value - cpfseq lo ; Current value - bra option_draw_uint8_2 ; Not default, add * - return ; Default, Done. + rcall option_draw_unit ; YES + movf opt_default,W ; get default value + cpfseq lo ; compare with current value, equal? + bra option_draw_uint8_2 ; NO - not default, add * + return ; YES - default, done option_draw_uint8_2: - PUTC "*" - return ; Done. - + PUTC "*" ; print "*" + return ; done option_draw_unit: movff opt_unit+0,FSR1L movff opt_unit+1,FSR1H @@ -471,21 +543,16 @@ ;---- Draw an enumerated value (set of translated strings) option_draw_enum8: - movf INDF1,W ; Get current value. - cpfsgt opt_max ; Bound value + movf INDF1,W ; get current value + cpfsgt opt_max ; bound value clrf WREG addwf WREG ; *= 2 - addwf opt_inc,W ; Base text + 2 * value + addwf opt_inc,W ; base text + 2 * value movwf FSR1L movlw .0 - addwfc opt_min,W ; Propagate carry - movwf FSR1H ; Into FSR1 + 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 END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/p2_deco.c --- a/src/p2_deco.c Thu Oct 11 21:06:29 2018 +0200 +++ b/src/p2_deco.c Thu Nov 22 19:47:26 2018 +0100 @@ -1,5 +1,5 @@ // *************************************************************************** -// p2_deco.c REFACTORED VERSION V2.97 SP1 +// p2_deco.c REFACTORED VERSION V2.99e // // Created on: 12.05.2009 // Author: heinrichs weikamp, contributions by Ralph Lembcke and others @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////////////////////// // OSTC - diving computer code -// Copyright (C) 2011 HeinrichsWeikamp GbR +// Copyright (C) 2018 HeinrichsWeikamp GmbH // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -74,28 +74,36 @@ // // Literature: // Buhlmann, Albert: Tauchmedizin; 4. Auflage [2002]; -// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq +// Schroeder, Kai & Reith, Steffen; 2000; Saettigungsvorgaenge beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq // Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html // Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf // Baker, Erik C.; Clearing Up The Confusion About "Deep Stops" // Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf -// + + +// ********************************************************************************************************************************* // - -// ********************* -// ** I N C L U D E S ** -// ********************* -#include - -// *********************************************** -// ** V A R I A B L E S D E F I N I T I O N S ** -// *********************************************** - +// I N C L U D E S +// +// ********************************************************************************************************************************* + +#include #include "p2_definitions.h" #define TEST_MAIN #include "shared_definitions.h" +// ********************************************************************************************************************************* +// +// C O N S T A N T S D E F I N I T I O N S +// +// ********************************************************************************************************************************* + +// conditional compiles +#define _rx_functions // if defined, compile transmitter functions (default: included *) +//#define _cave_mode // if defined, compile cave mode into firmware (default: not included *) ## OPTION IS UNDER CONSTRUCTION ## + // * option needs to be included / excluded in hwos.inc, too! + // ambient pressure at different mountain heights #define P_ambient_1000m 0.880 // [bar] based on 990 hPa and 20°C at sea level, 15°C at altitude #define P_ambient_2000m 0.782 // [bar] @@ -108,99 +116,160 @@ // 0.135 bar safety margin // constants and factors -#define ppWater 0.0627 // water vapor partial pressure in the lungs +#define ppWater 0.06270 // 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 SURFACE_DESAT_FACTOR 0.70420 // 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_ATTENTION_THRESHOLD 70 // threshold for CNS attention -#define ppO2_ATTENTION_THRESHOLD 130 // 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 -#define DECO_STATUS_MASK 0x03 -#define DECO_STATUS_START 0x00 -#define DECO_STATUS_FINISHED 0x00 -#define DECO_STATUS_STOPS 0x01 -#define DECO_STATUS_RESULTS 0x02 -#define DECO_STATUS_INIT 0x03 - -#define DECO_MODE_MASK 0x0C -#define DECO_MODE_LOOP 0x04 +#define GAS_NEEDS_ATTENTION_THRESHOLD 0.70 // threshold for gas needs attention [1.00 = 100%] +#define PRESSURE_LIMIT_WARNING 200 // threshold for pressure reading warning : 20.0 bar +#define PRESSURE_LIMIT_ATTENTION 500 // threshold for pressure reading attention: 50.0 bar +#define O2_CONSUMPTION_LIMIT_ATTENTION 20 // threshold for O2 "SAC" attention: 2.0 l/min + +// deco engine states and modes - char_O_main_status: controls current tissue and deco status calculation (as-is situation) +#define DECO_COMPLETED_NORM 0x01 // the calculation of a normal deco plan has just been completed +#define DECO_COMPLETED_ALT 0x02 // the calculation of an alternative deco plan has just been completed +//#define DECO_MODE_MASK 0x0C // mask for mode selection ==> current diving mode +//#define DECO_MODE_LOOP 0x04 // see below +//#define DECO_MODE_CCR 0x04 // see below +//#define DECO_MODE_PSCR 0x08 // see below + +#define DECO_USE_Z_FACTOR 0x10 // =1: figure in Z factor when converting gas volumes <-> pressures +#define DECO_CAVE_MODE 0x20 // =1: activate ascent gas needs calculation under cave constraints +#define DECO_BOTTOM_CALCULATE 0x40 // =1: switch to deco calculator interface +#define DECO_TR_FUNCTIONS 0x80 // =1: activate TR functions (pressure reading) processing + +// deco engine states and modes - char_O_deco_status: controls deco plan calculation (to-be scenario) +#define DECO_STATUS_MASK 0x03 // bit mask for values below +#define DECO_STATUS_START 0x00 // value commands the start of a new deco calculation cycle +#define DECO_STATUS_FINISHED 0x00 // value indicates completion of deco calculation +#define DECO_STATUS_STOPS 0x01 // value indicated calculation is ongoing, currently calculating the stops +#define DECO_STATUS_RESULTS 0x02 // value indicates calculation is ongoing, currently calculating the results +#define DECO_STATUS_INIT 0x03 // value to be set once for the first invocation at the begin of a new dive + +#define DECO_MODE_MASK 0x0C // mask for mode selection ==> diving mode during ascent +#define DECO_MODE_LOOP 0x04 // =1: CCR (DECO_MODE_PSCR needs to be cleared) or pSCR mode #define DECO_MODE_CCR 0x04 // to be used with == operator in combination with DECO_MODE_MASK only! -#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 - -// 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_BOTTOM_CALCULATE 0x40 - -// deco engine states and modes - tissue_increment +#define DECO_MODE_PSCR 0x08 // =1: pSCR mode (DECO_MODE_LOOP needs to be set, too) + +#define DECO_PLAN_ALTERNATE 0x10 // =1: calculate the 2nd (alternative) deco plan +#define DECO_BAILOUT_MODE 0x20 // =1: do a bailout calculation, i.e. allow gas switches before first deco stop +#define DECO_VOLUME_CALCULATE 0x40 // =1: calculate ascent gas needs +#define DECO_ASCENT_DELAYED 0x80 // =1: calculate a delayed ascent (fTTS) + +// deco engine warnings - char_O_deco_warnings +#define DECO_WARNING_IBCD 0x01 // IBCD occurring now +#define DECO_WARNING_IBCD_lock 0x02 // IBCD has occurred during the dive +#define DECO_WARNING_MBUBBLES 0x04 // micro bubbles likely to develop now +#define DECO_WARNING_MBUBBLES_lock 0x08 // ditto, but sometime during the dive +#define DECO_WARNING_OUTSIDE 0x10 // tissue pressures outside the Buhlmann model now +#define DECO_WARNING_OUTSIDE_lock 0x20 // tissue pressures outside the model sometime during the dive +#define DECO_ATTENTION_OUTSIDE 0x40 // tissue pressures are very close to the Buhlmann limit +#define DECO_WARNING_STOPTABLE_OVERFLOW 0x80 // internal error: no more space in the deco stops table + +// deco engine status (char_O_deco_info) +#define DECO_FLAG 0x01 // =1: deco ppO2 levels are permitted +#define IND_DOUBLE_SWITCH_FLAG 0x02 // =1: switch to other tank advice active +#define DECO_STEADY 0x04 // =1: fTTS = TTS (not updated when in bailout mode) +#define DECO_DECREASING 0x08 // =1: fTTS < TTS (not updated when in bailout mode) +#define DECO_CEILING 0x10 // =1: ceiling depth > 0 +#define GAS_NEEDS_CAVE 0x20 // =1: indicated gas needs are calculated in cave mode + +// deco engine control - tissue_increment #define TIME_MASK 0x7F // (127 decimal, bits 0-6 set) #define TISSUE_FLAG 0x80 // (128 decimal, bit 7 set) -// deco engine warnings -#define DECO_WARNING_IBCD 0x01 -#define DECO_WARNING_IBCD_lock 0x02 -#define DECO_WARNING_MBUBBLES 0x04 -#define DECO_WARNING_MBUBBLES_lock 0x08 -#define DECO_WARNING_OUTSIDE 0x10 -#define DECO_WARNING_OUTSIDE_lock 0x20 -#define DECO_WARNING_STOPTABLE_OVERFLOW 0x40 -#define DECO_FLAG 0x80 // flags used with integer numbers -#define INT_FLAG_INVALID 0x0400 -#define INT_FLAG_ZERO 0x0800 -#define INT_FLAG_LOW 0x1000 -#define INT_FLAG_HIGH 0x2000 -#define INT_FLAG_ATTENTION 0x4000 -#define INT_FLAG_WARNING 0x8000 - - - -// ************************* -// ** P R O T O T Y P E S ** -// ************************* - -static void calc_hauptroutine(void); -static void calc_hauptroutine_data_input(void); -static void calc_hauptroutine_calc_deco(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_CNS_increment(void); -static void calc_desaturation_time(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); +#define INT_FLAG_INVALID 0x0400 // =1: value not valid +#define INT_FLAG_ZERO 0x0800 // =1: value is zero +#define INT_FLAG_LOW 0x1000 // =1: value is below a lower warning threshold +#define INT_FLAG_NOT_AVAIL 0x1000 // =1: value is not available (not computed) +#define INT_FLAG_HIGH 0x2000 // =1: value is above an upper warning threshold +#define INT_FLAG_OUTDATED 0x2000 // =1: value has not been updated for too long +#define INT_FLAG_ATTENTION 0x4000 // =1: value exceeds the attention threshold +#define INT_FLAG_WARNING 0x8000 // =1: value exceeds the warning threshold +#define INT_FLAG_OUT_OF_RANGE 0x8000 // =1: value exceeds presentable range + + + +// ********************************************************************************************************************************* +// +// ** P R O T O T Y P E S ** +// +// The Functions are listed in sequence of intended usage / application. +// +// ********************************************************************************************************************************* + +// Functions used in surface mode +static void calc_interval(PARAMETER unsigned char time_increment); + // Calculates the tissue off-gassing under surface conditions. +static void calc_desaturation_time(void); // Calculates the desaturation and no-fly times. +static void clear_tissue(void); // Resets all tissues to surface pressure equilibrium state. + +// Main entry point in dive mode +static void calc_hauptroutine(void); // Sequences all calculations for the real tissues and the deco calculation. + +// Functions dedicated to the real tissues +static void calc_hauptroutine_data_input(void);// Initializes environment data and sets gas ratios for the real tissues. + +// Functions combined for real tissues & deco calculations +static void calc_alveolar_pressures(void); // Computes the partial pressures from the gas ratios and many more parameters, + // needs either calc_hauptroutine_data_input() be called beforehand or + // gas_find_current()/gas_find_better() and gas_set_ratios(). +static void calc_tissues(void); // Updates the tissues dependent on the partial pressures of N2 and He. +static void calc_CNS(void); // Updates the CNS value dependent on the partial pressure of the O2. +static void calc_limit(PARAMETER float GF_current); + // Calculates ceiling, current GF (supersaturation) and some more data. + +// Functions dedicated to deco calculations +static void clear_deco_table(void); // Clears the deco stops table, invoked at the start of each calculation cycle. +static void gas_find_current(void); // Sets the first gas used for deco calculation, invoked at start of cycle, too. +static unsigned char gas_find_better(void); // Checks for, and eventually switches to, a better gas. +static void gas_set_ratios(void); // Sets the gas ratios for use in deco calculation (simulated tissues), + // needs to be called after each gas change (gas_find_current/_better). +static void calc_NDL_time(void); // Calculates remaining NDL time. +static void find_NDL_gas_changes(void); // Finds the gas changes in an OC bailout ascent that is within NDL +static void calc_ascent_to_first_stop(void); // Calculates ascent to the first deco stop. +static void calc_hauptroutine_calc_deco(void); // Calculates the subsequent ascent until reaching surface. +static unsigned char calc_nextdecodepth(void); // Calculates the depth of the next required deco stop. static unsigned char update_deco_table(PARAMETER unsigned char time_increment); - + // Enters a new stop or extends an existing stop in the deco stops table. +static void calc_ascenttime(void); // Calculates the ascent time from current depth and deco stop times. +static void gas_volumes(void); // Calculates required gas volumes and pressures from the data in stops table. + +// Functions for results reporting +static void publish_deco_table(void); // Copies the internal deco stops table to the export interface. +static void convert_CNS_for_display(void); // Converts the current CNS value from float to integer. +static void convert_sim_CNS_for_display(void); // Converts the end-of-dive CNS value from float to integer. +static void convert_GF_for_display(void); // Converts leading tissue supersaturation value from float to integer, 1.0 = 100%. +static void convert_ceiling_for_display(void); // Converts ceiling from float to integer in mbar relative pressure. + + +// internal helper functions +static unsigned short tmr5(void); // Reads a hardware timer which is used for preemptive scheduling. +static void read_Buhlmann_coefficients(void); // Reads the a and b coefficients from a ROM table. +static void read_Buhlmann_times(PARAMETER char period); + // Reads pre-computed tissue increment factors from a ROM table. +static void read_Buhlmann_ht(void); // Reads the half-times from a ROM table. +static void adopt_Buhlmann_coefficients(void); // Computes average a and b coefficient by the N2/He tissue ratio. +static void temp_tissue_safety(void); // Applies safety margins to the tissue increments. +static void push_tissues_to_vault(void); // Stores the state of the real tissues during simulator runs. +static void pull_tissues_from_vault(void); // Restores the state of the real tissues after a simulator run. + + + +// ********************************************************************************************************************************* +// +// V A R I A B L E S D E F I N I T I O N S +// +// ********************************************************************************************************************************* //---- Bank 5 parameters ----------------------------------------------------- #ifndef UNIX @@ -209,45 +278,56 @@ // general deco parameters -static float GF_low; // initialized from deco parameters, constant during all computations -static float GF_high; // initialized from deco parameters, constant during all computations -static float GF_delta; // initialized from deco parameters, constant during all computations +static float GF_low; // initialized from deco parameters +static float GF_high; // initialized from deco parameters +static float GF_delta; // initialized from deco parameters + static float locked_GF_step_norm; // GF_delta / low_depth_norm in normal plan static float locked_GF_step_alt; // GF_delta / low_depth_alt in alternative plan -static float low_depth_norm; // Depth of deepest stop in normal plan -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 low_depth_norm; // depth of deepest stop in normal plan +static float low_depth_alt; // depth of deepest stop in alternative plan + +static float float_ascent_speed; // ascent speed from options_table (5.0 .. 10.0 m/min) 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 +static unsigned char split_N2_He[NUM_COMP]; // used for calculating the desaturation time + // 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 +static unsigned short deco_tissue_vector; // 16 bit vector to memorize all tissues that are in decompression +static unsigned short IBCD_tissue_vector; // 16 bit vector to memorize all tissues that experience IBCD + +static float pres_respiration_sac; // current depth in absolute pressure, used in SAC calculation +static float float_sac; // used in SAC calculation +static unsigned int max_sac_rate; // used in SAC calculation to determine SAC rate attention + // 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 float sim_CNS_fraction; // CNS after predicted ascent, 0.01 = 1%, as float + +static unsigned int int_sim_CNS_fraction; // CNS after predicted ascent, 1 = 1%, as integer 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 - +static unsigned char NDL_lead_tissue; // used to cache the tissue to start with when calculating the NDL + + +// result values from calculation functions + +static float ceiling; // minimum tolerated relative pressure (i.e. without surface pressure) +static float lead_supersat; // supersaturation of the leading tissue, 1.0 = 100% +static unsigned char lead_number; // number of the leading tissue // stops table -static unsigned char internal_deco_depth[NUM_STOPS]; // depth of the stop -static unsigned char internal_deco_time[NUM_STOPS]; // duration of the stop -static unsigned char internal_deco_gas[NUM_STOPS]; // gas used at the stop +static unsigned char internal_deco_depth[NUM_STOPS]; // depths of the stops +static unsigned char internal_deco_time[NUM_STOPS]; // durations of the stops +static unsigned char internal_deco_gas[NUM_STOPS]; // gases used on the stops // transfer variables between calc_desaturation_time() and calc_desaturation_time_helper() @@ -259,12 +339,15 @@ 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() +// transfer variables between gas_volumes() and gas_volumes_helper_1/_2() static float float_depth; // depth of the stop or half-way point static float float_time; // duration of the stop or ascent phase +static unsigned char char_usage; // gas usage in l/min +static unsigned char gas_num; // number of the gas/tank static float volume; // computed volume of gas -static unsigned char usage; // gas usage in l/min +static unsigned int int_volume; // required gas volume in liter +static unsigned int int_pres_need; // required gas volume in bar // auxiliary variables for data buffering @@ -272,9 +355,11 @@ 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) +static float calc_pres_tissue_N2; // auxiliary variable to buffer tissue N2 pressure +static float calc_pres_tissue_He; // auxiliary variable to buffer tissue He pressure +static float pres_tissue; // auxiliary variable to buffer total tissue pressure + +// 11 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char) //---- Bank 6 parameters ----------------------------------------------------- @@ -293,13 +378,13 @@ 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 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 unsigned char char_bottom_depth; // bottom depth in meters, used by ascent time and gas needs calculation + +static float real_pres_respiration; // current real depth in absolute pressure +static float real_O2_ratio; // real breathed gas oxygen ratio +static float real_N2_ratio; // real breathed gas nitrogen ratio +static float real_He_ratio; // real breathed gas helium ratio +static float real_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 @@ -307,19 +392,17 @@ static float sim_He_ratio; // simulated breathed gas helium ratio static float sim_pSCR_drop; // simulated ppO2 drop in pSCR loop + +// result values from calculation functions + 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 OC_ppO2; // ppO2 - calculated for breathing in OC mode +static float pSCR_ppO2; // ppO2 - calculated for breathing in pSCR mode 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 @@ -333,18 +416,17 @@ 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 float var_N2_ht; // half-time, for current N2 tissue +static float var_He_ht; // half-time, for current He tissue + + +// gas in use + +static unsigned char sim_gas_current; // number of the currently used gas +static unsigned char sim_gas_current_depth; // change depth of the currently 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 @@ -375,7 +457,7 @@ #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 @@ -388,14 +470,14 @@ #endif -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//////////////// THE LOOKUP TABLES //////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// +// ********************************************************************************************************************************* +// +// L O O K - U P T A B L E S +// +// ********************************************************************************************************************************* #ifndef UNIX -# pragma romdata Buhlmann_tables = 0x1DD00 // Needs to be in UPPER bank. +# pragma romdata Buhlmann_tables = 0x1DD00 // needs to be in the UPPER bank #endif rom const float Buhlmann_ab[4*16] = { @@ -508,23 +590,19 @@ //------------------------------------- }; -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//////////////// THE SUBROUTINES //////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// + +// ********************************************************************************************************************************* // -// all new in v.102 +// H E L P E R F U N C T I O N S +// +// ********************************************************************************************************************************* + + // moved from 0x0D000 to 0x0C000 in v.108 #ifndef UNIX # pragma code p2_deco = 0x0C000 #endif -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//////////////// U T I L I T I E S //////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Bump to blue-screen when an assert is wrong @@ -534,6 +612,7 @@ } #endif + ////////////////////////////////////////////////////////////////////////////// // When calling C code from ASM context, the data stack pointer and // frames should be reset. Bank8 is used by stack @@ -546,60 +625,61 @@ void fillDataStack(void) { _asm - LFSR 1,C_STACK - MOVLW 0xCC - loop: MOVWF POSTINC1,0 - TSTFSZ FSR1L,0 - BRA loop - - LFSR 1,C_STACK - LFSR 2,C_STACK + LFSR 1,C_STACK + MOVLW 0xCC + loop: MOVWF POSTINC1,0 + TSTFSZ FSR1L,0 + BRA loop + + LFSR 1,C_STACK + LFSR 2,C_STACK _endasm } # else # define RESET_C_STACK \ _asm \ - LFSR 1, C_STACK \ - LFSR 2, C_STACK \ + LFSR 1,C_STACK \ + LFSR 2,C_STACK \ _endasm # endif #endif + ////////////////////////////////////////////////////////////////////////////// -// Fast subroutine to read timer 5. -// Note: result is in 1/32 of milliseconds (30,51757813 us/bit to be precise) +// Fast subroutine to read timer 5 +// Note: result is in 1/32 of milliseconds (30.51757813 us/bit to be precise) static unsigned short tmr5(void) { #ifndef CROSS_COMPILE _asm movff 0xf7c,PRODL // TMR5L movff 0xf7d,PRODH // TMR5H - _endasm // result in PRODH:PRODL. + _endasm // result in PRODH:PRODL #else return 0; #endif } + ////////////////////////////////////////////////////////////////////////////// -// read Buhlmann tables A and B for compartment ci +// read Buhlmann coefficients a and b for compartment ci // static void read_Buhlmann_coefficients(void) { #ifndef CROSS_COMPILE - // Note: we don't use far rom pointer, because the - // 24 bits is too complex, hence we have to set - // the UPPER page ourself... - // --> Set zero if tables are moved to lower pages ! + // Note: We don't use far ROM pointer, because handling + // 24 bit is too complex, hence we have to set the + // UPPER page ourself... + // -> Set to zero if tables are moved to lower pages! _asm - movlw 1 - movwf TBLPTRU,0 + movlw 1 + movwf TBLPTRU,0 _endasm #endif assert( ci < NUM_COMP ); - // Use an interleaved array (AoS) to access coefficients with a - // single addressing. + // use an interleaved array (AoS) to access coefficients with a single addressing { overlay rom const float* ptr = &Buhlmann_ab[4*ci]; var_N2_a = *ptr++; @@ -609,21 +689,22 @@ } } + ////////////////////////////////////////////////////////////////////////////// -// read Buhlmann tables for compartment ci -// If period == 0 : 2sec interval -// 1 : 1 min interval -// 2 : 10 min interval. +// read Buhlmann increments for compartment ci +// If period == 0 : 2 sec interval +// 1 : 1 min interval +// 2 : 10 min interval static void read_Buhlmann_times(PARAMETER char period) { #ifndef CROSS_COMPILE - // Note: we don't use far rom pointer, because the - // 24 bits is to complex, hence we have to set - // the UPPER page ourself... - // --> Set zero if tables are moved to lower pages! + // Note: We don't use far ROM pointer, because handling + // 24 bit is to complex, hence we have to set the + // UPPER page ourself... + // -> set to zero if tables are moved to lower pages! _asm - movlw 1 - movwf TBLPTRU,0 + movlw 1 + movwf TBLPTRU,0 _endasm #endif @@ -661,20 +742,21 @@ } } + ////////////////////////////////////////////////////////////////////////////// -// read Buhlmann tables for compartment ci +// read Buhlmann half-times for compartment ci // static void read_Buhlmann_ht(void) { #ifndef CROSS_COMPILE - // Note: we don't use far rom pointer, because the - // 24 bits is to complex, hence we have to set - // the UPPER page ourself... - // --> Set zero if tables are moved to lower pages ! + // Note: We don't use far ROM pointer, because handling + // 24 bit is to complex, hence we have to set the + // UPPER page ourself... + // -> Set to zero if tables are moved to lower pages! _asm - movlw 1 - movwf TBLPTRU,0 + movlw 1 + movwf TBLPTRU,0 _endasm #endif @@ -685,15 +767,28 @@ var_He_ht = *ptr++; } - assert( 4.0 <= var_N2_ht && var_N2_ht <= 635.0 ); + assert( 4.0 <= var_N2_ht && var_N2_ht <= 635.0 ); assert( 1.5099 <= var_He_ht && var_He_ht <= 240.03 ); } + ////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//////////////// THE JUMP-IN CODE for the asm code //////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// +// compute adopted Buhlmann coefficients +// +static void adopt_Buhlmann_coefficients(void) +{ + // adopt a and b coefficients to current N2/He ratio inside 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; +} + + +// ********************************************************************************************************************************* +// +// J U M P I N F U N C T I O N S +// +// ********************************************************************************************************************************* + ////////////////////////////////////////////////////////////////////////////// // deco_calc_hauptroutine @@ -735,7 +830,7 @@ // // called from: simulator.asm // -// Updates tissues and CNS value for char_I_dive_interval minutes on Air +// 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) // @@ -754,7 +849,7 @@ // menu_tree.asm // ghostwriter.asm // -// Updates tissues and CNS value for 1 minute on Air at ambient pressure and +// 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). // @@ -766,11 +861,11 @@ ////////////////////////////////////////////////////////////////////////////// -// deco_calc_dive_interval_1min +// deco_calc_dive_interval_10min // // called from: sleepmode.asm // -// Updates tissues and CNS value for 10 minutes on Air at ambient pressure and +// 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). // @@ -824,37 +919,36 @@ pull_tissues_from_vault(); } -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//////////////// THE FUNCTIONS //////////////// -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// + +// ********************************************************************************************************************************* +// +// M A I N F U N C T I O N S +// +// ********************************************************************************************************************************* ////////////////////////////////////////////////////////////////////////////// // calc_nextdecodepth // -// new in v.102 -// // INPUT, changing during dive: -// sim_pres_respiration : current depth in absolute pressure +// sim_pres_respiration : current depth in absolute pressure // // INPUT, fixed during dive: -// pres_surface -// GF_delta -// GF_high -// GF_low -// char_I_depth_last_deco +// pres_surface +// GF_delta +// GF_high +// GF_low +// char_I_depth_last_deco // // MODIFIED -// locked_GF_step_norm/_alt : used for GF model -// low_depth_norm/_alt : used for GF model +// locked_GF_step_norm/_alt : used for GF model +// low_depth_norm/_alt : used for GF model // // OUTPUT -// sim_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 ) +// next possible depth without stop (if RETURN == false) // -// RETURN TRUE if a stop is needed. +// RETURN TRUE if a stop is needed, else false // static unsigned char calc_nextdecodepth(void) { @@ -867,9 +961,8 @@ 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 ); - + // target the simulated tissues + tissue_increment = 0; //---- check if a stop is needed for deco reasons ---------------------------- @@ -889,18 +982,18 @@ calc_limit(GF_low); // check if we can surface directly - if( sim_ceiling <= 0.0 ) + if( ceiling <= 0.0 ) { min_depth = 0.0; // set minimum depth to 0 meters = surface - goto no_deco_stop; // done. + goto no_deco_stop; // done } // convert minimum depth we can ascent to from relative pressure to depth in meters - limit_depth = sim_ceiling * BAR_TO_METER; + limit_depth = 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 @@ -925,7 +1018,7 @@ } else { - // recall locked_GF_step dependent on current plan + // recall locked_GF_step dependent of current plan locked_GF_step = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? locked_GF_step_alt : locked_GF_step_norm; } @@ -933,10 +1026,10 @@ 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 + limit_depth * 0.333333); + //---- if program execution passes here, we need a deco stop -------------------------------- + + // round to multiple of 3 meters (limit depth is in meters of depth) + first_stop = 3 * (unsigned char)(0.4999 + limit_depth * 0.333333); // check a constraint assert( first_stop < 128 ); @@ -947,9 +1040,9 @@ // 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) + while( first_stop > 0 ) { - // Next depth + // next depth overlay unsigned char next_stop; // invalidate this stop if we can ascent one more minute without going above minimum required deco depth @@ -965,7 +1058,8 @@ 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 + if( 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; @@ -994,13 +1088,13 @@ calc_limit(1.0); // check if we can surface directly - if (sim_ceiling >= 0) + if( ceiling >= 0 ) { // no - set flag for stop needed to 'yes' need_stop = 1; // convert stop depth in relative pressure to stop index - limit_depth = sim_ceiling * BAR_TO_METER / 3; + limit_depth = ceiling * BAR_TO_METER / 3.0; // convert stop index to depth in meters, rounded to multiple of 3 meters sim_depth_limit = 3 * (short)(limit_depth + 0.99); @@ -1018,22 +1112,23 @@ } } - // After the first deco stop, gas changes are only done at deco stops now! + // ---- 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 ) + if( need_stop ) if( gas_find_better() ) { // set the new calculation ratios for N2, He and O2 gas_set_ratios(); // prime the deco stop with the gas change time - update_deco_table(char_I_gas_change_time); + update_deco_table(char_I_gas_change_time); } return need_stop; } + ////////////////////////////////////////////////////////////////////////////// // publish_deco_table // @@ -1050,32 +1145,33 @@ char_O_first_deco_depth = internal_deco_depth[0]; char_O_first_deco_time = internal_deco_time [0]; - for(x=0; x 0 for OC deco gases, - // > 0 for first & normal diluents, - // = 0 else + sim_gas_current = char_I_current_gas; + sim_gas_current_depth = char_I_deco_gas_change[sim_gas_current-1]; } else { - 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 + sim_gas_current = 0; + sim_gas_current_depth = char_I_gas6_depth; } } ////////////////////////////////////////////////////////////////////////////// -// Find the deco gas with the shallowest change depth beyond current depth +// Find the deco gas with the shallowest change depth below or at the current depth // -// 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 +// INPUT sim_depth_limit : current depth in meters +// sim_gas_current : number of the currently used gas/dil +// sim_gas_current_depth : change depth of the currently used gas/dil +// char_I_deco_gas_type[] : types of the gases/dils +// char_I_deco_gas_change[] : change depths of the gases/dils // -// 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 +// MODIFIED sim_gas_current : index of the gas (1..5) - only if return value is true +// sim_gas_current_depth : switch depth - only if return value is true // // RETURNS TRUE if a better gas is available // static unsigned char gas_find_better(void) { overlay unsigned char switch_depth = 255; - overlay unsigned char switch_gas = 0; + 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; - - // Loop over all deco gases to find the shallowest one below or at current depth. - for(j=0; j char_I_deco_gas_change[j] ) continue; - - // Is the change depth of the gas deeper or equal than the change depth of the - // gas we are currently one? - // If yes, skip this gas as it is not better than the current one. - // Remark: if there is more than one gas with the same change depth, - // the last one from the list will be taken. - if( sim_gas_last_depth && (char_I_deco_gas_change[j] >= sim_gas_last_depth) ) continue; - - // Is the change depth of the gas shallower or equal to the change depth - // of the best gas found so far, or is it the first better gas found? - // If yes, we have a better gas + // Is this gas not the one we are already breathing? + if( j+1 != sim_gas_current ) + + // Is this - an (active) deco gas, + // - or if in deco phase, any gas but disabled + // - or if in bailout, any gas but disabled, + // - or if in pSCR mode, any gas but disabled? + if( ( ( char_I_deco_gas_type[j] == 3 ) ) + || ( ( char_O_deco_info & DECO_FLAG ) && ( char_I_deco_gas_type[j] != 0 ) ) + || ( ( char_O_deco_status & DECO_BAILOUT_MODE ) && ( char_I_deco_gas_type[j] != 0 ) ) + || ( ( char_O_main_status & DECO_MODE_PSCR ) && ( char_I_deco_gas_type[j] != 0 ) ) ) + + // Is the change depth of the this gas deeper than or + // at least equal to the current depth? + if( char_I_deco_gas_change[j] >= sim_depth_limit ) + + // Is the change depth of this gas shallower than the + // change depth of the gas we are currently on? + if( char_I_deco_gas_change[j] < sim_gas_current_depth ) + + // Is the change depth of this gas shallower than the change + // depth of the best gas found so far, or is it the first + // better gas found? if( char_I_deco_gas_change[j] < switch_depth ) + + // If there is a yes to all these questions, we have a better gas! { switch_gas = j+1; // remember this gas (1..5) switch_depth = char_I_deco_gas_change[j]; // remember its change depth } + } // continue looping through all gases to eventually find an even better gas // has a better gas been found? if( switch_gas ) { - // yes - sim_gas_last_used = switch_gas; // report the index of the better - 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 + // YES - set the better gas as the new gas + sim_gas_current = switch_gas; + + // set its change depth as the last used change depth + sim_gas_current_depth = switch_depth; + + assert( sim_gas_current_depth < switch_depth ); + + // signal a better gas was found + return 1; } else { - return 0; // signal no better gas was found + // NO - signal no better gas was found + return 0; } } + ////////////////////////////////////////////////////////////////////////////// -// Set calc_N2/He/O2_ratios by sim_gas_last_used +// Set calc_N2/He/O2_ratios by sim_gas_current // -// 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) +// Input: sim_gas_current : index of gas to use +// real_O2_ratio, real_He_ratio : if gas = 0 (the manually set gas) +// char_I_deco_O2/He_ratio[] : if gas = 1..5 (the configured gases) // -// Output: sim_N2_ratio, sim_He_ratio : ratios of the inert gases -// sim_pSCR_drop : ppO2 drop in pSCR loop +// Output: sim_N2_ratio, sim_He_ratio : ratios of the inert gases +// sim_pSCR_drop : ppO2 drop in pSCR loop // static void gas_set_ratios(void) { overlay float sim_IG_ratio; - assert( 0 <= sim_gas_last_used <= NUM_GAS ); + assert( 0 <= sim_gas_current <= NUM_GAS ); // get gas ratios - if( sim_gas_last_used == 0 ) + if( sim_gas_current == 0 ) { - sim_O2_ratio = O2_ratio; - sim_He_ratio = He_ratio; + sim_O2_ratio = real_O2_ratio; + sim_He_ratio = real_He_ratio; } else { - 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]; + sim_O2_ratio = 0.01 * char_I_deco_O2_ratio[sim_gas_current-1]; + sim_He_ratio = 0.01 * char_I_deco_He_ratio[sim_gas_current-1]; } // inert gas ratio (local helper variable) - sim_IG_ratio = 1.00 - sim_O2_ratio; + sim_IG_ratio = 1.00 - sim_O2_ratio; // N2 ratio - sim_N2_ratio = sim_IG_ratio - sim_He_ratio; + sim_N2_ratio = sim_IG_ratio - sim_He_ratio; // ppO2 drop in pSCR loop - sim_pSCR_drop = sim_IG_ratio * float_pSCR_factor; + sim_pSCR_drop = sim_IG_ratio * float_pSCR_factor; assert( 0.0 <= sim_N2_ratio && sim_N2_ratio <= 0.95 ); @@ -1234,30 +1339,30 @@ assert( (sim_N2_ratio + sim_He_ratio) <= 0.95 ); } + ////////////////////////////////////////////////////////////////////////////// -// Compute respired ppN2 and ppHe +// Compute respired ppO2, ppN2 and ppHe // -// 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 +// 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_/real_O2_ratio : (simulated) O2 ratio breathed +// sim_/real_N2_ratio : (simulated) N2 ratio breathed +// sim_/real_He_ratio : (simulated) He ratio breathed +// sim_/real_pres_respiration : (simulated) respiration pressure [bar] +// sim_/real_pSCR_drop : (simulated) pSCR O2 drop +// pres_surface : surface pressure [bar] +// char_I_const_ppO2 : ppO2 reported from sensors or setpoint [cbar] +// float_deco_distance : safety factor, additional depth below stop depth [bar] +// ppWater : water-vapor pressure inside respiratory tract [bar] // -// Output: ppN2 : respired N2 partial pressure -// ppHe : respired He partial pressure -// char_ppO2 : breathed ppO2 in %, to be used for CNS calculation +// Output: ppN2 : respired N2 partial pressure +// ppHe : respired He partial pressure +// char_ppO2 : breathed ppO2 in %, used in CNS calculation // void calc_alveolar_pressures(void) { - overlay float pres_diluent; + overlay float calc_pres_respiration; overlay float calc_O2_ratio; overlay float calc_N2_ratio; overlay float calc_He_ratio; @@ -1266,14 +1371,14 @@ 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.00 <= real_N2_ratio && real_N2_ratio <= 1.00 ); + assert( 0.00 <= real_He_ratio && real_He_ratio <= 1.00 ); + assert( (real_N2_ratio + real_He_ratio) <= 1.00 ); + assert( 0.800 < real_pres_respiration && real_pres_respiration < 14.0 ); + + assert( 0.00 <= sim_N2_ratio && real_N2_ratio <= 1.00 ); + assert( 0.00 <= sim_He_ratio && real_He_ratio <= 1.00 ); + assert( (sim_N2_ratio + sim_He_ratio) <= 1.00 ); assert( 0.800 < sim_pres_respiration && sim_pres_respiration < 14.0 ); @@ -1281,35 +1386,32 @@ 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; + status = char_O_main_status; + calc_pres_respiration = real_pres_respiration; + calc_pSCR_drop = real_pSCR_drop; + + calc_O2_ratio = real_O2_ratio; + calc_N2_ratio = real_N2_ratio; + calc_He_ratio = real_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; + status = char_O_deco_status; + calc_pres_respiration = 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; } //---- 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...) + O2_ppO2 = calc_pres_respiration - ppWater; + + // capture failure condition in case real_pres_respiration is < ppWater (should never happen...) if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0; // calculate ppO2 of the pure gas (OC, diluent) @@ -1326,19 +1428,19 @@ if( status & DECO_MODE_LOOP ) { overlay float const_ppO2; + overlay float max_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); - } + // Additionally, the ppO2 can be further reduced to account for exhaled inert gases + // accumulating in the loop by the user-adjustable setting char_I_cc_max_frac_o2. + // (ppWater is neglected here) + max_ppO2 = 0.01 * char_I_cc_max_frac_o2 * calc_pres_respiration; + + if( const_ppO2 > max_ppO2 ) const_ppO2 = max_ppO2; // check which kind of loop we are on if( status & DECO_MODE_PSCR ) @@ -1354,33 +1456,36 @@ { //---- CCR Mode --------------------------------------------------------------------------- - // derive breathed ppO2 from (char_I_)const_ppO2, - // which holds sensor reading or fixed setpoint + // derive breathed ppO2 from (char_I_)const_ppO2, which holds sensor reading or selected setpoint ppO2 = const_ppO2; } - // adjust diluent pressure (ppN2 + ppHe) for change - // in ppO2 due to setpoint (CCR) or drop (pSCR) - pres_diluent -= 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) ) + // adjust overall gas pressure for change in ppO2 due to setpoint (CCR) or drop (pSCR), + // capture potential failure conditions first: + if( ( calc_pres_respiration < ppO2 ) // sensor reading or selected setpoint is higher than ambient pressure + || ( calc_O2_ratio > 0.995 ) ) // diluent is pure O2, i.e. calc_N2_ratio + calc_He_ratio = 0 yielding a div/0 { - pres_diluent = 0.0; - ppO2 = OC_ppO2; + // failure condition present, set predetermined result + calc_pres_respiration = 0.0; + } + else + { + // no failure conditions present, equation can be executed + calc_pres_respiration -= ppO2; + calc_pres_respiration /= calc_N2_ratio + calc_He_ratio; } } else - { //---- OC mode --------------------------------------------------------------------------------- + { + //---- OC mode --------------------------------------------------------------------------------- // breathed ppO2 is ppO2 of pure gas ppO2 = OC_ppO2; } - // derive char_ppO2 in [cbar], used for calculating CNS% + //---- 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); @@ -1388,31 +1493,44 @@ //---- calculate ppN2 and ppHe --------------------------------------------------------------------- - if( pres_diluent > ppWater ) + // add deco safety distance when working on simulated tissues + if( !(tissue_increment & TISSUE_FLAG) ) calc_pres_respiration += float_deco_distance; + + // compute ppN2 and ppHe, capture potential failure conditions first: + if( calc_pres_respiration > ppWater ) { - ppN2 = calc_N2_ratio * (pres_diluent - ppWater); - ppHe = calc_He_ratio * (pres_diluent - ppWater); + // subtract water vapor pressure + calc_pres_respiration -= ppWater; + + // calculate partial pressures + ppN2 = calc_N2_ratio * calc_pres_respiration; + ppHe = calc_He_ratio * calc_pres_respiration; } else { + // calculated respired pressure is < water vapor pressure, thus set ppN2 and ppHe to 0 ppN2 = 0.0; ppHe = 0.0; } } + ////////////////////////////////////////////////////////////////////////////// // clear_tissue // // optimized in v.101 (var_N2_a) // -// preload tissues with standard pressure for the given ambient pressure. +// Reset all tissues to surface pressure equilibrium state. // static void clear_tissue(void) { - pres_respiration = 0.001 * int_I_pres_respiration; - N2_equilibrium = 0.7902 * (pres_respiration - ppWater); - - for(ci=0; ci 0 ) + // toggle-timer is used to skip every 2nd invocation. + twosectimer = (twosectimer) ? 0 : 1; + + // do initializations that need to be done only once at the beginning of a dive + if( (char_O_deco_status & DECO_STATUS_MASK) == DECO_STATUS_INIT ) { - // configure char_I_sim_advance_time minutes of tissue updating - tissue_increment = char_I_sim_advance_time // given number of minutes, limited to 127 - | TISSUE_FLAG; // set flag for updating the "real" tissues & CNS - - char_I_sim_advance_time = 0; // clear "mailbox" - } - else - { - // configure 2 seconds of tissue updating - tissue_increment = 0 // encoding for 2 seconds update - | TISSUE_FLAG; // set flag for updating the "real" tissues & CNS + // compute a factor that will be used later on in pSCR calculations + float_pSCR_factor = 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; } @@ -1488,35 +1600,48 @@ // acquire current environment data calc_hauptroutine_data_input(); - // calculate ppN2 and ppHe + // target the real tissues with 2 second increments by default + tissue_increment = TISSUE_FLAG | 0; + + // calculate ppO2, ppN2 and ppHe calc_alveolar_pressures(); // All deco code is invoked every second. But as the tissue and CNS updates are based - // on 2 seconds periods, each update is done only on each 2nd second. - // In case a "fast forward" of the tissues is commanded, the 2-seconds rule is over raided. - // To distribute computational load, updating of tissues and CNS is done in alternation. - if( twosectimer || (tissue_increment & TIME_MASK) ) + // on 2 seconds periods, each update is done only on each 2nd second. In case a "fast + // forward" of the tissues is commanded, the 2-seconds rule is over-raided. + if( twosectimer || char_I_sim_advance_time ) { + // Set up normal tissue updating or "fast forward" updating for simulator + // sim+5' function and deco calculator bottom time calculation. + if( char_I_sim_advance_time > 0 ) + { + // configure "fast forward" tissue updating + tissue_increment = TISSUE_FLAG | char_I_sim_advance_time; + + // clear the "mailbox" + char_I_sim_advance_time = 0; + } + // calculate the real tissues calc_tissues(); - // calculate ceiling (at GF_high) and current GF - calc_limit(GF_high); - } - - if( !twosectimer || (tissue_increment & TIME_MASK) ) - { - // calculate CNS value increment for the real tissues - calc_CNS_increment(); - - // increment CNS value of the real tissues - CNS_fraction += CNS_fraction_inc; - - // compute integer copy of CNS value for display purpose + // update the CNS value for the real tissues + calc_CNS(); + + // calculate ceiling (at GF_high or 100%) and leading tissue supersaturation + if( char_I_deco_model ) calc_limit(GF_high); // GF factors enabled + else calc_limit( 1.0 ); // classic Buhlmann + + // convert ceiling from float to integer for export [mbar relative pressure] + convert_ceiling_for_display(); + + // convert leading tissue supersaturation value from float to integer for export [%] + convert_GF_for_display(); + + // convert CNS value from float to integer for export convert_CNS_for_display(); } - //---- Calculate and Export EAD and END ------------------------------------------------------ // calculate EAD (Equivalent Air Depth): equivalent depth for the same N2 level with plain air @@ -1525,7 +1650,7 @@ // 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; + END = (real_pres_respiration - ppHe - pres_surface) * BAR_TO_METER; // export EAD if( (EAD < 0.0) || (EAD > 245.5) ) char_O_EAD = 0; @@ -1539,31 +1664,49 @@ //---- Compute ppO2 Values in [cbar] --------------------------------------------------------- // pure oxygen ppO2 - if ( O2_ppO2 < 0.01 ) int_O_O2_ppO2 = 0; + 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); - + // pure gas ppO2 - if ( OC_ppO2 < 0.01 ) int_O_pure_ppO2 = 0; + 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; + 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); // breathed ppO2 - if ( ppO2 < 0.01 ) int_O_breathed_ppO2 = 0; + 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); + //---- Set/Reset Deco Mode -------------------------------------------------------------------- + + // Set the deco mode flag if: + // - breathing an OC deco gas (gas type 3), or + // - breathing a gas or diluent that officially is disabled (type 0), or + // - if nearby or above the deepest deco stop (nearby means 1 meter below, the additional 0.9 serves rounding effects) + if ( ( char_I_current_gas_type == 3 ) + || ( char_I_current_gas_type == 0 ) + || ( (unsigned char)((real_pres_respiration - pres_surface) * BAR_TO_METER - 1.9) < char_O_first_deco_depth ) + ) + char_O_deco_info |= DECO_FLAG; + else + char_O_deco_info &= ~DECO_FLAG; + + //---- Compute ppO2 Warnings ------------------------------------------------------------------ // compute conditional min/max values - int_ppO2_min = (char_O_main_status & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min; - int_ppO2_max = (char_O_deco_warnings & DECO_FLAG ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max; + int_ppO2_min = (char_O_main_status & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min; + int_ppO2_max = (char_O_deco_info & DECO_FLAG ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max; + + // get biggest of char_I_ppO2_max / char_I_ppO2_max_deco + int_ppO2_max_max = ( char_I_ppO2_max_deco > char_I_ppO2_max ) ? char_I_ppO2_max_deco : char_I_ppO2_max; // default value for the upper diluent ppO2 warning threshold is the normal upper warning threshold int_ppO2_max_dil = int_ppO2_max; @@ -1574,7 +1717,7 @@ overlay unsigned int max_dil; // The upper diluent ppO2 threshold is ppO2_GAP_TO_SETPOINT below the setpoint... - // (the condition protects from negative numbers which would cause a wrap-around) + // (the condition protects from negative numbers which would cause a wrap-around in unsigned integers) max_dil = (char_I_const_ppO2 > ppO2_GAP_TO_SETPOINT) ? (unsigned int)(char_I_const_ppO2 - ppO2_GAP_TO_SETPOINT) : 0; // ...but never above int_ppO2_max. @@ -1585,160 +1728,374 @@ } // 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_ATTENTION_THRESHOLD ) int_O_breathed_ppO2 |= INT_FLAG_ATTENTION; + 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_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + else if ( char_O_deco_info & DECO_FLAG ) ; // no attention generated in deco mode + else if ( char_O_main_status & DECO_MODE_LOOP ) ; // no attention generated in loop modes + else if ( int_O_breathed_ppO2 >= (unsigned int)char_I_ppO2_max ) 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; - else if ( int_O_pure_ppO2 >= int_ppO2_max_dil ) int_O_pure_ppO2 |= INT_FLAG_ATTENTION; + 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; - - - // done with the real tissues - - - - //---- Toggle between Calculation for NDL (bottom time), ------------------------------------- - //---- Deco Stops, more Deco Stops and Results Gathering ------------------------------------- - - - // 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 + 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; + + +#ifdef _rx_functions + + //---- Process Pressure Readings (OSTC TR only) ----------------------------------------------- + + // only for OSTC TR model with TR functions enabled + if( char_O_main_status & DECO_TR_FUNCTIONS ) + { + // pressure warnings for reading 1, but only if enabled and pressure value available + if( (char_I_pressure_gas[0] > 0) && !(int_IO_pressure_value[0] & INT_FLAG_NOT_AVAIL) ) + { + overlay unsigned int pressure_value = int_IO_pressure_value[0] & ~INT_FLAG_OUTDATED; + + if( (char_I_pressure_gas[0] < 6 ) && !(int_O_pressure_need[0] & INT_FLAG_NOT_AVAIL) ) + { + // not a dil and need available: warning & attention by need + if( pressure_value <= int_O_pressure_need[0]) + int_IO_pressure_value[0] |= INT_FLAG_WARNING; + else if( pressure_value <= int_O_pressure_need[0] + int_O_pressure_need[0] / 2 ) + int_IO_pressure_value[0] |= INT_FLAG_ATTENTION; + } + else + { + // a dil or need not available: warning & attention by fixed thresholds + if ( pressure_value <= PRESSURE_LIMIT_WARNING ) int_IO_pressure_value[0] |= INT_FLAG_WARNING; + else if( pressure_value <= PRESSURE_LIMIT_ATTENTION ) int_IO_pressure_value[0] |= INT_FLAG_ATTENTION; + } + } + + // pressure warnings for reading 2, but only if enabled and pressure value available + if( (char_I_pressure_gas[1] > 0) && !(int_IO_pressure_value[1] & INT_FLAG_NOT_AVAIL) ) + { + overlay unsigned int pressure_value = int_IO_pressure_value[1] & ~INT_FLAG_OUTDATED; + + if( (char_I_pressure_gas[1] < 6 ) && !(int_O_pressure_need[1] & INT_FLAG_NOT_AVAIL) ) + { + // not a dil and need available: warning & attention by need + if( pressure_value <= int_O_pressure_need[1]) + int_IO_pressure_value[1] |= INT_FLAG_WARNING; + else if( pressure_value <= int_O_pressure_need[1] + int_O_pressure_need[1] / 2 ) + int_IO_pressure_value[1] |= INT_FLAG_ATTENTION; + } + else + { + // a dil or need not available: warning & attention by fixed thresholds + if( pressure_value <= PRESSURE_LIMIT_WARNING ) int_IO_pressure_value[1] |= INT_FLAG_WARNING; + else if( pressure_value <= PRESSURE_LIMIT_ATTENTION ) int_IO_pressure_value[1] |= INT_FLAG_ATTENTION; + } + } + + //--- SAC Calculation --------------------------------------------------------------------- + // + // char_I_SAC_mode =0: disabled + // =1: SAC from 1st reading + // =2: SAC from 2nd reading + // =3: SAC from higher one of both pressure drops (independent double mode) + // =4: SAC (O2 usage) from 2nd reading without real_pres_respiration term + + // set SAC rate to not available by default + int_O_sac_rate = 0 + INT_FLAG_NOT_AVAIL; + + // get a copy of the current absolute pressure + pres_respiration_sac = real_pres_respiration; + + // set threshold for SAC rate attention + max_sac_rate = (char_O_deco_info & DECO_FLAG) ? char_I_deco_usage : char_I_bottom_usage; + + // char_I_deco_usage / char_I_bottom_usage are in l/min, max_sac_rate is in 0.1 l/min + max_sac_rate *= 10; + + + // pre-process SAC mode 3 (independent double) + if( char_I_SAC_mode == 3 ) + { + overlay unsigned char reading1_gas; + overlay unsigned char reading2_gas; + overlay unsigned char reading1_tanksize; + overlay unsigned char reading2_tanksize; + overlay unsigned short reading1_press; + overlay unsigned short reading2_press; + overlay unsigned short reading1_drop; + overlay unsigned short reading2_drop; + + // get gas numbers (1-10) of both readings + reading1_gas = char_I_pressure_gas[0]; + reading2_gas = char_I_pressure_gas[1]; + + // default to no SAC calculation + char_I_SAC_mode = 0; + + // clear switch advice by default + char_O_deco_info &= ~IND_DOUBLE_SWITCH_FLAG; + + // check if both readings are configured and available + if( reading1_gas ) + if( reading2_gas ) + if( !(int_IO_pressure_value[0] & INT_FLAG_NOT_AVAIL) ) + if( !(int_IO_pressure_value[1] & INT_FLAG_NOT_AVAIL) ) + if( !(int_I_pressure_drop[0] & INT_FLAG_NOT_AVAIL) ) + if( !(int_I_pressure_drop[1] & INT_FLAG_NOT_AVAIL) ) + { + // get tank pressures, stripping flags + reading1_press = int_IO_pressure_value[0] & 0x0FFF; // in 0.1 bar + reading2_press = int_IO_pressure_value[1] & 0x0FFF; // in 0.1 bar + + // get pressure drops as integers, stripping flags and shifting right + // to avoid an overflow when multiplying with the tank size later on + reading1_drop = (int_I_pressure_drop[0] & 0x0FFF) >> 2; + reading2_drop = (int_I_pressure_drop[1] & 0x0FFF) >> 2; + + // get tank sizes + reading1_tanksize = char_I_tank_size[reading1_gas-1]; + reading2_tanksize = char_I_tank_size[reading2_gas-1]; + + // set mode to calculate SAC on the reading with the higher absolute drop + char_I_SAC_mode = (reading1_drop * reading1_tanksize > reading2_drop * reading2_tanksize) ? 1 : 2; + + // compute switch advice if pressure (in 0.1 bar) of tank breathed from is + // more than char_I_max_pres_diff (in bar) below pressure of the other tank. + if( char_I_SAC_mode == 1 ) + { + // breathing from reading 1, switch advice if pressure on reading 1 lower than on 2 + if( (reading1_press + 10*char_I_max_pres_diff) <= reading2_press ) + char_O_deco_info |= IND_DOUBLE_SWITCH_FLAG; + } + else + { + // breathing from reading 2, switch advice if pressure on reading 2 lower than on 1 + if( (reading2_press + 10*char_I_max_pres_diff) <= reading1_press ) + char_O_deco_info |= IND_DOUBLE_SWITCH_FLAG; + } + } + } + + + // pre-process SAC mode 4 (O2 usage by reading 2) + if( char_I_SAC_mode == 4 ) + { + // O2 usage on CCR is independent from absolute pressure + pres_respiration_sac = 1.0; + + // O2 pressure drop is measured via reading 2 + char_I_SAC_mode = 2; + + // reconfigure max SAC rate to O2 consumption attention threshold + max_sac_rate = O2_CONSUMPTION_LIMIT_ATTENTION; + } + + + // calculate SAC - modes 1 & 2 + if( (char_I_SAC_mode == 1) || (char_I_SAC_mode == 2) ) + { + overlay unsigned char reading_index; + overlay unsigned char reading_gas; + overlay unsigned char reading_tanksize; + overlay float reading_drop; + + // set index: char_I_SAC_mode = 1 -> reading one, index 0 + // = 2 -> two, 1 + reading_index = char_I_SAC_mode - 1; + + // get gas number (1-10) + reading_gas = char_I_pressure_gas[reading_index]; + + // check if reading is configured and available + if( reading_gas ) + if( !(int_I_pressure_drop[reading_index] & INT_FLAG_NOT_AVAIL) ) + { + // get tank size (in liter) + reading_tanksize = char_I_tank_size[reading_gas-1]; + + // get pressure drop as float, stripping flags (in 1/5120 bar/sec) + reading_drop = (float)(int_I_pressure_drop[reading_index] & 0x0FFF); + + // check if pressure drop is within range + if( !(int_I_pressure_drop[reading_index] & INT_FLAG_OUT_OF_RANGE) ) + { + // calculate SAC, 10 is factor to have result in 0.1 liter/min + // 60 is factor for 60 seconds per 1 minute, + // 5120 accounts for reading_drop being in 1/5120 bar/sec + // 10*60/5120 = 60/512 = 15/128 + float_sac = reading_drop * 15/128 * reading_tanksize / pres_respiration_sac; + + // limit result to 999 (99.9 liter/min) + if ( float_sac >= 998.5 ) + { + int_O_sac_rate = 999 + INT_FLAG_ATTENTION; + } + else + { + // convert float to integer + int_O_sac_rate = (unsigned short)(float_sac + 0.5); + + // set attention flag if exceeding SAC threshold, but only if pressure drop is not outdated + if( !(int_I_pressure_drop[reading_index] & INT_FLAG_OUTDATED) ) + if( int_O_sac_rate >= max_sac_rate ) + { + int_O_sac_rate |= INT_FLAG_ATTENTION; + } + } + } + else + { + // pressure drop is out of range, so SAC will be set out of range, too + int_O_sac_rate = 999 + INT_FLAG_ATTENTION; + } + + // copy outdated flag from int_I_pressure_drop to int_O_sac_rate + if( int_I_pressure_drop[reading_index] & INT_FLAG_OUTDATED ) + { + int_O_sac_rate |= INT_FLAG_OUTDATED; + } + } + } + } // TR functions + +#endif + + + //---- End of Computations for the real Tissues ----------------------------------------------- + // + //============================================================================================= + // + //---- Begin of Computations for Ascent and Decompression ------------------------------------- + + // branch to the code for the current phase the deco calculations are in, i.e. + // toggle between calculating NDL (remaining bottom time), deco stops, and results switch( char_O_deco_status & DECO_STATUS_MASK ) { overlay unsigned char i; + default: + case DECO_STATUS_INIT: //---- At surface: Start a new dive --------------------- - // clear the internal stops table from remains lasting from the last dive + // clear the internal stops table from remains lasting from the previous dive or deco calculator run clear_deco_table(); // publish the cleared stops table to the display functions publish_deco_table(); // clear the gas needs table - for(i=0; i 20 ) char_I_deco_distance = 20; // max. 20 dm (= 2 m) + if( char_I_desaturation_multiplier < 50 ) char_I_desaturation_multiplier = 50; // min. 50 % // initialize values that are constant during the course of the dive - 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; + float_ascent_speed = 1.00 * char_I_ascent_speed; // in meter/minute + float_deco_distance = 0.01 * char_I_deco_distance; // in bar + float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier; // as factor, 1.0 = 100% + float_saturation_multiplier = 0.01 * char_I_saturation_multiplier; // as factor, 1.0 = 100% // initialize values that will be recalculated later on periodically - char_O_nullzeit = 0; // reset NDL time for the normal plan - char_O_alternate_nullzeit = 0; // reset NDL time for the alternative plan - int_O_ascenttime = 0; // reset ascent time for the normal plan - int_O_alternate_ascenttime = 0; // reset ascent time for the alternative plan - char_O_deco_warnings = 0; // reset all deco warnings - deco_tissue_vector = 0; // reset tissue deco vector - IBCD_tissue_vector = 0; // reset tissue IBCD vector - NDL_lead_tissue = 0; // reset first tissue to look at during NDL calculation + char_O_nullzeit = 0; // reset NDL time for the normal plan + char_O_alternate_nullzeit = 0; // reset NDL time for the alternative plan + int_O_ascenttime = 0; // reset ascent time for the normal plan + int_O_alternate_ascenttime = 0; // reset ascent time for the alternative plan + char_O_deco_warnings = 0; // reset all deco warnings + char_O_deco_info = 0; // reset all deco infos + deco_tissue_vector = 0; // reset tissue deco vector + IBCD_tissue_vector = 0; // reset tissue IBCD vector + NDL_lead_tissue = 0; // reset first tissue to look at during NDL calculation // tag desaturation time as invalid (it will not be computed during a dive) int_O_desaturation_time = 65535; + // initialize values for first stop depth and GF slope + low_depth_norm = 0.0; // reset depth of first stop in normal plan + locked_GF_step_norm = 0.0; // reset GF slope in normal plan + low_depth_alt = 0.0; // reset depth of first stop in alternative plan + locked_GF_step_alt = 0.0; // reset GF slope in alternative plan + // initialize CNS values - int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = int_O_CNS_fraction; - - // Values that should be reset just once for the full real dive. - // This is used to record the lowest stop for the whole dive, - // including ACCROSS all simulated ascents. - low_depth_norm = low_depth_alt = 0.0; - locked_GF_step_norm = locked_GF_step_alt = 0.0; + int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = int_O_CNS_fraction; // // --> code execution continues in state DECO_STATUS_START // - case DECO_STATUS_START: //---- Bottom Time & initial Ascent -------------------- - default: + case DECO_STATUS_START: //---- Start a new deco calculation cycle -------------- // clear the internal(!) stops table clear_deco_table(); - + // initialize the simulated tissues with the current state of the real tissues - for(i=0; i 0 but the + // deco calculation reveals no distinct deco stop yet because + // the deco obligation will vanish during the ascent, create an + // artificial stop to signal that expedite surfacing ("popping + // up") is not allowed anymore. + if( char_O_first_deco_depth == 0 ) // simulation reveals no stop required + if( int_O_ceiling > 0 ) // real status reveals a ceiling + { + // set a pro forma stop at 3 meters + char_O_first_deco_depth = 3; + + // set a stop time of 0 minute, this will be displayed as "..'" + char_O_first_deco_time = 0; + } + } + + // The current depth is needed by calc_ascenttime() and gas_volumes(). As we + // don't want it to be calculated multiple times, it's done here on stockpile. + char_bottom_depth = (unsigned char)((real_pres_respiration - pres_surface) * BAR_TO_METER + 0.5); // 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 ) { //---- alternate dive plan --------------------------------- - // As we are in no stop, CNS at end of dive is more or less - // the same CNS as we have right now. It's so simple that we - // don't check if it requested to be computed or not... - int_O_alternate_CNS_fraction = int_O_CNS_fraction; - // output NDL time char_O_alternate_nullzeit = NDL_time; // clear ascent time int_O_alternate_ascenttime = 0; + + // As we are in no stop, CNS at end of dive is more or less + // the same CNS as we have right now. + int_O_alternate_CNS_fraction = int_O_CNS_fraction; } else { //---- normal dive plan ------------------------------------ - // As we are in no stop, CNS at end of dive is more or less - // the same CNS as we have right now. It's so simple that we - // don't check if it requested to be computed or not... - int_O_normal_CNS_fraction = int_O_CNS_fraction; - // output NDL time char_O_nullzeit = NDL_time; // clear ascent time int_O_ascenttime = 0; + + // As we are in no stop, CNS at end of dive is more or less + // the same CNS as we have right now. + int_O_normal_CNS_fraction = int_O_CNS_fraction; } } // NDL else { //---- in DECO ------------------------------------------------- + // calculate the ascent time + calc_ascenttime(); + // check which plan we are on if( char_O_deco_status & DECO_PLAN_ALTERNATE ) { //---- alternative plan ---------------------------------------------------- - // clear NDL time - char_O_alternate_nullzeit = 0; - - // output ascent time + // clear the NDL time + char_O_alternate_nullzeit = 0; + + // export the ascent time int_O_alternate_ascenttime = ascent_time; - // shall the CNS at the end of the dive be calculated? - if( char_O_deco_status & DECO_CNS_CALCULATE ) - { - // 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; - } + // convert the CNS value to integer for export + convert_sim_CNS_for_display(); + + // export the integer CNS value + int_O_alternate_CNS_fraction = int_sim_CNS_fraction; } // alternative plan else { //---- normal plan --------------------------------------------------------- - // clear NDL time + // clear the NDL time char_O_nullzeit = 0; - // output ascent time + // export the ascent time int_O_ascenttime = ascent_time; - // shall the CNS at the end of the dive be calculated? - if( char_O_deco_status & DECO_CNS_CALCULATE ) - { - // 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; - } + // convert the CNS value to integer for export + convert_sim_CNS_for_display(); + + // export the integer CNS value + int_O_normal_CNS_fraction = int_sim_CNS_fraction; } // 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 + } // NDL / DECO + + + // Check if deco obligation is steady or decreasing. This works only when an alternative plan is enabled and + // if it is not a bailout plan, thus DECO_BAILOUT_MODE must not be set while doing the DECO_PLAN_ALTERNATE. + if( (char_O_deco_status & DECO_PLAN_ALTERNATE) && !(char_O_deco_status & DECO_BAILOUT_MODE) ) + { + // Set DECO_DECREASING flag when fTTS < TTS and DECO_STEADY flag when fTTS = TTS. + if ( int_O_alternate_ascenttime < int_O_ascenttime ) char_O_deco_info |= DECO_DECREASING; + else if ( int_O_alternate_ascenttime == int_O_ascenttime ) char_O_deco_info |= DECO_STEADY; + } + + // Clear DECO_DECREASING flag when fTTS >= TTS and DECO_STEADY flag when fTTS > TTS. + // This works in any planning mode combination. + if ( int_O_alternate_ascenttime > int_O_ascenttime ) char_O_deco_info &= ~(DECO_DECREASING + DECO_STEADY); + else if ( int_O_alternate_ascenttime == int_O_ascenttime ) char_O_deco_info &= ~(DECO_DECREASING ); + + // If requested, calculate the required gas volumes and tank pressures at the end of the dive. + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) + { + // When in bailout mode and within NDL, find the gas changes along the ascent and put + // them into the stops table for use by gas_volumes(). The stops table can be "polluted" + // by now because the table has already been published in "clean" state before. + if( (NDL_time) && ( char_O_deco_status & DECO_BAILOUT_MODE ) ) + { + // find the gas changes and put them into the stops table + find_NDL_gas_changes(); + } + + // calculate the required gas volumes and tank pressures + gas_volumes(); + } + + // set the computation cycle to finished char_O_deco_status &= ~DECO_STATUS_MASK; + // set flag indicating that deco calculation has been completed + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) char_O_main_status |= DECO_COMPLETED_ALT; + else char_O_main_status |= DECO_COMPLETED_NORM; + + break; } // switch @@ -1898,9 +2276,18 @@ { overlay float IG_ratio; + // safety limits to prevent eventual infinite looping (bricking the OSTC) + if( int_I_pres_surface < 500) int_I_pres_surface = 500; // min. surface pressure = 500 mbar + if( int_I_pres_respiration < 500) int_I_pres_respiration = 500; // min. respiration pressure = 500 mbar + + // safe-guard further parameters to protect the tissue-flag + if( char_I_sim_advance_time > 127 ) char_I_sim_advance_time = 127; + if( char_I_extra_time > 127 ) char_I_extra_time = 127; + if( char_I_gas_change_time > 99 ) char_I_gas_change_time = 99; + // get the current pressures - pres_surface = 0.001 * int_I_pres_surface; - pres_respiration = 0.001 * int_I_pres_respiration; + pres_surface = 0.001 * int_I_pres_surface; + real_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); @@ -1911,60 +2298,57 @@ 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; + real_O2_ratio = 0.01 * char_I_O2_ratio; + real_He_ratio = 0.01 * char_I_He_ratio; // inert gas ratio (local helper variable) - IG_ratio = 1.00 - O2_ratio; + IG_ratio = 1.00 - real_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; + real_N2_ratio = IG_ratio - real_He_ratio; + + // compute values for ppO2 drop in pSCR loop + real_pSCR_drop = IG_ratio * float_pSCR_factor; } ////////////////////////////////////////////////////////////////////////////// -// Compute stops. +// Compute stops // -// Note: because this can be very long, break on 16 iterations, and set state -// to DECO_STATUS_FINISHED when finished, or to DECO_STATUS_STOPS when -// needing to continue. -// Note: because each iteration might be very long too (~ 66 ms in 1.84beta), -// break the loop when elapsed time exceeds 512 milliseconds. +// Note: because this can be very long, break on 16 iterations, or after +// 512 ms, whichever comes first. Set state to DECO_STATUS_RESULTS +// when finished, or keep DECO_STATUS_STOPS when needing to continue. // void calc_hauptroutine_calc_deco(void) { overlay unsigned char loop; - - for(loop = 0; loop < 16; ++loop) + for( loop = 0; loop < 16; ++loop ) { - // limit loops to 512ms, using timer 5 + // limit execution time to 512 ms using timer 5 if( tmr5() & (512*32) ) break; // calc_nextdecodepth() // // 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 + // OUTPUT sim_depth_limit : depth of next stop in meters (if RETURN = true) + // next depth without need of a stop (if RETURN = false) + // RETURN true if a stop is needed, else false // // The function manages gas changes by itself, including priming // the deco stop with the configured gas change time. // if( calc_nextdecodepth() ) { - 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 sim_depth_limit ------------------------------------- + // this check should not be needed as in this case the RETURN value will be false + if( sim_depth_limit == 0 ) goto Surface; + + //---- stop required at sim_depth_limit ---------------------- // convert stop depth in meters to absolute pressure sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface; - // add one minute to the current stop, or add a new stop, + // Add one minute to the current stop, or add a new stop, // or abort deco calculation if the deco table is full. if( !update_deco_table(1) ) goto Surface; } @@ -1987,128 +2371,177 @@ } } - - //---- as one minute as passed now, update the tissues ---------------------- - - // program 1 minute interval on simulated tissues (Flagbit 7 = 0) + //---- as one minute as passed now, update the tissues ----------- + + // program 1 minute interval on simulated tissues tissue_increment = 1; - // compute current ppN2 and ppHe + // compute current ppO2, ppN2 and ppHe calc_alveolar_pressures(); // update the tissues calc_tissues(); + + // update the CNS value + calc_CNS(); } } ////////////////////////////////////////////////////////////////////////////// -// Calculate ascent to first deco stop. +// Find gas changes on an NDL ascent +// +// This function is a variant of calc_ascent_to_first_stop() to be used solely +// for finding the gas changes in an OC bailout ascent that is within NDL. +// +// Input : char_bottom_depth : depth at which the ascent starts, in meters +// +// Output : gas change stops put into stops table +// +// Destroyed: sim_depth_limit +// sim_gas_current +// sim_gas_current_depth // +void find_NDL_gas_changes(void) +{ + overlay unsigned char old_depth_limit; + + // set gas to start with + gas_find_current(); + + // loop in ascending until reaching a depth of 3 meters, no gas switches considered thereafter + for( sim_depth_limit = char_bottom_depth; sim_depth_limit >= 3; ) + { + // memorize the depth we came from + old_depth_limit = sim_depth_limit; + + // ascent - initially in steps of 10 m, then slowing down to 1 m steps to not miss a O2 gas + if( sim_depth_limit > 10 ) sim_depth_limit -= 10; + else sim_depth_limit -= 1; + + // check if there is a better gas to switch to + if( gas_find_better() ) + { + // adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from + sim_depth_limit = (sim_gas_current_depth < old_depth_limit) ? sim_gas_current_depth : old_depth_limit; + + // create a stop for the gas change in the stops table + update_deco_table(char_I_gas_change_time); + } + } // for() +} + + +////////////////////////////////////////////////////////////////////////////// +// Calculate ascent to first deco stop // -// Modified: sim_pres_respiration : 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 +// +// Output : sim_depth_limit : depth in meters of the 1st stop, if a stop is found +// +// Destroyed: tissue_increment : tissue and update period selector // 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 ---------- + overlay float old_pres_respiration; + overlay unsigned char fast = 1; // 0: 2 seconds step, 1: 1 minute step + + // target the simulated tissues + tissue_increment = 0; + + // loop until first deco stop or the surface is reached for(;;) { - // depth in absolute pressure we came from - overlay float old_deco = sim_pres_respiration; + // memorize depth in absolute pressure we came from + old_pres_respiration = sim_pres_respiration; // try ascending 1 full minute (fast) or 2 seconds (!fast) - 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) + if( fast ) sim_pres_respiration -= float_ascent_speed * METER_TO_BAR; // 1 min at float_ascent_speed ( 5 .. 10 m) + else sim_pres_respiration -= 0.0333 * float_ascent_speed * METER_TO_BAR; // 2 sec at float_ascent_speed (17 .. 33 cm) // but don't go over surface 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( sim_pres_respiration < (sim_ceiling + pres_surface) ) + // compute ceiling of the simulated tissues + if( char_I_deco_model != 0 ) calc_limit(GF_low); + else calc_limit(1.0); + + // did we overshoot the ceiling? + if( sim_pres_respiration < (ceiling + pres_surface) ) { - // YES - back to last depth below first stop - sim_pres_respiration = old_deco; + // YES - back to memorized depth + sim_pres_respiration = old_pres_respiration; // switch to 2 seconds ascent if not yet in, else done if( fast ) { - fast = 0; // retry with 2 seconds ascent steps + fast = 0; // ascent with 2 seconds ascent steps continue; } else { - break; // done... + break; // done, stop required } } - // If code execution passes along here, we did not overshoot the first stop. - - // did we reach the surface? if yes, done! + // if code execution passes along here, we did not overshoot the ceiling + + // did we reach the surface? If yes, deco has vanished, no stop required, done. if( sim_pres_respiration == pres_surface ) break; // depth in meters where we are now (no round-up) 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) ) + // program interval on simulated tissues: + // fast = 1 -> 1 minute, + // fast = 0 -> 2 seconds + tissue_increment = fast; + + // Check if there is a better gas to switch to, but only if bailout mode is enabled. + // If yes, introduce a stop for the gas change. + if( char_O_deco_status & DECO_BAILOUT_MODE ) if( gas_find_better() ) { - // depth in meters we came from - overlay unsigned char old_depth_limit = (unsigned char)((old_deco - pres_surface) * BAR_TO_METER); - - // 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); + overlay unsigned char old_depth_limit; // set the new calculation values for N2, He and O2 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... + // add gas change time: a gas change time of + // 0 minutes will keep the 1 minute / 2 seconds interval selection, + // >= 1 minute will add the the 1 minute interval but overrule a 2 seconds interval. + tissue_increment += char_I_gas_change_time; + + // depth in meters we came from + old_depth_limit = (unsigned char)((old_pres_respiration - pres_surface) * BAR_TO_METER); + + // adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from + sim_depth_limit = (sim_gas_current_depth < old_depth_limit) ? sim_gas_current_depth : old_depth_limit; + + // Adjust the depth for the tissue update to the current depth. In case of fast mode, + // this imposes that the ascent from the 'old_pres_respiration' depth to this depth + // took one minute although we might have only ascended one or two meters... sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface; + + // create a stop for the gas change in the stops table + update_deco_table(char_I_gas_change_time); } - // 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 - // calc_alveolar_pressures() and calc_tissues() - see code commented out below. - if( fast || gaschange ) + // omit the 2 seconds interval updates (do only updates for >= 1 minute) + // It's a trade-off between computational effort and accuracy... + if( tissue_increment ) { - // program interval on simulated tissues (flag bit 7 = 0) - tissue_increment = fast + gaschange; - - // clear gas change signal - gaschange = 0; - // } - // else - // { - // // program 2 seconds interval on simulated tissues (flag bit 7 = 0) - // tissue_increment = 0; - // } - // { - // compute ppN2/ppHe for current depth from sim_pres_respiration + // compute ppO2, ppN2 and ppHe for current depth from sim_pres_respiration calc_alveolar_pressures(); - + // update the tissues calc_tissues(); + + // update the CNS value + calc_CNS(); } - } + + } // for() } @@ -2139,7 +2572,7 @@ 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) @@ -2230,8 +2663,8 @@ { 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)) ) + 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)) ) { IBCD_tissue_vector |= (1 << ci); // tag tissue as experiencing mentionable IBCD } @@ -2240,7 +2673,7 @@ // keep the saturating / desaturating flags from last invocation char_O_tissue_N2_saturation[ci] &= 128; - char_O_tissue_He_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 @@ -2252,7 +2685,7 @@ // 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 + // The surface steady-state tissue loading of [0.7902 * (real_pres_respiration - ppWater)] bar // gives then a 10. If N2 is completely washed out of the tissue, result will be 0. // This scaling is adapted to the capabilities of the tissue graphics in the custom views. temp_tissue = (pres_tissue_N2[ci] / N2_equilibrium) * 10; @@ -2271,19 +2704,13 @@ temp_tissue = pres_tissue_He[ci] * 7.7; // limit to 127 to leave space for sat/desat flag - if (temp_tissue > 127) temp_tissue = 127; + if (temp_tissue > 127) temp_tissue = 127; // export as integer char_O_tissue_He_saturation[ci] += (unsigned char)temp_tissue; } //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; } ////////////////////////////////////////////////////////////////////////////// @@ -2295,36 +2722,33 @@ // pres_tissue_N2/_He : tissue pressures (used in real tissues context) // // 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) +// lead_supersat : supersaturation of the leading tissue, 1.0 = 100% +// ceiling : ceiling in bar relative pressure // // Modified: // char_O_deco_warnings : for IBCD, microbubbles and outside warning (only in real tissues context) // static void calc_limit(PARAMETER float GF_parameter) { - overlay float lead_tissue_limit = 0.0; - overlay float lead_supersat = 0.0; - - overlay unsigned char lead_tissue_no = 0; - + overlay float lead_tissue_limit = 0.0; + + + // set leading tissue number to not yet computed + lead_number = 0; + + // initialize leading tissue supersaturation value to null + lead_supersat = 0.0; // check context if( tissue_increment & TISSUE_FLAG ) { // 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); + char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE + DECO_ATTENTION_OUTSIDE ); } - // loop over all tissues - for(ci=0; ci 0.0 ) @@ -2369,42 +2792,22 @@ // 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 ) - { - 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); - } - } - } + // limit value for micro bubbles and outside warnings + limit_warning = 0.02 * ci + 0.9; + + // micro bubbles warning: supersaturation >= limit_warning OR >= 1.0 + if( (supersat >= limit_warning) || (supersat >= 1.0) ) + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + // outside warning: supersaturation >= limit_warning AND >= 1.0 + if( (supersat >= limit_warning) && (supersat >= 1.0) ) + 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, so that can change who is the - // leading gas... + // Note: the correction factor depends both on GF and b, so that can change which is the + // leading tissue... (this equation [1] is the inverse of equation [2]) if( char_I_deco_model != 0 ) pres_min = ( pres_tissue - (var_N2_a * GF_parameter) ) / ( 1.0 - GF_parameter + (GF_parameter / var_N2_b ) ); @@ -2412,71 +2815,36 @@ if( pres_min > lead_tissue_limit ) { lead_tissue_limit = pres_min; - lead_tissue_no = ci; + lead_number = ci; } } // for - // compile outputs + // compute ceiling for the real tissues in bar relative pressure + ceiling = lead_tissue_limit - pres_surface; + + + // next in real tissue context only if( tissue_increment & TISSUE_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) ) + // check if the leading tissue is in IBCD condition + if( (IBCD_tissue_vector & (1 << lead_number)) + && ((pres_tissue_N2[lead_number] + pres_tissue_He[lead_number]) > real_pres_respiration) ) { - // leading tissue is in IBCD condition and in super-saturation, so issue a warning. + // 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 - { - //--- simulated tissues ------------------------------------------------ - - // compute ceiling for the simulated tissues in bar relative pressure - sim_ceiling = lead_tissue_limit - pres_surface; } } ////////////////////////////////////////////////////////////////////////////// // calc_NDL_time // -// calculates the remaining bottom time +// calculation of the remaining bottom time (NDL: no decompression limit) // -// NOTE: Erik Baker's closed formula works for Nitroxes. Trimix adds a second +// NOTE: Erik Baker's closed formula works for Nitrox. Trimix adds a second // 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. +// invert. So we have to solve the problem with an iterative approach. // // Input: ppN2 // ppHe @@ -2492,28 +2860,27 @@ // initialize NDL_time to 240 minutes NDL_time = 240; - for(i=0; i= 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 the loading factors for 10 minute iterations read_Buhlmann_times(2); - + // 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]; @@ -2521,72 +2888,73 @@ // 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 + // Simulate an increasing bottom time and check when we hit the NDL. + // It is not needed to simulate for longer than the already found NDL. + for( NDL_tissue = 0; NDL_tissue < NDL_time; ) { - overlay float var_a; - overlay float var_b; overlay float pres_limit; overlay float delta_pres_tissue_N2; overlay float delta_pres_tissue_He; + // read Buhlmann a and b coefficients for tissue ci, they need to be re-read on each + // iteration because adopt_Buhlmann_coefficients() twiddles with the N2 coefficients + read_Buhlmann_coefficients(); + // 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 + adopt_Buhlmann_coefficients(); + + // compute the maximum tissue pressure allowed to be exposed to an ambient pressure equaling + // the surface pressure (this equation [2] is the inverse of equation [1]) + pres_limit = (1.0 - GF_factor + GF_factor / var_N2_b) * pres_surface + GF_factor * var_N2_a; + + // check if this tissue is already beyond the NDL if( pres_tissue > pres_limit) { - // NO - finish the outer loop, + // beyond NDL - finish the outer loop, ... i = NUM_COMP; - // and finish the inner loop + // ... and finish the inner loop break; } - // compute delta to tissue pressures in 10 or 1 minutes of time ahead + // compute tissue pressure deltas for 10 or 1 minute 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 + // NDL can be computed while ascending, so we have to check if the tissues is 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 ! + // simulate off-gassing while going to surface - well, maybe some day we'll do that... // 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 ) + // calculate tissue pressure for given time ahead + next_pres_tissue = pres_tissue + delta_pres_tissue_N2 + delta_pres_tissue_He; + + // within NDL now, but still within NDL in 10 or 1 minute from now? + if( next_pres_tissue <= pres_limit ) { - // YES - apply the pressure deltas to tissues + // YES - apply the pressure deltas to the tissues calc_pres_tissue_N2 += delta_pres_tissue_N2; calc_pres_tissue_He += delta_pres_tissue_He; - + // update the overall tissue pressure - pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He; + pres_tissue = next_pres_tissue; // increment the NDL NDL_tissue += period; - // do next loop + // do next iteration continue; } - // NO - if delta pressures were for 10 minutes of time ahead, try with 1 minute ahead + // NO - if delta pressures were for 10 minutes of time ahead, continue with trying for 1 minute ahead if( period == 10 ) { // reduce period to 1 minute @@ -2595,21 +2963,16 @@ // read the loading factors for 1 minute periods read_Buhlmann_times(1); - // do next loop + // do next iteration 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 + // less than a full minute of NDL time left, so finish the inner loop break; - } - - // is the current NDL short than the shortest so far? + + } // inner for-loop simulating increasing bottom time + + // is the current NDL shorter than the shortest so far? if ( NDL_tissue < NDL_time ) { // keep the current's tissue NDL as the new shortest NDL @@ -2619,64 +2982,76 @@ 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 - } + // If NDL is > 0 the outer loop will continues with the next tissue. + // If NDL found to be overrun, outer loop will be terminated by means of the i = NUM_COMP statement. + + } // outer for-loop iterating over all tissues // store the NDL dominating tissue for to start with in the next NDL calculation NDL_lead_tissue = new_NDL_lead_tissue; } + ////////////////////////////////////////////////////////////////////////////// // calc_ascenttime // -// Sum up ascent from bottom to surface at float_ascent_speed, -// but 1 minute per meter for the final ascent, and all stops. +// Sum up ascent from bottom to surface at float_ascent_speed, slowing down to +// 1 minute per meter for the final ascent when in deco, and all stop times. // // Input: char_I_depth_last_deco -// pres_respiration -// pres_surface -// float_ascent_speed +// char_I_ascent_speed +// char_bottom_depth // internal_deco_depth[] +// internal_deco_time[] // // Output: ascent_time // static void calc_ascenttime(void) { - 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; - - // check if we are already in final ascent - if (ascent <= final) + overlay unsigned char x; // loop counter + overlay unsigned char ascent; // meters to go from bottom to last stop + overlay unsigned char final; // meters to go from last stop to surface + + + // check if there are stops + if( internal_deco_depth[0] ) { - // yes - all ascent is final ascent - final = ascent; - ascent = 0.0; + // stops / in deco + + // check if already at last stop depth or shallower + if( char_bottom_depth <= char_I_depth_last_deco) + { + // YES + ascent = 0; + final = char_bottom_depth; + } + else + { + // NO + ascent = char_bottom_depth - char_I_depth_last_deco; + final = char_I_depth_last_deco; + } } else { - // no - subtract final ascent part from overall ascent - ascent -= final; - - // compute time for ascent part without final ascent - ascent /= float_ascent_speed; + // no stops / within NDL + ascent = char_bottom_depth; + final = 0; } - // add 1 minute for each meter of final ascent - ascent += final; - - // convert to integer - ascent_time = (unsigned short)(ascent + 0.5); + + // initialize ascent time + ascent_time = 0; + + // time for the ascent part (bottom to last stop), if existing + if( ascent ) ascent_time += ascent / char_I_ascent_speed + 1; + + // add time for the final ascent (last stop to surface) at 1 min/m + ascent_time += final; // add all stop times - for(x=0; x 999) ascent_time = 999; @@ -2694,11 +3069,11 @@ { 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 internal_deco_depth[x]) ) - sim_depth_limit = internal_deco_depth[x]; - + // In case the first deco stop is to be placed deeper than previously recorded + // stops for gas changes during the initial ascent (this may happen because the + // deco stops are placed at the next deeper multiple of 3 meters instead of the + // real stop's depth), relocate the deco stop to the depth of the last gas change. + // The resulting combined stop's duration will be the sum of the configured gas + // change time plus the duration of the deco stop itself. + if( internal_deco_depth[x] && (sim_depth_limit > internal_deco_depth[x]) ) + sim_depth_limit = internal_deco_depth[x]; + // Is there already a stop entry for our current depth? if( internal_deco_depth[x] == sim_depth_limit ) { // Yes - increment stop time if possible // Stop time entries are limited to 99 minutes because of display constraints. - // Else a limit of 254 would account because of constrains in calc_CNS_planning(). if( internal_deco_time[x] < (100 - time_increment) ) { internal_deco_time[x] += time_increment; // increment stop time @@ -2760,7 +3134,7 @@ { internal_deco_time[x] = time_increment; // initialize entry with first stop's time, internal_deco_depth[x] = sim_depth_limit; // ... depth, and - internal_deco_gas[x] = sim_gas_last_used; // ... gas + internal_deco_gas[x] = sim_gas_current; // ... gas return 1; // return with status 'success' } } @@ -2778,16 +3152,13 @@ ////////////////////////////////////////////////////////////////////////////// // calc_desaturation_time // -// Inputs: int_I_pres_surface, ppWater, char_I_desaturation_multiplier -// Outputs: int_O_desaturation_time, int_O_nofly_time -// // Helper function // -void calc_desaturation_time_helper(void) +static void calc_desaturation_time_helper(void) { if( pres_actual > pres_target ) // check if actual pressure is higher then target pressure { // YES - compute remaining time - overlay float pres_ratio; + overlay float pres_ratio; pres_ratio = pres_actual / pres_target; @@ -2795,7 +3166,7 @@ // 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. + // backwards as ambient pressure rises/falls and N2/He ratio is being adjusted. int_time = (unsigned int)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 ); } else @@ -2805,22 +3176,31 @@ } ///////////////////////////////////////////////////////////////////////////// -// Main function +// calc_desaturation_time +// +// Inputs: int_I_pres_surface, ppWater, char_I_desaturation_multiplier +// Outputs: int_O_desaturation_time, int_O_nofly_time +// +// Calculate the time needed for the tissues to equilibrate with surface pressure // 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 ); + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + + // safety limit to prevent eventual infinite looping (bricking the OSTC) + if( int_I_pres_surface < 500) int_I_pres_surface = 500; // fraction of inert gases in respired air - N2_ratio = 0.7902; - He_ratio = 0.0; + real_N2_ratio = 0.7902; + real_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); + N2_equilibrium = real_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; @@ -2830,7 +3210,7 @@ int_O_nofly_time = 0; - for(ci=NUM_COMP; ci>0;) + for( ci = NUM_COMP; ci > 0; ) { overlay float pres_tissue_max; overlay float P_ambient_altitude; @@ -2872,9 +3252,9 @@ // 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 desaturation time for N2 in tissue. // Desaturated state is defined as residual tissue pressure <= 1.05 x ppN2 respired @@ -2906,6 +3286,9 @@ // no-fly time // + // initialize split_N2_He in case there was a hard reboot / memory clear. + if( split_N2_He[ci] == 0 ) split_N2_He[ci] = 90; + // initialize search direction search_direction = 0; @@ -2915,7 +3298,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 no-fly time for N2 in the tissue. // Flying is permitted when the N2 pressure fits into the assigned fraction above equilibrium. @@ -2927,7 +3310,7 @@ int_O_nofly_time = 288; // NO - set no-fly time to 288 * 10 min = 48 h break; // done for this compartment } - else + else { calc_desaturation_time_helper(); nofly_N2 = int_time; @@ -2966,7 +3349,7 @@ // 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 if( (search_direction < 0) || (split_N2_He[ci] == 99) ) - { + { // 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_N2 < nofly_last) ? nofly_N2 : nofly_last; @@ -2997,7 +3380,7 @@ // decrease the N2 fraction of the split and set search direction towards less N2 split_N2_He[ci] -= 1; - search_direction = -1; + search_direction = -1; } } // for(;;) @@ -3015,17 +3398,19 @@ if( int_O_nofly_time > 5999 ) int_O_nofly_time = 5999; - // 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 ) + // Clear the microbubbles warning when the current gradient factor is < 100%. + // The current gradient factor is calculated by calc_interval() while not in diving mode. + // 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 < 100 ) 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 ); + 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 + + DECO_ATTENTION_OUTSIDE ); } @@ -3039,26 +3424,30 @@ // Input: int_I_pres_surface : surface pressure in mbar // time_interval : time interval in minutes, must be limited to 254 at max // -// Modified: tissue pressures -// CNS value -// ceiling and current GF +// Modified: tissue pressures : N2 and He pressures of the tissues +// CNS_fraction : current CNS value +// ceiling : minimum allowed depth in mbar relative pressure +// lead_supersat : supersaturation of the leading tissue +// int_O_gradient_factor : current GF factor // static void calc_interval(PARAMETER unsigned char time_interval) { 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 ); - + assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + + // safety limit to prevent eventual infinite looping (bricking the OSTC) + if( int_I_pres_surface < 500) int_I_pres_surface = 500; // min. surface pressure = 500 mbar // setup input data for deco routines - 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); + real_pres_respiration = pres_surface = 0.001 * int_I_pres_surface; + + real_N2_ratio = 0.7902; // according to Buhlmann + N2_equilibrium = real_N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling + ppN2 = real_N2_ratio * (real_pres_respiration - ppWater); ppHe = 0.0; float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; @@ -3075,7 +3464,7 @@ if( time > 127) { // do a full 127 minutes on the real tissues - tissue_increment = 127 | TISSUE_FLAG; + tissue_increment = TISSUE_FLAG | 127; calc_tissues(); // determine the remaining part @@ -3083,9 +3472,9 @@ } // 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 + tissue_increment = TISSUE_FLAG | time; + + // update the N2 and He pressures in the tissues calc_tissues(); @@ -3095,7 +3484,7 @@ time = time_interval; - while ( time ) + while( time ) { if( time > 9 ) { @@ -3112,32 +3501,37 @@ // compute integer copy of CNS value convert_CNS_for_display(); - - // calculate ceiling (for a GF high of 100%) and gradient factor + // calculate GF value (for a GF high of 100%) calc_limit(1.0); + + // compute integer copy of GF value + convert_GF_for_display(); } ////////////////////////////////////////////////////////////////////////////// -// calc_CNS_increment +// calc_CNS // -// Input: char_ppO2 : current ppO2 [decibars] -// tissue_increment : time increment and tissue selector +// Input: char_ppO2 : current ppO2 [decibars] +// tissue_increment : time increment and tissue selector // -// Output: CNS_fraction_inc : increment of the CNS value +// Modified: CNS_fraction accumulated CNS (real tissue context) +// sim_CNS_fraction : accumulated CNS (simulated tissue context) // -void calc_CNS_increment(void) +static void calc_CNS(void) { - overlay float time_factor = 1.0; // default is 2sec + overlay float CNS_fraction_inc; // increment of CNS load, 0.01 = 1% + overlay float time_factor; // factor for time increment assert( char_ppO2 > 15 ); - // adjust time factor if minute-based stepping is commanded, mask out flag bit - if( tissue_increment & TIME_MASK ) time_factor = 30.0 * (float)(tissue_increment & TIME_MASK); + // adjust time factor to 2 seconds (factor = 1.0) or minute-based interval (factor = N * 30.0) + if( tissue_increment & TIME_MASK ) time_factor = (float)(tissue_increment & TIME_MASK) * 30.0; + else time_factor = 1.0; //------------------------------------------------------------------------ - // Don't increase CNS below 0.5 bar, but keep it steady. - if (char_ppO2 < 50) CNS_fraction_inc = 0.0; // no CNS increase below 0.5 bar ppO2 + // No CNS increase below 0.5 bar ppO2 + if (char_ppO2 < 50) CNS_fraction_inc = 0.0; //------------------------------------------------------------------------ // Below (and including) 1.60 bar else if (char_ppO2 < 61) CNS_fraction_inc = time_factor/(-533.07 * char_ppO2 + 54000.0); @@ -3152,178 +3546,19 @@ // 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 increase during predicted ascent -// -// Input: internal_deco_time[], internal_deco_depth[], internal_deco_gas[] -// Output: sim_CNS_fraction -// -void calc_CNS_planning(void) -{ - // 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 ! - - // get current ppO2 from sensors or setpoint - 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_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_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_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 - - - // 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_set_ratios(); - - // calculate absolute pressure - abs_pres = pres_surface + bottom_depth * METER_TO_BAR; - - // 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_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 a minimum of 5. - // - // // limit tissue_increment to 127 minutes - // if( tissue_increment > 127 ) tissue_increment = 127; - - // simulate the CNS increase - calc_CNS_increment(); // calculate the CNS increment - sim_CNS_fraction += CNS_fraction_inc; // sum up - - - //---- Stops --------------------------------------------------------- - - for(i=0; i 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 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_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_increment(); // calculate the CNS increment - sim_CNS_fraction += CNS_fraction_inc; // sum up - } - } + 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.02090; + else CNS_fraction_inc = time_factor * 0.04820; // value for 2.5 bar, used for 2.33 bar and above + + // update the CNS accumulator + if( tissue_increment & TISSUE_FLAG ) CNS_fraction += CNS_fraction_inc; // real tissues + else sim_CNS_fraction += CNS_fraction_inc; // simulated tissues } @@ -3332,37 +3567,71 @@ // // calculates volumes and required tank fill pressures for each gas. // -// Input: bottom_depth depth of the bottom segment +// Input: char_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 +// NDL_time remaining NDL time, used to adjust speed of final ascent // 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: +// Output: int_O_ascent_volumes[] amount of gas needed, in liters +// int_O_ascent_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 +// 2^10: pres_need is invalid // -void gas_volumes_helper(void) +static void gas_volumes_helper_1(void) { // Calculate the gas volume needed at a given depth, time and usage (SAC rate). // 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; + volume = (float_depth * METER_TO_BAR + 1.0) * float_time * char_usage; return; } -void gas_volumes(void) +static void gas_volume_helper_2(void) +{ + // Convert a gas volume in liters given as a float into an integer number + // and computes the equivalent tank pressure in bar, including all flags. + + if( volume >= 65534.5 ) + { + int_volume = 65535; + int_pres_need = 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill + } + else + { + overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[gas_num]; + + // No distinct rounding done here because volumes are not accurate to the single liter anyhow + + // convert gas volumes to integers + int_volume = (unsigned short)volume; + + // compute how much pressure in the tank will be needed [in bar] (integer-division) + int_pres_need = (unsigned short)(int_volume / char_I_tank_size[gas_num]); + + // limit to 999 bar because of display constraints + if( int_pres_need > 999 ) int_pres_need = 999; + + // set flags for fast evaluation by divemode check_for_warnings + if ( int_pres_need == 0 ) int_pres_need |= INT_FLAG_ZERO; + else if( int_pres_need >= tank_pres_fill ) int_pres_need |= INT_FLAG_WARNING; + else if( int_pres_need >= GAS_NEEDS_ATTENTION_THRESHOLD * tank_pres_fill ) int_pres_need |= INT_FLAG_ATTENTION; + } + + return; +} + +static void gas_volumes(void) { overlay float volumes[NUM_GAS]; @@ -3373,11 +3642,10 @@ overlay unsigned char stop_depth_last; overlay unsigned char i; - //---- initialization ---------------------------------------------------- // null the volume accumulators - for(i=0; i 0 if( float_depth > 0.0 ) @@ -3447,10 +3716,10 @@ float_time = float_depth / float_ascent_speed; // compute average depth between bottom and first stop - float_depth = (float)bottom_depth - float_depth * 0.5; + float_depth = (float)char_bottom_depth - float_depth * 0.5; // calculate gas demand - gas_volumes_helper(); + gas_volumes_helper_1(); // add result volumes[stop_gas-1] += volume; @@ -3459,7 +3728,7 @@ // switch the usage (SAC rate) to deco usage rate // for stops, intermediate and final ascent - usage = char_I_deco_usage; + char_usage = char_I_deco_usage; // is there a (first) stop? if yes, goto stops processing if( stop_depth ) goto stops; @@ -3469,7 +3738,7 @@ float_depth = 5.0; // calculate gas demand - gas_volumes_helper(); + gas_volumes_helper_1(); // add result volumes[stop_gas-1] += volume; @@ -3526,7 +3795,7 @@ float_depth = (float)stop_depth_last - float_depth * 0.5; // calculate gas demand - gas_volumes_helper(); + gas_volumes_helper_1(); // add result volumes[stop_gas_last-1] += volume; @@ -3541,18 +3810,18 @@ // get the next gas stop_gas = internal_deco_gas[i]; - - // in case of end-of-table, keep the last gas - if( !stop_gas ) stop_gas = stop_gas_last; - - // do we we have a gas change? + + // in case of end-of-table, keep the last gas + if( !stop_gas ) stop_gas = stop_gas_last; + + // do 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(); + gas_volumes_helper_1(); // add result volumes[stop_gas_last-1] += volume; @@ -3565,7 +3834,7 @@ float_time = (float)stop_time; // calculate gas demand - gas_volumes_helper(); + gas_volumes_helper_1(); // add result to last gas volumes[stop_gas-1] += volume; @@ -3581,17 +3850,26 @@ // 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 + // 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 ascent time dependent on deco status + if( NDL_time ) + { + // within NDL - ascent with float_ascent_speed + float_time = float_depth / float_ascent_speed; + } + else + { + // in deco - reduce ascent speed to 1 meter per minute + float_time = float_depth; + } // set half-way depth float_depth *= 0.5; // calculate gas demand - gas_volumes_helper(); + gas_volumes_helper_1(); // add result volumes[stop_gas-1] += volume; @@ -3601,89 +3879,155 @@ //---- convert results for the assembler interface ----------------------------- done: - for(i=0; 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 - } - else + volume = volumes[gas_num]; + + // compute int_volume and int_pres_need from volume and gas_num + gas_volume_helper_2(); + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_pres_need |= INT_FLAG_INVALID; + + // copy result data to ASM interface + int_O_ascent_volumes[gas_num] = int_volume; + int_O_ascent_pres_need[gas_num] = int_pres_need; + +#ifdef _rx_functions + // only for OSTC TR model with TR functions enabled + if( char_O_main_status & DECO_TR_FUNCTIONS ) { - 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]; - - // 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 ) + // char_I_pressure_gas[] uses gas numbers 1-10, gas_num runs from 0 to 4 + overlay unsigned char gas = gas_num + 1; + + // check if the current gas is configured on pressure reading 1 or 2 + if( (gas == char_I_pressure_gas[0]) || (gas == char_I_pressure_gas[1]) ) { - // set flag for 0 bar - int_O_tank_pres_need[i] |= INT_FLAG_ZERO; - } - else if( int_O_tank_pres_need[i] >= tank_pres_fill ) - { - // set warning flag - int_O_tank_pres_need[i] |= INT_FLAG_WARNING; - + // strip all flags from int_pres_need + int_pres_need &= 1023; + + // limit to 400 bar and multiply by 10 to get result in 0.1 bar + int_pres_need = (int_pres_need > 400) ? (4000 | INT_FLAG_OUT_OF_RANGE) : (10 * int_pres_need); + + // tag as not available if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_pres_need |= INT_FLAG_NOT_AVAIL; + + // copy to result vars (in both readings the same gas could be configured) + if( gas == char_I_pressure_gas[0] ) int_O_pressure_need[0] = int_pres_need; + if( gas == char_I_pressure_gas[1] ) int_O_pressure_need[1] = int_pres_need; } - 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_ATTENTION; - } - - // set invalid flag if there is an overflow in the stops table - if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) - int_O_tank_pres_need[i] |= INT_FLAG_INVALID; - - } // if( volumes[i] ) + } // TR functions +#endif + } // for } ////////////////////////////////////////////////////////////////////////////// -void convert_CNS_for_display(void) +static 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; + if( CNS_fraction < 0.010 ) int_O_CNS_fraction = 0; + else if( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING; else { // convert float to integer int_O_CNS_fraction = (unsigned short)(100 * CNS_fraction + 0.5); - // 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; + // set warning & attention flags + 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) +static 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; + if( sim_CNS_fraction < 0.010 ) 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% + // set warning & attention flags 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; } + + // 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; +} + +////////////////////////////////////////////////////////////////////////////// + +static void convert_GF_for_display(void) +{ + // convert supersaturation of the leading tissue to int_O_gradient_factor in % (1.0 = 100%) + // limit to 255 because of constraints in ghostwriter code + if( lead_supersat <= 0.000 ) 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( char_I_deco_model != 0 ) + { + // GF factors enabled + if( int_O_gradient_factor >= char_I_GF_High_percentage ) + { + int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow + char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow + } + + if( int_O_gradient_factor >= 100 ) + int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red + } + else + { + // straight Buhlmann + if ( int_O_gradient_factor >= 100 ) + int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red + + else if ( int_O_gradient_factor >= 90 ) + { + int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow + char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow + } + } + } + + // export also the number of the leading tissue + char_O_lead_number = lead_number; +} + +////////////////////////////////////////////////////////////////////////////// + +static void convert_ceiling_for_display(void) +{ + // Convert ceiling to int_O_ceiling in mbar relative pressure. + // Round up to next 10 cm so that the ceiling disappears only + // when the ceiling limit is really zero. This will coincident + // with TTS switching back to NDL time. + if( ceiling <= 0.0 ) int_O_ceiling = 0; + else if( ceiling > 16.0 ) int_O_ceiling = 16000; + else int_O_ceiling = (short)(ceiling * 1000 + 9); + + // set/reset ceiling flag + if( int_O_ceiling ) char_O_deco_info |= DECO_CEILING; + else char_O_deco_info &= ~DECO_CEILING; } ////////////////////////////////////////////////////////////////////////////// @@ -3694,21 +4038,21 @@ // tissues and related data when entering / leaving simulation mode! // -void push_tissues_to_vault(void) +static void push_tissues_to_vault(void) { overlay unsigned char x; cns_vault_float = CNS_fraction; deco_warnings_vault = char_O_deco_warnings; - for (x=0;x= 127 (special treatment)? + bra get_pressure_readings_2b ; NO - proceed reading a pressure + rcall get_pressure_readings_H1 ; YES - set pressure data to not available + bra get_pressure_readings_2c ; - continue wit copying to output data +get_pressure_readings_2b: + rcall get_pressure_readings_H3 ; get transmitter ID + rcall get_pres_by_transmitter_id ; get data from transmitter with ID in hi:lo into hi:lo (pressure) and up (status) +get_pressure_readings_2c: + movff lo,int_IO_pressure_value+2 ; copy pressure, low byte + movff hi,int_IO_pressure_value+3 ; copy pressure, high byte + movff ul,char_I_pressure_gas+1 ; copy associated gas number + movff up,char_I_pressure_age+1 ; copy age of data + movff ex,char_I_pressure_stat+1 ; copy status data + return + +get_pressure_readings_H1: + clrf lo ; set pressure to 0 (low byte) + clrf hi ; set pressure to 0 (high byte) + clrf up ; set age to 0 + clrf ex ; set status to 0 + bsf hi,int_not_avail_flag ; set flag for data not available + return + +get_pressure_readings_H2: + movlw .11 + subwf ul,F + bnz get_pressure_readings_H2a + call get_first_gas_to_WREG ; ul = 11 -> ul = (get_first_gas_to_WREG) + movwf ul + return +get_pressure_readings_H2a: + decfsz ul,F + bra get_pressure_readings_H2b + movff active_gas,ul ; ul = 12 -> ul = active_gas + return +get_pressure_readings_H2b: + decfsz ul,F + bra get_pressure_readings_H2c + call get_first_dil_to_WREG ; ul = 13 -> ul = (get_first_dil_to_WREG) + 5 + movwf ul + movlw .5 + addwf ul,F + return +get_pressure_readings_H2c: + decfsz ul,F + bra get_pressure_readings_H2d + movff active_dil,ul ; ul = 14 -> ul = active_dil + 5 + movlw .5 + addwf ul,F + return +get_pressure_readings_H2d: + movlw .1 + movwf ul ; ul >= 15 -> should not happen, default to ul = 1 + return + +get_pressure_readings_H3: + lfsr FSR1,opt_transmitter_id_1 ; load base address of transmitter ID array + decf ul,W ; (1-10) -> (0-9) + mullw .2 ; IDs are 2 byte in size + movf PRODL,W ; WREG is index now + movff PLUSW1,lo ; get transmitter ID (low byte) + incf WREG,W ; increment index + movff PLUSW1,hi ; get transmitter ID (high byte) + return + + +;============================================================================= +; Get data from transmitter with ID in (hi:lo) +; +; input: hi:lo = transmitter ID +; +; output: hi:lo = pressure in 0.1 bar if return code = 0, else 0 + int_not_avail_flag +; up = packet age if return code = 0, else 0 +; ex = status data if return code = 0, else 0 +; +; return code: 0 transmitter found +; 254 illegal transmitter ID +; 255 transmitter not found +; +; RX slot data: Byte 0 : transmitter ID high byte +; 1 : transmitter ID low byte +; 2 (-> hi) : pressure in 0.1 bar, high byte +; 3 (-> lo) : pressure in 0.1 bar, low byte +; 4 (-> ex) : status data: +; bit 2..0: battery status +; 5..3: sequence counter +; 6: =1 if pressure changed (usage in RX slot data) +; =1 if transmitter not found (usage in output data) +; 7: =1 if pressure sensed (usage in RX slot data) +; =1 if low battery (< 3.0V) (usage in output data) +; 5 (-> up) : age of data in seconds, 0 if slot is unused +; + global get_pres_by_transmitter_id +get_pres_by_transmitter_id: + ; hi:lo zero? + tstfsz hi ; hi <> zero ? + bra output_pressure_1 ; YES - search transmitter + tstfsz lo ; lo <> zero ? + bra output_pressure_1 ; YES - search transmitter + movlw .254 ; NO to both - set return code for invalid transmitter ID + bra output_pressure_6 ; - clear result vars, set data as not available and return +output_pressure_1: + lfsr FSR1,rx_buffer ; load base address of RX buffer + movlw .8 ; 8 RX slots to look at + movwf up ; up will be the loop counter +output_pressure_2: + movf POSTINC1,W ; get high byte of received transmitter ID + cpfseq hi ; match? + bra output_pressure_3 ; NO - check next slot + movf POSTINC1,W ; get low byte byte received transmitter ID + cpfseq lo ; match? + bra output_pressure_4 ; NO - check next slot + ; transmitter found, gather data ; YES - transmitter found, copy: + movff POSTINC1,hi ; - pressure high byte, + movff POSTINC1,lo ; - pressure low byte, + movff POSTINC1,ex ; - status byte, and + movff POSTINC1,up ; - packet age. + movlw rx_packet_overdue_timeout ; - load overdue time + subwf up,W ; - subtract overdue time from packet age + btfss STATUS,N ; - result negative (packet younger than overdue time)? + bsf hi,int_outdated_flag ; NO - set outdated flag + bcf ex,char_transmitter_lost ; - clear transmitter lost flag + bsf ex,char_transmitter_low_bat ; - set low battery warning by default + btfsc ex,1 ; - bit 1 of battery voltage set? + bcf ex,char_transmitter_low_bat ; - YES - revoke low battery warning + btfsc ex,2 ; - bit 2 of battery voltage set? + bcf ex,char_transmitter_low_bat ; - YES - revoke low battery warning + ;bsf ex,char_transmitter_low_bat ; DEBUG CODE TO FAKE A LOW BAT WARNING + retlw .0 ; - return with success code 0 +output_pressure_3: + movf POSTINC1,W ; dummy read to advance FSR0 to byte 2 position +output_pressure_4: + dcfsnz up,F ; decrement loop counter, last slot searched? + bra output_pressure_5 ; YES - return with error code + movf POSTINC1,W ; NO - dummy reads to advance FSR0 to byte 3 (any other code would not be more compact...) + movf POSTINC1,W ; - ... byte 4 + movf POSTINC1,W ; - ... byte 5 + movf POSTINC1,W ; - ... byte 6 = first byte of next slot + bra output_pressure_2 ; - loop +output_pressure_5: + movlw .255 ; return code for transmitter not found + clrf ex ; clear ex (status data) + bsf ex,char_transmitter_lost ; set transmitter status to lost + bra output_pressure_7 +output_pressure_6: + clrf ex ; clear ex (status data) +output_pressure_7: + clrf lo ; clear lo (pressure, low byte) + clrf hi ; clear hi (pressure, high byte) + clrf up ; clear up (age of data) + bsf hi,int_not_avail_flag ; set flag for data not available + return ; done + + +;============================================================================= +; Get transmitter ID in given slot +; +; input : WREG = slot (0-7) +; output : hi:lo = transmitter ID +; + global get_transmitter_id_by_slot +get_transmitter_id_by_slot: + lfsr FSR1,rx_buffer ; load base address of RX buffer + mullw .6 ; multiply WREG with 6 because each slot is 6 bytes in size + movf PRODL,W ; get result into WREG to be used as index (product is 42 at max) + movff PLUSW1,hi ; read transmitter ID high byte + incf WREG,W ; increment index + movff PLUSW1,lo ; read transmitter ID low byte + return + + +;============================================================================= +; Compute average pressure drop from 1st / 2nd reading +; +; Memory Map: +; ------------------------------------------------------------------------------------ +; +; pres_accu_1st res 4 ; accumulator for pressure drop in 1/(160 * 2^16) bar +; pres_accu_2nd res 4 ; accumulator for pressure drop in 1/(160 * 2^16) bar +; time_accu_1st res 1 ; accumulator for reading periods in seconds +; gas__last_1st res 1 ; last gas assignment +; time_accu_2nd res 1 ; accumulator for reading periods in seconds +; gas__last_2nd res 1 ; last gas assignment +; pres_last_1st res 2 ; last pressure reading pressure in 1/160 bar +; pres_last_2nd res 2 ; last pressure reading pressure in 1/160 bar +; time_last_1st res 2 ; last pressure reading time in seconds +; time_last_2nd res 2 ; last pressure reading time in seconds +; +; int_IO_pressure_value [1] res 2 ; current pressure reading in 1/10 bar +; int_IO_pressure_value [2] res 2 ; current pressure reading in 1/10 bar +; int_I_pressure_drop [1] res 2 ; calculated average pressure drop in 1/5120 bar/sec +; int_I_pressure_drop [2] res 2 ; calculated average pressure drop in 1/5120 bar/sec + +; relative positioning of 16 bit ASM variables +#DEFINE offset_FSR1_time_accu .0 ; offset 0 == base address of 1st/2nd +#DEFINE offset_FSR1_gas__last .1 ; offset 1 to base address of 1st/2nd +#DEFINE offset_FSR1_pres_last .4 ; offset 4 ... +#DEFINE offset_FSR1_time_last .8 ; offset 8 ... + +; relative positioning of shared integer variables +#DEFINE offset_FSR2_press_curr .0 ; offset 0 == base address of 1st/2nd +#DEFINE offset_FSR2_press_drop .4 ; offset 4 to base address of 1st/2nd + + +calc_pres_drop_1st: + ; set up base addresses + lfsr FSR0,pres_accu_1st-1 ; load base address - 1 of pressure accumulator + lfsr FSR1,time_accu_1st ; load base address of other ASM variables + lfsr FSR2,int_IO_pressure_value+0; load base address of the shared variables + + ; get the currently assigned gas into lo + movff char_I_pressure_gas+0,lo + + ; get the age of the current reading into hi + movff char_I_pressure_age+0,hi + + ; continue with common part + bra calc_pres_drop_common + +calc_pres_drop_2nd: + ; set up base addresses + lfsr FSR0,pres_accu_2nd-1 ; load base address - 1 of pressure accumulator + lfsr FSR1,time_accu_2nd ; load base address of other ASM variables + lfsr FSR2,int_IO_pressure_value+2; load base address of the shared variables + + ; get the currently assigned gas into lo + movff char_I_pressure_gas+1,lo + + ; get the age of the current reading into hi + movff char_I_pressure_age+1,hi + +calc_pres_drop_common: + ; load the pressure accumulator into xC - FSR0 has been initialized to base address -1 + movff PREINC0,xC+0 ; copy pressure accumulator to xC, lowest byte + movff PREINC0,xC+1 ; copy pressure accumulator to xC, second byte + movff PREINC0,xC+2 ; copy pressure accumulator to xC, third byte + movff PREINC0,xC+3 ; copy pressure accumulator to xC, highest byte + + ; check if the assigned gas has changed + movlw offset_FSR1_gas__last ; load index of last assigned gas + movf PLUSW1,W ; copy last gas to WREG + cpfseq lo ; is current gas = last gas ? + bra calc_pres_drop_reset ; NO - reset everything + + ; check if the pressure reading is activated at all + tstfsz lo ; is there no gas (0=off) assigned to the reading? + bra calc_pres_drop_common_1 ; NO - continue + bra calc_pres_drop_reset ; YES - reset everything + +calc_pres_drop_common_1: + ; load the time accumulator into xB + movff INDF1,xB+0 ; load time accumulator, low byte (had been stored) + clrf xB+1 ; clear time accumulator, high byte (will be reset to 0 each round) + + ; get the current pressure value into divA - after copying, FSR2 will have been restored to initial address + movff POSTINC2,divA+0 ; copy current pressure value to divA, low byte + movff POSTDEC2,divA+1 ; copy current pressure value to divA, high byte + + ; check if the current pressure value is available and not outdated + bsf aux_flag ; set the current pressure value as not available or outdated by default + btfsc divA+1,int_not_avail_flag ; current pressure value not available? + bra calc_pres_drop_common_2 ; YES - skip updating the accumulators with new data + btfsc divA+1,int_outdated_flag ; current pressure outdated? + bra calc_pres_drop_common_2 ; YES - skip updating the accumulators with new data + bcf aux_flag ; NO to both - set current pressure value as available and up-to-date + + ; check if a new reading has been received + movlw .2 ; capture new reading at an age of 2 (age 1 sometimes slips through...) + subwf hi,W ; subtract capture-age from reading age, dump result to WREG + bnz calc_pres_drop_common_2 ; result <> 0 ? YES - skip updating the accumulators + + ; multiply the current pressure with 16 (pre-scaling), this will also remove the flags + movlw .4 ; multiply with 16 = 2^4 + call mult16 ; divA = divA * 2^WREG + + ; get the last pressure value and store the current pressure as the new last pressure value + movlw offset_FSR1_pres_last+0 ; load index of last pressure value, low byte + movff PLUSW1,sub_b+0 ; copy last pressure value to sub_b, low byte + movff divA+0,PLUSW1 ; store current pressure value as new last pressure value, low byte + movlw offset_FSR1_pres_last+1 ; load index of last pressure value, high byte + movff PLUSW1,sub_b+1 ; copy last pressure value to sub_b, high byte + movff divA+1,PLUSW1 ; store current pressure value as new last pressure value, high byte + + ; add the last pressure value to the pressure accumulator: pres_accu (xC) += pres_last (sub_b) * 2^16 + movf sub_b+0,W ; copy pres_last (sub_b) to WREG, low byte + addwf xC+2,F ; add to pres_accu (xC), third byte + movf sub_b+1,W ; copy pres_last (sub_b) to WREG, high byte + addwfc xC+3,F ; add to pres_accu (xC), highest byte + + ; subtract the current pressure from the pressure accumulator: pres_accu (xC) -= pres_curr (divA) * 2^16 + ; -> effectively, the pressure drop during the last measurement period has been added now + bcf neg_flag ; clear neg_flag by default + movf divA+0,W ; copy pres_curr (divA) to WREG, low byte + subwf xC+2,F ; subtract from pres_accu (xC), third byte + movf divA+1,W ; copy pres_curr (divA) to WREG, high byte + subwfb xC+3,F ; subtract from pres_accu (xC), highest byte + btfss STATUS,C ; did the accumulator under-run (result negative)? + bsf neg_flag ; YES - memorize this + + ; get the current time into lo + SAFE_2BYTE_COPY total_divetime_seconds,lo ; get current total dive time into lo:2 + + ; get the last pressure time and store the current time as the new last pressure time + movlw offset_FSR1_time_last+0 ; load index of last pressure time, low byte + movff PLUSW1,sub_b+0 ; copy last pressure time to sub_b, low byte + movff lo+0,PLUSW1 ; store current time as new last pressure time, low byte + movlw offset_FSR1_time_last+1 ; load index of last pressure time, high byte + movff PLUSW1,sub_b+1 ; copy last pressure time to sub_b, high byte + movff lo+1,PLUSW1 ; store current time as new last pressure time, high byte + + ; did the pressure accumulator under-run before because the current pressure is higher than the accumulator value was? + ; we can not check & abort earlier because the current time needs to be stored along with the current pressure + btfsc neg_flag ; did the pressure accumulator under-run? + bra calc_pres_drop_restart ; YES - reset both accumulators and set average pressure drop to not available + + ; add the current time to the time accumulator: time_accu (xB) += time_curr (lo) + movf lo+0,W ; copy time_curr (lo) to WREG, low byte + addwf xB+0,F ; add to time_accu (xB), low byte + movf lo+1,W ; copy time_curr (lo) to WREG, high byte + addwfc xB+1,F ; add to time_accu (xB), high_byte + + ; subtract the last pressure time from time accumulator: time_accu (xB) -= time_last (sub_b) + movf sub_b+0,W ; copy time_last (sub_b) to WREG, low byte + subwf xB+0,F ; subtract from time_accu (xB), low byte + movf sub_b+1,W ; copy time_last (sub_b) to WREG, high byte + subwfb xB+1,F ; subtract from time_accu (xB), high byte + btfss STATUS,C ; did the accumulator under-run (result negative) because of a wrap-around of the current time? + bra calc_pres_drop_restart ; YES - reset both accumulators and set average pressure drop to not available + + ; check if the time accumulator (xB) is or has become too large + ; this will happen if the last valid pressure reading is older than (256 - time_accu target) seconds + tstfsz xB+1 ; is the time accumulator < 256 [seconds], i.e. high byte = 0 ? + bra calc_pres_drop_restart ; NO - reset both accumulators and set average pressure drop to not available + +calc_pres_drop_common_2: + ; check if the time accumulator is or has become zero to avoid a div/0 + ; as long as no valid pressure value is available, the time accumulator will stay at 0 and the pressure drop calculation kept in reset + movf xB+0,W ; copy time accumulator low byte to WREG, does it set the zero flag? + bz calc_pres_drop_restart ; YES - reset both accumulators and set average pressure drop to not available + + ; duplicate pressure and time accumulators to other variables because xC and xB will get destroyed in div32x16 operation + movff xC+0,lo+0 ; duplicate pres_accu to lo, lowest byte + movff xC+1,lo+1 ; duplicate pres_accu to lo, second byte + movff xC+2,lo+2 ; duplicate pres_accu to lo, third byte + movff xC+3,lo+3 ; duplicate pres_accu to lo, highest byte + movff xB+0,divA+0 ; duplicate time_accu to divA, low byte + movff xB+1,divA+1 ; duplicate time_accu to divA, high byte + + ; calculate average pressure drop: pres_drop (xC) = pres_accu (xC) / time_accu (xB) + call div32x16 ; xC = xC / xB, xC is average pressure drop in 1/(160 * 2^16) bar/sec + + ; is the time accumulator above target level? (only the low byte needs to be evaluated)? + incf ul,W ; load the target threshold, +1 (incf) transforms cpfslt from < to <= operation + cpfslt divA+0 ; is the time accumulator > target threshold ? + rcall calc_pres_drop_reduce_accus ; YES - do an accumulator reduction + + ; do an additional half-rate (every 2nd second) accumulator reduction + btfsc total_divetime_seconds+0,0 ; are we on an even second? + rcall calc_pres_drop_reduce_accus ; YES - do an additional accumulator reduction + + ; store pressure accumulator (lo:4) - FSR0 was left pointing to address of highest byte + movff lo+3,POSTDEC0 ; store pressure accumulator, highest byte + movff lo+2,POSTDEC0 ; store pressure accumulator, third byte + movff lo+1,POSTDEC0 ; store pressure accumulator, second byte + movff lo+0,POSTDEC0 ; store pressure accumulator, lowest byte + + ; store the time accumulator + movff divA+0,INDF1 ; store time accumulator (only the low byte will be stored) + + ; check if the average pressure drop for transfer to p2deco needs to be limited + tstfsz xC+3 ; check if the highest byte is all zero + bra calc_pres_drop_limit ; NO - limit output + btfsc xC+2,7 ; check if the highest bit of the third byte is zero + bra calc_pres_drop_limit ; NO - limit output + + ; pick and adjust the bytes from pres_drop for transfer to p2deco + movff xC+1,divA+0 ; pick second byte of average pressure drop for transfer to p2deco as low byte + movff xC+2,divA+1 ; pick third byte of average pressure drop for transfer to p2deco as high byte + movlw .3 ; divide by 8 = 2^3 + call div16 ; divA = divA / 2^WREG + bra calc_pres_drop_common_3 + +calc_pres_drop_limit: + ; limit output to 0x0FFF + movlw LOW 0x0FFF ; set output to 0x0FFF + movwf divA+0 ; ... + movlw HIGH 0x0FFF ; ... + movwf divA+1 ; ... + bsf divA+1,int_warning_flag ; set warning flag indicating out-of-range + +calc_pres_drop_common_3: + ; set the average pressure drop as not available if the last pressure reading is outdated or not available + btfsc aux_flag ; is the last pressure reading outdated or not available? + bsf divA+1,int_not_avail_flag ; YES - set pressure drop to not available, too + + ; set the average pressure drop as outdated if time_accu (divA) < (target threshold / 2) + rrncf ul,W ; load time accumulator target value / 2 into WREG + decf WREG,W ; subtract 1 to transform cpfsgt from > to >= operation + cpfsgt INDF1 ; time accumulator < (target threshold / 2) ? + bsf divA+1,int_outdated_flag ; YES - set outdated flag + + ; write average pressure drop to p2deco interface + movlw offset_FSR2_press_drop+0 ; load index of average pressure drop, low byte + movff divA+0,PLUSW2 ; store average pressure drop, low byte + movlw offset_FSR2_press_drop+1 ; load index of average pressure drop, high byte + movff divA+1,PLUSW2 ; store average pressure drop, high byte + + ; done + return + + +calc_pres_drop_reduce_accus: + ; subtract 1 second from the time accumulator: time_accu (divA) -= 1 (only the low byte needs to be processed) + decf divA+0,F ; decrement low byte of time_accu + + ; subtract average pressure drop per second from pressure accumulator: press_accu (lo) -= press_drop (xC) + movf xC+0,W ; copy press_drop(xC) to WREG, lowest byte + subwf lo+0,F ; subtract from pres_accu, lowest byte + movf xC+1,W ; copy press_drop(xC) to WREG, second byte + subwfb lo+1,F ; subtract from pres_accu, second byte + movf xC+2,W ; copy press_drop(xC) to WREG, third byte + subwfb lo+2,F ; subtract from pres_accu, third byte + movf xC+3,W ; copy press_drop(xC) to WREG, highest byte + subwfb lo+3,F ; subtract from pres_accu, highest byte + btfsc STATUS,C ; did the buffer under-run (result negative)? + return ; NO - done + clrf lo+0 ; YES - clear pressure accumulator, lowest byte + clrf lo+1 ; - clear pressure accumulator, second byte + clrf lo+2 ; - clear pressure accumulator, third byte + clrf lo+3 ; - clear pressure accumulator, highest byte + return ; - done + +calc_pres_drop_reset: + ; store the current gas as the last gas + movlw offset_FSR1_gas__last ; load index of last gas + movff lo,PLUSW1 ; store current gas as new last gas + + ; clear last pressure value + movlw offset_FSR1_pres_last+0 ; load index of last pressure value, low byte + clrf PLUSW1 ; clear last pressure value, low byte + movlw offset_FSR1_pres_last+1 ; load index of last pressure value, high byte + clrf PLUSW1 ; clear last pressure value, high byte + + ; clear last pressure time + movlw offset_FSR1_time_last+0 ; load index of last pressure time, low byte + clrf PLUSW1 ; clear last pressure time, low byte + movlw offset_FSR1_time_last+1 ; load index of last pressure time, high byte + clrf PLUSW1 ; clear last pressure time, high byte + +calc_pres_drop_restart: + ; clear pressure accumulator - FSR0 was left pointing to address of highest byte + clrf POSTDEC0 ; clear pressure accumulator, highest byte + clrf POSTDEC0 ; clear pressure accumulator, third byte + clrf POSTDEC0 ; clear pressure accumulator, second byte + clrf POSTDEC0 ; clear pressure accumulator, lowest byte + + ; clear time accumulator + clrf INDF1 ; clear time accumulator + + ; clear pressure drop and set it to not available + movlw offset_FSR2_press_drop+0 ; load index of average pressure drop, low byte + clrf PLUSW2 ; clear average pressure drop, low byte + movlw offset_FSR2_press_drop+1 ; load index of average pressure drop, high byte + clrf PLUSW2 ; clear average pressure drop, high byte + bsf PLUSW2,int_not_avail_flag ; set flag for data not available + + return ; done + + +;============================================================================= +; set up SAC calculation dependent on TR mode +; + global configure_sac_calculation +configure_sac_calculation: + movlw time_accu_target_OC ; load time accumulator target value for OC as default + movwf ul ; store it in ul + movff opt_TR_mode,WREG ; get TR mode + dcfsnz WREG,W ; TR mode = 1 (on)? + bra configure_sac_calculation_1 ; YES + dcfsnz WREG,W ; TR mode = 2 (ind.double)? + bra configure_sac_calculation_2 ; YES + dcfsnz WREG,W ; TR mode = 3 (CCR Dil+O2)? + bra configure_sac_calculation_3 ; YES + bra configure_sac_calculation_4 ; NO to all - was disabled then (or invalid) + +configure_sac_calculation_1: ; TR mode 1: calculate SAC on 1st reading + rcall calc_pres_drop_1st ; calculate pressure drop on 1st reading + movlw .1 ; select SAC mode 1: SAC on 1st reading + bra configure_sac_calculation_5 ; goto exit + +configure_sac_calculation_2: ; TR mode 2: independent double + rcall calc_pres_drop_1st ; calculate pressure drop on 1st reading + rcall calc_pres_drop_2nd ; calculate pressure drop on 2nd reading + movlw .3 ; select SAC mode 3: SAC on higher of both readings + bra configure_sac_calculation_5 ; goto exit + +configure_sac_calculation_3: ; TR mode 3: CCR Dil+O2 + btfsc FLAG_bailout_mode ; in bailout? + bra configure_sac_calculation_1 ; YES - handle alike TR mode 1 + movlw time_accu_target_CCR ; load time accumulator target value for CCR mode + movwf ul ; store it in ul + rcall calc_pres_drop_2nd ; calculate pressure drop on 2nd reading + movlw .4 ; select SAC mode 4: SAC on 2nd reading, O2 usage + bra configure_sac_calculation_5 ; goto exit + +configure_sac_calculation_4: + clrf WREG ; select SAC mode 0 (disabled) + +configure_sac_calculation_5: + movff WREG,char_I_SAC_mode ; write SAC mode selection + return + +;============================================================================= + + ENDIF + + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/rx_ops.inc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rx_ops.inc Thu Nov 22 19:47:26 2018 +0100 @@ -0,0 +1,12 @@ +;============================================================================= +; +; File rx_ops.inc V2.98c +; +; +; Copyright (c) 2018, heinrichs weikamp, all right reserved. +;============================================================================= + + extern get_pressure_readings + extern get_pres_by_transmitter_id + extern get_transmitter_id_by_slot + extern configure_sac_calculation diff -r 00b24fb4324d -r ca4556fb60b9 src/shared_definitions.h --- a/src/shared_definitions.h Thu Oct 11 21:06:29 2018 +0200 +++ b/src/shared_definitions.h Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; -; shared_definitions.h REFACTORED VERSION V2.97 +; shared_definitions.h REFACTORED VERSION V2.99e ; ; Declare variables used both in C and ASM code ; @@ -17,7 +17,7 @@ ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . ; -; Copyright (c) 2010, JD Gascuel. +; Copyright (c) 2010, JD Gascuel ;============================================================================= ; RATIONAL ; @@ -31,7 +31,7 @@ ; (with suitable macros) to make sure they have the same size in both language. ; ; HISTORY -; 2011-01-20: [jDG] Creation. +; 2011-01-20: [jDG] Creation ; ; NOTE ; @@ -46,30 +46,30 @@ #ifdef __18CXX //------------------------------------------------------------------------ - // C-style declarations: -# ifndef TEST_MAIN -# define VAR_UCHAR(n) extern unsigned char n -# define TAB_UCHAR(n,size) extern unsigned char n[size] -# define VAR_UINT(n) extern unsigned short n -# define TAB_UINT(n,size) extern unsigned short n[size] -# else -# define VAR_UCHAR(n) unsigned char n -# define TAB_UCHAR(n,size) unsigned char n[size] -# define VAR_UINT(n) unsigned short n -# define TAB_UINT(n,size) unsigned short n[size] -# endif + // C-Style Declarations: +# ifndef TEST_MAIN +# define VAR_UCHAR(n) extern unsigned char n +# define TAB_UCHAR(n,size) extern unsigned char n[size] +# define VAR_UINT(n) extern unsigned short n +# define TAB_UINT(n,size) extern unsigned short n[size] +# else +# define VAR_UCHAR(n) unsigned char n +# define TAB_UCHAR(n,size) unsigned char n[size] +# define VAR_UINT(n) unsigned short n +# define TAB_UINT(n,size) unsigned short n[size] +# endif #else ;------------------------------------------------------------------------- - ; 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 -#define TAB_UINT(n,size) n res 2*size + ; 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 +#define TAB_UINT(n,size) n res 2*size #endif #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - Define model dimensions. + Define Model Dimensions NUM_COMP is the number of compartiments in the Bühlmann ZH-L16 model, ie 16. NUM_STOPS is the maximum number of stops computed by decoplanning. Note that the deepest stop is roughly limited to 3m * NUM_STOPS @@ -78,20 +78,22 @@ and not reported in TTS summing. NUM_GAS is the number of (potentially) active gas considered during ascent simulation. + NUM_SP is the number of setpoints #endif -#define NUM_COMP 0x10 -#define NUM_STOPS 0x20 -#define NUM_GAS 5 +#define NUM_COMP 0x10 +#define NUM_STOPS 0x20 +#define NUM_GAS 5 +#define NUM_SP 5 #ifdef __18CXX //---- BANK 3 DATA ------------------------------------------------------- - // Gather all data C-code --> ASM-code - // Memory usage: 41 Bytes left + // Gather all Data C-Code --> ASM-Code + // Memory usage: 202 Byte used, 54 Byte free # pragma udata overlay bank3=0x300 #else - ; In ASM, put the same bank, in overlay mode, at the same address -bank3 udata_ovr 0x300 + ; in ASM, put the same bank, in overlay mode, at the same address +bank3 udata_ovr 0x300 #endif VAR_UINT (int_O_desaturation_time); // time until tissues desaturated to 5% remains, in minutes @@ -104,13 +106,17 @@ 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 %, 100% = on M-line of straight Buhlmann + +VAR_UCHAR (char_O_lead_number); // number of the leading tissue 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_warnings); // vector of warnings generated by the deco engine +VAR_UCHAR (char_O_deco_info); // vector of infos generated by the deco engine VAR_UCHAR (char_O_EAD); // equivalent air depth (EAD) of breathed gas VAR_UCHAR (char_O_END); // equivalent narcosis depth (END) of breathed gas @@ -118,43 +124,46 @@ 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, ... | ATTENTION: do not re-arrange these +TAB_UCHAR (char_O_deco_time, NUM_STOPS); // ... duration, and | three arrays relative +TAB_UCHAR (char_O_deco_gas, NUM_STOPS); // ... gas breathed | to each other! 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 -VAR_UCHAR (char_O_deco_warnings); // vector of warnings generated by the deco engine +TAB_UINT (int_O_ascent_volumes, NUM_GAS); // gas volumes needed for ascent in liters +TAB_UINT (int_O_ascent_pres_need, NUM_GAS); // tank pressures needed for ascent in bar -TAB_UINT (int_O_gas_volumes, NUM_GAS); // gas volumes needed in liters -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_ceiling); // ascent boundary in mbar relative pressure, calculated at GF-high 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_breathed_ppO2); // ppO2 actually breathed (= char_O_pure_ppO2 if in OC) +TAB_UINT (int_O_pressure_need, 2); // pressure reading, need by deco calculations, in 0.1 bar +VAR_UINT (int_O_sac_rate); // SAC rate in 0.1 liter/minute + #ifdef __18CXX //---- BANK 4 DATA ------------------------------------------------------- - // Gather all data ASM-code --> C-code - // Memory usage: 183 bytes left + // Gather all Data ASM-Code --> C-Code + // Memory usage: 86 Byte used, 170 byte free # pragma udata overlay bank4=0x400 #else - ; In ASM, put the same bank, in overlay mode, at the same address -bank4 udata_ovr 0x400 + ; 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_UCHAR (char_I_current_gas_type); // type of current gas: (0=Disabled), 1=First, 2=Travel/Normal, 3=Deco/- +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_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 @@ -172,20 +181,20 @@ 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_extra_time); // extra bottom time for fTTs and delayed ascent calculation in minutes 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 -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 - -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 +TAB_UCHAR (char_I_setpoint_cbar, NUM_SP); // setpoints in cbar | ATTENTION: do not change the position of these +TAB_UCHAR (char_I_setpoint_change,NUM_SP); // change depth for the setpoints in meter | two arrays relative to each other! -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 +TAB_UCHAR (char_I_deco_O2_ratio, NUM_GAS); // oxygen ratios of the configured gases, used for deco calc. | ATTENTION: do not change the +TAB_UCHAR (char_I_deco_He_ratio, NUM_GAS); // helium ratios of the configured gases, used for deco calc. | position of these +TAB_UCHAR (char_I_deco_gas_type, NUM_GAS); // type of the configured gases, used for deco calc. | arrays relative to +TAB_UCHAR (char_I_deco_gas_change,NUM_GAS); // change depths of the configured gases, used for deco calc. | each other! -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_tank_size, NUM_GAS * 2); // tank sizes, used for pressure needs and SAC calculations +TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS * 2); // tank fill pressures (in multiples of 10 bar), used to generate warnings VAR_UCHAR (char_I_cc_max_frac_o2); // limiter for maximum O2% in loop VAR_UCHAR (char_I_PSCR_drop); // pSCR parameter drop [%] @@ -196,7 +205,7 @@ 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 +VAR_UCHAR (char_I_gas6_depth); // change depth (MOD) of the manually configured gas in meters 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 @@ -205,3 +214,28 @@ 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_SAC_mode); // SAC calculation mode +VAR_UCHAR (char_I_max_pres_diff); // maximum pressure difference for independent double mode + +TAB_UINT (int_IO_pressure_value,2); // pressure reading, measured pressure, in 0.1 bar | ATTENTION: do not change the position +TAB_UINT (int_I_pressure_drop, 2); // pressure reading, average pressure drop, in 1/160 bar/sec | of these arrays relative to each other! + +TAB_UCHAR (char_I_pressure_gas, 2); // pressure reading, associated gas (1-5) / diluent (6-10), 0 if off +TAB_UCHAR (char_I_pressure_age, 2); // pressure reading, age of data +TAB_UCHAR (char_I_pressure_stat,2); // pressure reading, transmitter status data + +VAR_UCHAR (char_I_backtrack_time); // index (in minutes) of backtrack entries in char_I_backtrack_depth + + +#ifdef __18CXX + //---- BANK 11 DATA ------------------------------------------------------- + // Backtracking Data ASM-Code --> C-Code + // Memory usage: 256 Byte used, 0 byte free +# pragma udata overlay bank11=0xB00 +#else + ; in ASM, put the same bank, in overlay mode, at the same address +bank11 udata_ovr 0xB00 +#endif + +TAB_UCHAR (char_I_backtrack_depth, 0x100); // recorded depths for backtracking in cave mode diff -r 00b24fb4324d -r ca4556fb60b9 src/simulator.asm --- a/src/simulator.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/simulator.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File simulator.asm REFACTORED VERSION V2.98 +; File simulator.asm REFACTORED VERSION V2.99e ; ; Decoplan interface to C model code. ; @@ -23,23 +23,18 @@ #include "gaslist.inc" #include "isr.inc" -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 log_screendump_and_onesecond extern logbook_preloop_tasks extern do_return_demo_planner + extern dive_boot_oc_bail + extern dive_boot_oc + extern dive_boot_cc ;---- Private local variables ------------------------------------------------- @@ -47,8 +42,8 @@ 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_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 @@ -60,39 +55,35 @@ #define decoplan_last_ceiling_shown decoplan_flags,0 #define decoplan_abort decoplan_flags,1 + +simulator CODE + + ;---- Demo deco planner ------------------------------------------------------ global do_demo_planner do_demo_planner: - btfsc FLAG_gauge_mode ; =1: In Gauge mode - goto do_return_demo_planner - btfsc FLAG_apnoe_mode ; =1: In Apnea mode - 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) + btfsc FLAG_gauge_mode ; in gauge mode? + bra do_demo_planner_exit ; YES - abort + btfsc FLAG_apnoe_mode ; in Apnea mode? + bra do_demo_planner_exit ; YES - abort + bcf decoplan_abort ; initialize (clear) abort flag + bcf FLAG_bailout_mode ; 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 + btfss decoplan_abort ; skip recall deco_show_plan if calculations were aborted rcall deco_show_plan +do_demo_planner_exit: goto do_return_demo_planner - global deco_setup deco_setup: - 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 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 deco_setup_cc_diluents ; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation -deco_setup_cont: - ; use ambient conditions for simulation + call dive_boot_oc_bail ; basic setup for all modes + btfsc FLAG_oc_mode ; in OC mode? + call dive_boot_oc ; YES - set up OC mode + btfss FLAG_oc_mode ; in OC mode? + call dive_boot_cc ; NO - set up CCR/pSCR mode + + ; use ambient conditions for deco calculation SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ; copy surface pressure to deco routine movlw deco_distance @@ -103,17 +94,15 @@ 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 + bsf use_agf ; set flag to use alternative GF factors by default + TSTOSS opt_sim_use_aGF ; shall use alternative GF factors? + bcf use_agf ; NO - clear flag again - 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 @@ -131,25 +120,29 @@ ; global deco_planer deco_planer: - call speed_fastest ; Quick ! + call speed_fastest ; quick! + call TFT_ClearScreen ; clear screen to show that calculator is starting up call deco_push_tissues_to_vault ; C-code: back-up state of the real tissues banksel common - rcall deco_setup ; Setup all model parameters. + 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 + movff char_O_deco_status,lo ; bank-safe copy + bcf lo,DECO_PLAN_FLAG ; normal plan mode, + bsf lo,DECO_VOLUME_FLAG ; enable gas volume calculation, and + bcf lo,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff lo,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 + movff char_O_main_status,hi ; bank-safe copy + bcf hi,DECO_TR_FUNCTIONS ; execution of TR functions is not needed in deco calculator mode + bsf hi,DECO_BOTTOM_FLAG ; set bottom flag + bsf hi,DECO_Z_FACTOR_FLAG ; enable use of Z factor by default + TSTOSS opt_ZfactorUse ; shall use Z factor? + bcf hi,DECO_Z_FACTOR_FLAG ; NO - disable again + movff hi,char_O_main_status ; bank-safe copy back deco_planer_redo: ; show deco calculation is in progress @@ -160,66 +153,65 @@ 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 initialization + movff char_O_deco_status,lo ; bank-safe copy + bsf lo,DECO_STATUS_0_FLAG ; configure init ... + bsf lo,DECO_STATUS_1_FLAG ; ... state, + movff lo,char_O_deco_status ; bank-safe copy back -;---- Add delay at surface, if needed ---------------------------------------- +;---- add delay at surface, if requested ------------------------------------- banksel char_I_dive_interval tstfsz char_I_dive_interval call deco_calc_dive_interval ;---- Dive loop -------------------------------------------------------------- - ; Compute dive ambient conditions + ; compute dive ambient conditions banksel char_I_bottom_depth movf char_I_bottom_depth,W mullw .100 - movlw LOW(.1000) + 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 + banksel common movff char_I_bottom_time,char_I_sim_advance_time - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H + clrf TMR5L ; restart timer used to preempt stops calculation + clrf TMR5H ; - call deco_calc_hauptroutine ; C-code: initialization + complete bottom time part + call deco_calc_hauptroutine ; initialization, complete bottom time part and initial ascent 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 - ; YES - switch to OC gas + btfss FLAG_bailout_mode ; doing a bailout deco plan? + bra deco_planer_loop ; NO - keep gases and go on + ; YES - switch to OC gas and restart deco plan - ; reconfigure the deco engine for delayed ascent mode +;---- BAILOUT: Switch to OC gases for ascent ----------------------------------- + + ; reconfigure the deco engine for delayed ascent & bailout mode and start a new calculation cycle movff char_O_deco_status,lo ; bank-safe copy bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation + bsf lo,DECO_BAILOUT_FLAG ; set bailout mode flag to allow gas changes on initial ascent + bcf lo,DECO_STATUS_0_FLAG ; configure start of a new... + bcf lo,DECO_STATUS_1_FLAG ; ... deco calculation cycle 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 + ; reconfigure the deco engine for bailout ascent needs + movff char_O_main_status,hi ; bank-safe copy + bcf hi,DECO_BOTTOM_FLAG ; clear bottom flag + movff hi,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 + call dive_boot_oc ; configure deco engine for OC mode ;---- Wait until status reaches zero ------------------------------------------- -deco_planer_finishing: - call deco_calc_hauptroutine ; C-code: Simulate more dive time to trigger the deco calculations +deco_planer_loop: + clrf TMR5L ; restart timer used to preempt stops calculation + clrf TMR5H ; + call deco_calc_hauptroutine ; simulate more dive time to trigger the deco calculations banksel common btfss switch_left ; check if left button was pressed @@ -227,11 +219,9 @@ 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_main_status,hi ; working copy of char_O_main_status in bank common + btfss hi,DECO_COMPLETED_NORM ; calculations completed? + bra deco_planer_loop ; NO - needs more computation cycles ;---- Done: add CNS from decoplan, and restore tissues deco_planer_finishing_2: @@ -263,13 +253,13 @@ lfsr FSR2,buffer - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meter, 1=Feet bra deco_plan_show_nstd_stop_metric - movff hi,up ; backup hi (minutes) - WIN_LEFT .85 + movff hi,ul ; back-up hi (minutes) + WIN_LEFT .80 movf lo,W ; lo = m - mullw .100 ; PRODL:PRODH = mbar + mullw .100 ; PRODL:PRODH = hPa movff PRODL,lo movff PRODH,hi ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... @@ -292,76 +282,62 @@ 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 + bsf ignore_digit4 ; only full feet output_16 - bcf leftbind - STRCAT_PRINT "ft " - movff up,hi ; restore hi (minutes) + STRCAT_PRINT "ft" + movff ul,hi ; restore hi (minutes) 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 .85 + output_8 ; outputs into postinc2 + STRCAT_PRINT "m" deco_plan_show_nstd_stop_common: ;---- Print duration ------------------------------------------------- WIN_LEFT .135 lfsr FSR2,buffer - - 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 hi & lo - movff hi,lo - movwf hi + output_99 ; stop entries are 99 min max. + STRCAT_PRINT "'" ;--------------------------------------------------------------------- - ; Draw the bar graph used for deco stops (deco plan in simulator or dive). + ; 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. + movwf win_width+0 ; column max width clrf win_width+1 - ; Draw used area (hi = minutes): - movlw .16 ; Limit length (16min) - cpfslt hi - movwf hi - movff hi,win_bargraph ; Active width, the rest is cleared. + ; Draw used area (lo = minutes): + movlw .16 ; limit length to max. column width + cpfslt lo + movwf lo + movff lo,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 + 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 + movf win_top,W ; get back from bank0 + sublw .239 ; bottom row in planning movwf win_height - WIN_LEFT .85 ; Full dive menu width + 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_color1 ; fill with black clrf win_color2 goto TFT_box ; and return @@ -372,9 +348,9 @@ ; decoplan_page = page number. ; deco_show_plan_page: - bcf win_invert ; Reset invert flag + bcf win_invert ; reset invert flag - ;---- Is there deco stops ? ------------------------------------------ + ;---- Are there deco stops ? ------------------------------------------ movff char_O_first_deco_depth,WREG iorwf WREG bnz deco_plan_show_1 @@ -382,15 +358,25 @@ ;---- No Deco -------------------------------------------------------- call TFT_standard_color TEXT_SMALL .80, .0, tNoDeco + + ; output of remaining NDL time + WIN_SMALL .80, .50 ; same line as bottom time + movff char_O_nullzeit,lo ; remaining NDL at end of bottom time + output_8 + PUTC "'" + PUTC " " + STRCAT_TEXT_PRINT tNDLleft ; "left" + bsf decoplan_last_ceiling_shown return deco_plan_show_1: - lfsr FSR0,char_O_deco_depth ; Initialize indexed addressing. + 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 + movlw .24 + movwf win_top ; and row = 0 at position 24 ; Read stop parameters, indexed by decoplan_index and decoplan_page movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index @@ -399,18 +385,18 @@ addwf PRODL,W movwf decoplan_gindex ; --> decoplan_gindex - bcf decoplan_last_ceiling_shown ; Not finished yet... + bcf decoplan_last_ceiling_shown ; not done 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 - done ; 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. + bz deco_plan_show_99 ; depth == 0 : done ; Display the stop line rcall deco_plan_show_stop @@ -424,23 +410,23 @@ ; Max number of lines/page reached ? movlw .8 ; 8 lines/page in deco plan cpfseq decoplan_index - bra deco_plan_show_2 ; NO: loop + 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... + bz deco_plan_show_99 ; end of list ; Display the message "more..." - rcall deco_plan_show_clear_bottom ; Clear from next line + rcall deco_plan_show_clear_bottom ; clear from next line 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 + bsf decoplan_last_ceiling_shown ; nothing more in table to display + rcall deco_plan_show_clear_bottom ; clear from next line return ;----------------------------------------------------------------------------- @@ -451,17 +437,17 @@ clrf decoplan_page call TFT_ClearScreen WIN_COLOR color_greenish - btfsc is_bailout + btfsc FLAG_bailout_mode 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 +deco_show_plan_bail_title: + TEXT_SMALL .1,.1, tDiveBailout deco_show_plan2: call TFT_standard_color ;---- Display Plan Parameters WIN_SMALL .0,.25 - STRCPY "Int:" + STRCPY "Int.:" movff char_I_dive_interval,lo bsf leftbind output_8 @@ -470,17 +456,17 @@ WIN_SMALL .0,.50 STRCPY_TEXT tBtTm_short movff char_I_bottom_time,lo - bsf leftbind + bsf leftbind output_8 - bcf leftbind + bcf leftbind STRCAT_PRINT "'" WIN_SMALL .0,.75 STRCPY_TEXT tDepth PUTC ":" movff char_I_bottom_depth,lo - bsf leftbind + bsf leftbind output_8 - bcf leftbind + bcf leftbind STRCAT_PRINT "m" WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors @@ -507,7 +493,7 @@ WIN_SMALL .25,.105 movff char_I_saturation_multiplier,lo output_8 - STRCAT "/" + STRCAT "/" movff char_I_desaturation_multiplier,lo output_8 STRCAT_PRINT "" @@ -515,20 +501,20 @@ deco_show_plan_m1: call TFT_standard_color ; clean-up from warnings - ;---- Get Model + ;---- get Model movff char_I_deco_model,WREG iorwf WREG - bz deco_show_plan_m2 + 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 + output_8 STRCAT "/" movff char_I_GF_High_percentage,lo - output_99x + output_8 STRCAT_PRINT "" deco_show_plan_m2: @@ -564,14 +550,14 @@ 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 + 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 + call TFT_color_code_cns ; color-code CNS output bsf leftbind output_16_3 ; limit to 999 and display only (0-999) bcf leftbind @@ -590,22 +576,22 @@ 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? + 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 + ; all stops shown -;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- +;----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 + bsf FLAG_bailout_mode ; YES - redo 2nd deco-plan in bailout mode rcall deco_planer_redo ; redo plan computation btfss decoplan_abort ; shall we abort? @@ -613,42 +599,44 @@ return ; YES -;---- In OC+BAIL modes, show the gas usage special page ----------------------- +;---- 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 row_pos ; Row for gas list is .25+.25 - clrf gas_counter ; Gas counter - lfsr FSR0,int_O_gas_volumes ; Initialize indexed addressing. + movwf row_pos ; row for gas list is .25+.25 + clrf gas_counter ; gas counter + lfsr FSR0,int_O_ascent_volumes ; initialize indexed addressing - WIN_LEFT .80 ; Set column + WIN_LEFT .80 ; set column call TFT_standard_color + bcf FLAG_diluent_setup ; steer gaslist_strcat_gas to use OC gases + simulator_show_decoplan5_loop: - movff gas_counter,PRODL ; Copy to PRODL first - incf gas_counter,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) 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:" + 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 row_pos,F ; Increase row position - movff row_pos,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? + incf WREG ; > 65535 ? bnz simulator_show_decoplan5_1 ; NO STRCAT_PRINT ">65500" ; YES bra simulator_show_decoplan5_2 @@ -656,27 +644,25 @@ simulator_show_decoplan5_1: PUTC ":" bsf leftbind - output_16 ; No decimal anymore. + 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 + cpfseq gas_counter ; all gases shown? + bra simulator_show_decoplan5_loop ; NO - loop 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 ":" + WIN_SMALL .120,.175 + STRCPY_TEXT_PRINT tLiterLong ; "Liter" + call TFT_standard_color call logbook_preloop_tasks @@ -689,13 +675,12 @@ simulator_show_decoplan5_3a: 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 + bcf FLAG_bailout_mode ; back to normal + 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? + 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/sleepmode.asm --- a/src/sleepmode.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/sleepmode.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File sleepmode.asm Version 2.98 +; File sleepmode.asm Version 2.99e ; ; Sleepmode ; @@ -40,19 +40,23 @@ ENDC ; used: 5 byte, remaining: 11 byte -gui CODE +slmode CODE ;============================================================================== global sleeploop -sleeploop: ; enter sleepmode! +sleeploop: ; enter sleep mode 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) + + IFDEF _screendump + bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (screen dump) + ENDIF + call disable_rs232 ; USB off call vault_decodata_into_eeprom ; store deco data call ext_flash_enable_protection ; enable write protection for external flash @@ -63,15 +67,15 @@ 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 ; inhibit sensor interrupts + clrf ADCON0 ; power-down ADC module sleeploop_pre: - bcf deep_sleep ; Normal sleepmode + bcf deep_sleep ; normal sleep mode call I2C_sleep_accelerometer call I2C_sleep_compass - btfss analog_switches - bra sleeploop_loop ; no analog switches + btfss analog_switches ; OSTC with analog switches? + bra sleeploop_loop ; NO - no analog switches bsf power_sw1 btfss power_sw1 @@ -79,19 +83,19 @@ bsf power_sw2 btfss power_sw2 bra $-4 - movlw .4 ; Wait for button circuity - movwf sm_temp1 ; Used as temp - bcf onesecupdate + movlw .4 ; wait for button circuity + movwf sm_temp1 ; used as temp + bcf onesecupdate sleeploop_pre1: rcall sleepmode_sleep - btfss onesecupdate ; Wait 1 second + 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 sm_temp1 ; used as temp sleeploop_pre2: call get_analog_switches @@ -106,33 +110,33 @@ 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 + 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. btfss sleepmode ; wake up? (This bit will be set in other routines) - goto restart ; yes + 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 35 ms (every 62.5ms timer7 wakeup) ; Any button pressed in sleep? -; btfsc switch_left +; btfsc switch_left ; rcall onesec_sleep1a ; 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 something happens @@ -140,39 +144,39 @@ 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 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 + rcall deepsleep_get_accel ; read accelerometer into WREG + movwf sm_temp1 ; store init value deepsleep_loop: btfsc onesecupdate ; one second in sleep? - rcall onesec_deepsleep ; check accelerometer + rcall onesec_deepsleep ; YES - check accelerometer btfsc onesecupdate ; one second in sleep? - rcall onesec_sleep ; check switches, check pressure sensor, etc. + rcall onesec_sleep ; YES - check switches, check pressure sensor, etc. rcall sleepmode_sleep - btfss deep_sleep ; Enter normal sleepmode? + btfss deep_sleep ; enter normal sleep mode? bra sleeploop_pre ; Yes bra deepsleep_loop ; do loop until something happens onesec_deepsleep: - 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! + 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 sm_temp1,WREG @@ -187,7 +191,7 @@ 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_RX_accelerometer ; read accelerometer call I2C_sleep_compass ; required for compass1 call I2C_sleep_accelerometer ; required for compass2 movff accel_DZ+0,WREG @@ -201,10 +205,10 @@ onemin_sleep: btfsc onehourupdate ; one hour in sleep? - rcall onehour_sleep ; Yes + rcall onehour_sleep ; YES btfsc battery_gauge_available - call get_battery_voltage ; Check for charger + call get_battery_voltage ; check for charger ;---- 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 @@ -269,10 +273,10 @@ onesec_sleep: btfsc oneminupdate ; one minute in sleep? - rcall onemin_sleep ; do one-minute tasks, e.g. calculate desaturation + rcall onemin_sleep ; YES - do one-minute tasks, e.g. calculate desaturation btfsc battery_gauge_available - call get_battery_voltage ; Check for charger + call get_battery_voltage ; check for charger incf sm_timer1,F ; counts to #test_pressure_in_sleep (10) movlw d'10' @@ -287,73 +291,65 @@ 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 + bra onesec_sleep1 ; no wake-up with cR hardware btfsc vusb_in ; USB plugged in? - bra onesec_sleep1a ; Yes, skip button checks, wake up! + bra onesec_sleep1a ; YES - skip button checks, wake up onesec_sleep1: - bcf onesecupdate ; all done. - ; Check switches - btfsc switch_left - bra onesec_sleep1a - btfsc switch_right - bra onesec_sleep1a + bcf onesecupdate ; clear flag + btfsc switch_left ; left switch pressed? + bra onesec_sleep1a ; YES + btfsc switch_right ; right switch pressed? + bra onesec_sleep1a ; YES + return ; NO to both - done -; No button pressed -; 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 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 + 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 +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 ; clear pressure average registers clrf amb_pressure_avg+1 - clrf temperature_avg+0 + clrf temperature_avg+0 ; clear temperature average registers clrf temperature_avg+1 - call get_temperature_start ; and start temperature integration (73,5us) + call get_temperature_start ; start temperature integration (73.5 us) 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. + rcall sleepmode_sleep ; wait at least 35 ms (every 62.5 ms timer7 wakeup) + rcall sleepmode_sleep ; wait at least 35 ms (every 62.5 ms 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) + rcall sleepmode_sleep ; wait at least 35 ms (every 62.5 ms timer7 wakeup) + rcall sleepmode_sleep ; wait at least 35 ms (every 62.5 ms timer7 wakeup) + banksel isr_backup ; back to bank0 ISR data + call get_pressure_value ; state2: get pressure (51 us) + call calculate_compensation ; calculate temperature compensated pressure (27 us) 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 + 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 -> 2 seconds @ 32768 Hz, not synced movwf T7CON sleep sleep - clrf T7GCON ; Reset Timer7 Gate Control register - movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced + clrf T7GCON ; reset timer7 gate control register + movlw b'10001001' ; 1:1 prescaler -> 2 seconds @ 32768Hz, synced movwf T7CON - banksel common ; Bank1 + banksel common ; back to bank1 return END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/sleepmode.inc --- a/src/sleepmode.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/sleepmode.inc Thu Nov 22 19:47:26 2018 +0100 @@ -8,4 +8,4 @@ ; HISTORY ; 2011-08-12 : [mH] moving from OSTC code - extern sleeploop + extern sleeploop diff -r 00b24fb4324d -r ca4556fb60b9 src/start.asm --- a/src/start.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/start.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File start.asm REFACTORED VERSION V2.98 +; File start.asm REFACTORED VERSION V2.99e ; ; Startup subroutines ; @@ -9,10 +9,10 @@ ; HISTORY ; 2011-08-06 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; mandatory header #include "ms5541.inc" #include "isr.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "shared_definitions.h" ; mailbox from/to p2_deco.c #include "eeprom_rs232.inc" #include "math.inc" #include "tft.inc" @@ -28,9 +28,7 @@ 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 @@ -39,36 +37,48 @@ extern do_new_battery_select extern use_old_batteries extern use_old_prior_209 + extern get_first_gas_to_WREG + extern get_first_dil_to_WREG + extern option_cleanup_oCCRMode_pSCR + extern option_cleanup_oCCRMode_CCR + + IFDEF _rx_functions + extern option_cleanup_oTrMode_CCR + extern option_cleanup_oTrMode_no_CCR + ENDIF + ;============================================================================= -; Reset vector: What to do on device wake-up and hard reset. +; Reset Vector: entry point on device wake-up and hard reset ; reset_v code 0x00000 ; goto start - goto 0x1FF00 ; Bootloader + goto 0x1FF00 ; bootloader - ORG 0x00004 ; Needed for second-level bootloader + ORG 0x00004 ; needed for second-level bootloader goto start ;============================================================================= -boot CODE +boot CODE + +;============================================================================= global start start: - lfsr FSR0,0x000 ; Clear rambank 0-14 + lfsr FSR0,0x000 ; clear ram-banks 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 ; NO - loop - call init_ostc + call init_ostc ; initialize hardware (ports, timers, etc.) - ; Get button type from Bootloader-Info + ; get button type from Bootloader-Info movlw .16 - movff WREG,analog_counter ; init averaging + movff WREG,analog_counter ; initialize averaging bsf analog_switches movlw 0x7C movwf TBLPTRL @@ -76,7 +86,7 @@ movwf TBLPTRH movlw 0x01 movwf TBLPTRU - TBLRD*+ ; Reads 0x07 for analog buttons + TBLRD*+ ; reads 0x07 for analog buttons movlw 0x07 cpfseq TABLAT bcf analog_switches @@ -86,23 +96,23 @@ movwf EEADR 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 + ; 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 ; 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 + ; 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 @@ -120,10 +130,10 @@ 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 air pressure is lower then "allowed" air pressure, ok! + btfss neg_flag ; is 1080 mbar < amb_pressure ? + bra start_copy_pressure ; NO - current air pressure is lower then "allowed" air pressure, ok - ; not ok! Overwrite with max. "allowed" air pressure + ; 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 @@ -142,9 +152,7 @@ movff int_I_pres_respiration+0,int_I_pres_surface+0 ; surface pressure movff int_I_pres_respiration+1,int_I_pres_surface+1 - 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) + 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 @@ -155,8 +163,8 @@ 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 + 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 @@ -164,32 +172,57 @@ bcf menubit ; clear menu flag - ; Check for Power-on reset here + ; 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 + 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 + btfsc RCON,POR ; was this a power-on reset? + bsf use_old_batt_flag ; NO - call lt2942_get_status ; Check for gauge IC + call lt2942_get_status ; check for gauge IC btfss battery_gauge_available ; cR or 2 hardware? - bra power_on_return2 ; no + bra check_firmware_new ; NO - skip next + movlw .30 ; YES - reset button sensitivity + movff WREG,opt_cR_button_right + movff WREG,opt_cR_button_left ; reset on power-on reset + call piezo_config ; configure buttons + call piezo_config ; configure buttons (2 times) + +check_firmware_new: + call TFT_boot ; initialize TFT (includes clear screen) + clrf CCPR1L ; backlight off + + WIN_TOP .40 + WIN_LEFT .10 + TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block ; show heinrichsweikamp logo - 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) + call TFT_standard_color + + WIN_SMALL .20,.100 + STRCPY_PRINT "Update successful!" ; hard coded since language switch does not work here -power_on_return2: -; check firmware and reset Custom Functions after an update + WIN_SMALL .20,.140 + STRCPY "New Firmware: " + call TFT_cat_firmware ; show firmware version x.y and color-code if outdated + STRCAT_PRINT "" ; finalize output + bcf win_invert ; reset inverted output if firmware is outdated + call TFT_standard_color ; reset color if firmware is outdated + + WIN_SMALL .60,.180 + call TFT_cat_beta_release ; if it is a beta version, show "BETA" + issue, else "Release" + STRCAT_PRINT "" ; finalize output + call TFT_standard_color ; reset color + + call TFT_Display_FadeIn ; display resulting surface screen + + ; check if a new firmware was loaded, if yes reset Custom Function oPressureAdjust movlw d'1' movwf EEADR ; =1 movwf EEADRH ; =1 @@ -198,53 +231,25 @@ incf EEADR,F ; set to 0x102 call read_eeprom ; read current version y movff EEDATA,hi - clrf EEADRH ; Reset EEADRH + clrf EEADRH ; reset EEADRH movlw softwareversion_x - cpfseq lo ; 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_new4 ; is not equal -> reset CF and store new version in EEPROM movlw softwareversion_y - 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 + cpfseq hi ; compare version y + bra check_firmware_new4 ; is not equal -> reset CF and store new version in EEPROM + bra check_firmware_new5 ; 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 - 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: " - movlw softwareversion_x - movwf lo - bsf leftbind - output_8 - PUTC "." - movlw softwareversion_y - movwf lo - output_99x - bcf leftbind - STRCAT_PRINT "" ; Print second row - call TFT_Display_FadeIn ; Display resulting surface screen. - - +check_firmware_new4: ; place "after-update reset" here... lfsr FSR0,oPressureAdjust - call option_reset ; Reset FSR0 option to factory default. + call option_reset ; reset oPressureAdjust to factory default lfsr FSR0,oPressureAdjust - call option_save ; Save in EEPROM + call option_save ; save new value of oPressureAdjust in EEPROM +check_firmware_new5: rcall backup_flash_page ; backup the first 128 bytes from flash to EEPROM movlw d'1' ; store current version in EEPROM @@ -252,35 +257,34 @@ movwf EEADRH ; =1 movlw softwareversion_x movwf EEDATA - call write_eeprom ; write version x + call write_eeprom ; write version, major number incf EEADR,F ; set to 0x102 movlw softwareversion_y movwf EEDATA - call write_eeprom ; write version y - clrf EEADRH ; Reset EEADRH + call write_eeprom ; write version, minor number + clrf EEADRH ; reset EEADRH - movlw .7 - movwf lo -check_firmware_new2: - ; Wait 1 second - bcf onesecupdate - btfss onesecupdate - bra $-2 - decfsz lo,F ; Wait 10 seconds... - bra check_firmware_new2 + ; wait 10 seconds + movlw .10 ; load loop counter +check_firmware_new6: + call wait_1s ; wait (about) 1 second + decfsz WREG,W ; YES - decrement loop counter, did it became zero? + bra check_firmware_new6 ; NO - loop + ;bra restart ; YES - proceed with restart + global restart restart: - clrf STKPTR ; Never return from here + clrf STKPTR ; never return from here clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + bcf PORTC,2 ; pull PWM out to GND - 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 @@ -292,73 +296,102 @@ clrf flag8 clrf flag9 clrf flag10 - ; Do not clear flag11 (Sensor calibration and charger status) + ; do not clear flag11 (sensor calibration and charger status) clrf flag12 - ; Do not clear flag13 (Important hardware flags) + ; do not clear flag13 (important hardware flags) clrf flag14 - clrf hardware_flag ; hardware descriptor flag + clrf flag15 + clrf flag16 + clrf flag17 + + clrf cvt_flags + + clrf tft_update_flags+0 + clrf tft_update_flags+1 + clrf tft_update_flags+2 + + clrf hardware_flag1 ; hardware descriptor 1 + ; hardware_flag2 ; hardware descriptor 2 - do not clear here! bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! - ; configure hardware_flag byte - bsf ambient_sensor ; Set flag - bsf optical_input ; Set flag + ; configure hardware descriptor 1 + bcf tft_power ; inverted, here needed for I2C_probe_OSTC_rx, to wake-up RX circuity + bsf ambient_sensor ; set flag + bsf optical_input ; set flag - call lt2942_get_status ; Check for gauge IC + 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 + bra restart2 ; NO + call lt2942_init ; YES - initialize 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 + 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. + btfss PORTF,2 ; light sensor available? + bsf ambient_sensor ; YES banksel 0xF16 - bsf ANCON0,7 ; AN7 Analog again + bsf ANCON0,7 ; AN7 analog again banksel common - bsf lightsen_power ; Power-up ambient light sensor again + bsf lightsen_power ; power-up ambient light sensor again restart2: btfsc vusb_in bra restart3 ; USB (and powered on) - bcf PORTE,0 ; Start comms + bcf PORTE,0 ; start comms WAITMS d'1' btfss vusb_in bra restart3 ; USB (and powered off) - bsf ble_available ; ble available + 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 + 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: +restart4: + IFDEF _rx_functions + WAITMS d'200' + call I2C_probe_OSTC_rx ; set ostc_rx_present flag if this is an OSTC TR model + + ; The hardware descriptor is now: ; 0x11: 2 with BLE - ; 0x13: 2 with BLE & ambient + ; 0x13: +/2 with BLE & ambient ; 0x05: cR ; 0x0A: 3 ; 0x1A: 3 with BLE + ; 0x33: 2 TR -restart4: - ; Select high altitude (Fly) mode? + btfss ostc_rx_present ; OSTC TR detected? + bra restart5 ; NO + movff opt_TR_mode,WREG ; YES - get user-selected TR mode + tstfsz WREG ; TR functions switched on? + bsf FLAG_tr_enabled ; YES - switch on displays and calculation functions + ENDIF + + ; configure hardware descriptor 2 + ; flag screen_type will be configured on each call of TFT_boot + ; flags compass_type & compass_type2 will be configured on each call of I2C_init_compass + ; flag analog_switches will be configured directly after hard start (in start:) + +restart5: + ; 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 movwf sub_a+1 - movlw LOW high_altitude_threshold ; hard-wired 880mbar + movlw LOW high_altitude_threshold ; hard-wired 880 hPa 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 neg_flag ; result negative (ambient > 880 hPa)? + bsf high_altitude_mode ; NO - set flag btfss analog_o2_input bsf TRISB,3 @@ -366,25 +399,25 @@ bsf TRISG,0 call ext_flash_disable_protection ; disable write protection for external flash - bsf flip_screen ; flip 180° - TSTOSS opt_flip_screen ; =1: Flip the screen - bcf flip_screen ; normal orientation + bsf flip_screen ; select screen flip 180° + TSTOSS opt_flip_screen ; shall actually flip? (=1: flip the screen) + bcf flip_screen ; NO - revert to normal orientation btfsc use_old_batt_flag ; =1: load old battery information after power-on reset - goto use_old_batteries ; returns to "surfloop"! + goto use_old_batteries ; returns to surface loop btfsc RCON,POR ; was this a power-on reset? - goto surfloop ; jump to surface loop! + goto surfloop ; YES - 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"! + goto do_new_battery_select ; returns to surface loop ;============================================================================= ; 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 dive mode as well + call option_restore_all ; restore everything from EEPROM ; Setup sampling rate movlw .2 @@ -395,13 +428,31 @@ movwf samplingrate restart_set_modes_and_flags1: - bcf twosecupdate ; to have divemode routines in sync + bcf FLAG_gauge_mode 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_oc_mode + bcf FLAG_ccr_mode bcf FLAG_pscr_mode + bcf FLAG_bailout_mode call disable_ir_s8 ; IR off + IFDEF _cave_mode + bsf FLAG_cave_mode ; enable cave mode by default + movff opt_calc_asc_gasvolume,WREG ; get gas needs calculation mode (0=off, 1=on, 2=cave mode) + xorlw .2 ; coding for cave mode + tstfsz WREG ; cave mode enabled? + bcf FLAG_cave_mode ; NO - disable cave mode again + bcf FLAG_cave_mode_shutdown ; clear flag for cave mode shutdown + bcf FLAG_dive_turned ; clear flag for dive turned + bcf gas_needs_mode_last ; set last gas calculation results as direct ascent needs + ENDIF + + ; Initialize active_gas and active_dil for surface mode pressure display + call get_first_gas_to_WREG + movwf active_gas + call get_first_dil_to_WREG + movwf active_dil + ; 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 @@ -417,30 +468,23 @@ bra restart_set_modes_and_flags2 ; OC Mode + bsf FLAG_oc_mode ; =1: OC mode active + IFDEF _rx_functions + call option_cleanup_oTrMode_no_CCR ; revert TR mode from 'CCR Dil+O2' to 'on' + ENDIF 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 (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 + ; CCR Mode bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active - call enable_ir_s8 ; Enable IR/S8-Port + call option_cleanup_oCCRMode_CCR ; revert CCR mode 'Sensor' to 'fixed SP' if no sensor interface available + IFDEF _rx_functions + call option_cleanup_oTrMode_CCR ; revert TR mode from 'ind.double' to 'on' + ENDIF + call enable_ir_s8 ; enable IR/S8 port return restart_set_modes_and_flags3: @@ -448,41 +492,35 @@ bra restart_set_modes_and_flags4 ; Gauge Mode - bsf FLAG_gauge_mode ; =1: In Gauge mode + bsf FLAG_gauge_mode ; =1: in gauge mode + IFDEF _rx_functions + call option_cleanup_oTrMode_no_CCR ; revert TR mode from 'CCR Dil+O2' to 'on' + ENDIF 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 + bsf FLAG_apnoe_mode ; =1: in Apnea mode + IFDEF _rx_functions + call option_cleanup_oTrMode_no_CCR ; revert TR mode from 'CCR Dil+O2' to 'on' + ENDIF + return ; start in surface mode restart_set_modes_and_flags5: - ; PSCR Mode - btfsc analog_o2_input ; cR? - bra restart_set_modes_and_flags5b ; Yes, skip mode check - btfsc optical_input ; 3 - bra restart_set_modes_and_flags5b ; Yes, skip mode check - - ; Make sure Sensor is not selected - ; opt_ccr_mode must be <> 1 (=0: calculated ppO2, =1: Sensor, =2: Auto SP - not valid in pSCR, too) - banksel opt_ccr_mode - movlw .1 - cpfseq opt_ccr_mode ; = Sensor? - bra restart_set_modes_and_flags5b ; No - clrf opt_ccr_mode ; Yes, reset to calculated ppO2 - -restart_set_modes_and_flags5b: - banksel opt_ccr_mode - bcf opt_ccr_mode,1 ; in pSCR mode only calculated or Sensor, not 2 = Auto SP allowed - banksel common - bsf FLAG_pscr_mode - call enable_ir_s8 ; Enable IR/S8-Port - return ; start in Surfacemode + ; pSCR Mode + bsf FLAG_pscr_mode ; set pSCR mode flag + call option_cleanup_oCCRMode_pSCR ; in pSCR mode, revert AutoSP (2) to calculated SP (0), additionally revert Sensor to fixed SP if no sensor interface available + IFDEF _rx_functions + call option_cleanup_oTrMode_no_CCR ; revert TR mode from 'CCR Dil+O2' to 'on' + ENDIF + call enable_ir_s8 ; enable IR/S8 port + return ; start in surface mode -; backup the first 128bytes from flash to EEPROM +; backup the first 128 bytes from flash to EEPROM backup_flash_page: ; Start address in internal flash movlw 0x00 @@ -491,20 +529,20 @@ movwf TBLPTRU movlw .128 - movwf lo ; Byte counter + movwf lo ; byte counter clrf EEADR movlw .3 - movwf EEADRH ; Setup backup address + 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 + 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. + decfsz lo,F ; 128 byte done? + bra backup_flash_loop ; NO - loop + clrf EEADRH ; reset EEADRH + return ; done END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/strings.asm --- a/src/strings.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/strings.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,217 +1,231 @@ ;============================================================================= ; -; File strings.asm Version 2.92 = 2.26 +; File strings.asm V2.99c ; ; Implementation code various string functions. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2010-12-02 : [jDG] Creation... +; 2010-12-02 : [jDG] Creation ; ; See strings.inc for doc and public calling macros. #include "hwos.inc" #include "varargs.inc" - extern aa_wordprocessor + extern aa_wordprocessor + +strings CODE -basic CODE ;============================================================================= -; Variants that call word_processor at the end: - global strcpy_block_print +; Variants that call word_processor at the end + + global strcpy_block_print strcpy_block_print: - lfsr FSR2, buffer - global strcat_block_print + lfsr FSR2,buffer + global strcat_block_print strcat_block_print: - clrf PRODL,A - bra strings_common + clrf PRODL,A + bra strings_common + -; Variants that do not call word_processor at end: - global strcpy_block +; Variants that do not call word_processor at end + + global strcpy_block strcpy_block: - lfsr FSR2, buffer - global strcat_block + lfsr FSR2,buffer + global strcat_block strcat_block: - setf PRODL,A - -; Common part: append the string from PROM return address: -strings_common: - VARARGS_BEGIN + setf PRODL,A + + +; Common part: append the string from PROM return address - rcall strcat_prom +strings_common: + VARARGS_BEGIN + rcall strcat_prom + VARARGS_ALIGN + VARARGS_END - VARARGS_ALIGN - VARARGS_END - - btfsc PRODL,0,A ; Should we print afterward ? - return ; NO: then return straight away. - goto aa_wordprocessor ; ELSE: print it... + btfsc PRODL,0,A ; ahall we print afterwards? + return ; NO - then return straight away + goto aa_wordprocessor ; YES - print it... ;============================================================================= -; Copy multi-lingual text from FSR1 12bit pointers, to buffer. +; Copy multi-lingual text from FSR1 12 bit pointer to buffer ; -; Input: FSR1 = 12bit pointer to multi-lingual text. -; Output: FSR2 points to closing null byte in buffer. -; Trashed: TBLPTR, TABLAT. - global strcpy_text +; Input: FSR1 = 12 bit pointer to multi-lingual text +; Output: FSR2 pointing to closing null byte in buffer +; Trashed: TBLPTR, TABLAT + + global strcpy_text strcpy_text: - rcall text_get_tblptr - bra strcpy_prom + rcall text_get_tblptr + bra strcpy_prom -; Copy then print multi-lingual text from FSR1 12bit pointers, to buffer. +; Copy and print multi-lingual text from FSR1 12 bit pointer to buffer ; -; Input: FSR1 = 12bit pointer to multi-lingual text. -; Output: FSR2 points to closing null byte in buffer. -; Trashed: TBLPTR, TABLAT. - global strcpy_text_print +; Input: FSR1 = 12 bit pointer to multi-lingual text +; Output: FSR2 pointing to closing null byte in buffer +; Trashed: TBLPTR, TABLAT + + global strcpy_text_print strcpy_text_print: - rcall text_get_tblptr - bra strcpy_prom_print + rcall text_get_tblptr + bra strcpy_prom_print -; Append multi-lingual text from FSR1 12bit pointers, to buffer at FRS2. +; Append multi-lingual text from FSR1 12 bit pointers to buffer at FRS2 ; -; Input: FSR1 = 12bit pointer to multi-lingual text. -; FSR2 = Current position in buffer. -; Output: FSR2 points to closing null byte in buffer. -; Trashed: TBLPTR, TABLAT. - global strcat_text +; Input: FSR1 = 12 bit pointer to multi-lingual text +; FSR2 = current position in buffer +; Output: FSR2 pointing to closing null byte in buffer +; Trashed: TBLPTR, TABLAT + + global strcat_text strcat_text: - rcall text_get_tblptr - bra strcat_prom + rcall text_get_tblptr + bra strcat_prom -; Append then print multi-lingual text from FSR1 12bit pointers, to buffer at FRS2. +; Append and print multi-lingual text from FSR1 12 bit pointers to buffer at FRS2 ; -; Input: FSR1 = 12bit pointer to multi-lingual text. -; FSR2 = Current position in buffer. -; Output: FSR2 points to closing null byte in buffer. -; Trashed: TBLPTR, TABLAT. - global strcat_text_print +; Input: FSR1 = 12 bit pointer to multi-lingual text +; FSR2 = current position in buffer +; Output: FSR2 pointing to closing null byte in buffer +; Trashed: TBLPTR, TABLAT + + global strcat_text_print strcat_text_print: - rcall text_get_tblptr - bra strcat_prom_print + rcall text_get_tblptr + bra strcat_prom_print ;============================================================================= -; Get pointer to multilingual texl in TBLPTR +; Get pointer to multilingual text in TBLPTR ; -; Input: FSR1 = 12bits of text handle. -; opt_language = current language. -; Output: TBLPTR = 24bits of PROM address. -; - global text_get_tblptr +; Input: FSR1 = 12 bit text handle +; opt_language = current language +; Output: TBLPTR = 24 bit PROM address + + global text_get_tblptr text_get_tblptr: - extern text_1_base - movlw UPPER(text_1_base) ; Complete 12bits to 24bits address. - movwf TBLPTRU - movlw HIGH(text_1_base) - andlw 0xF0 - iorwf FSR1H,W - movwf TBLPTRH - movff FSR1L,TBLPTRL - + extern text_1_base + movlw UPPER(text_1_base) ; complete 12 bit address to 24 bit address + movwf TBLPTRU + movlw HIGH(text_1_base) + andlw 0xF0 + iorwf FSR1H,W + movwf TBLPTRH + movff FSR1L,TBLPTRL - movff opt_language,WREG ; Get lang - bz text_get_lang1 ; 0 == English - dcfsnz WREG ; 1 == German - bra text_get_lang2 -; Other ??? Keep language 1 + IF _language_2!=none + movff opt_language,WREG ; get language selection + bz text_get_lang1 ; 0: language 1 + dcfsnz WREG + bra text_get_lang2 ; 1: language 2 + ENDIF -; Read 2-byte pointer to string -text_get_lang1: - tblrd*+ - movff TABLAT,WREG - tblrd*+ - movff WREG,TBLPTRL - movff TABLAT,TBLPTRH - return +text_get_lang1: ; read 2-byte pointer to string + tblrd*+ + movff TABLAT,WREG + tblrd*+ + movff WREG,TBLPTRL + movff TABLAT,TBLPTRH + return -; Add correction for German table: -text_get_lang2: - extern text_2_base - movlw LOW(text_2_base) - addwf TBLPTRL - movlw HIGH(text_2_base) - addwfc TBLPTRH - movlw UPPER(text_2_base) - addwfc TBLPTRU + IF _language_2!=none +text_get_lang2: ; add offset for second language + extern text_2_base + movlw LOW(text_2_base) + addwf TBLPTRL + movlw HIGH(text_2_base) + addwfc TBLPTRH + movlw UPPER(text_2_base) + addwfc TBLPTRU - movlw LOW(text_1_base) - subwf TBLPTRL - movlw HIGH(text_1_base) - subwfb TBLPTRH - movlw UPPER(text_1_base) - subwfb TBLPTRU - bra text_get_lang1 - + movlw LOW(text_1_base) + subwf TBLPTRL + movlw HIGH(text_1_base) + subwfb TBLPTRH + movlw UPPER(text_1_base) + subwfb TBLPTRU + bra text_get_lang1 + ENDIF + ;============================================================================= -; Copy a null-terminated string from TBLPTR to buffer. +; Copy a null-terminated string from TBLPTR to buffer ; -; Input: TBLPTR : string pointer into PROM. -; Output: string in buffer, FSR2 pointer on the closing null byte. +; Input: TBLPTR : string pointer into PROM +; Output: string in buffer, FSR2 pointing to the closing null byte ; - global strcpy_prom + global strcpy_prom strcpy_prom: - lfsr FSR2,buffer + lfsr FSR2,buffer + ;bra strcat_prom -; Append a null-terminated string from TBLPTR to buffer. +; Append a null-terminated string from TBLPTR to buffer ; -; Input: TBLPTR : string pointer into PROM. -; FRS2 : current character position. -; Output: string in buffer, FSR2 pointer on the closing null byte. +; Input: TBLPTR : string pointer into PROM +; FRS2 : current character position +; Output: string in buffer, FSR2 pointing to the closing null byte ; - global strcat_prom + global strcat_prom strcat_prom: - tblrd*+ - movf TABLAT,W - movwf POSTINC2 - bnz strcat_prom - movf POSTDEC2,W ; rewind one char in string buffer. - return + tblrd*+ + movf TABLAT,W + movwf POSTINC2 + bnz strcat_prom + movf POSTDEC2,W ; step back one char + return ;============================================================================= ; Variant that calls word processor right-away... - global strcpy_prom_print - global strcat_prom_print + global strcpy_prom_print + global strcat_prom_print strcpy_prom_print: - lfsr FSR2,buffer + lfsr FSR2,buffer strcat_prom_print: - rcall strcat_prom - goto aa_wordprocessor + rcall strcat_prom + goto aa_wordprocessor ;============================================================================= - global start_tiny_block + global start_tiny_block start_tiny_block: - clrf WREG - bra start_common + clrf WREG + movff WREG, win_font ; needs a bank-safe move here ! + bra start_common - global start_small_block + global start_small_block start_small_block: - movlw 1 - bra start_common + movlw 1 + movff WREG, win_font ; needs a bank-safe move here ! + bra start_common - global start_std_block + global start_std_block start_std_block: - movlw 2 - bra start_common + movlw 2 + movff WREG, win_font ; needs a bank-safe move here ! + bra start_common - global start_medium_block + global start_medium_block start_medium_block: - movlw 3 - bra start_common + movlw 3 + movff WREG, win_font ; needs a bank-safe move here ! + bra start_common - global start_large_block + global start_large_block start_large_block: - movlw 4 -; bra start_common + movlw 4 + movff WREG, win_font ; needs a bank-safe move here ! + ;bra start_common + start_common: - movff WREG, win_font ; Need a bank-safe move here ! - VARARGS_BEGIN - VARARGS_GET8 win_leftx2 - VARARGS_GET8 win_top - VARARGS_END - lfsr FSR2,buffer ; point to buffer here - return + VARARGS_BEGIN + VARARGS_GET8 win_leftx2 + VARARGS_GET8 win_top + VARARGS_END + lfsr FSR2,buffer ; point to buffer + return - END \ No newline at end of file + END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/strings.inc --- a/src/strings.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/strings.inc Thu Nov 22 19:47:26 2018 +0100 @@ -2,184 +2,192 @@ ; ; File strings.asm ; -; Implementation code various string functions. +; Implementation code various string functions ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2010-12-02 : [jDG] Creation... +; 2010-12-02 : [jDG] Creation ; ;============================================================================= -; Copy a short embebed string at start of the string buffer (letter) -; Input: (nothing) -; Output: chars are copied into letter, starting at the beginning. -; FSR2 point to the first unused char (the NULL termination). -; -; Trashed: WREG, TBLPTR, TABLAT, PRODL -; Note: This are all bank-safe call. +; Copy a short embedded string to the start of the string buffer +; Input : string after macro name +; Output : chars are copied to the start of the string buffer +; FSR2 points to the first unused char containing the NULL termination +; Trashed: WREG, TBLPTR, TABLAT, PRODL +; Note : uses bank-safe calls only ; - extern strcpy_block -STRCPY macro string - call strcpy_block - DB string, 0 - endm + extern strcpy_block +STRCPY macro string + call strcpy_block + DB string, 0 + endm ;============================================================================= -; A variant of STRCPY that appends chars to the current FSR2 pointer. -; Input/Output/Trashed : see STRCPY. - extern strcat_block -STRCAT macro string - call strcat_block - DB string, 0 - endm +; A variant of STRCPY that appends chars in the string buffer at the current +; FSR2 pointer position +; Input/Output/Trashed: see STRCPY +; + extern strcat_block +STRCAT macro string + call strcat_block + DB string, 0 + endm ;============================================================================= ; A variant of STRCAT when there is just on char to output -; Input/Output/Trashed : none. -PUTC macro char - movlw char - movwf POSTINC2 - endm +; Input/Output/Trashed: see STRCPY +; +PUTC macro char + movlw char + movwf POSTINC2 + endm ;============================================================================= -; A variant of STRCPY that send the string to the word processor afterwards. -; Input/Output: see STRCPY. -; Trashed: See STRCPY + word_processor. In particular, switch RAM to Bank1 +; A variant of STRCPY that sends the string to the word processor afterwards +; Input/Output: see STRCPY +; Trashed : see STRCPY + word_processor. In particular, switches RAM to Bank1 ; - extern strcpy_block_print -STRCPY_PRINT macro string - call strcpy_block_print - DB string, 0 - endm + extern strcpy_block_print +STRCPY_PRINT macro string + call strcpy_block_print + DB string, 0 + endm -; Trashed: See STRCPY + word_processor. In particular, switch RAM to Bank1 - extern strcat_block_print -STRCAT_PRINT macro string - call strcat_block_print - DB string, 0 - endm +;============================================================================= +; A variant of STRCAT that sends the string to the word processor afterwards +; Input/Output: see STRCAT +; Trashed : see STRCPY + word_processor. In particular, switches RAM to Bank1 +; + extern strcat_block_print +STRCAT_PRINT macro string + call strcat_block_print + DB string, 0 + endm ;============================================================================= ; Subroutines to operate on strings from PROM code ; -; Input: TBLPTR : string pointer into PROM. -; Output: string in buffer, FSR2 pointer on the closing null byte. +; Input : TBLPTR : string pointer into PROM +; Trashed: FSR1 +; Output : string in buffer, FSR2 pointer on the closing null byte - extern strcpy_prom, strcat_prom - extern strcpy_prom_print, strcat_prom_print + extern strcpy_prom, strcat_prom + extern strcpy_prom_print, strcat_prom_print ;============================================================================= ; Subroutines and macros to operate on multilingual text ; - extern strcpy_text -STRCPY_TEXT macro txt - extern txt - lfsr FSR1, txt - call strcpy_text - endm + extern strcpy_text +STRCPY_TEXT macro txt + extern txt + lfsr FSR1, txt + call strcpy_text + endm - extern strcpy_text_print -STRCPY_TEXT_PRINT macro txt - extern txt - lfsr FSR1, txt - call strcpy_text_print - endm + extern strcpy_text_print +STRCPY_TEXT_PRINT macro txt + extern txt + lfsr FSR1, txt + call strcpy_text_print + endm - extern strcat_text -STRCAT_TEXT macro txt - extern txt - lfsr FSR1, txt - call strcat_text - endm + extern strcat_text +STRCAT_TEXT macro txt + extern txt + lfsr FSR1, txt + call strcat_text + endm - extern strcat_text_print -STRCAT_TEXT_PRINT macro txt - extern txt - lfsr FSR1, txt - call strcat_text_print - endm + extern strcat_text_print +STRCAT_TEXT_PRINT macro txt + extern txt + lfsr FSR1, txt + call strcat_text_print + endm ;============================================================================= -; A shortcut for the macros WIN_TOP + WIN_LEFT + WIN_FONT. -; The idea is to replace a 4x6=24 bytes sequence by a more compact 6bytes one. +; A shortcut for the macros WIN_TOP + WIN_LEFT + WIN_FONT +; The idea is to replace a 4x6=24 bytes sequence by a more compact 6 bytes one. ; ; Trashed: TBLPTR, TABLAT, WREG. -; Note: This are all bank-safe call. - extern start_tiny_block +; Note : uses bank-safe calls only +; + extern start_tiny_block WIN_TINY macro x, y - call start_tiny_block - DB x, y - endm + call start_tiny_block + DB x, y + endm - extern start_small_block + extern start_small_block WIN_SMALL macro x, y - call start_small_block - DB x, y - endm + call start_small_block + DB x, y + endm - extern start_std_block + extern start_std_block WIN_STD macro x, y - call start_std_block - DB x, y - endm + call start_std_block + DB x, y + endm - extern start_medium_block -WIN_MEDIUM macro x, y - call start_medium_block - DB x, y - endm + extern start_medium_block +WIN_MEDIUM macro x, y + call start_medium_block + DB x, y + endm - extern start_large_block -WIN_LARGE macro x, y - call start_large_block - DB x, y - endm + extern start_large_block +WIN_LARGE macro x, y + call start_large_block + DB x, y + endm ;============================================================================= -; Shortcuts for compact display programmings. -TEXT_TINY macro x, y, txt - WIN_TINY x,y - STRCPY_TEXT_PRINT txt - endm +; Shortcuts for compact display programmings +; +TEXT_TINY macro x, y, txt + WIN_TINY x,y + STRCPY_TEXT_PRINT txt + endm -TEXT_SMALL macro x, y, txt - WIN_SMALL x,y - STRCPY_TEXT_PRINT txt - endm +TEXT_SMALL macro x, y, txt + WIN_SMALL x,y + STRCPY_TEXT_PRINT txt + endm -TEXT_SMALL_INVERT macro x, y, txt - WIN_SMALL_INVERT x,y - STRCPY_TEXT_PRINT txt - endm +TEXT_SMALL_INVERT macro x, y, txt + WIN_SMALL_INVERT x,y + STRCPY_TEXT_PRINT txt + endm -TEXT_MEDIUM macro x, y, txt - WIN_MEDIUM x,y - STRCPY_TEXT_PRINT txt - endm +TEXT_MEDIUM macro x, y, txt + WIN_MEDIUM x,y + STRCPY_TEXT_PRINT txt + endm -TEXT_LARGE macro x, y, txt - WIN_LARGE x,y - STRCPY_TEXT_PRINT txt - endm +TEXT_LARGE macro x, y, txt + WIN_LARGE x,y + STRCPY_TEXT_PRINT txt + endm -STRING_TINY macro x, y, string - WIN_SMALL x,y - STRCPY_PRINT string - endm +STRING_TINY macro x, y, string + WIN_SMALL x,y + STRCPY_PRINT string + endm -STRING_SMALL macro x, y, string - WIN_SMALL x,y - STRCPY_PRINT string - endm +STRING_SMALL macro x, y, string + WIN_SMALL x,y + STRCPY_PRINT string + endm -STRING_MEDIUM macro x, y, string - WIN_MEDIUM x,y - STRCPY_PRINT string - endm +STRING_MEDIUM macro x, y, string + WIN_MEDIUM x,y + STRCPY_PRINT string + endm -STRING_LARGE macro x, y, string - WIN_LARGE x,y - STRCPY_PRINT string - endm - +STRING_LARGE macro x, y, string + WIN_LARGE x,y + STRCPY_PRINT string + endm diff -r 00b24fb4324d -r ca4556fb60b9 src/surfmode.asm --- a/src/surfmode.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/surfmode.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File surfmode.asm REFACTORED VERSION V2.97 SP1 +; File surfmode.asm REFACTORED VERSION V2.99e ; ; Surfacemode ; @@ -29,15 +29,28 @@ #include "eeprom_rs232.inc" #include "calibrate.inc" + IFDEF _rx_functions +#include "rx_ops.inc" + ENDIF + extern do_main_menu - extern color_image + extern TFT_sensor_mV + extern TFT_surface_compass_heading + extern check_cns_violation + extern check_warn_battery + extern check_and_store_gf_violation + extern check_mbubbles + + IFDEF _osct_logo + extern ostc_logo_block + ENDIF ;---- Private local variables ------------------------------------------------- - CBLOCK local1 ; max size is 16 Byte !!! - ; currently not used - ENDC ; used: 0 byte, remaining: 16 byte + CBLOCK local1 ; max size is 16 Byte !!! + ; currently not used + ENDC ; used: 0 byte, remaining: 16 byte #DEFINE menu_pos_row .215 @@ -45,56 +58,63 @@ #DEFINE view_row .215 #DEFINE view_column .124 -gui CODE +sfmode CODE ;============================================================================= ; Boot tasks for all modes + global surfloop surfloop: call speed_normal - bcf no_sensor_int ; Normal pressure mode + bcf no_sensor_int ; normal pressure mode bcf LEDr clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM output to GND - call TFT_boot ; Initialize TFT (includes clear screen) + bcf PORTC,2 ; pull PWM output to GND + call TFT_boot ; initialize TFT (includes clear screen) bcf restore_deco_data - WIN_TOP .50 + WIN_TOP .40 WIN_LEFT .10 - movlw LOW 0x1E000 - movwf TBLPTRL - movlw HIGH 0x1E000 - movwf TBLPTRH - movlw UPPER 0x1E000 - movwf TBLPTRU - call color_image ; Show logo + TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block ; show heinrichsweikamp logo - WIN_TOP .100 + IFDEF _ostc_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 + TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ; show OSTC logo + ELSE + WIN_COLOR color_white + WIN_STD .30,.90 ; column, row + STRCPY_PRINT "Open Source" ; show OSTC banner text, line 1 + WIN_STD .20,.130 ; column, row + STRCPY_PRINT "Tauch-Computer" ; show OSTC banner text, line 2 + ENDIF + + WIN_COLOR color_white + WIN_SMALL .35,.180 + PUTC "v" ; print v + call TFT_cat_firmware ; print x.y + PUTC " " ; print _ + call TFT_cat_beta_release ; print BetaZ or Release + STRCAT_PRINT "" ; finalize output + bcf win_invert ; clean up eventual color-coding + call TFT_standard_color ; ditto + + call TFT_Display_FadeIn ; show splash ;---- Do any useful initializes that takes time ------------------------- - call restart_set_modes_and_flags ; Sets deco mode flags + + call restart_set_modes_and_flags ; sets deco mode flags bcf pressure_refresh - call I2C_init_compass - call I2C_init_accelerometer + call I2C_sleep_compass + call I2C_sleep_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 + call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics clrf timeout_counter2 ; clrf timeout_counter3 ; not used / required [rl] @@ -102,27 +122,23 @@ 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 FLAG_bailout_mode ; =1: Bailout + bcf FLAG_diluent_setup ; use OC gases for gaslist routine - bcf simulatormode_active ; Quit simulator mode (if active) + bcf simulatormode_active ; quit simulator mode (if active) + + call wait_1s ; wait <= 1 second + call wait_1s ; wait 1 second + call wait_1s ; wait 1 second ;---- Fade to standard surface view -------------------------------------- - ; Wait 1 second - bcf onesecupdate - btfss onesecupdate - bra $-2 - ; Wait 1 second - bcf onesecupdate - btfss onesecupdate - bra $-2 - call TFT_Display_FadeOut ; Go to black screen - call TFT_ClearScreen ; Then change everything - WIN_TOP .0 + 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 + bcf win_invert ; reset invert flag WIN_COLOR color_lightblue WIN_SMALL menu_pos_column,menu_pos_row @@ -132,34 +148,37 @@ call TFT_standard_color ; Logo - WIN_TOP .0 + IFDEF _ostc_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 + TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ; show OSTC logo + ELSE + WIN_COLOR color_white + WIN_STD .100,.0 + STRCPY_PRINT "OSTC" ; show "OSTC" + WIN_COLOR color_cyan + WIN_TINY .140,.0 + STRCPY_PRINT "hwOS" ; show "hwOS" + WIN_TINY .139,.12 + STRCPY_PRINT "tech" ; show "tech" + ENDIF call TFT_clock ; display time 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_temp_surfmode ; display 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 -surfloop_no_oc: - movff customview_surfmode,menupos3; Reload last customview - call surf_customview_mask ; Update #menupos3 view + TSTOSS opt_dive_mode ; in OC ? (0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR) + call TFT_show_OC_startgas_surface; YES - show first gas and "OSTC2-like" active gases - call TFT_Display_FadeIn ; Display resulting surface screen. + movff customview_surfmode,menupos3; reload last custom view + call surf_customview_mask ; redraw last custom view + + call TFT_Display_FadeIn ; display resulting surface screen bcf switch_left bcf switch_right @@ -169,8 +188,8 @@ 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,last_surfpressure+1 ; Use 30min old airpressure + movff last_surfpressure_30min+0,last_surfpressure+0 ; use 30min old air pressure + movff last_surfpressure_30min+1,last_surfpressure+1 ; use 30min old air pressure movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage @@ -182,114 +201,113 @@ call deco_calc_desaturation_time ; calculate desaturation time banksel common - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - call enable_rs232 ; Also sets to speed_normal ... + IFDEF _screendump + btfsc enable_screen_dumps ; =1: ignore vin_usb, wait for "l" command (Screen dump) + call enable_rs232 ; also sets to speed_normal + ENDIF surfloop_loop: btfss onesecupdate ; do every second tasks? - bra surfloop_loop2 ; no, loop + bra surfloop_loop2 ; NO - loop -; One Second tasks for all modes + ; one second tasks for all modes call speed_normal ;call TFT_debug_output call TFT_clock ; update clock - call timeout_surfmode ; check timeout + call timeout_surfmode ; check timeout 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... - call TFT_temp_surfmode ; Displays temperature - btfss secs,0 ; Every two seconds... + call set_dive_modes ; tests if depth > threshold + 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 bcf onesecupdate ; every second tasks done -surfloop_loop2: -; Tasks approx. every 50ms for all modes + IFDEF _rx_functions + btfss FLAG_tr_enabled ; YES - TR functions enabled? + bra surfloop_loop2 ; NO - skip tank pressure part + call get_pressure_readings ; YES - get pressure readings + call TFT_surface_tank_pres ; - update first gas/diluent pressure + movlw .10 ; - number of tank data custom view + cpfseq menupos3 ; - in tank data custom view? + bra surfloop_loop2 ; NO - skip + call TFT_surface_tankdata ; YES - update tank data custom view + ENDIF + +surfloop_loop2: + ; tasks approx. every 50 ms for all modes call test_switches_surfmode ; check switches - call TFT_debug_output + ;call TFT_debug_output -; One minute tasks for all modes + ; one minute tasks for all modes btfsc oneminupdate ; do every minute tasks call update_surfloop60 ; yes, e.g. update time and date -; Mode tasks - btfsc divemode ; Divemode active? - goto diveloop ; Yes, switch into Divemode! + ; mode tasks + btfsc divemode ; divemode active? + goto diveloop ; YES - switch into divemode! - btfsc menubit ; Menu? - goto do_main_menu ; Menu! + btfsc menubit ; shall enter menu? + goto do_main_menu ; YES - enter menu btfsc pressure_refresh ; new pressure available? call TFT_update_surf_press ; display surface pressure bcf pressure_refresh ; until new pressure is available -; Updates every 1/4 second + ; updates every 1/4 second btfss quarter_second_update bra surfloop_loop2b bcf quarter_second_update - ; Update Sensors + ; 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 + btfsc FLAG_ccr_mode ; in CCR mode? + bra surfloop_loop2a1 ; YES + btfsc FLAG_pscr_mode ; in pSCR mode? + bra surfloop_loop2a1 ; YES + bra surfloop_loop2a ; NO to both 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 + movff opt_ccr_mode,WREG ; =0: fixed SP, =1: sensor, =2: auto SP + decfsz WREG ; opt_ccr_mode = 1 (sensor)? + bra surfloop_loop2a ; NO - skip sensor readings 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 + 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) + cpfseq menupos3 ; in sensor mV surface custom view? + bra surfloop_loop2a ; NO + 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 + bra surfloop_loop2b ; NO + 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) + btfsc toggle_customview ; next view? + 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 vusb_in ; USB plugged in? - ;call comm_mode ; Start COMM mode - - bra surfloop_loop4 + IFDEF _screendump + btfsc enable_screen_dumps ; screendump enabled? + call TFT_dump_screen_check ; YES - check if requested and do it + ENDIF -surfloop_loop3: - 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 + ;btfsc vusb_in ; USB plugged in? | commented out - do not start COMM mode when charging in surface mode + ;call comm_mode ; YES - start COMM mode | -surfloop_loop4: - 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 - + btfss sleepmode ; shall we go into sleep mode? + bra surfloop_loop ; NO - loop in surface mode + movff menupos3,customview_surfmode; YES - save last custom view + goto sleeploop ; switch into sleep mode update_surfloop60: -; One minute tasks for all modes - call TFT_date ; Update date + ; one minute tasks for all modes + 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 @@ -297,15 +315,15 @@ ; update tissue diagram if it is on display movlw .5 ; number of tissue custom view - cpfseq menupos3 ; is this the current customview? + cpfseq menupos3 ; is this the current custom view? bra update_surfloop60_1 ; NO call TFT_standard_color ; YES - set standard color call TFT_surface_tissues ; show tissue diagram update_surfloop60_1: ; 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? + movlw .8 ; number of the last dive info custom view + cpfseq menupos3 ; is this the current custom view? bra update_surfloop60_2 ; NO call TFT_standard_color ; YES - set standard color call TFT_surface_lastdive ; show last dive infos @@ -314,106 +332,100 @@ bcf oneminupdate return - 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 + bcf message_attention ; clear flag for messages of level attention + bcf message_warning ; clear flag for messages of level warning + clrf message_counter ; clear message 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 - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + 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 + btfsc FLAG_gauge_mode ; done for Apnoe or Gauge mode bra surfmode_check_for_warnings2 - ; 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 - - 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 + ; 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 + call check_mbubbles ; check for micro bubbles surfmode_check_for_warnings2: - ; Setup warning_page number - incf warning_page,F + ; setup message page number + incf message_page,F bcf STATUS,C - rlcf warning_page,W ; *2 - cpfsgt warning_counter ; > warning_counter - clrf warning_page ; No, clear + rlcf message_page,W ; *2 + cpfsgt message_counter ; > message_counter? + clrf message_page ; NO - clear - ; Clear both rows of warnings if there is nothing to show at all - tstfsz warning_counter ; any warnings? + ; clear both rows of warnings if there is nothing to show at all + tstfsz message_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: - ; Clear 2nd row of warnings if there is nothing to show (on this page) + ; 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 + call TFT_clear_warning_text_2nd_row ; NO - clear this row return ; Done. surfmode_check_for_desat: banksel int_O_desaturation_time - movf int_O_desaturation_time+0,W ; is nofly-time null ? + movf int_O_desaturation_time+0,W iorwf int_O_desaturation_time+1,W banksel common - bnz surfmode_check_for_desat_1 ; NO - return + bnz surfmode_check_for_desat_1 ; is the desat-time > 0 ? + return ; NO surfmode_check_for_desat_1: ; YES - incf warning_counter,F ; increase counter + incf message_counter,F ; increase counter call TFT_desaturation_time ; show desaturation time return surfmode_check_for_nofly: banksel int_O_nofly_time - movf int_O_nofly_time+0,W ; is nofly-time null ? + movf int_O_nofly_time+0,W iorwf int_O_nofly_time+1,W banksel common - bnz surfmode_check_for_nofly_1 ; No... - return + bnz surfmode_check_for_nofly_1 ; is the nofly-time > 0 ? + return ; NO surfmode_check_for_nofly_1: ; YES - incf warning_counter,F ; increase counter + incf message_counter,F ; increase counter call TFT_nofly_time ; show nofly-time return ;============================================================================= -test_switches_surfmode: ; checks switches in surfacemode +test_switches_surfmode: ; check switches in surfacemode btfsc switch_right bra test_switches_surfmode2 btfsc switch_left bra test_switches_surfmode3 - ; No button pressed + ; no button pressed return test_switches_surfmode3: movlw .6 cpfseq menupos3 ; in compass view? - bra test_switches_surfmode3a ; No + bra test_switches_surfmode3a ; NO - btfsc premenu ; already shown "Bearing" - bra test_switches_surfmode3b ; Yes, remove it - - extern TFT_surf_set_bearing - call TFT_surf_set_bearing ; Yes. + btfsc premenu ; "Bearing" already shown? + bra test_switches_surfmode3b ; YES - remove it + call TFT_surf_set_bearing ; NO - show it bcf switch_left return test_switches_surfmode3a: bcf switch_left bcf compass_bearing_set ; clear bearing on entering menu - bsf menubit ; Enter Menu! + bsf menubit ; enter the main menu return test_switches_surfmode3b: - ; Clear "Heading?" + ; clear "Bearing" WIN_BOX_BLACK .158,.190, .15, .99 ; top, bottom, left, right bcf premenu bcf switch_left @@ -422,10 +434,10 @@ test_switches_surfmode2: movlw .6 cpfseq menupos3 ; in compass view? - bra test_switches_surfmode2a ; No + bra test_switches_surfmode2a ; NO btfss premenu ; "Heading?" shown? - bra test_switches_surfmode2a ; No - ; Set new heading + bra test_switches_surfmode2a ; NO + ; set new heading bcf premenu bsf compass_bearing_set movff compass_heading_shown+0,compass_bearing+0 @@ -442,22 +454,26 @@ 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 ; load default timeout + btfsc menu_update_sensor_mv ; in the "Calibrate" menu? + movlw timeout_calibrate_menu ; YES - replace with CCR Calibrate Menu timeout + IFDEF _rx_functions + btfsc FLAG_pairing_mode ; in the "Setup Tank" menu? + movlw timeout_tanksetup_menu ; YES - replace with Tank Setup Menu timeout + ENDIF + btfsc menubit ; in menu? + bra timeout_testmode ; NO - done + ; must be in surface mode + btfss FLAG_ccr_mode ; in CCR mode? (fixed ppO2 or sensor) + bra timeout_testmode ; NO - not CCR + movlw timeout_ccr_surface ; YES - replace with CCR surface mode timeout global timeout_testmode timeout_testmode: incf timeout_counter2,F ; increase timeout counter - cpfsgt timeout_counter2 ; Compare with timeout limit + cpfsgt timeout_counter2 ; compare with timeout limit return ; return, no timeout - bsf sleepmode ; Set Flag - return ; Return + bsf sleepmode ; set flag + return ; return END \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/text_english.inc --- a/src/text_english.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_english.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,369 +1,466 @@ ;============================================================================= ; -; File text_english.asm REFACTORED VERSION V2.95 +; File text_english.asm REFACTORED VERSION V2.99e ; -; English texts reference file. +; English texts reference file. ; -; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; Basic texts - TCODE tNo, "No" ; No - TCODE tYes, "Yes" ; Yes = No + 1 - TCODE tblank, " " ; (a single space character) ## NEW (layout) - + TCODE tNo, "No" ; 0 No keep order, enum! + TCODE tYes, "Yes" ; 1 Yes + IFDEF _cave_mode + TCODE tCave, "Cave" ; 2 Cave + ENDIF + + TCODE tblank, " " ; (a single space character) + ; Surface-mode texts - TCODE tBeta, "beta" ; beta - TCODE tMenu, "" ; View> - TCODE tHeading, "Heading:" ; Heading: - TCODE tLastDive, "Last Dive" ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "CCR Sensors mV" ; CCR Sensors mV + TCODE tMenu, "" ; View> + TCODE tHeading, "Heading:" ; Heading: + TCODE tLastDive, "Last Dive" ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "Sensors mV" ; Sensors mV -; Divemode Menu - TCODE tDivemenu_Gaslist, "Gaslist" ; Gaslist - TCODE tDivemenu_ResetAvg, "Reset Avg." ; Reset Avg. - TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"use Sensor" ; Use Sensor - TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF - TCODE tDivemenu_Marker, "Set Marker" ; Set Marker - TCODE tDivemenu_LostGas, "Lost Gas" ; Lost Gas +; Divemode menu + TCODE tDivemenu_Gaslist, "Gaslist" ; Gaslist (OC) + TCODE tDivemenu_Diluent, "Diluents" ; Diluents (CCR) + TCODE tDivemenu_Premix, "Premix" ; Premix (pSCR) + TCODE tDivemenu_ResetAvg, "Reset Avg." ; Reset Avg. + TCODE tDivemenu_Avg_Mkr, "Avg/Marker" ; Reset Avg., Set Marker (and Turn Dive) + TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint + TCODE tDivemenu_UseSensor,"use Sensor" ; Use Sensor + TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF + TCODE tDivemenu_Marker, "Set Marker" ; Set Marker + TCODE tDivemenu_LostGas, "Lost Gas" ; Lost Gas + IFDEF _cave_mode + TCODE tDivemenu_TurnDive, "Turn Dive" ; Turn Dive + ENDIF ; Main menu - TCODE tNext, "" ; Enter> - - TCODE tMainMenu, "Main Menu" ; MainMenu - TCODE tLogbook, "Logbook" ; Logbook - TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup - TCODE tSetTime, "Set Time" ; Set Time - TCODE tSetDate, "Set Date" ; Set Date - TCODE tSetTimeDate, "Set Time & Date" ; Set Time & Date - TCODE tDispSets, "Display Settings" ; Display Settings - TCODE tExit, "Exit" ; Exit - TCODE tResetMenu, "Reset Menu" ; Reset Menu - TCODE tDiveModeMenu, "Deco Setup" ; Deco Setup ## MODIFIED (consistent naming) - TCODE tInfoMenu, "Information" ; Information - TCODE tCCRSetup, "CCR/pSCR Setup" ; CCR/pSCR Setup ## MODIFIED (consistent naming) - TCODE tDiluentSetup, "Diluent Setup" ; Diluent Setup - TCODE tFixedSetpoints,"CCR Setpoints" ; Fixed Setpoints for CCR ## MODIFIED (consistent naming) - TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor ## MODIFIED (consistent naming) - TCODE tCalibrateMenu, "Calibration" ; Calibration - TCODE tCalibrationGas,"Cal. Gas O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Calibrate" ; Calibrate - TCODE tBack, "back..." ; ## NEW + TCODE tNext, "" ; Enter> + TCODE tMainMenu, "Main Menu" ; MainMenu + TCODE tLogbook, "Logbook" ; Logbook + TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup + TCODE tSetTime, "Set Time" ; Set Time + TCODE tSetDate, "Set Date" ; Set Date + TCODE tSetTimeDate, "Set Time & Date" ; Set Time & Date + TCODE tDispSets, "Display Settings" ; Display Settings + TCODE tExit, "Exit" ; Exit + TCODE tResetMenu, "Reset Menu" ; Reset Menu + TCODE tDiveModeMenu, "Deco Setup" ; Deco Setup + TCODE tInfoMenu, "Information" ; Information + TCODE tTrSettings, "Pressure Display" ; Pressure Display + TCODE tTrMode, "Mode: " ; Mode + TCODE tTr1stPres, "1.Pres.: " ; 1st Pressure + TCODE tTr2ndPres, "2.Pres.: " ; 2nd Pressure + TCODE tTrBailPres, "1.B/O : " ; Bailout Pressure + TCODE tTrMaxDeltaP, "max deltaP: " ; independent double max diffenerce + TCODE tCCRSetup, "CCR/pSCR Setup" ; CCR/pSCR Setup + TCODE tDiluentSetup, "Diluent Setup" ; Diluent Setup + TCODE tFixedSetpoints, "CCR Setpoints" ; Fixed Setpoints for CCR + TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor + TCODE tCalibrateMenu, "Calibration" ; Calibration + TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tBack, "back" ; Gas menu - TCODE tGaslist, "OC Gas List" - TCODE tGaslistCC, "CC Diluents" - TCODE tGasEdit, "Edit Gas" - TCODE tType, "Type: " - TCODE tGasDisabled, "Disabled" ; Disabled - TCODE tGasFirst, "First" ; First - TCODE tGasTravel, "Travel" ; Travel - TCODE tGasDeco, "Deco" ; Deco - TCODE tDilDisabled, "Disabled" ; Disabled - TCODE tDilFirst, "First" ; First - TCODE tDilNorm, "Normal" ; Normal - TCODE tAir, "Air " ; Enum: values must follow (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Change depth" - TCODE tDepthPlus, "Depth +" - TCODE tDepthMinus, "Depth -" - TCODE tDepthReset, "Reset to MOD:" - TCODE tSetup_mix, "Setup Mix" - TCODE tCCRMode, "Mode:" ; Mode: ## MODIFIED (layout) - TCODE tCCRModeFixedSP,"Fixed SP" ; Fixed for CCR / Calc.for pSCR ## MODIFIED (layout) - TCODE tCCRModeSensor, "Sensor" ; Sensor - TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP - TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ - TCODE tSensorFallback,"Fallback:" ; Fallback: - TCODE tCalculated, "calculated" ; calculated - TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) - + TCODE tGaslist, "OC Gas List" + TCODE tGaslistCC, "CC Diluents" + TCODE tGasEdit, "Edit Gas" + TCODE tType, "Type: " + TCODE tGasDisabled, "Disabled" ; Disabled + TCODE tGasFirst, "First" ; First + TCODE tGasTravel, "Travel" ; Travel + TCODE tGasDeco, "Deco" ; Deco + TCODE tDilDisabled, "Disabled" ; Disabled + TCODE tDilFirst, "First" ; First + TCODE tDilNorm, "Normal" ; Normal + TCODE tAir, "Air " ; Enum: values must follow (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD :" + TCODE tEAD, "EAD:" + TCODE tSetup_GasDepth, "Setup Depth" + TCODE tDepthPlus, "Depth +" + TCODE tDepthMinus, "Depth -" + TCODE tDepthReset, "Reset to MOD:" + TCODE tSetup_GasMix, "Setup Mix" + TCODE tCCRMode, "Mode:" ; Mode: + TCODE tCCRModeFixedSP, "Fixed SP/Calc." ; 0 Fixed for CCR / Calc.for pSCR + TCODE tCCRModeSensor, "Sensor" ; 1 Sensor + TCODE tCCRModeAutoSP, "Auto SP" ; 2 Auto SP + TCODE tSP, "SP" ; SP (SetPoint) + TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "calculated" ; calculated + TCODE tppO2, "ppO2:" ; ppO2: + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + ; New batteries menu - TCODE tNewBattTitle, "New Battery?" - TCODE tNewBattOld, "Keep old" + TCODE tNewBattTitle, "New Battery?" + TCODE tNewBattOld, "Keep old" TCODE tNewBattNew36, "New 3.6V Saft (T1)" TCODE tNewBattNew15, "New 1.5V AA (T0)" TCODE tNewBattAccu, "3.6V LiIon AA (T2)" - TCODE tNew18650, "Internal 18650 (T3)" - TCODE tNew16650, "Internal 16650 (T4)" + TCODE tNew18650, "Internal 18650 (T3)" + TCODE tNew16650, "Internal 16650 (T4)" + +; Gaslist Management + TCODE tGas, "Gas" ; Gas + TCODE tDil, "Dil" ; Diluent + TCODE tGasErr, "Err" ; Err (3 chars) -; Gaslist management - TCODE tGas, "Gas" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) - -; Communication Menu - TCODE tUsbTitle, "USB Mode" - TCODE tBleTitle, "Bluetooth Mode" - TCODE tUsbStarting, "Starting..." - TCODE tUsbStartDone, "Done." - TCODE tUsbServiceMode,"Service mode enabled" - TCODE tUsbClosed, "Port closed" - TCODE tUsbExit, "Exited" - TCODE tUsbDownloadMode,"Download mode enabled" - TCODE tUsbLlBld, "Low-level Bootloader" +; Communication menu + TCODE tUsbTitle, "USB Mode" + TCODE tBleTitle, "Bluetooth Mode" + TCODE tUsbStarting, "Starting..." + TCODE tUsbStartDone, "Done." + TCODE tUsbServiceMode, "Service mode enabled" + TCODE tUsbClosed, "Port closed" + TCODE tUsbExit, "Exited" + TCODE tUsbDownloadMode, "Download mode enabled" + TCODE tUsbLlBld, "Low-level Bootloader" -; Dive Settings - TCODE tDvMode, "Dive Mode:" - TCODE tDvOC, "OC" ; keep order, enum from here... - TCODE tDvCCR, "CCR" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnea" - TCODE tDvPSCR, "pSCR" ; ...up to here! - TCODE tDvCC, "CC" - TCODE tDkMode, "Decotype: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 :" ; ## MODIFIED (layout) - TCODE tPPO2DECO, "Max Deco:" ; ## MODIFIED (layout) - TCODE tPPO2MIN, "Min :" ; ## MODIFIED (layout) - TCODE tPPO2MINCC, "Min Loop:" ; ## NEW ppO2 min cc - TCODE tLastDecostop, "Last Deco:" - TCODE tDecoparameters,"Deco Parameters" - TCODE tGF_low, "GF low :" ; ## MODIFIED (layout) - TCODE tGF_high, "GF high:" - TCODE tSaturationMult, "Saturation :" ; ## MODIFIED (layout) - TCODE tDesaturationMult,"Desaturation:" - 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 - TCODE taGF_enable, "aGF selectable:" ; aGF Selectable - TCODE tDiveaGF_active,"aGF!" ; aGF! - TCODE tppO2settings, "ppO2 Settings" ; ppO2 Settings - TCODE tsafetystopmenu,"Safety Stop:" ; Safety Stop: - TCODE tGasUsage, "Gas Usage" ; Gas Usage - TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) - TCODE tSetDecoUse, "Deco Gas: " ; Deco Gas: (space) ## MODIFIED (layout) - 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, "Liter" - TCODE tTankFillPress, "Tank Press Budget"; - TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs - TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs - TCODE tGas3, "Gas 3:" ; ## NEW bailout gas needs - TCODE tGas4, "Gas 4:" ; ## NEW bailout gas needs - TCODE tGas5, "Gas 5:" ; ## NEW bailout gas needs - TCODE tCCmaxFracO2, "Loop %O2 max.:" ; ## NEW CCR max ppO2 limiter - TCODE t2ndDecoPlanMenu,"2nd Deco Plan" ; ## NEW deco engine +; Dive settings + TCODE tDvMode, "Dive Mode: " + TCODE tDvOC, "OC" ; 0 - keep order, enum! + TCODE tDvCCR, "CCR" ; 1 + TCODE tDvGauge, "Gauge" ; 2 + TCODE tDvApnea, "Apnea" ; 3 + TCODE tDvPSCR, "pSCR" ; 4 + TCODE tDvCC, "CC" + TCODE tDkMode, "Decotype: ZH-L16" + TCODE tZHL16, " " ; 0 - keep order, enum! + TCODE tZHL16GF, "+GF" ; 1 + TCODE tPPO2Max, "Max :" + TCODE tPPO2DECO, "Max Deco:" + TCODE tPPO2MIN, "Min :" + TCODE tPPO2MINCC, "Min Loop:" + TCODE tLastDecostop, "Last Deco : " ; last deco stop depth + TCODE tAscentSpeed, "Ascent Speed: " ; Ascent Speed + TCODE tGasChangeTime, "Gas Change :+" ; additional Gas Change Time + TCODE tDecoparameters, "Deco Parameters" + TCODE tGF_low, "GF low :" + TCODE tGF_high, "GF high:" + TCODE tSaturationMult, "Saturation : " + TCODE tDesaturationMult, "Desaturation: " + TCODE tFTTSMenu, "fTTS/Delay:" ; Future TTS / Ascent Delay + TCODE tLastDecostopSurf, "Last Deco :" ; last deco stop depth Surface Custom View + TCODE tGFMenu, "GF Settings" ; GF Settings + TCODE taGF_low, "aGF low :" ; aGF low + TCODE taGF_high, "aGF high:" ; aGF high + TCODE taGF_enable, "aGF selectable:" ; aGF Selectable + TCODE tDiveaGF_active, "using aGF" ; using aGF + TCODE tppO2settings, "ppO2 Settings" ; ppO2 Settings + TCODE tsafetystopmenu, "Safety Stop: " ; Safety Stop: + TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deco Gas: " ; Deco Gas: (space) + TCODE tCalcAscGas, "Calc.Gas (B/O):" + TCODE tSetup_Tank, "Setup Tank" ; Setup Tank + TCODE tTankSize, "Tank Size" ; Tank Sizes + TCODE tTankUsablePress, "Turn Pres/Asc.Need" ; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars) + TCODE tCopyDilToOC, "Copy Dil.-> OC" ; copy diluent settings to OC gas + TCODE tTankPairing, "Select Transmitter" ; select Transmitter + TCODE tLiter, " l" ; Liter as l + TCODE tLiterLong, "Liter" ; Liter as Liter + TCODE tCCmaxFracO2, "Loop %O2 max.:" + TCODE t2ndDecoPlanMenu, "2nd Deco Plan" -; Display Settings - TCODE tBright, "Brightness:" - TCODE tEco, "Eco" - TCODE tMedium, "Medium" - TCODE tHigh, "High" - TCODE tDvSalinity, "Salinity: " ; Salinity ## MODIFIED (layout) - TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: - TCODE tFlip, "Rotate Screen:" ; Rotate Screen - TCODE tMODwarning, "MOD Warning :" ; MOD warning ## MODIFIED (layout) - TCODE tIBCDwarning, "IBCD Warning :" ; IBCD Warning ## NEW IBCD - TCODE tTimeoutDive, "Dive Timeout:" ; Dive Timeout ## MODIFIED (layout) - -; VSI display Settings - TCODE tVSItext2, "Variable Speed:" ; Variable speed: ## MODIFIED (layout) - TCODE tVSIgraph, "Speed Graph:" ; Speed graph: ## MODIFIED (layout) + IFDEF _rx_functions + TCODE tTrModeOff, "off" ; 0 off keep order, enum! + TCODE tTrModeOn, "on" ; 1 on + TCODE tTrModeIndDouble, "indep.Double" ; 2 independent double + TCODE tTrModeCCR, "CCR Dil+O2" ; 3 CCR diluent and O2 + TCODE tTrPresNone, "none" ; 0 none keep order, enum! + TCODE tTrPresGas1, "Gas 1" ; 1 Gas 1 + TCODE tTrPresGas2, "Gas 2" ; 2 Gas 2 + TCODE tTrPresGas3, "Gas 3" ; 3 Gas 3 + TCODE tTrPresGas4, "Gas 4" ; 4 Gas 4 + TCODE tTrPresGas5, "Gas 5" ; 5 Gas 5 + TCODE tTrPresDil1, "Dil 1" ; 6 Dil 1 + TCODE tTrPresDil2, "Dil 2" ; 7 Dil 2 + TCODE tTrPresDil3, "Dil 3" ; 8 Dil 3 + TCODE tTrPresDil4, "Dil 4" ; 9 Dil 4 + TCODE tTrPresDil5, "Dil 5" ; 10 Dil 5 + TCODE tTrPresFirstGas, "First Gas" ; 11 first Gas + TCODE tTrPresActiveGas, "active Gas" ; 12 active Gas + TCODE tTrPresFirstDil, "First Dil" ; 13 first Dil + TCODE tTrPresActiveDil, "active Dil" ; 14 active Dil + ELSE + TCODE tTrModeOff, "" ; dummy target for entry in option table + TCODE tTrPresNone, "" ; dummy target for entry in option table + ENDIF -; Setup Menu - TCODE tSystSets, "Settings" - TCODE tLanguage, "Language:" - TCODE tEnglish, "English" - TCODE tGerman, "German" - TCODE tFrench, "French" - TCODE tItalian, "Italian" - TCODE tCompassMenu, "Compass calibration" - TCODE tCompassGain, "Compass Gain:" - TCODE tCalX, "Cal X:" ; Cal X - TCODE tCalY, "Cal Y:" ; Cal Y - TCODE tCalZ, "Cal Z:" ; Cal Z +; Display settings + TCODE tBright, "Brightness:" + TCODE tEco, "Eco" + TCODE tMedium, "Medium" + TCODE tHigh, "High" + TCODE tDvSalinity, "Salinity: " ; Salinity + TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: + TCODE tFlip, "Rotate Screen:" ; Rotate Screen + TCODE tMODwarning, "MOD Warning :" ; MOD warning + TCODE tIBCDwarning, "IBCD Warning :" ; IBCD Warning + TCODE t2ndDepth, "2nd Depth:" ; 2nd depth display content (10 chars max) + TCODE tTimeoutDive, "Dive Timeout:" ; Dive Timeout + +; VSI display settings + TCODE tVSItext2, "Variable Speed:" ; Variable speed: + TCODE tVSIgraph, "Speed Graph :" ; Speed graph: - TCODE tUnits, "Units:" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - - TCODE tButtonleft, "Left button:" ; Left button - TCODE tButtonright, "Right button:" ; Right button - - TCODE tAltMode, "Waiting Time:" ; ## NEW no fly altitude - TCODE tAltModeFly, "Flying" ; ## NEW no fly altitude - TCODE tAltMode1000, "1000m" ; ## NEW no fly altitude - TCODE tAltMode2000, "2000m" ; ## NEW no fly altitude - TCODE tAltMode3000, "3000m" ; ## NEW no fly altitude +; Setup menu + TCODE tSystSets, "Settings" + TCODE tCompassMenu, "Compass Calibration" + TCODE tCompassGain, "Compass Gain:" + TCODE tCalX, "Cal X:" ; Cal X + TCODE tCalY, "Cal Y:" ; Cal Y + TCODE tCalZ, "Cal Z:" ; Cal Z + TCODE tUnits, "Units: " + TCODE tMetric, " m/°C" ; 0 - keep order, enum! + TCODE tImperial, "ft/°F" ; 1 + ; 111 111 111 111 111 + ;123456789012123456789012123456789012123456789012123456789012 + TCODE tDefName, "HW OSTC" ; 5 rows by 12 chars each + TCODE tButtonleft, "Left button:" ; Left button + TCODE tButtonright, "Right button:" ; Right button + TCODE tAltMode, "Waiting Time:" + TCODE tAltModeFly, "Flying" + TCODE tAltMode1000, "1000m" + TCODE tAltMode2000, "2000m" + TCODE tAltMode3000, "3000m" ; Units for all menu - TCODE tMeters, "m" - TCODE tFeets, "ft" - TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" - TCODE tbar, " bar" ; bar ## MODIFIED (layout) - TCODE tbar10, "0 bar" ; bar ## NEW 2.95 - TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed - TCODE tmin, "min" ; minutes + TCODE tMeters, "m" + TCODE tFeets, "ft" + TCODE tFeets1, "f" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" + TCODE tbar, " bar" ; bar + TCODE tbar10, "0 bar" ; xx0 bar + TCODE tMeterMinute, "m/'" ; meter per minute ; Date - TCODE tDateFormat, "Date:" - TCODE tDateformat, "MMDDYY" - TCODE tDateformat1, "DDMMYY" - TCODE tDateformat2, "YYMMDD" + TCODE tDateFormat, "Format: " + TCODE tDateformat, "MMDDYY" + TCODE tDateformat1, "DDMMYY" + TCODE tDateformat2, "YYMMDD" ; Simulator menu - TCODE tInter, "Start Simulator" ; Start Simulator - TCODE tPlan, "Simulator" ; Simulator + TCODE tInter, "Start Simulator" ; Start Simulator + TCODE tPlan, "Simulator" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Bot.Time : " ; Bot. Time: (10 chars) ## MODIFIED (layout) - TCODE tBtTm_short, "Time:" ; Bot. Time: (max. 6 chars) - TCODE tBtDep, "Bot.Depth: " ; Max Depth: (10 chars) ## MODIFIED (layout) - TCODE tIntvl, "Interval : " ; Interval : (10 chars) - TCODE tDecoSetup, "Calculator Setup" ; ## NEW (layout) - TCODE tDeco, "Start Calculator" ; Calculate Deco ## MODIFIED (layout) - TCODE tDivePlan, "Dive Plan:" ; Dive Plan: - TCODE tNoDeco, "No Deco" ; No Deco - TCODE tMore, "More..." ; More... - TCODE tSelectSetpoint,"CCR Setpoint: " ; ## NEW deco calculator enhancement - TCODE tuseAGF, "use aGF: " ; ## NEW deco calculator enhancement - TCODE tCalculating, "Calculating..." ; ## NEW deco calculator enhancement + TCODE tBtTm, "Bot.Time : " ; Bot. Time: (10 chars) + TCODE tBtTm_short, "Time:" ; Bot. Time: (max. 6 chars) + TCODE tBtDep, "Bot.Depth: " ; Max Depth: (10 chars) + TCODE tIntvl, "Interval : " ; Interval : (10 chars) + TCODE tDecoSetup, "Calculator Setup" + TCODE tDeco, "Start Calculator" ; Calculate Deco + TCODE tDivePlan, "Dive Plan:" ; Dive Plan: + TCODE tNoDeco, "No Deco" ; No Deco + TCODE tMore, "more" ; more + TCODE tSelectSetpoint, "Setpoint : " + TCODE tuseAGF, "use aGF : " + TCODE tCalculating, "Calculating..." + TCODE tNDLleft, "left" ; time left within NDL ; Information menu - TCODE tFirmware, "Firmware: " ; Firmware: (space) - TCODE tSerial, "Serial : " ; Serial : (space) - TCODE tTotalDives, "Total Dives: " ; Total Dives: - TCODE tBatteryV, "Battery : " ; Battery: ## MODIFIED ## info - added one space - TCODE tUptime, "Uptime : " ; Uptime: ## MODIFIED ## info - added two spaces - + TCODE tFirmware, "Firmware: " ; Firmware: (space) + TCODE tFirmware_rx, "RX Ver : " ; RX Ver : (space) + TCODE tSerial, "Serial : " ; Serial : (space) + TCODE tTotalDives, "Total Dives: " ; Total Dives: + TCODE tBatteryV, "Battery : " ; Battery: + TCODE tUptime, "Uptime : " ; Uptime: + ; Divemode screen - TCODE tNDL, "NDL" - TCODE tTTS, "TTS" - TCODE tVelMetric, "m/min" - TCODE tVelImperial, "ft/m " - TCODE tGasSelect, "Select Gas" ; Select Gas - TCODE tSelectAir, "Air " ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Depth" ; Depth - TCODE tMaxDepth, "Max. Depth" ; Max. Depth - max 10chars! - TCODE tDivetime, "Divetime" ; Divetime - TCODE tDiveHudMask1, "Sensor 1" - TCODE tDiveHudMask2, "Sensor 2" - TCODE tDiveHudMask3, "Sensor 3" - TCODE tDiveTotalAvg, "Total Avg" - TCODE tDiveStopwatch, "Stopwatch" - TCODE tDiveStopAvg, "Stopped Avg" ; 11chars max - TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) - TCODE tApnoeMax, "Last Descent" ; Last descent - TCODE tApnoeSurface, "Surface Time" ; Surface Time - TCODE tDiveDecoplan, "Decoplan" ; Decoplan - TCODE tDiveClock, "Clock" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Tissues" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "GF Values" ; GF Values - TCODE taGFactors, "aGF Values" ; aGF Values - TCODE tGFInfo, "Current GF" ; GF Info - TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) - TCODE tDecoInfo, "Deco Zone" ; Deco info - TCODE tSensorCheck, "Sensor Check" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning - TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning - TCODE tSensorDisagree,"Sensors<>" ; Sensors disagree Warning ## NEW voting logic - TCODE tGasNeedsWarn, "Gas Needs" ; ## NEW bailout gas needs - TCODE tGasNeedsBar, "Gas Needs (bar)" ; ## NEW bailout gas needs - TCODE tCNSsurf, "CNS Surf." ; ## NEW CNS at end-of-dive - TCODE tCNSfTTS, "CNS fTTS" ; ## NEW CNS at end-of-dive - TCODE tCNSBO, "CNS B/O" ; ## NEW CNS at end-of-dive - TCODE tCNSnow, "CNS now" ; ## NEW CNS at end-of-dive - TCODE tCNSeod, "CNS final" ; ## NEW CNS at end-of-dive - TCODE tIBCD, "IBCD N2He" ; ## NEW IBCD - TCODE tMicroBubbles, "M.Bubbles" ; ## NEW microbubbles - TCODE tCNS, "CNS: " ; ## V2.95 optics + TCODE tNDL, "NDL" ; 3 chars max + TCODE tTTS, "TTS" + TCODE tVelMetric, "m/min" + TCODE tVelImperial, "ft/m " + TCODE tGasSelect, "Select Gas" ; Select Gas + TCODE tSelectAir, "Air " ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Depth" ; Depth + TCODE tMaxDepth, "Max.Depth" ; Max. Depth - max 10chars! + TCODE tAvgDepth, "Average" ; average Depth - max 10chars! + TCODE tDivetime, "Divetime" ; Divetime + TCODE tDiveHudMask1, "Sensor 1" + TCODE tDiveHudMask2, "Sensor 2" + TCODE tDiveHudMask3, "Sensor 3" + TCODE tDiveTotalAvg, "Total Avg" + TCODE tDiveStopwatch, "Stopwatch" + TCODE tDiveStopAvg, "Stopped Avg" ; 11 chars max + TCODE tApnoeTotal, " Total" ; Total (six chars, right aligned) + TCODE tApnoeMax, "Last Descent" ; Last descent + TCODE tApnoeSurface, "Surface Time" ; Surface Time + TCODE tTime, "Time of Day" ; Time + TCODE tSurface, "Surface" ; Surface (max 12 chars) + TCODE tDiveDecoplan, "Decoplan" ; Decoplan +; TCODE tDiveClock, "Clock" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Tissues" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "GF Values" ; GF Values + TCODE taGFactors, "aGF Values" ; aGF Values + TCODE tGFInfo, "Current GF" ; GF Info + TCODE tCeiling, "Ceiling" ; Ceiling + TCODE tDiveSafetyStop, "Stop" ; Stop (four chars, right aligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Deco Zone" ; Deco info + TCODE tSensorCheck, "Sensor Check" ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree, "Sensors<>" ; Sensors disagree Warning + TCODE tGasNeedsWarn, "Gas Needs" + TCODE tGasNeedsAscent, "Gas Needs Ascent" + TCODE tCNSsurf, "CNS Surf." + TCODE tCNSfTTS, "CNS fTTS" + TCODE tCNSBO, "CNS B/O" + TCODE tCNSnow, "CNS now" + TCODE tCNSeod, "CNS final" + TCODE tIBCD, "IBCD N2He" + TCODE tnoBOgas, "-B/O-Gas-" + TCODE tMicroBubbles, "M.Bubbles" + TCODE tCNS, "CNS: " + TCODE tgaschange, "Change?" ; better gas found + TCODE tNeed, "Need " ; gas need (5 chars) + TCODE tBattery, "Battery" ; Battery + IFDEF _rx_functions + TCODE tTransmitter, "Pres XMTR" ; pressure transmitter + TCODE tPressure, "Tank Pres" ; tank pressure + TCODE tSAC, "SAC" ; SAC, must be 3 chars! + TCODE tswap, "Swap Tank" ; swap tank (max. 9 chars) + ENDIF + IFDEF _cave_mode + TCODE tGasNeedsCaveMode, "Gas Needs Cave Mode" ; title for gas needs custom view + TCODE tDiveTurned, "Dv.turned" ; dive is turned (max. 9 char) + TCODE tCaveMode, "Cave Mode" ; cave mode activated (max. 9 char) + TCODE tCaveModeShutdown, "X-Cave-X" ; cave mode shut down (max. 9 char) + ENDIF + ; Divemode menu - TCODE tDivePreMenu, "Menu?" ; Menu? - TCODE tSetHeading, "Bearing" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menu?" ; Menu? + TCODE tSetHeading, "Course" ; set bearing (max. 6 chars) ; Simulator menu - TCODE tQuitSim, "Quit?" ; Quit Simulation? + TCODE tQuitSim, "Quit" ; Quit Simulation ; Logbook - TCODE tCNS2, "CNS:" - TCODE tAVG, "Avg:" - TCODE tGF, "GF:" - TCODE tSAT, "Sat:" ; Sat: + TCODE tCNS2, "CNS:" + TCODE tAVG, "Avg:" + TCODE tGF, "GF:" + TCODE tSAT, "Sat:" ; Logbook units - TCODE tLogTunitC, "°C" - TCODE tLogTunitF, "°F" - TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tLogTunitC, "°C" + TCODE tLogTunitF, "°F" + TCODE tKGL, "kg/l" + TCODE tMBAR, "hPa" ; Logbook menu - TCODE tNextLog, "Next Page" + TCODE tNextLog, "Next Page" ; Reset menu - TCODE tReboot, "Reboot" ; Reboot - TCODE tResetMenu2, "Are you sure?" ; Are you sure? - TCODE tAbort, "Abort" ; Abort - TCODE tResetSettings, "Reset all" ; Reset all - TCODE tResetDeco, "Reset Deco" ; Reset Deco - TCODE tResetBattery, "Reset Battery" ; Reset Battery - TCODE tResetLogbook, "Reset Logbook" ; Reset Logbook + TCODE tReboot, "Reboot" ; Reboot + TCODE tResetMenu2, "Are you sure?" ; Are you sure? + TCODE tAbort, "Abort" ; Abort + TCODE tResetSettings, "Reset Settings" ; Reset Settings + TCODE tResetDeco, "Reset Deco" ; Reset Deco + TCODE tResetBattery, "Reset Battery" ; Reset Battery + TCODE tResetLogbook, "Reset Logbook" ; Reset Logbook ; Set Time Menu/Set Date Menu - TCODE tSetHours, "Set Hours" ; Set Hours - TCODE tSetMinutes, "Set Minutes" ; Set Minutes - TCODE tSetSeconds, "Clear Seconds" ; Clear seconds - TCODE tSetDay, "Set Day" ; Set Day - TCODE tSetMonth, "Set Month" ; Set Month - TCODE tSetYear, "Set Year" ; Set Year + TCODE tSetHours, "Set Hours" ; Set Hours + TCODE tSetMinutes, "Set Minutes" ; Set Minutes + TCODE tSetSeconds, "Clear Seconds" ; Clear seconds + TCODE tSetDay, "Set Day" ; Set Day + TCODE tSetMonth, "Set Month" ; Set Month + TCODE tSetYear, "Set Year" ; Set Year ; Logbook Offset Menu - TCODE tLogOffset, "Logbook offset" ; Logbook offset - TCODE tLogOffsetp1, "+1" ; +1 - TCODE tLogOffsetp10, "+10" ; +10 - TCODE tLogOffsetm1, "-1" ; -1 - TCODE tLogOffsetm10, "-10" ; -10 + TCODE tLogOffset, "Logbook Offset" ; Logbook offset + TCODE tLogOffsetp1, "+1" ; +1 + TCODE tLogOffsetp10, "+10" ; +10 + TCODE tLogOffsetm1, "-1" ; -1 + TCODE tLogOffsetm10, "-10" ; -10 -; Compass directions - TCODE tN, "N " ; N(orth), 338°- 22° - TCODE tNE, "NE" ; North-East, 23°- 67° - TCODE tE, "E " ; E(east), 68°-112° - TCODE tSE, "SE" ; South-East,113°-157° - TCODE tS, "S " ; S(outh), 158°-202° - TCODE tSW, "SW" ; South-West,203°-247° - TCODE tW, "W " ; W(West), 248°-292° - TCODE tNW, "NW" ; North-West,293°-337° +; Compass Directions + TCODE tN, "N " ; N(orth), 338°- 22° + TCODE tNE, "NE" ; North-East, 23°- 67° + TCODE tE, "E " ; E(east), 68°-112° + TCODE tSE, "SE" ; South-East, 113°-157° + TCODE tS, "S " ; S(outh), 158°-202° + TCODE tSW, "SW" ; South-West, 203°-247° + TCODE tW, "W " ; W(West), 248°-292° + TCODE tNW, "NW" ; North-West, 293°-337° ; Color Scheme menu - TCODE tColorScheme, "Colour scheme" ; Colour scheme - TCODE tColorSetDive, "Divemode:" ; Divemode: - TCODE tColorSetName0, "Standard" ; Standard - TCODE tColorSetName1, "Red" ; Red - TCODE tColorSetName2, "Green" ; Green - TCODE tColorSetName3, "Blue" ; Blue - -; PSCR Menu and Settings - TCODE tPSCRMenu, "pSCR Setup" ; PSCR Menu ## MODIFIED (consistient naming) - TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop - TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio + TCODE tColorScheme, "Colour Scheme" ; Colour Scheme + TCODE tColorSetDive, "Divemode:" ; Divemode: + TCODE tColorSetName0, "Standard" ; Standard + TCODE tColorSetName1, "Red" ; Red + TCODE tColorSetName2, "Green" ; Green + TCODE tColorSetName3, "Blue" ; Blue + +; pSCR Menu and Settings + TCODE tPSCRMenu, "pSCR Setup" ; PSCR Menu + TCODE tPSCR_O2_drop, "O2 Drop " ; O2 drop + TCODE tPSCR_lungratio, "Lung Ratio " ; lung ratio + TCODE tBackToLoop, "goto loop" ; back to loop (10 chars max) ### new + + +; Language selection + IF _language_2!=none + TCODE tLanguage, "Language: " ; used in menu_tree + ENDIF + + IF _language_1==en + TCODE tLang1, "English" ; tLang1 is 1st language, enum context + ELSE + IF _language_1==de + TCODE tLang1, "German" + ELSE + IF _language_1==fr + TCODE tLang1, "French" + ELSE + IF _language_1==it + TCODE tLang1, "Italian" + ELSE + TCODE tLang1, "" ; dummy target for options table + ENDIF + ENDIF + ENDIF + ENDIF + + IF _language_2==en + TCODE tLang2, "English" ; tLang2 is 2nd language, enum context + ELSE + IF _language_2==de + TCODE tLang2, "German" + ELSE + IF _language_2==fr + TCODE tLang2, "French" + ELSE + IF _language_2==it + TCODE tLang2, "Italian" + ENDIF + ENDIF + ENDIF + ENDIF diff -r 00b24fb4324d -r ca4556fb60b9 src/text_french.inc --- a/src/text_french.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_french.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,369 +1,463 @@ -;============================================================================= >> OCTC3 V1.13b > ClaudeDive update proposed.  +;============================================================================= ; -; File text_french.asm REFACTORED VERSION V2.95 +; File text_french.asm REFACTORED VERSION V2.99e ; -; French texts translation file. +; French texts translation file. ; -; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; Basic texts - TCODE tNo, "Non" ; No - TCODE tYes, "Oui" ; Yes = No + 1 - TCODE tblank, " " ; (a single space character) ## NEW (layout) + TCODE tNo, "Non" ; 0 No + TCODE tYes, "Oui" ; 1 Yes + IFDEF _cave_mode + TCODE tCave, "Cave" ; 2 Cave + ENDIF + + TCODE tblank, " " ; (a single space character) ; Surface-mode texts - TCODE tBeta, "bêta" ; beta - TCODE tMenu, "" ; View> - TCODE tHeading, "Cap:" ; Heading: - TCODE tLastDive, "Dern.Plong" ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "Cellules CCR mV" ; CCR Sensors mV + TCODE tMenu, "" ; View> + TCODE tHeading, "Cap:" ; Heading: + TCODE tLastDive, "Dern.Plong" ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "Cellules mV" ; Sensors mV ; Divemode Menu - TCODE tDivemenu_Gaslist, "Liste Gaz" ; Gas List - TCODE tDivemenu_ResetAvg, "RaZChrono" ; Reset Avg. - TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"Cellules" ; Use Sensor - TCODE tDivemenu_ToggleGF, "Bascul.GF" ; Toggle GF - TCODE tDivemenu_Marker, "Repère" ; Set Marker - TCODE tDivemenu_LostGas, "Gaz Perdu" ; Lost Gas + TCODE tDivemenu_Gaslist, "Liste Gaz" ; Gas List (OC) + TCODE tDivemenu_Diluent, "Liste Dil" ; Diluents (CCR) + TCODE tDivemenu_Premix, "Liste Mix" ; Premix (pSCR) + TCODE tDivemenu_ResetAvg, "RaZChrono" ; Reset Avg. + TCODE tDivemenu_Avg_Mkr, "Avg/Marker" ; Reset Avg., Set Marker (and Turn Dive) ## pending translation + TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint + TCODE tDivemenu_UseSensor,"Cellules" ; Use Sensor + TCODE tDivemenu_ToggleGF, "Bascul.GF" ; Toggle GF + TCODE tDivemenu_Marker, "Repère" ; Set Marker + TCODE tDivemenu_LostGas, "Gaz Perdu" ; Lost Gas + IFDEF _cave_mode + TCODE tDivemenu_TurnDive, "Turn Dive" ; Turn Dive + ENDIF ; Main menu - TCODE tNext, "" ; Enter> - - TCODE tMainMenu, "Menu Principal" ; Main Menu - TCODE tLogbook, "Carnet de Plongée" ; Logbook - TCODE tGasSetup, "Paramètres Gaz OC" ; OC Gas Setup - TCODE tSetTime, "Réglage Heure" ; Set Time - TCODE tSetDate, "Réglage Date" ; Set Date - TCODE tSetTimeDate,"Date & Heure" ; Set Time & Date - TCODE tDispSets, "Préfér. Réglages" ; Display Settings - TCODE tExit, "Retour" ; Exit - TCODE tResetMenu, "Menu RaZ" ; Reset Menu - TCODE tDiveModeMenu,"Menu Déco" ; Deco Mode - TCODE tInfoMenu, "Informations" ; Information - TCODE tCCRSetup, "Paramètres CCR" ; CCR Setup - TCODE tDiluentSetup,"Liste Diluants" ; Diluent Setup - TCODE tFixedSetpoints,"Setpoints Fixes" ; Fixed Setpoints - TCODE tCCRSensor, "Cellules CCR" ; CCR Sensor - TCODE tCalibrateMenu, "Calibration" ; Calibration - TCODE tCalibrationGas, "Cal. Gaz O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Calibrate" ; Calibrate - TCODE tBack, "retour..." ; back... ## NEW + TCODE tNext, "" ; Enter> + TCODE tMainMenu, "Menu Principal" ; Main Menu + TCODE tLogbook, "Carnet de Plongée" ; Logbook + TCODE tGasSetup, "Paramètres Gaz OC" ; OC Gas Setup + TCODE tSetTime, "Réglage Heure" ; Set Time + TCODE tSetDate, "Réglage Date" ; Set Date + TCODE tSetTimeDate, "Date & Heure" ; Set Time & Date + TCODE tDispSets, "Préfér. Réglages" ; Display Settings + TCODE tExit, "Retour" ; Exit + TCODE tResetMenu, "Menu RaZ" ; Reset Menu + TCODE tDiveModeMenu, "Menu Déco" ; Deco Mode + TCODE tInfoMenu, "Informations" ; Information + TCODE tTrSettings, "Pressure Display" ; Pressure Display ## pending translation + TCODE tTrMode, "Mode: " ; Mode + TCODE tTr1stPres, "1.Pres.: " ; 1st Pressure + TCODE tTr2ndPres, "2.Pres.: " ; 2nd Pressure + TCODE tTrBailPres, "1.B/O : " ; Bailout Pressure + TCODE tTrMaxDeltaP, "max deltaP: " ; independent double max diffenerce ## pending translation + TCODE tCCRSetup, "Paramètres CCR" ; CCR Setup + TCODE tDiluentSetup, "Liste Diluant" ; Diluent Setup + TCODE tFixedSetpoints, "Setpoints Fixes" ; Fixed Setpoints + TCODE tCCRSensor, "Cellules CCR" ; CCR Sensor + TCODE tCalibrateMenu, "Calibration" ; Calibration + TCODE tCalibrationGas, "Cal. Gaz O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tBack, "retour" ; back ; Gas menu - TCODE tGaslist, "Liste Gaz OC" ; OC Gas List - TCODE tGaslistCC, "Liste Gaz CC" ; CC Diluents - TCODE tGasEdit, "Préférence Gaz" ; Edit Gas - TCODE tType, "Type: " - TCODE tGasDisabled,"Désactivé" ; Disabled - TCODE tGasFirst, "Premier" ; First - TCODE tGasTravel, "Travel" ; Travel - TCODE tGasDeco, "Déco" ; Deco - TCODE tDilDisabled,"Désactivé" ; Disabled - TCODE tDilFirst, "Premier" ; First - TCODE tDilNorm, "Normal" ; Normal - TCODE tAir, "Air " ; Enum: values must follows (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Prof. Changement" ; Change Depth - TCODE tDepthPlus, "Prof. +" - TCODE tDepthMinus,"Prof. -" - TCODE tDepthReset,"MOD par défaut:" - TCODE tSetup_mix, "Config. Gaz" ; Setup mix - TCODE tCCRMode, "Mode CCR:" ; CCR Mode: - TCODE tCCRModeFixedSP, "SP Fixe" ; Fixed SP - TCODE tCCRModeSensor, "Cellule" ; Sensor - TCODE tCCRModeAutoSP, "SP Auto" ; Auto SP - TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "PpO2+" ; pO2+ - TCODE tSensorFallback, "Fallback:" ; Fallback: - TCODE tCalculated, "calculé" ; calculated - TCODE tppO2, "PpO2:" ; ppO2: - TCODE tppO2O2, "PpO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "PpO2(Dil)" ; ppO2(Dil) - TCODE tppO2Mix, "PpO2(Mix)" ; ppO2(Mix) - + TCODE tGaslist, "Liste Gaz OC" ; OC Gas List + TCODE tGaslistCC, "Liste Gaz CC" ; CC Diluents + TCODE tGasEdit, "Préférence Gaz" ; Edit Gas + TCODE tType, "Type: " + TCODE tGasDisabled, "Désactivé" ; Disabled + TCODE tGasFirst, "Premier" ; First + TCODE tGasTravel, "Travel" ; Travel + TCODE tGasDeco, "Déco" ; Deco + TCODE tDilDisabled, "Désactivé" ; Disabled + TCODE tDilFirst, "Premier" ; First + TCODE tDilNorm, "Normal" ; Normal + TCODE tAir, "Air " ; Enum: values must follows (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD :" + TCODE tEAD, "EAD:" + TCODE tSetup_GasDepth, "Config. Changement" ; Change Depth + TCODE tDepthPlus, "Prof. +" + TCODE tDepthMinus, "Prof. -" + TCODE tDepthReset, "MOD par défaut:" + TCODE tSetup_GasMix, "Config. Gaz" ; Setup mix + TCODE tCCRMode, "Mode CCR:" ; CCR Mode: + TCODE tCCRModeFixedSP, "SP Fixe" ; Fixed SP + TCODE tCCRModeSensor, "Cellule" ; Sensor + TCODE tCCRModeAutoSP, "SP Auto" ; Auto SP + TCODE tSP, "SP" ; SP (SetPoint) + TCODE tSPPlus, "PpO2+" ; pO2+ + TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "calculé" ; calculated + TCODE tppO2, "PpO2:" ; ppO2: + TCODE tppO2O2, "PpO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "PpO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "PpO2(Mix)" ; ppO2(Mix) + ; New batteries menu - TCODE tNewBattTitle, "Nouvelle Batterie?" + TCODE tNewBattTitle, "Nouvelle Batterie?" TCODE tNewBattOld, "Conserver" TCODE tNewBattNew36, "Réinit.3,6V Saft(T1)" ; New 3,6V TCODE tNewBattNew15, "Réinit.1,5V AA (T0)" ; New 1,5V TCODE tNewBattAccu, "3,6V LiIon AA (T2)" - TCODE tNew18650, "Internal 18650 (T3)" - TCODE tNew16650, "Internal 16650 (T4)" - + TCODE tNew18650, "Internal 18650 (T3)" + TCODE tNew16650, "Internal 16650 (T4)" + ; Gaslist management - TCODE tGas, "Gaz" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) + TCODE tGas, "Gaz" ; Gas + TCODE tDil, "Dil" ; Diluent + TCODE tGasErr, "Err" ; Err (3 chars) ; Communication Menu - TCODE tUsbTitle, "Mode USB" - TCODE tBleTitle, "Mode Bluetooth" - TCODE tUsbStarting, "Début..." - TCODE tUsbStartDone, "Ok." - TCODE tUsbServiceMode,"Mode Maintenance" - TCODE tUsbClosed, "Port Fermé" - TCODE tUsbExit, "Terminé" - TCODE tUsbDownloadMode,"Mode Téléchargement" - TCODE tUsbLlBld, "Chargeur Bas-Niv." + TCODE tUsbTitle, "Mode USB" + TCODE tBleTitle, "Mode Bluetooth" + TCODE tUsbStarting, "Début..." + TCODE tUsbStartDone, "Ok." + TCODE tUsbServiceMode, "Mode Maintenance" + TCODE tUsbClosed, "Port Fermé" + TCODE tUsbExit, "Terminé" + TCODE tUsbDownloadMode, "Mode Téléchargement" + TCODE tUsbLlBld, "Chargeur Bas-Niv." ; Dive Settings - TCODE tDvMode, "Mode:" - TCODE tDvOC, "OC" - TCODE tDvCCR, "CCR" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnée" - TCODE tDvPSCR, "pSCR" - TCODE tDvCC, "CC" - TCODE tDkMode, "Modèle:ZH-L16" ; ## MODIFIED (memory) - TCODE tZHL16, " " ; ## MODIFIED (memory) - TCODE tZHL16GF, "+GF" ; ## MODIFIED (memory) - TCODE tPPO2Max, "PpO2 Max :" - TCODE tPPO2DECO, "PpO2 Déco:" - TCODE tPPO2MIN, "PpO2 Min :" - TCODE tPPO2MINCC, "Min Loop :" ; ## NEW ppO2 min cc - TCODE tLastDecostop, "Dern.Palier:" - TCODE tDecoparameters, "Paramètres Déco" - TCODE tGF_low, "GF Bas:" - TCODE tGF_high, "GF Haut:" - TCODE tSaturationMult, "Saturation:" - TCODE tDesaturationMult, "Désaturation:" - 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 - TCODE taGF_enable,"aGF Possible:" ; aGF Selectable - TCODE tDiveaGF_active,"aGF!" ; aGF! - TCODE tppO2settings,"Menu PpO2" ; ppO2 Settings (max. 18 chars) - TCODE tsafetystopmenu,"Palier Sécurité:" ; Safety Stop: (max. 16 chars) - TCODE tGasUsage, "Usage Gaz" ; Gas Usage - TCODE tSetBotUse, "Gaz Fond: " ; Bottom Gas: (space) - TCODE tSetDecoUse, "Gaz Déco: " ; Deco Gas: (space) ## MODIFIED (layout) - 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, "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 - TCODE tGas3, "Gaz 3:" ; ## NEW bailout gas needs - TCODE tGas4, "Gaz 4:" ; ## NEW bailout gas needs - TCODE tGas5, "Gaz 5:" ; ## NEW bailout gas needs - TCODE tCCmaxFracO2, "Loop %O2 max.:" ; ## NEW CCR max ppO2 limiter - TCODE t2ndDecoPlanMenu,"Suite Menu Déco" ; 2nd Deco Plan ## NEW deco engine + TCODE tDvMode, "Mode: " + TCODE tDvOC, "OC" + TCODE tDvCCR, "CCR" + TCODE tDvGauge, "Gauge" + TCODE tDvApnea, "Apnée" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Modèle: ZH-L16" + TCODE tZHL16, " " + TCODE tZHL16GF, "+GF" + TCODE tPPO2Max, "PpO2 Max :" + TCODE tPPO2DECO, "PpO2 Déco:" + TCODE tPPO2MIN, "PpO2 Min :" + TCODE tPPO2MINCC, "Min Loop :" + TCODE tLastDecostop, "Dern.Palier : " + TCODE tAscentSpeed, "Ascent Speed: " ; Ascent Speed ## pending translation + TCODE tGasChangeTime, "Gas Change :+" ; additional Gas Change Time ## pending translation + TCODE tDecoparameters, "Paramètres Déco" + TCODE tGF_low, "GF Bas :" + TCODE tGF_high, "GF Haut:" + TCODE tSaturationMult, "Saturation : " + TCODE tDesaturationMult, "Désaturation: " + TCODE tFTTSMenu, "Future DTR:" ; Future TTS + TCODE tLastDecostopSurf, "Dern.Palier:" ; last deco stop depth Surface Custom View + TCODE tGFMenu, "Menu GF" ; GF Settings + TCODE taGF_low, "aGF Bas :" ; aGF Low + TCODE taGF_high, "aGF Haut:" ; aGF High + TCODE taGF_enable, "aGF Possible:" ; aGF Selectable + TCODE tDiveaGF_active, "using aGF" ; using aGF ## pending translation + TCODE tppO2settings, "Menu PpO2" ; ppO2 Settings (max. 18 chars) + TCODE tsafetystopmenu, "Palier Sécurité:" ; Safety Stop: (max. 16 chars) + TCODE tGasUsage, "Usage Gaz" ; Gas Usage + TCODE tSetBotUse, "Gaz Fond: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Gaz Déco: " ; Deco Gas: (space) + TCODE tCalcAscGas, "Calc.Gaz (B/O):" + TCODE tSetup_Tank, "Config. Blocs" ; Setup Tank + TCODE tTankSize, "Volume Bloc" ; Tank Sizes + TCODE tTankUsablePress, "Pression Ascent" ; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars) ## pending translation + TCODE tCopyDilToOC, "Copy Dil.-> OC" ; copy diluent settings to OC gas ## pending translation + TCODE tTankPairing, "Config. Transmitter" ; select Transmitter ## pending translation + TCODE tLiter, " l" ; Liter as l + TCODE tLiterLong, "Liter" ; Liter as Liter + TCODE tCCmaxFracO2, "Loop %O2 max.:" ; + TCODE t2ndDecoPlanMenu, "Suite Menu Déco" ; 2nd Deco Plan + + IFDEF _rx_functions + TCODE tTrModeOff, "off" ; off ## pending translation + TCODE tTrModeOn, "on" ; on ## pending translation + TCODE tTrModeIndDouble, "indep.Double" ; independent double ## pending translation + TCODE tTrModeCCR, "CCR Dil+O2" ; CCR diluent and O2 + TCODE tTrPresNone, "none" ; none (big enum group follows) ## pending translation + TCODE tTrPresGas1, "Gas 1" ; Gas 1 + TCODE tTrPresGas2, "Gas 2" ; Gas 2 + TCODE tTrPresGas3, "Gas 3" ; Gas 3 + TCODE tTrPresGas4, "Gas 4" ; Gas 4 + TCODE tTrPresGas5, "Gas 5" ; Gas 5 + TCODE tTrPresDil1, "Dil 1" ; Dil 1 + TCODE tTrPresDil2, "Dil 2" ; Dil 2 + TCODE tTrPresDil3, "Dil 3" ; Dil 3 + TCODE tTrPresDil4, "Dil 4" ; Dil 4 + TCODE tTrPresDil5, "Dil 5" ; Dil 5 + TCODE tTrPresFirstGas, "First Gas" ; first Gas ## pending translation + TCODE tTrPresActiveGas, "active Gas" ; active Gas ## pending translation + TCODE tTrPresFirstDil, "First Dil" ; first Dil ## pending translation + TCODE tTrPresActiveDil, "active Dil" ; active Dil ## pending translation + ELSE + TCODE tTrModeOff, "" ; dummy target for entry in option table + TCODE tTrPresNone, "" ; dummy target for entry in option table + ENDIF ; Display Settings - TCODE tBright, "Luminosité:" - TCODE tEco, "Eco" - TCODE tMedium, "Moyenne" - TCODE tHigh, "Haute" - TCODE tDvSalinity,"Salinité:" ; Salinity - TCODE tShowppO2, "Afficher PpO2:" ; Always show ppO2: - TCODE tFlip, "Pivoter l'écran:" ; Rotate Screen - TCODE tMODwarning,"Alerte MOD:" ; MOD warning - TCODE tIBCDwarning,"Alerte CDI:" ; IBCD Warning ## NEW IBCD - TCODE tTimeoutDive,"Fin Plongée:" ; Dive Timeout + TCODE tBright, "Luminosité:" + TCODE tEco, "Eco" + TCODE tMedium, "Moyenne" + TCODE tHigh, "Haute" + TCODE tDvSalinity, "Salinité: " ; Salinity + TCODE tShowppO2, "Afficher PpO2:" ; Always show ppO2: + TCODE tFlip, "Pivoter l'écran:" ; Rotate Screen + TCODE tMODwarning, "Alerte MOD:" ; MOD warning + TCODE tIBCDwarning, "Alerte CDI:" ; IBCD Warning + TCODE t2ndDepth, "2.Prof.:" ; 2nd depth display content (10 chars max) + TCODE tTimeoutDive, "Fin Plongée:" ; Dive Timeout ; VSI display Settings - TCODE tVSItext2, "Vitesse Variable:" ; Variable speed: - TCODE tVSIgraph, "Graph. Vitesse:" ; Speed graph: + TCODE tVSItext2, "Vitesse Variable:" ; Variable speed: + TCODE tVSIgraph, "Graph. Vitesse :" ; Speed graph: ; Setup Menu - TCODE tSystSets, "Réglages" - TCODE tLanguage, "Langue:" - TCODE tEnglish, "Anglais" - TCODE tGerman, "Allemand" - TCODE tFrench, "Français" - TCODE tItalian, "Italien" - TCODE tCompassMenu,"Calibration Compas" ; Compass Calibration - TCODE tCompassGain,"Sensibilité:" ; Compass Gain: - TCODE tCalX, "Cal X:" ; Cal X - TCODE tCalY, "Cal Y:" ; Cal Y - TCODE tCalZ, "Cal Z:" ; Cal Z - - TCODE tUnits, "Unités:" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - - TCODE tButtonleft,"Bouton gauche:" ; Left button - TCODE tButtonright,"Bouton droit:" ; Right button + TCODE tSystSets, "Réglages" + TCODE tCompassMenu, "Calibration Compas" ; Compass Calibration + TCODE tCompassGain, "Sensibilité:" ; Compass Gain: + TCODE tCalX, "Cal X:" ; Cal X + TCODE tCalY, "Cal Y:" ; Cal Y + TCODE tCalZ, "Cal Z:" ; Cal Z + TCODE tUnits, "Unités:" + TCODE tMetric, " m/°C" ; Enum menu + TCODE tImperial, "ft/°F" + TCODE tDefName, "HW OSTC" + TCODE tButtonleft, "Bouton gauche:" ; Left button + TCODE tButtonright, "Bouton droit :" ; Right button + TCODE tAltMode, "Temps Attente:" ; Waiting Time + TCODE tAltModeFly, "Avion" ; Flying + TCODE tAltMode1000, "1000m" + TCODE tAltMode2000, "2000m" + TCODE tAltMode3000, "3000m" - TCODE tAltMode, "Temps Attente" ; ## NEW no fly altitude - TCODE tAltModeFly, "Avion " ; ## NEW no fly altitude - TCODE tAltMode1000, "1000 m" ; ## NEW no fly altitude - TCODE tAltMode2000, "2000 m" ; ## NEW no fly altitude - TCODE tAltMode3000, "3000 m" ; ## NEW no fly altitude - ; Units for all menu - TCODE tMeters, "m" - TCODE tFeets, "ft" - TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" - TCODE tbar, "bar" ; bar - TCODE tbar10, "0 bar" ; bar ## NEW 2.95 - TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed - TCODE tmin, "min" ; minutes - + TCODE tMeters, "m" + TCODE tFeets, "ft" + TCODE tFeets1, "f" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" + TCODE tbar, "bar" ; bar + TCODE tbar10, "0 bar" ; xx0 bar + TCODE tMeterMinute, "m/'" ; meter per minute + ; Date - TCODE tDateFormat, "Date:" - TCODE tDateformat, "MMJJAA" - TCODE tDateformat1,"JJMMAA" - TCODE tDateformat2,"AAMMJJ" + TCODE tDateFormat, "Date: " + TCODE tDateformat, "MMJJAA" + TCODE tDateformat1, "JJMMAA" + TCODE tDateformat2, "AAMMJJ" ; Simulator menu - TCODE tInter, "Lancer Simulation" ; Start Simulator - TCODE tPlan, "Simulateur" ; Simulator + TCODE tInter, "Lancer Simulation" ; Start Simulator + TCODE tPlan, "Simulateur" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Temps Fond:" ; Bot. Time: (10 chars) - TCODE tBtTm_short,"Temps:" ; Bot. Time: (max. 6 chars) - TCODE tBtDep, "Prof. Max:" ; Max Depth: (10 chars) - TCODE tIntvl, "Intervalle:" ; Interval : (10 chars) - TCODE tDecoSetup, "Réglage Ordinateur" ; ## NEW (layout) - TCODE tDeco, "Calcul Déco" ; Calculate Deco - TCODE tDivePlan, "Runtime:" ; Dive Plan: - TCODE tNoDeco, "Pas de Déco" ; No Deco - TCODE tMore, "Suite..." ; More... - TCODE tSelectSetpoint,"Setpoint CCR: " ; ## NEW deco calculator enhancement - TCODE tuseAGF, "aGF Permis:" ; ## NEW deco calculator enhancement - TCODE tCalculating, "Calcul en cours" ; Calculating... ## NEW deco calculator enhancement + TCODE tBtTm, "Temps Fond:" ; Bot. Time: (10 chars) + TCODE tBtTm_short, "Temps:" ; Bot. Time: (max. 6 chars) + TCODE tBtDep, "Prof. Max :" ; Max Depth: (10 chars) + TCODE tIntvl, "Intervalle:" ; Interval : (10 chars) + TCODE tDecoSetup, "Réglage Ordinateur" ; Calculator Setup + TCODE tDeco, "Calcul Déco" ; Calculate Deco + TCODE tDivePlan, "Runtime:" ; Dive Plan: + TCODE tNoDeco, "Pas de Déco" ; No Deco + TCODE tMore, "Suite" ; More + TCODE tSelectSetpoint, "Setpoint :" + TCODE tuseAGF, "aGF Permis:" ; use aGF + TCODE tCalculating, "Calcul en cours" ; Calculating + TCODE tNDLleft, "left" ; time left within NDL ## pending translation ; Information menu - TCODE tFirmware, "Logiciel:" ; Firmware: (space) - TCODE tSerial, "N° Série:" ; Serial : (space) - TCODE tTotalDives,"Nbre Plongées:" ; Total Dives: (space) - TCODE tBatteryV, "Batterie:" ; Battery: - TCODE tUptime, "Mise a Jour:" ; Uptime: + TCODE tFirmware, "Logiciel: " ; Firmware: (space) + TCODE tFirmware_rx, "RX Ver : " ; RX Ver : (space) + TCODE tSerial, "N. Série: " ; Serial : (space) + TCODE tTotalDives, "Nbre Plongées:" ; Total Dives: (space) + TCODE tBatteryV, "Batterie: " ; Battery: + TCODE tUptime, "Mise a Jour:" ; Uptime: ; Divemode screen - TCODE tNDL, "NDL" - TCODE tTTS, "DTR" - TCODE tVelMetric, "m/min" - TCODE tVelImperial,"ft/m " - TCODE tGasSelect, "Activer Gaz" ; Select Gas - TCODE tSelectAir, "Air " ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Prof." ; Depth - TCODE tMaxDepth, "Prof. Max." ; Max. Depth - max 10chars! - TCODE tDivetime, "Durée" ; Divetime - TCODE tDiveHudMask1, "cell. 1" - TCODE tDiveHudMask2, "cell. 2" - TCODE tDiveHudMask3, "cell. 3" - TCODE tDiveTotalAvg, "Prof. Moy." - TCODE tDiveStopwatch, "Chrono" - TCODE tDiveStopAvg, "P.Moy.Chron" ; 11chars max - TCODE tApnoeTotal, "Totale" ; Total (Six chars, right alligned) - TCODE tApnoeMax, "Dern.Plongée" ; Last Descend - TCODE tApnoeSurface, "Tps Surface" ; Surface Time - TCODE tDiveDecoplan, "Runtime" ; Decoplan - TCODE tDiveClock, "Heure" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Tissus" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "Valeurs GF" ; GF Values - TCODE taGFactors, "Valeurs aGF" ; aGF Values - TCODE tGFInfo, " GF Info" ; GF Info - TCODE tCeiling, "Plafond" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) - TCODE tDecoInfo, "Zone Déco" ; Deco info - TCODE tSensorCheck, "Ctrl Cell. " ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning - TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning - TCODE tSensorDisagree,"Sensors<>" ; Sensors disagree Warning ## NEW voting logic - TCODE tGasNeedsWarn, "Gas Needs" ; ## NEW bailout gas needs - TCODE tGasNeedsBar, "Besoins Gaz (bar)" ; ## NEW bailout gas needs - TCODE tCNSsurf, "SNC Surf." ; CNS Surf. ## NEW CNS at end-of-dive - TCODE tCNSfTTS, "SNC fDTR" ; CNS fTTS ## NEW CNS at end-of-dive - TCODE tCNSBO, "SNC B/O" ; CNS B/O ## NEW CNS at end-of-dive - TCODE tCNSnow, "SNC actuel" ; CNS now ## NEW CNS at end-of-dive - TCODE tCNSeod, "SNC final" ; CNS fin ## NEW CNS at end-of-dive - TCODE tIBCD, "CDI N2He" ; IBCD N2He ## NEW IBCD - TCODE tMicroBubbles, "M.Bulles " ; ## NEW microbubbles - TCODE tCNS, "SNC: " ; ## V2.95 optics - + TCODE tNDL, "NDL" ; 3 chars max + TCODE tTTS, "DTR" + TCODE tVelMetric, "m/min" + TCODE tVelImperial, "ft/m " + TCODE tGasSelect, "Activer Gaz" ; Select Gas + TCODE tSelectAir, "Air " ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Prof." ; Depth + TCODE tMaxDepth, "Prof. Max." ; Max. Depth - max 10chars! + TCODE tAvgDepth, "Prof. Moy." ; average Depth - max 10chars! + TCODE tDivetime, "Durée" ; Divetime + TCODE tDiveHudMask1, "cell. 1" + TCODE tDiveHudMask2, "cell. 2" + TCODE tDiveHudMask3, "cell. 3" + TCODE tDiveTotalAvg, "Prof. Moy." + TCODE tDiveStopwatch, "Chrono" + TCODE tDiveStopAvg, "P.Moy.Chron" ; 11 chars max + TCODE tApnoeTotal, "Totale" ; Total (six chars, right aligned) + TCODE tApnoeMax, "Dern.Plongée" ; Last Descend + TCODE tApnoeSurface, "Tps.Surface" ; Surface Time + TCODE tTime, "Time" ; Time ## pending translation + TCODE tSurface, "Surface" ; Surface (max 12 chars) ## pending translation + TCODE tDiveDecoplan, "Runtime" ; Decoplan +; TCODE tDiveClock, "Heure" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Tissus" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "Valeurs GF" ; GF Values + TCODE taGFactors, "Valeurs aGF" ; aGF Values + TCODE tGFInfo, " GF Info" ; GF Info + TCODE tCeiling, "Plafond" ; Ceiling + TCODE tDiveSafetyStop, "Stop" ; Stop (four chars, right aligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Zone Déco" ; Deco info + TCODE tSensorCheck, "Ctrl Cell. " ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree, "Sensors<>" ; Sensors disagree Warning + TCODE tGasNeedsWarn, "Gas Needs" ; + TCODE tGasNeedsAscent, "Besoins Gaz Ascent" ; ## pending translation + TCODE tCNSsurf, "SNC Surf." ; CNS Surf. + TCODE tCNSfTTS, "SNC fDTR" ; CNS fTTS + TCODE tCNSBO, "SNC B/O" ; CNS B/O + TCODE tCNSnow, "SNC actuel" ; CNS now + TCODE tCNSeod, "SNC final" ; CNS fin + TCODE tIBCD, "CDI N2He" ; IBCD N2He + TCODE tnoBOgas, "-B/O-Gaz-" ; + TCODE tMicroBubbles, "M.Bulles " ; + TCODE tCNS, "SNC: " ; + TCODE tgaschange, "Change?" ; better gas found ## pending translation + TCODE tNeed, "Need " ; gas need (5 chars) ## pending translation + TCODE tBattery, "Batterie" ; Battery + IFDEF _rx_functions + TCODE tTransmitter, "P.Transm." ; pressure transmitter ## pending translation + TCODE tPressure, "Pres Bloc" ; tank pressure + TCODE tSAC, "SAC" ; SAC, must be 3 chars! + TCODE tswap, "Swap Tank" ; swap tank (max. 9 chars) ## pending translation + ENDIF + IFDEF _cave_mode + TCODE tGasNeedsCaveMode, "Besoins Gaz Cave Mode" ; title for gas needs custom view + TCODE tDiveTurned, "Dv.turned" ; dive is turned (max. 9 char) ## pending translation + TCODE tCaveMode, "Cave Mode" ; cave mode activated (max. 9 char) + TCODE tCaveModeShutdown, "X-Cave-X" ; cave mode shut down (max. 9 char) + ENDIF + ; Divemode menu - TCODE tDivePreMenu, "Menu ?" ; Menu? - TCODE tSetHeading, "Cap" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menu?" ; Menu? + TCODE tSetHeading, "Cap" ; Bearing (max. 6 chars) ; Simulator menu - TCODE tQuitSim, "Fin ?" ; Quit Simulation? + TCODE tQuitSim, "Fin" ; Quit Simulation ; Logbook - TCODE tCNS2, "SNC:" - TCODE tAVG, "Moy:" - TCODE tGF, "GF:" - TCODE tSAT, "Sat:" ; Sat: + TCODE tCNS2, "SNC:" + TCODE tAVG, "Moy:" + TCODE tGF, "GF:" + TCODE tSAT, "Sat:" ; Logbook units - TCODE tLogTunitC, "°C" - TCODE tLogTunitF, "°F" - TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tLogTunitC, "°C" + TCODE tLogTunitF, "°F" + TCODE tKGL, "kg/l" + TCODE tMBAR, "hPa" ; Logbook menu - TCODE tNextLog, "Page Suivante" - + TCODE tNextLog, "Page Suivante" + ; Reset menu - TCODE tReboot, "Redémarrage" ;Reboot - TCODE tResetMenu2,"Confirmer ?" ;Are You Sure? - TCODE tAbort, "Quitter" ;Abort - TCODE tResetSettings, "RaZ Complète" ;Reset All - TCODE tResetDeco, "RaZ Déco" ;Reset Deco - TCODE tResetBattery, "RaZ Batterie" ;Reset Battery - TCODE tResetLogbook, "RaZ Carnet" ;Reset Logbook + TCODE tReboot, "Redémarrage" ; Reboot + TCODE tResetMenu2, "Confirmer?" ; Are You Sure? + TCODE tAbort, "Quitter" ; Abort + TCODE tResetSettings, "RaZ Settings" ; Reset Settings ## pending translation + TCODE tResetDeco, "RaZ Déco" ; Reset Deco + TCODE tResetBattery, "RaZ Batterie" ; Reset Battery + TCODE tResetLogbook, "RaZ Carnet" ; Reset Logbook ; Set Time Menu/Set Date Menu - TCODE tSetHours, "Ajust. Heures" ; Set Hours - TCODE tSetMinutes,"Ajust. Minutes" ; Set Minutes - TCODE tSetSeconds,"RaZ Secondes" ; Clear Seconds - TCODE tSetDay, "Ajust. Jours" ; Set Day - TCODE tSetMonth, "Ajust. Mois" ; Set Month - TCODE tSetYear, "Ajust. Année" ; Set Year + TCODE tSetHours, "Ajust. Heures" ; Set Hours + TCODE tSetMinutes, "Ajust. Minutes" ; Set Minutes + TCODE tSetSeconds, "RaZ Secondes" ; Clear Seconds + TCODE tSetDay, "Ajust. Jours" ; Set Day + TCODE tSetMonth, "Ajust. Mois" ; Set Month + TCODE tSetYear, "Ajust. Année" ; Set Year ; Logbook Offset Menu - TCODE tLogOffset, "N° 1ère plongée" ; Logbook offset (Max. 15 Chars!) - TCODE tLogOffsetp1, "+1" ; +1 - TCODE tLogOffsetp10, "+10" ; +10 - TCODE tLogOffsetm1, "-1" ; -1 - TCODE tLogOffsetm10, "-10" ; -10 + TCODE tLogOffset, "N° 1ère plongée" ; Logbook offset (Max. 15 Chars!) + TCODE tLogOffsetp1, "+1" ; +1 + TCODE tLogOffsetp10, "+10" ; +10 + TCODE tLogOffsetm1, "-1" ; -1 + TCODE tLogOffsetm10, "-10" ; -10 ; Compass directions - TCODE tN, "N " ; N(orth),338°-22° - TCODE tNE, "NE" ; North-East,23°-67° - TCODE tE, "E " ; E(east),68°-112° - TCODE tSE, "SE" ; South-East,113°-157° - TCODE tS, "S " ; S(outh),157°-202° - TCODE tSW, "SO" ; South-West,203°-247° - TCODE tW, "O " ; W(West),248°-292° - TCODE tNW, "NO" ; North-West,293°-337° + TCODE tN, "N " ; N(orth), 338°-22° + TCODE tNE, "NE" ; North-East, 23°-67° + TCODE tE, "E " ; E(east), 68°-112° + TCODE tSE, "SE" ; South-East, 113°-157° + TCODE tS, "S " ; S(outh), 157°-202° + TCODE tSW, "SO" ; South-West, 203°-247° + TCODE tW, "O " ; W(West), 248°-292° + TCODE tNW, "NO" ; North-West, 293°-337° ; Color Scheme menu - TCODE tColorScheme, "Jeu de Couleurs" ; Colour scheme - TCODE tColorSetDive, "Mode Plongée:" ; Divemode: - TCODE tColorSetName0, "Blanc" ; White - TCODE tColorSetName1, "Rouge" ; Red - TCODE tColorSetName2, "Vert" ; Green - TCODE tColorSetName3, "Bleu" ; Blue + TCODE tColorScheme, "Jeu de Couleurs" ; Colour scheme + TCODE tColorSetDive, "Mode Plongée:" ; Divemode: + TCODE tColorSetName0, "Blanc" ; White + TCODE tColorSetName1, "Rouge" ; Red + TCODE tColorSetName2, "Vert" ; Green + TCODE tColorSetName3, "Bleu" ; Blue ; PSCR Menu and Settings - TCODE tPSCRMenu, "Menu PSCR" ; PSCR Menu - TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop - TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio + TCODE tPSCRMenu, "Menu pSCR" ; PSCR Menu + TCODE tPSCR_O2_drop, "O2 Drop " ; O2 drop + TCODE tPSCR_lungratio, "Lung Ratio " ; lung ratio + TCODE tBackToLoop, "goto loop" ; back to loop (10 chars max) ### new + + +; Language selection + IF _language_2!=none + TCODE tLanguage, "Langue: " ; used in menu_tree + ENDIF + + IF _language_1==en + TCODE tLang1, "Anglais" ; tLang1 is 1st language, enum context + ELSE + IF _language_1==de + TCODE tLang1, "Allemand" + ELSE + IF _language_1==fr + TCODE tLang1, "Français" + ELSE + IF _language_1==it + TCODE tLang1, "Italien" + ELSE + TCODE tLang1, "" ; dummy target for options table + ENDIF + ENDIF + ENDIF + ENDIF + + IF _language_2==en + TCODE tLang2, "Anglais" + ELSE + IF _language_2==de + TCODE tLang2, "Allemand" ; tLang2 is 2nd language, enum context + ELSE + IF _language_2==fr + TCODE tLang2, "Français" + ELSE + IF _language_2==it + TCODE tLang2, "Italien" + ENDIF + ENDIF + ENDIF + ENDIF diff -r 00b24fb4324d -r ca4556fb60b9 src/text_german.inc --- a/src/text_german.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_german.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,334 +1,388 @@ ;============================================================================= ; -; File text_german.asm REFACTORED VERSIOn V2.95 +; File text_german.asm REFACTORED VERSIOn V2.99e ; -; German texts translation file. +; German texts translation file. ; -; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; Basic texts - TCODE tNo, "Nein" ; No - TCODE tYes, "Ja" ; Yes = No + 1 + TCODE tNo, "Nein" ; 0 No + TCODE tYes, "Ja" ; 1 Yes + IFDEF _cave_mode + TCODE tCave, "Höhle" ; 2 Höhle + ENDIF + TCODE tblank, " " ; (a single space character) - + ; Surface-mode texts - TCODE tBeta, "beta" ; beta - TCODE tMenu, "" ; View> - TCODE tHeading, "Kurs:" ; Heading: - TCODE tLastDive, "Letzter TG" ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "CCR Sensoren mV" ; CCR Sensors mV + TCODE tMenu, "" ; View> + TCODE tHeading, "Kurs:" ; Heading: + TCODE tLastDive, "Letzter TG" ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "Sensoren mV" ; Sensors mV -; Divemode Menu - TCODE tDivemenu_Gaslist, "Gasliste" ; Gaslist - TCODE tDivemenu_ResetAvg, "Stoppuhr" ; Reset Avg. - TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"akt. Sensor" ; Use Sensor - TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF - TCODE tDivemenu_Marker, "Markierung" ; Set Marker - TCODE tDivemenu_LostGas, "Gasverlust" ; Lost Gas +; Divemode Menu - 10 chars max! + TCODE tDivemenu_Gaslist, "Gasliste" ; Gaslist (OC) + TCODE tDivemenu_Diluent, "Diluents" ; Diluent (CCR) + TCODE tDivemenu_Premix, "Premix" ; Premix (pSCR) + TCODE tDivemenu_ResetAvg, "Stoppuhr" ; Reset Avg. + TCODE tDivemenu_Avg_Mkr, "Uhr/Marker" ; Reset Avg., Set Marker (and Turn Dive) + TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint + TCODE tDivemenu_UseSensor,"akt.Sensor" ; Use Sensor + TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF + TCODE tDivemenu_Marker, "Markierung" ; Set Marker + TCODE tDivemenu_LostGas, "Gasverlust" ; Lost Gas + IFDEF _cave_mode + TCODE tDivemenu_TurnDive, "Rückweg" ; Turn Dive + ENDIF ; Main menu - TCODE tNext, "" ; Enter> - - TCODE tMainMenu, "Hauptmenü" ; MainMenu - TCODE tLogbook, "Logbuch" ; Logbook - TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup - TCODE tSetTime, "Zeit stellen" ; Set Time + TCODE tNext, "" ; Enter> + TCODE tMainMenu, "Hauptmenü" ; MainMenu + TCODE tLogbook, "Logbuch" ; Logbook + TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup + TCODE tSetTime, "Zeit stellen" ; Set Time TCODE tSetDate, "Datum stellen" ; Set Date TCODE tSetTimeDate, "Datum & Uhrzeit" ; Set Time & Date - TCODE tDispSets, "Anzeige" ; Display Settings - TCODE tExit, "Ende" ; Exit - TCODE tResetMenu, "Reset Menü" ; Reset Menu + TCODE tDispSets, "Anzeige" ; Display Settings + TCODE tExit, "Ende" ; Exit + TCODE tResetMenu, "Reset Menü" ; Reset Menu TCODE tDiveModeMenu, "Deko Einstellung" ; Deco Mode TCODE tInfoMenu, "Informationen" ; Information - TCODE tCCRSetup, "CCR/pSCR Menü" ; CCR Setup - TCODE tDiluentSetup, "Diluent Menü" ; Diluent Setup - TCODE tFixedSetpoints, "CCR Setpoints" ; Fixed Setpoints - TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor - TCODE tCalibrateMenu, "Kalibrierung" ; Calibration - TCODE tCalibrationGas, "Kal. Gas O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Kalibrieren" ; Calibrate - TCODE tBack, "zurück..." + TCODE tTrSettings, "Druckanzeige" ; Pressure Display + TCODE tTrMode, "Modus: " ; Mode + TCODE tTr1stPres, "1.Druck: " ; 1st Pressure + TCODE tTr2ndPres, "2.Druck: " ; 2nd Pressure + TCODE tTrBailPres, "1.B/O : " ; Bailout Pressure + TCODE tTrMaxDeltaP, "max Diff.: " ; independent double max diffenerce + TCODE tCCRSetup, "CCR/pSCR Menü" ; CCR/pSCR Setup + TCODE tDiluentSetup, "Diluent Menü" ; Diluent Setup + TCODE tFixedSetpoints, "CCR Setpoints" ; Fixed Setpoints + TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor + TCODE tCalibrateMenu, "Kalibrierung" ; Calibration + TCODE tCalibrationGas, "Kal. Gas O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Kalibrieren" ; Calibrate + TCODE tBack, "zurück" ; Gas menu - TCODE tGaslist, "OC Gas Liste" - TCODE tGaslistCC, "CC Gas Liste" ; CC Diluents - TCODE tGasEdit, "Gas einstellen" - TCODE tType, "Typ: " - TCODE tGasDisabled, "Deaktiviert" ; Disabled - TCODE tGasFirst, "Start" ; First - TCODE tGasTravel, "Reise" ; Travel - TCODE tGasDeco, "Deko" ; Deco - TCODE tDilDisabled, "Deaktiviert" ; Disabled - TCODE tDilFirst, "Start" ; First - TCODE tDilNorm, "Normal" ; Normal - TCODE tAir, "Luft " ; Enum: values must follows (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Wechseltiefe" - TCODE tDepthPlus, "Tiefe +" - TCODE tDepthMinus, "Tiefe -" - TCODE tDepthReset, "Reset auf MOD:" - TCODE tSetup_mix, "Mix Einstellen" - TCODE tCCRMode, "Modus:" ; Mode: - TCODE tCCRModeFixedSP, "Feste SP" ; Fixed SP - TCODE tCCRModeSensor, "Sensor" ; Sensor - TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP - TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ - TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tGaslist, "OC Gas Liste" + TCODE tGaslistCC, "CC Gas Liste" ; CC Diluents + TCODE tGasEdit, "Gas einstellen" + TCODE tType, "Type: " + TCODE tGasDisabled, "Deaktiviert" ; Disabled + TCODE tGasFirst, "Start" ; First + TCODE tGasTravel, "Reise" ; Travel + TCODE tGasDeco, "Deko" ; Deco + TCODE tDilDisabled, "Deaktiviert" ; Disabled + TCODE tDilFirst, "Start" ; First + TCODE tDilNorm, "Normal" ; Normal + TCODE tAir, "Luft " ; Enum: values must follows (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD :" + TCODE tEAD, "EAD:" + TCODE tSetup_GasDepth, "Wechseltiefe" + TCODE tDepthPlus, "Tiefe +" + TCODE tDepthMinus, "Tiefe -" + TCODE tDepthReset, "Reset auf MOD:" + TCODE tSetup_GasMix, "Mix Einstellen" + TCODE tCCRMode, "Modus:" ; Mode: + TCODE tCCRModeFixedSP, "fixeSP/Berech." ; Fixed SP + TCODE tCCRModeSensor, "Sensor" ; Sensor + TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP + TCODE tSP, "SP" ; SP (SetPoint) + TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSensorFallback, "Fallback:" ; Fallback: TCODE tCalculated, "berechnet" ; calculated - TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + TCODE tppO2, "ppO2:" ; ppO2: + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) ; New batteries menu - TCODE tNewBattTitle, "Neue Batterie?" - TCODE tNewBattOld, "Behalte alte" + TCODE tNewBattTitle, "Neue Batterie?" + TCODE tNewBattOld, "behalte alte" TCODE tNewBattNew36, "Neue 3,6V Saft (T1)" TCODE tNewBattNew15, "Neue 1,5V AA (T0)" TCODE tNewBattAccu, "3,6V AA Akku (T2)" - TCODE tNew18650, "Interne 18650 (T3)" - TCODE tNew16650, "Interne 16650 (T4)" + TCODE tNew18650, "Interne 18650 (T3)" + TCODE tNew16650, "Interne 16650 (T4)" ; Gaslist management - TCODE tGas, "Gas" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) + TCODE tGas, "Gas" ; Gas + TCODE tDil, "Dil" ; Diluent + TCODE tGasErr, "Err" ; Err (3 chars) ; Communication Menu TCODE tUsbTitle, "USB Modus" - TCODE tBleTitle, "Bluetooth Modus" - TCODE tUsbStarting, "Starte....." - TCODE tUsbStartDone, "Fertig." - TCODE tUsbServiceMode, "Servicemodus aktiv" + TCODE tBleTitle, "Bluetooth Modus" + TCODE tUsbStarting, "Starte..." + TCODE tUsbStartDone, "Fertig." + TCODE tUsbServiceMode, "Servicemodus aktiv" TCODE tUsbClosed, "Abgebrochen" TCODE tUsbExit, "Beendet" - TCODE tUsbDownloadMode, "Downloadmodus aktiv" - TCODE tUsbLlBld, "Low-Level Bootloader" + TCODE tUsbDownloadMode, "Downloadmodus aktiv" + TCODE tUsbLlBld, "Low-Level Bootloader" ; Dive Settings - TCODE tDvMode, "Betrieb:" - TCODE tDvOC, "OC" + TCODE tDvMode, "Betrieb : " + TCODE tDvOC, "OC" TCODE tDvCCR, "CCR" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnoe" - TCODE tDvPSCR, "pSCR" - TCODE tDvCC, "CC" - 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.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/fB/O:" ; Future TTS - TCODE taGFMenu, "Alternativ-GF" ; Alternative GF - TCODE taGF_low, "aGF low :" ; aGF low - TCODE taGF_high, "aGF high:" ; aGF high - TCODE taGF_enable, "aGF wählbar:" ; aGF Selectable - TCODE tDiveaGF_active, "aGF aktiv" ; aGF Active - TCODE tppO2settings, "ppO2 Parameter" ; ppO2 Settings - TCODE tsafetystopmenu, "Sicherheitsstop:" ; Safety Stop: - 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, "Liter" - TCODE tTankFillPress, "Tank Nutzmenge" - TCODE tGas1, "Gas 1:" - TCODE tGas2, "Gas 2:" - TCODE tGas3, "Gas 3:" - TCODE tGas4, "Gas 4:" - TCODE tGas5, "Gas 5:" + TCODE tDvGauge, "Gauge" + TCODE tDvApnea, "Apnoe" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Decotype: ZH-L16" + TCODE tZHL16, " " ; keep order, enum from here... + TCODE tZHL16GF, "+GF" ; ...up to here! + TCODE tPPO2Max, "Max. :" + TCODE tPPO2DECO, "Max. Deko:" + TCODE tPPO2MIN, "Min. :" + TCODE tPPO2MINCC, "Min. Loop:" + TCODE tLastDecostop, "Letzt.Stop : " + TCODE tAscentSpeed, "Auf.Geschw.: " ; Ascent Speed + TCODE tGasChangeTime, "Gaswechsel :+" ; additional Gas Change Time + 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 tLastDecostopSurf, "Letzt.Stop:" ; last deco stop surface custom view + TCODE tGFMenu, "GF Parameter" ; GF Settings + TCODE taGF_low, "aGF low :" ; aGF low + TCODE taGF_high, "aGF high:" ; aGF high + TCODE taGF_enable, "aGF wählbar:" ; aGF Selectable + TCODE tDiveaGF_active, "aGF aktiv" ; using aGF + TCODE tppO2settings, "ppO2 Parameter" ; ppO2 Settings + TCODE tsafetystopmenu, "Sicherheitsstop:" ; Safety Stop: + TCODE tGasUsage, "Gasbedarf" ; Gas Usage + TCODE tSetBotUse, "Reise Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deko Gas: " ; Deco Gas: (space) + TCODE tCalcAscGas, "Gasmenge(B/O):" + TCODE tSetup_Tank, "Tank Einstellen" ; Setup Tank + TCODE tTankSize, "Tank Größe" + TCODE tTankUsablePress, "Umkehrdruck (Aufst)" ; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars) + TCODE tCopyDilToOC, "Kopiere Dil.-> OC" ; copy diluent settings to OC gas + TCODE tTankPairing, "Sender wählen" ; select Transmitter + TCODE tLiter, " l" + TCODE tLiterLong, "Liter" TCODE tCCmaxFracO2, "Loop %O2 max.:" TCODE t2ndDecoPlanMenu, "2.Deko Plan" - + + IFDEF _rx_functions + TCODE tTrModeOff, "aus" ; off + TCODE tTrModeOn, "ein" ; on + TCODE tTrModeIndDouble, "unabh.Doppel" ; independent double + TCODE tTrModeCCR, "CCR Dil+O2" ; CCR diluent and O2 + TCODE tTrPresNone, "keiner" ; none (big enum group follows) + TCODE tTrPresGas1, "Gas 1" ; Gas 1 + TCODE tTrPresGas2, "Gas 2" ; Gas 2 + TCODE tTrPresGas3, "Gas 3" ; Gas 3 + TCODE tTrPresGas4, "Gas 4" ; Gas 4 + TCODE tTrPresGas5, "Gas 5" ; Gas 5 + TCODE tTrPresDil1, "Dil 1" ; Dil 1 + TCODE tTrPresDil2, "Dil 2" ; Dil 2 + TCODE tTrPresDil3, "Dil 3" ; Dil 3 + TCODE tTrPresDil4, "Dil 4" ; Dil 4 + TCODE tTrPresDil5, "Dil 5" ; Dil 5 + TCODE tTrPresFirstGas, "erstes Gas" ; first Gas + TCODE tTrPresActiveGas, "aktives Gas" ; active Gas + TCODE tTrPresFirstDil, "erstes Dil" ; first Dil + TCODE tTrPresActiveDil, "aktives Dil" ; active Dil + ELSE + TCODE tTrModeOff, "" ; dummy target for entry in option table + TCODE tTrPresNone, "" ; dummy target for entry in option table + ENDIF + ; Display Settings - TCODE tBright, "Helligkeit:" - TCODE tEco, "Eco" - TCODE tMedium, "Mittel" - TCODE tHigh, "Hoch" - TCODE tDvSalinity, "Salinität: " ; Salinity - 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 - TCODE tTimeoutDive, "TG-Ende nach:" ; Dive Timeout + TCODE tBright, "Helligkeit:" + TCODE tEco, "Eco" + TCODE tMedium, "Mittel" + TCODE tHigh, "Hoch" + TCODE tDvSalinity, "Salinität: " ; Salinity + 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 + TCODE t2ndDepth, "2.Tiefe:" ; 2nd depth display content (10 chars max) + TCODE tTimeoutDive, "TG-Ende nach:" ; Dive Timeout ; VSI display Settings - TCODE tVSItext2, "Variable Geschw.:" ; Variable speed: - TCODE tVSIgraph, "Geschw. Grafik :" ; Speed graph: + TCODE tVSItext2, "Variable Geschw.:" ; Variable speed: + TCODE tVSIgraph, "Geschw. Grafik :" ; Speed graph: ; Setup Menu - TCODE tSystSets, "Konfiguration" - TCODE tLanguage, "Sprache:" - TCODE tEnglish, "Englisch" - TCODE tGerman, "Deutsch" - TCODE tFrench, "Französisch" - TCODE tItalian, "Italienisch" - TCODE tCompassMenu, "Kompass-Kalibrierung" ; Compass calibration - TCODE tCompassGain, "Empfindlichkeit:" ; Compass gain: - TCODE tCalX, "Kal. X:" ; Cal X - TCODE tCalY, "Kal. Y:" ; Cal Y - TCODE tCalZ, "Kal. Z:" ; Cal Z - - TCODE tUnits, "Einheiten:" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - - TCODE tButtonleft, "Taster links :" ; Left button - TCODE tButtonright, "Taster rechts:" ; Right button - + TCODE tSystSets, "Konfiguration" + TCODE tCompassMenu, "Kompass-Kalibrierung" ; Compass calibration + TCODE tCompassGain, "Empfindlichkeit:" ; Compass gain: + TCODE tCalX, "Kal. X:" ; Cal X + TCODE tCalY, "Kal. Y:" ; Cal Y + TCODE tCalZ, "Kal. Z:" ; Cal Z + TCODE tUnits, "Einheiten: " + TCODE tMetric, " m/°C" ; Enum menu + TCODE tImperial, "ft/°F" + TCODE tDefName, "HW OSTC" + TCODE tButtonleft, "Taster links :" ; Left button + TCODE tButtonright, "Taster rechts:" ; Right button TCODE tAltMode, "Wartezeit:" TCODE tAltModeFly, "Fliegen" TCODE tAltMode1000, "1000m" TCODE tAltMode2000, "2000m" TCODE tAltMode3000, "3000m" - + ; Units for all menu - TCODE tMeters, "m" + TCODE tMeters, "m" TCODE tFeets, "ft" TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" TCODE tbar, " bar" ; bar - TCODE tbar10, "0 bar" ; bar ## NEW 2.95 - TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed - TCODE tmin, "min" ; minutes + TCODE tbar10, "0 bar" ; xx0 bar + TCODE tMeterMinute, "m/'" ; meter per minute ; Date - TCODE tDateFormat, "Datum:" - TCODE tDateformat, "MMTTJJ" + TCODE tDateFormat, "Format: " + TCODE tDateformat, "MMTTJJ" TCODE tDateformat1, "TTMMJJ" TCODE tDateformat2, "JJMMTT" ; Simulator menu - TCODE tInter, "Start Simulator" ; Start Simulator - TCODE tPlan, "Simulator" ; Simulator + TCODE tInter, "Start Simulator" ; Start Simulator + TCODE tPlan, "Simulator" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Grundzeit:" ; Bot. Time: (10 chars) - TCODE tBtTm_short, "Zeit:" ; Bot. Time: (max. 6 chars) - TCODE tMxDep, "Tiefe :" ; Max Depth: (10 chars) - TCODE tIntvl, "Intervall:" ; Interval : (10 chars) - TCODE tDecoSetup, "Deko Parameter" - TCODE tDeco, "Deko Berechnung" ; Calculate Deco - TCODE tDivePlan, "Tauchplan:" ; Dive Plan: - TCODE tNoDeco, "Keine Deko" ; No Deco - TCODE tMore, "Mehr..." ; More... - TCODE tSelectSetpoint, "CCR Setpoint: " - TCODE tuseAGF, "Benutze aGF : " + TCODE tBtTm, "Grundzeit:" ; Bot. Time: (10 chars) + TCODE tBtTm_short, "Zeit:" ; Bot. Time: (max. 6 chars) + TCODE tBtDep, "Tiefe :" ; Max Depth: (10 chars) + TCODE tIntvl, "Intervall:" ; Interval : (10 chars) + TCODE tDecoSetup, "Deko Parameter" + TCODE tDeco, "Deko Berechnung" ; Calculate Deco + TCODE tDivePlan, "Tauchplan:" ; Dive Plan: + TCODE tNoDeco, "Keine Deko" ; No Deco + TCODE tMore, "mehr" ; More + TCODE tSelectSetpoint, "Setpoint :" + TCODE tuseAGF, "Benutze aGF:" TCODE tCalculating, "Berechnung läuft..." + TCODE tNDLleft, "übrig" ; time left within NDL ; Information menu - TCODE tFirmware, "Firmware: " ; Firmware: (space) - TCODE tSerial, "Seriennr: " ; Serial : (space) ## MODIFIED ## info - removed dot + TCODE tFirmware, "Firmware: " ; Firmware: (space) + TCODE tFirmware_rx, "RX Ver : " ; RX Ver : (space) + TCODE tSerial, "Seriennr: " ; Serial : (space) TCODE tTotalDives, "Anzahl TG: " ; Total Dives: - TCODE tBatteryV, "Batterie: " ; Battery: - TCODE tUptime, "Laufzeit: " ; Uptime: + TCODE tBatteryV, "Batterie: " ; Battery: + TCODE tUptime, "Laufzeit: " ; Uptime: ; Divemode screen - TCODE tNDL, " NZ" - TCODE tTTS, "TTS" - TCODE tVelMetric, "m/min" + TCODE tNDL, " NZ" ; 3 chars max + TCODE tTTS, "TTS" + TCODE tVelMetric, "m/min" TCODE tVelImperial, "ft/m " - TCODE tGasSelect, "Wähle Gas" ; Select Gas - TCODE tSelectAir, "Air " ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Tiefe" ; Depth - TCODE tMaxDepth, "Max. Tiefe" ; Max. Depth - max 10chars! - TCODE tDivetime, " Zeit" ; Divetime - TCODE tDiveHudMask1, "Sensor 1" - TCODE tDiveHudMask2, "Sensor 2" - TCODE tDiveHudMask3, "Sensor 3" - TCODE tDiveTotalAvg, "Durchschn.1" - TCODE tDiveStopwatch, "Stoppuhr" - TCODE tDiveStopAvg, "Durchschn.2" ; 11chars max - TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) - TCODE tApnoeMax, " Letzter TG" ; Last descend - TCODE tApnoeSurface, "Oberflächenzeit" ; Surface Time - TCODE tDiveDecoplan, "Dekoplan" ; Decoplan - TCODE tDiveClock, "Uhr" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Gewebe" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "GF Werte" ; GF Values - TCODE taGFactors, "aGF Werte" ; aGF Values - TCODE tGFInfo, "GF jetzt" ; GF Info - TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop, "Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tGasSelect, "Wähle Gas" ; Select Gas + TCODE tSelectAir, "Luft" ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Tiefe" ; Depth + TCODE tMaxDepth, "Max. Tiefe" ; Max. Depth - max 10chars! + TCODE tAvgDepth, "Durchschn." ; average Depth - max 10chars! + TCODE tDivetime, " Zeit" ; Divetime + TCODE tDiveHudMask1, "Sensor 1" + TCODE tDiveHudMask2, "Sensor 2" + TCODE tDiveHudMask3, "Sensor 3" + TCODE tDiveTotalAvg, "Durchschn.1" + TCODE tDiveStopwatch, "Stoppuhr" + TCODE tDiveStopAvg, "Durchschn.2" ; 11 chars max + TCODE tApnoeTotal, " Total" ; Total (six chars, right aligned) + TCODE tApnoeMax, " Letzter TG" ; Last descend + TCODE tApnoeSurface, "Oberflächenzeit" ; Surface Time + TCODE tTime, "Uhrzeit" ; Time + TCODE tSurface, "Oberfläche" ; Surface (max 12 chars) + TCODE tDiveDecoplan, "Dekoplan" ; Decoplan +; TCODE tDiveClock, "Uhr" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Gewebe" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "GF Werte" ; GF Values + TCODE taGFactors, "aGF Werte" ; aGF Values + TCODE tGFInfo, "GF jetzt" ; GF Info + TCODE tCeiling, "Ceiling" ; Ceiling + TCODE tDiveSafetyStop, "Stop" ; Stop (four chars, right aligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) TCODE tDecoInfo, "Deko Zone" ; Deco info - TCODE tSensorCheck, "Sensor Test" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tSensorCheck, "Sensor Test" ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning TCODE tSensorDisagree, "Sensoren!" ; Sensors disagree Warning TCODE tGasNeedsWarn, "Gasbedarf" - TCODE tGasNeedsBar, "Gas Bedarf (bar)" + TCODE tGasNeedsAscent, "Gas Bedarf Aufstieg" TCODE tCNSsurf, "ZNS Oberfl." TCODE tCNSfTTS, "ZNS fTTS" TCODE tCNSBO, "ZNS B/O" TCODE tCNSnow, "ZNS jetzt" TCODE tCNSeod, "ZNS Ende" TCODE tIBCD, "IBCD N2He" + TCODE tnoBOgas, "-B/O-Gas-" TCODE tMicroBubbles, "M.Blasen" TCODE tCNS, "CNS: " - + TCODE tgaschange, "wechseln?" ; better gas found + TCODE tNeed, "Bedf." ; gas need (5 chars) + TCODE tBattery, "Batterie" ; Battery + IFDEF _rx_functions + TCODE tTransmitter, "TR Sender" ; pressure transmitter + TCODE tPressure, "Fl.Druck" ; tank pressure + TCODE tSAC, "AMV" ; SAC, must be 3 chars! + TCODE tswap, "wechseln" ; switch tank (max. 9 chars) + ENDIF + IFDEF _cave_mode + TCODE tGasNeedsCaveMode, "Gas Bedarf Höhlen-Modus"; title for gas needs custom view + TCODE tDiveTurned, "Rückweg" ; dive is turned (max. 9 char) + TCODE tCaveMode, "Höhle" ; cave mode activated (max. 9 char) + TCODE tCaveModeShutdown, "X-Höhle-X" ; cave mode shut down (max. 9 char) + ENDIF + + ; Divemode menu - TCODE tDivePreMenu, "Menü?" ; Menu? - TCODE tSetHeading, "Peilung" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menü?" ; Menu? + TCODE tSetHeading, "Kurs" ; set bearing (max. 6 chars) ; Simulator menu - TCODE tQuitSim, "Ende?" ; Quit Simulation? + TCODE tQuitSim, "Ende" ; Quit Simulation ; Logbook TCODE tCNS2, "ZNS:" - TCODE tAVG, "Mittel:" + TCODE tAVG, "Mit:" TCODE tGF, "GF:" - TCODE tSAT, "Sät:" ; Sat: + TCODE tSAT, "Sät:" ; Logbook units - TCODE tLogTunitC, "°C" + TCODE tLogTunitC, "°C" TCODE tLogTunitF, "°F" TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tMBAR, "hPa" ; Logbook menu - TCODE tNextLog, "Nächste Seite" + TCODE tNextLog, "Nächste Seite" ; Reset menu - TCODE tReboot, "Neu starten" ;Reboot - TCODE tResetMenu2, "Sind Sie sicher?" ;Are you sure? - TCODE tAbort, "Abbrechen" ;Abort - TCODE tResetSettings, "Alles zurücksetzen" ;Reset all - TCODE tResetDeco, "Deko zurücksetzen" ;Reset Deco - TCODE tResetBattery, "neue Batterie" ;Reset Battery - TCODE tResetLogbook, "Logbuch löschen" ;Reset Logbook + TCODE tReboot, "Neu starten" ; Reboot + TCODE tResetMenu2, "Sind Sie sicher?" ; Are you sure? + TCODE tAbort, "Abbrechen" ; Abort + TCODE tResetSettings, "Reset Einstellungen" ; Reset Settings (max. 19 chars) + TCODE tResetDeco, "Reset Deko" ; Reset Deco + TCODE tResetBattery, "neue Batterie" ; Reset Battery + TCODE tResetLogbook, "Logbuch löschen" ; Reset Logbook ; Set Time Menu/Set Date Menu TCODE tSetHours, "Stunden einst." ; Set Hours @@ -346,24 +400,65 @@ TCODE tLogOffsetm10, "-10" ; -10 ; Compass directions - TCODE tN, "N " ; N(orth),338°-22° - TCODE tNE, "NO" ; North-East,23°-67° - TCODE tE, "O " ; E(east),68°-112° - TCODE tSE, "SO" ; South-East,113°-157° - TCODE tS, "S " ; S(outh),157°-202° - TCODE tSW, "SW" ; South-West,203°-247° - TCODE tW, "W " ; W(West),248°-292° - TCODE tNW, "NW" ; North-West,293°-337° + TCODE tN, "N " ; N(orth), 338°-22° + TCODE tNE, "NO" ; North-East, 23°-67° + TCODE tE, "O " ; E(east), 68°-112° + TCODE tSE, "SO" ; South-East, 113°-157° + TCODE tS, "S " ; S(outh), 157°-202° + TCODE tSW, "SW" ; South-West, 203°-247° + TCODE tW, "W " ; W(West), 248°-292° + TCODE tNW, "NW" ; North-West, 293°-337° ; Color Scheme menu - TCODE tColorScheme, "Farbschema" ; Colour Scheme - TCODE tColorSetDive, "Tauchmodus:" ; Divemode: - TCODE tColorSetName0, "Standard" ; Standard - TCODE tColorSetName1, "Rot" ; Red - TCODE tColorSetName2, "Grün" ; Green - TCODE tColorSetName3, "Blau" ; Blue - -; PSCR Menu and Settings - TCODE tPSCRMenu, "pSCR Menü" ; PSCR Menu - TCODE tPSCR_O2_drop, "O2 Abfall :" ; O2 drop - TCODE tPSCR_lungratio, "Lungenverhält.:" ; lung ratio + TCODE tColorScheme, "Farbschema" ; Colour Scheme + TCODE tColorSetDive, "Tauchmodus:" ; Divemode: + TCODE tColorSetName0, "Standard" ; Standard + TCODE tColorSetName1, "Rot" ; Red + TCODE tColorSetName2, "Grün" ; Green + TCODE tColorSetName3, "Blau" ; Blue + +; pSCR Menu and Settings + TCODE tPSCRMenu, "pSCR Menü" ; PSCR Menu + TCODE tPSCR_O2_drop, "O2 Abfall " ; O2 drop + TCODE tPSCR_lungratio, "L.Verhält. " ; lung ratio + TCODE tBackToLoop, "auf Loop" ; back to loop (10 chars max) ### new + + +; Language selection + IF _language_2!=none + TCODE tLanguage, "Sprache: " ; used in menu_tree + ENDIF + + IF _language_1==en + TCODE tLang1, "Englisch" ; tLang1 is 1st language, enum context + ELSE + IF _language_1==de + TCODE tLang1, "Deutsch" + ELSE + IF _language_1==fr + TCODE tLang1, "Französisch" + ELSE + IF _language_1==it + TCODE tLang1, "Italienisch" + ELSE + TCODE tLang1, "" ; dummy target for options table + ENDIF + ENDIF + ENDIF + ENDIF + + IF _language_2==en + TCODE tLang2, "Englisch" ; tLang2 is 2nd language, enum context + ELSE + IF _language_2==de + TCODE tLang2, "Deutsch" + ELSE + IF _language_2==fr + TCODE tLang2, "Französisch" + ELSE + IF _language_2==it + TCODE tLang2, "Italienisch" + ENDIF + ENDIF + ENDIF + ENDIF diff -r 00b24fb4324d -r ca4556fb60b9 src/text_italian.inc --- a/src/text_italian.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_italian.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,369 +1,463 @@ ;============================================================================= ; -; File text_italian.asm REFACTORED VERSION V2.95 +; File text_italian.asm REFACTORED VERSION V2.99e ; -; Italian texts translation file. +; Italian texts translation file. ; -; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; Basic texts - TCODE tNo, "No" ; No - TCODE tYes, "Si" ; Yes = No + 1 - TCODE tblank, " " ; (a single space character) ## NEW (layout) + TCODE tNo, "No" ; 0 No + TCODE tYes, "Si" ; 1 Yes + IFDEF _cave_mode + TCODE tCave, "Cave" ; 2 Cave + ENDIF + + TCODE tblank, " " ; (a single space character) ; Surface-mode texts - TCODE tBeta, "beta" ; beta - TCODE tMenu, "" ; View> - TCODE tHeading, "Direzione:" ; Heading: - TCODE tLastDive, "UltimaImm." ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "Sensori CCR mV" ; CCR Sensors mV + TCODE tMenu, "" ; View> + TCODE tHeading, "Direzione:" ; Heading: + TCODE tLastDive, "UltimaImm." ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "Sensori mV" ; Sensors mV ; Divemode Menu - TCODE tDivemenu_Gaslist, "Lista Gas" ; Gaslist - TCODE tDivemenu_ResetAvg, "AzzeraMed" ; Reset Avg. - TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"Usa Sensori" ; Use Sensor - TCODE tDivemenu_ToggleGF, "Alterna GF" ; Toggle GF - TCODE tDivemenu_Marker, "Set Marker" ; Set Marker - TCODE tDivemenu_LostGas, "Gas perso" ; Lost Gas + TCODE tDivemenu_Gaslist, "Lista Gas" ; Gaslist (OC) + TCODE tDivemenu_Diluent, "Lista Dil" ; Diluents (CCR) + TCODE tDivemenu_Premix, "Lista Mix" ; Premix (pSCR) + TCODE tDivemenu_ResetAvg, "AzzeraMed" ; Reset Avg. + TCODE tDivemenu_Avg_Mkr, "Avg/Marker" ; Reset Avg., Set Marker (and Turn Dive) ## pending translation + TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint + TCODE tDivemenu_UseSensor,"Usa Sensori" ; Use Sensor + TCODE tDivemenu_ToggleGF, "Alterna GF" ; Toggle GF + TCODE tDivemenu_Marker, "Set Marker" ; Set Marker + TCODE tDivemenu_LostGas, "Gas perso" ; Lost Gas + IFDEF _cave_mode + TCODE tDivemenu_TurnDive, "Turn Dive" ; Turn Dive + ENDIF ; Main menu - TCODE tNext, "" ; Enter> - - TCODE tMainMenu, "Menu Principale" ; MainMenu - TCODE tLogbook, "Logbook" ; Logbook - TCODE tGasSetup, "Imposta Gas OC" ; OC Gas Setup - TCODE tSetTime, "Imposta Ora" ; Set Time - TCODE tSetDate, "Imposta Data" ; Set Date - TCODE tSetTimeDate,"Imp. Ora e Data"; Set Time & Date - TCODE tDispSets, "Visualizzazione" ; Display Settings - TCODE tExit, "Esci" ; Exit - TCODE tResetMenu, "Resetta Menu" ; Reset Menu - TCODE tDiveModeMenu,"Modalita' Deco" ; Deco Mode - TCODE tInfoMenu, "Informazioni" ; Information - TCODE tCCRSetup, "Imposta CCR" ; CCR Setup - TCODE tDiluentSetup,"Imposta Diluente" ; Diluent Setup - TCODE tFixedSetpoints,"Setpoints Fissi" ; Fixed Setpoints - TCODE tCCRSensor, "Sensori CCR" ; CCR Sensor - TCODE tCalibrateMenu, "Calibrazione" ; Calibration - TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Calibra" ; Calibrate - TCODE tBack, "back..." ; ## NEW + TCODE tNext, "" ; Enter> + TCODE tMainMenu, "Menu Principale" ; MainMenu + TCODE tLogbook, "Logbook" ; Logbook + TCODE tGasSetup, "Imposta Gas OC" ; OC Gas Setup + TCODE tSetTime, "Imposta Ora" ; Set Time + TCODE tSetDate, "Imposta Data" ; Set Date + TCODE tSetTimeDate, "Imp. Ora e Data" ; Set Time & Date + TCODE tDispSets, "Visualizzazione" ; Display Settings + TCODE tExit, "Esci" ; Exit + TCODE tResetMenu, "Resetta Menu" ; Reset Menu + TCODE tDiveModeMenu, "Modalita' Deco" ; Deco Mode + TCODE tInfoMenu, "Informazioni" ; Information + TCODE tTrSettings, "Pressure Display" ; Pressure Display ## pending translation + TCODE tTrMode, "Modo: " ; Mode + TCODE tTr1stPres, "1.Pres.: " ; 1st Pressure + TCODE tTr2ndPres, "2.Pres.: " ; 2nd Pressure + TCODE tTrBailPres, "1.B/O : " ; Bailout Pressure + TCODE tTrMaxDeltaP, "max deltaP: " ; independent double max diffenerce ## pending translation + TCODE tCCRSetup, "Imposta CCR" ; CCR Setup + TCODE tDiluentSetup, "Imposta Diluente" ; Diluent Setup + TCODE tFixedSetpoints, "Setpoints Fissi" ; Fixed Setpoints + TCODE tCCRSensor, "Sensori CCR" ; CCR Sensor + TCODE tCalibrateMenu, "Calibrazione" ; Calibration + TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Calibra" ; Calibrate + TCODE tBack, "back" ; back ; Gas menu - TCODE tGaslist, "Lista Gas OC" - TCODE tGaslistCC, "Lista Gas CC" ; CC Diluents - TCODE tGasEdit, "Modifica Gas" - TCODE tType, "Tipo: " - TCODE tGasDisabled,"Disabilitato" ; Disabled - TCODE tGasFirst, "Primo" ; First - TCODE tGasTravel, "Viaggio" ; Travel - TCODE tGasDeco, "Deco" ; Deco - TCODE tDilDisabled,"Disabilitato" ; Disabled - TCODE tDilFirst, "Primo" ; First - TCODE tDilNorm, "Normale" ; Normal - TCODE tAir, "Aria " ; Enum: values must follows (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Cambia profondita'" - TCODE tDepthPlus, "Profondita' +" - TCODE tDepthMinus,"Profondita' -" - TCODE tDepthReset,"Reset a MOD:" - TCODE tSetup_mix, "Imposta Miscela" - TCODE tCCRMode, "Modo CCR:" ; CCR Mode: - TCODE tCCRModeFixedSP, "SP Fissi" ; Fixed SP - TCODE tCCRModeSensor, "Sensori" ; Sensor - TCODE tCCRModeAutoSP, "SP Auto" ; Auto SP - TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ - TCODE tSensorFallback, "Fallback:" ; Fallback: - TCODE tCalculated, "calcolato" ; calculated - TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) - + TCODE tGaslist, "Lista Gas OC" + TCODE tGaslistCC, "Lista Gas CC" ; CC Diluents + TCODE tGasEdit, "Modifica Gas" + TCODE tType, "Tipo: " + TCODE tGasDisabled, "Disabilitato" ; Disabled + TCODE tGasFirst, "Primo" ; First + TCODE tGasTravel, "Viaggio" ; Travel + TCODE tGasDeco, "Deco" ; Deco + TCODE tDilDisabled, "Disabilitato" ; Disabled + TCODE tDilFirst, "Primo" ; First + TCODE tDilNorm, "Normale" ; Normal + TCODE tAir, "Aria " ; Enum: values must follows (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD :" + TCODE tEAD, "EAD:" + TCODE tSetup_GasDepth, "Cambia profondita'" + TCODE tDepthPlus, "Profondita' +" + TCODE tDepthMinus, "Profondita' -" + TCODE tDepthReset, "Reset a MOD:" + TCODE tSetup_GasMix, "Cambia Miscela" + TCODE tCCRMode, "Modo CCR:" ; CCR Mode: + TCODE tCCRModeFixedSP, "SP Fissi" ; Fixed SP + TCODE tCCRModeSensor, "Sensori" ; Sensor + TCODE tCCRModeAutoSP, "SP Auto" ; Auto SP + TCODE tSP, "SP" ; SP (SetPoint) + TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "calcolato" ; calculated + TCODE tppO2, "ppO2:" ; ppO2: + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + ; New battery menu - TCODE tNewBattTitle, "Nuova Batteria?" - TCODE tNewBattOld, "Mantieni vecchia" + TCODE tNewBattTitle, "Nuova Batteria?" + TCODE tNewBattOld, "Mantieni vecchio" TCODE tNewBattNew36, "Nuova 3,6V Saft (T1)" TCODE tNewBattNew15, "Nuova 1,5V AA (T0)" TCODE tNewBattAccu, "3,6V AA ricaric.(T2)" - TCODE tNew18650, "Internal 18650 (T3)" - TCODE tNew16650, "Internal 16650 (T4)" + TCODE tNew18650, "Internal 18650 (T3)" + TCODE tNew16650, "Internal 16650 (T4)" ; Gaslist management - TCODE tGas, "Gas" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) + TCODE tGas, "Gas" ; Gas + TCODE tDil, "Dil" ; Diluent + TCODE tGasErr, "Err" ; Err (3 chars) ; Communication Menu - TCODE tUsbTitle, "Modalita' USB" - TCODE tBleTitle, "Modalita' Bluetooth" - TCODE tUsbStarting, "Avvio..." - TCODE tUsbStartDone, "Fatto." - TCODE tUsbServiceMode, "Modo Servizio abil" - TCODE tUsbClosed, "Porta chiusa" - TCODE tUsbExit, "Uscita" - TCODE tUsbDownloadMode, "Modo Download abil" - TCODE tUsbLlBld, "Livello-basso Bootloader" + TCODE tUsbTitle, "Modalita' USB" + TCODE tBleTitle, "Modalita' Bluetooth" + TCODE tUsbStarting, "Avvio..." + TCODE tUsbStartDone, "Fatto." + TCODE tUsbServiceMode, "Modo Servizio abil" + TCODE tUsbClosed, "Porta chiusa" + TCODE tUsbExit, "Uscita" + TCODE tUsbDownloadMode, "Modo Download abil" + TCODE tUsbLlBld, "Livello-basso Bootloader" ; Dive Settings - TCODE tDvMode, "Tipo Tuffo:" - TCODE tDvOC, "OC" - TCODE tDvCCR, "CCR" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnea" - TCODE tDvPSCR, "pSCR" - TCODE tDvCC, "CC" - TCODE tDkMode, "Algorit.:ZH-L16" ; ## MODIFIED (memory) - TCODE tZHL16, " " ; ## MODIFIED (memory) - TCODE tZHL16GF, "+GF" ; ## MODIFIED (memory) - TCODE tPPO2Max, "ppO2 Max:" - TCODE tPPO2DECO, "ppO2 Deco:" - TCODE tPPO2MIN, "ppO2 Min:" - TCODE tPPO2MINCC, "Loop Min:" ; ## NEW ppO2 min cc - TCODE tLastDecostop, "Ultima Deco:" - TCODE tDecoparameters, "Parametri Deco" - TCODE tGF_low, "GF Basso:" - TCODE tGF_high, "GF Alto:" - TCODE tSaturationMult, "Saturazione:" - TCODE tDesaturationMult, "Desaturazione:" - 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 - TCODE taGF_enable,"aGF Selezionabile:" ; aGF Selectable - TCODE tDiveaGF_active,"aGF!" ; aGF! - TCODE tppO2settings,"Menu ppO2" ; ppO2 Settings (max. 18 chars) - TCODE tsafetystopmenu,"Tappa Sicurezza:" ; Safety Stop: (max. 16 chars) - TCODE tGasUsage, "Util.Gas" ; Gas Usage - TCODE tSetBotUse, "Gas Fondo: " ; Bottom Gas: (space) - TCODE tSetDecoUse, "Gas Deco : " ; Deco Gas: (space) ## MODIFIED (layout) - TCODE tCalcAscGas, "Calc.Gas (B/O):" ; ## NEW bailout gas needs - TCODE tTankSizes, "Capac. Bombola" ; ## NEW bailout gas needs - TCODE tLiter, " l" ; ## NEW bailout gas needs - TCODE tBarLiter, "Litri" - TCODE tTankFillPress, "Press. Bombola"; ## NEW bailout gas needs - TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs - TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs - TCODE tGas3, "Gas 3:" ; ## NEW bailout gas needs - TCODE tGas4, "Gas 4:" ; ## NEW bailout gas needs - TCODE tGas5, "Gas 5:" ; ## NEW bailout gas needs - TCODE tCCmaxFracO2, "%O2 max Loop:" ; ## NEW CCR max ppO2 limiter - TCODE t2ndDecoPlanMenu,"2o Piano Deco" ; ## NEW deco engine + TCODE tDvMode, "Tipo Tuffo:" + TCODE tDvOC, "OC" + TCODE tDvCCR, "CCR" + TCODE tDvGauge, "Gauge" + TCODE tDvApnea, "Apnea" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Algorit.: ZH-L16" + TCODE tZHL16, " " + TCODE tZHL16GF, "+GF" + TCODE tPPO2Max, "ppO2 Max :" + TCODE tPPO2DECO, "ppO2 Deco:" + TCODE tPPO2MIN, "ppO2 Min :" + TCODE tPPO2MINCC, "Loop Min :" + TCODE tLastDecostop, "Ultima Deco : " + TCODE tAscentSpeed, "Ascent Speed: " ; Ascent Speed ## pending translation + TCODE tGasChangeTime, "Gas Change :+" ; additional Gas Change Time ## pending translation + TCODE tDecoparameters, "Parametri Deco" + TCODE tGF_low, "GF Basso:" + TCODE tGF_high, "GF Alto :" + TCODE tSaturationMult, "Saturazione : " + TCODE tDesaturationMult, "Desaturazione: " + TCODE tFTTSMenu, "TTS Futuro:" ; Future TTS + TCODE tLastDecostopSurf, "Ultima Deco:" ; last deco stop surface custom view + TCODE tGFMenu, "Menu GF" ; GF Settings + TCODE taGF_low, "aGF Basso:" ; aGF low + TCODE taGF_high, "aGF Alto :" ; aGF high + TCODE taGF_enable, "aGF Selezionabile:" ; aGF Selectable + TCODE tDiveaGF_active, "using aGF" ; using aGF ## pending translation + TCODE tppO2settings, "Menu ppO2" ; ppO2 Settings (max. 18 chars) + TCODE tsafetystopmenu, "Tappa Sicurezza:" ; Safety Stop: (max. 16 chars) + TCODE tGasUsage, "Utilizzo Gas" ; Gas Usage + TCODE tSetBotUse, "Gas Fondo: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Gas Deco : " ; Deco Gas: (space) + TCODE tCalcAscGas, "Calc.Gas (B/O):" ; + TCODE tSetup_Tank, "Imposta Bombola" ; Setup Tank + TCODE tTankSize, "Capac. Bombola" ; Tank Size + TCODE tTankUsablePress, "Press. Necess. Asc." ; Tank Press Budget for Ascent (turn pressure) ## pending translation + TCODE tCopyDilToOC, "Copy Dil->OC" ; copy diluent settings to OC gas ## pending translation + TCODE tTankPairing, "Cambia Transmitter" ; select Transmitter ## pending translation + TCODE tLiter, " l" ; + TCODE tLiterLong, "Litri" ; + TCODE tCCmaxFracO2, "%O2 max Loop:" ; + TCODE t2ndDecoPlanMenu, "2o Piano Deco" ; 2nd Deco Plan + + IFDEF _rx_functions + TCODE tTrModeOff, "off" ; off ## pending translation + TCODE tTrModeOn, "on" ; on ## pending translation + TCODE tTrModeIndDouble, "indep.Double" ; independent double ## pending translation + TCODE tTrModeCCR, "CCR Dil+O2" ; CCR diluent and O2 + TCODE tTrPresNone, "none" ; none (big enum group follows) ## pending translation + TCODE tTrPresGas1, "Gas 1" ; Gas 1 + TCODE tTrPresGas2, "Gas 2" ; Gas 2 + TCODE tTrPresGas3, "Gas 3" ; Gas 3 + TCODE tTrPresGas4, "Gas 4" ; Gas 4 + TCODE tTrPresGas5, "Gas 5" ; Gas 5 + TCODE tTrPresDil1, "Dil 1" ; Dil 1 + TCODE tTrPresDil2, "Dil 2" ; Dil 2 + TCODE tTrPresDil3, "Dil 3" ; Dil 3 + TCODE tTrPresDil4, "Dil 4" ; Dil 4 + TCODE tTrPresDil5, "Dil 5" ; Dil 5 + TCODE tTrPresFirstGas, "First Gas" ; first Gas ## pending translation + TCODE tTrPresActiveGas, "active Gas" ; active Gas ## pending translation + TCODE tTrPresFirstDil, "First Dil" ; first Dil ## pending translation + TCODE tTrPresActiveDil, "active Dil" ; active Dil ## pending translation + ELSE + TCODE tTrModeOff, "" ; dummy target for entry in option table + TCODE tTrPresNone, "" ; dummy target for entry in option table + ENDIF ; Display Settings - TCODE tBright, "Luminosita':" - TCODE tEco, "Eco" - TCODE tMedium, "Media" - TCODE tHigh, "Alta" - TCODE tDvSalinity,"Salinita':" ; Salinity - TCODE tShowppO2, "ppO2 Permanente:" ; Always show ppO2: - TCODE tFlip, "Ruota schermo:" ; Rotate Screen - TCODE tMODwarning,"Avvertimento MOD:" ; MOD warning - TCODE tIBCDwarning, "Avvertimento IBCD:" ; IBCD Warning ## NEW IBCD - TCODE tTimeoutDive,"Timeout Immsni:" ; Dive Timeout + TCODE tBright, "Luminosita':" + TCODE tEco, "Eco" + TCODE tMedium, "Media" + TCODE tHigh, "Alta" + TCODE tDvSalinity, "Salinita': " ; Salinity + TCODE tShowppO2, "ppO2 Permanente:" ; Always show ppO2: + TCODE tFlip, "Ruota schermo:" ; Rotate Screen + TCODE tMODwarning, "Avvertimento MOD:" ; MOD warning + TCODE tIBCDwarning, "Avvertimento IBCD:" ; IBCD Warning + TCODE t2ndDepth, "2.Prof.:" ; 2nd depth display content (10 chars max) + TCODE tTimeoutDive, "Timeout Immsni:" ; Dive Timeout ; VSI display Settings - TCODE tVSItext2, "Velox Variabile:" ; Variable speed: - TCODE tVSIgraph, "Grafico Velocita':" ; Speed graph: + TCODE tVSItext2, "Velox Variabile:" ; Variable speed: + TCODE tVSIgraph, "Grafico Velocita':" ; Speed graph: ; Setup Menu - TCODE tSystSets, "Impostazioni" - TCODE tLanguage, "Lingua:" - TCODE tEnglish, "Inglese" - TCODE tGerman, "Tedesco" - TCODE tFrench, "Francese" - TCODE tItalian, "Italiano" - TCODE tCompassMenu,"Calibra Bussola" ; Compass calibration - TCODE tCompassGain,"Suscettibilita:" ; Compass gain: - TCODE tCalX, "Cal X:" ; Cal X - TCODE tCalY, "Cal Y:" ; Cal Y - TCODE tCalZ, "Cal Z:" ; Cal Z - - TCODE tUnits, "Unita':" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - - TCODE tButtonleft,"Bottone Sx:" ; Left button - TCODE tButtonright,"Bottone Dx:" ; Right button + TCODE tSystSets, "Impostazioni" + TCODE tCompassMenu, "Calibra Bussola" ; Compass calibration + TCODE tCompassGain, "Suscettibilita:" ; Compass gain: + TCODE tCalX, "Cal X:" ; Cal X + TCODE tCalY, "Cal Y:" ; Cal Y + TCODE tCalZ, "Cal Z:" ; Cal Z + TCODE tUnits, "Unita':" + TCODE tMetric, " m/°C" ; Enum menu + TCODE tImperial, "ft/°F" + TCODE tDefName, "HW OSTC" + TCODE tButtonleft, "Bottone Sx:" ; Left button + TCODE tButtonright, "Bottone Dx:" ; Right button + TCODE tAltMode, "Attesa :" ; Waiting Time + TCODE tAltModeFly, "Volo" ; Flying + TCODE tAltMode1000, "1000m" ; + TCODE tAltMode2000, "2000m" ; + TCODE tAltMode3000, "3000m" ; - TCODE tAltMode, "Attesa:" ; ## NEW no fly altitude - TCODE tAltModeFly, "Volo" ; ## NEW no fly altitude - TCODE tAltMode1000, "1000m" ; ## NEW no fly altitude - TCODE tAltMode2000, "2000m" ; ## NEW no fly altitude - TCODE tAltMode3000, "3000m" ; ## NEW no fly altitude - ; Units for all menu - TCODE tMeters, "m" - TCODE tFeets, "ft" - TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" - TCODE tbar, "bar" ; bar - TCODE tbar10, "0 bar" ; bar ## NEW 2.95 - TCODE tMeterMinute, "m/min" ; meter per minute ## NEW ascent speed - TCODE tmin, "min" ; minutes - + TCODE tMeters, "m" + TCODE tFeets, "ft" + TCODE tFeets1, "f" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" + TCODE tbar, "bar" ; bar + TCODE tbar10, "0 bar" ; xx0 bar + TCODE tMeterMinute, "m/'" ; meter per minute + ; Date - TCODE tDateFormat, "Data:" - TCODE tDateformat, "MMGGAA" - TCODE tDateformat1,"GGMMAA" - TCODE tDateformat2,"AAMMGG" + TCODE tDateFormat, "Data: " + TCODE tDateformat, "MMGGAA" + TCODE tDateformat1, "GGMMAA" + TCODE tDateformat2, "AAMMGG" ; Simulator menu - TCODE tInter, "Avvia Simulatore" ; Start Simulator - TCODE tPlan, "Simulatore" ; Simulator + TCODE tInter, "Avvia Simulatore" ; Start Simulator + TCODE tPlan, "Simulatore" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Tempo Fondo :" ; Bot. Time: (10 chars) - TCODE tBtTm_short,"Tempo:" ; Bot. Time: (max. 6 chars) - TCODE tBtDep, "Profond. Max:" ; Max Depth: (10 chars) - TCODE tIntvl, "Int.Superf. :" ; Interval : (10 chars) - TCODE tDecoSetup, "Setta Calcoli" ; ## NEW (layout) - TCODE tDeco, "Calcola Deco" ; Calculate Deco - TCODE tDivePlan, "Pianificat:" ; Dive Plan: - TCODE tNoDeco, "No Deco" ; No Deco - TCODE tMore, "Dettagli.." ; More... - TCODE tSelectSetpoint,"Setpoint CCR: " ; ## NEW deco calculator enhancement - TCODE tuseAGF, "usa aGF: " ; ## NEW deco calculator enhancement - TCODE tCalculating, "Calcolando..." ; ## NEW deco calculator enhancement + TCODE tBtTm, "Tempo Fondo :" ; Bot. Time: (10 chars) + TCODE tBtTm_short, "Tempo:" ; Bot. Time: (max. 6 chars) + TCODE tBtDep, "Profond. Max:" ; Max Depth: (10 chars) + TCODE tIntvl, "Int.Superf. :" ; Interval : (10 chars) + TCODE tDecoSetup, "Setta Calcoli" ; Deco Setup + TCODE tDeco, "Calcola Deco" ; Calculate Deco + TCODE tDivePlan, "Pianificat:" ; Dive Plan: + TCODE tNoDeco, "No Deco" ; No Deco + TCODE tMore, "Dettagli" ; More + TCODE tSelectSetpoint, "Setpoint CCR: " ; + TCODE tuseAGF, "usa aGF : " ; use aGF + TCODE tCalculating, "Calcolando..." ; calculating... + TCODE tNDLleft, "left" ; time left within NDL ## pending translation ; Information menu - TCODE tFirmware, "Firmware: " ; Firmware: (space) - TCODE tSerial, "Seriale : " ; Serial : (space) - TCODE tTotalDives,"Tot Immersioni:" ; Total Dives: - TCODE tBatteryV, "Batteria: " ; Battery: - TCODE tUptime, "Uptime: " ; Uptime: + TCODE tFirmware, "Firmware: " ; Firmware: (space) + TCODE tFirmware_rx, "RX Ver : " ; RX Ver : (space) + TCODE tSerial, "Seriale : " ; Serial : (space) + TCODE tTotalDives, "Tot Immersioni:" ; Total Dives: + TCODE tBatteryV, "Batteria: " ; Battery: + TCODE tUptime, "Uptime: " ; Uptime: ; Divemode screen - TCODE tNDL, "NDL" - TCODE tTTS, "TTS" - TCODE tVelMetric, "m/min" - TCODE tVelImperial,"ft/m " - TCODE tGasSelect, "Selez. Gas" ; Select Gas - TCODE tSelectAir, "Aria" ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Prof." ; Depth - TCODE tMaxDepth, "Prof. Max" ; Max. Depth - max 10chars! - TCODE tDivetime, "Divetime" ; Divetime - TCODE tDiveHudMask1, "Sensore 1" - TCODE tDiveHudMask2, "Sensore 2" - TCODE tDiveHudMask3, "Sensore 3" - TCODE tDiveTotalAvg, "Media" - TCODE tDiveStopwatch, "Cronometro" - TCODE tDiveStopAvg, "Media Inter" ; 11chars max - TCODE tApnoeTotal, "Totale" ; Total (Six chars, right alligned) - TCODE tApnoeMax, "Ultima Discesa" ; Last descend - TCODE tApnoeSurface, "Tempo Superficie" ; Surface Time - TCODE tDiveDecoplan, "Piano Deco" ; Decoplan - TCODE tDiveClock, "Orologio" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Tessuti" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "Valori GF" ; GF Values - TCODE taGFactors, "Valori aGF" ; aGF Values - TCODE tGFInfo, "Info GF" ; GF Info - TCODE tCeiling, "Tetto" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) - TCODE tDecoInfo, "Zona Deco" ; Deco info - TCODE tSensorCheck, "Testa Sensori" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning - TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning - TCODE tSensorDisagree,"Sensori<>" ; Sensors disagree Warning ## NEW voting logic - TCODE tGasNeedsWarn, "Gas Neces" ; ## NEW bailout gas needs - TCODE tGasNeedsBar, "Gas Necess. (bar)" ; ## NEW bailout gas needs - TCODE tCNSsurf, "CNS Surf." ; ## NEW CNS at end-of-dive - TCODE tCNSfTTS, "CNS fTTS" ; ## NEW CNS at end-of-dive - TCODE tCNSBO, "CNS B/O" ; ## NEW CNS at end-of-dive - TCODE tCNSnow, "CNS ora" ; ## NEW CNS at end-of-dive - TCODE tCNSeod, "CNS finale" ; ## NEW CNS at end-of-dive - TCODE tIBCD, "IBCD N2He" ; ## NEW IBCD - TCODE tMicroBubbles, "M.Bolle" ; ## NEW microbubbles - TCODE tCNS, "CNS: " ; ## V2.95 optics - + TCODE tNDL, "NDL" ; 3 chars max + TCODE tTTS, "TTS" + TCODE tVelMetric, "m/min" + TCODE tVelImperial, "ft/m " + TCODE tGasSelect, "Selez. Gas" ; Select Gas + TCODE tSelectAir, "Aria" ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Prof." ; Depth + TCODE tMaxDepth, "Prof. Max" ; Max. Depth - max 10chars! + TCODE tAvgDepth, "Prof. Med." ; average Depth - max 10chars! + TCODE tDivetime, "Divetime" ; Divetime + TCODE tDiveHudMask1, "Sensore1" + TCODE tDiveHudMask2, "Sensore2" + TCODE tDiveHudMask3, "Sensore3" + TCODE tDiveTotalAvg, "Media" + TCODE tDiveStopwatch, "Cronometro" + TCODE tDiveStopAvg, "Media Inter" ; 11 chars max + TCODE tApnoeTotal, "Totale" ; Total (six chars, right aligned) + TCODE tApnoeMax, "Ultima Discesa" ; Last descend + TCODE tApnoeSurface, "Tempo Superficie" ; Surface Time + TCODE tTime, "Time" ; Time ## pending translation + TCODE tSurface, "Surface" ; Surface (max 12 chars) ## pending translation + TCODE tDiveDecoplan, "Piano Deco" ; Decoplan +; TCODE tDiveClock, "Orologio" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Tessuti" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "Valori GF" ; GF Values + TCODE taGFactors, "Valori aGF" ; aGF Values + TCODE tGFInfo, "Info GF" ; GF Info + TCODE tCeiling, "Tetto" ; Ceiling + TCODE tDiveSafetyStop, "Stop" ; Stop (four chars, right aligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Zona Deco" ; Deco info + TCODE tSensorCheck, "Testa Sensori" ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree, "Sensori<>" ; Sensors disagree Warning + TCODE tGasNeedsWarn, "Gas Neces" ; + TCODE tGasNeedsAscent, "Gas Necess. Ascent" ; ## pending translation + TCODE tCNSsurf, "CNS Surf." ; + TCODE tCNSfTTS, "CNS fTTS" ; + TCODE tCNSBO, "CNS B/O" ; + TCODE tCNSnow, "CNS ora" ; + TCODE tCNSeod, "CNS finale" ; + TCODE tIBCD, "IBCD N2He" ; + TCODE tnoBOgas, "-B/O-Gas-" ; + TCODE tMicroBubbles, "M.Bolle" ; + TCODE tCNS, "CNS: " ; + TCODE tgaschange, "Change?" ; better gas found ## pending translation + TCODE tNeed, "Need " ; gas need (5 chars) ## pending translation + TCODE tBattery, "Batteria" ; Battery + IFDEF _rx_functions + TCODE tTransmitter, "P.Transm." ; pressure transmitter ## pending translation + TCODE tPressure, "P.Bombola" ; tank pressure + TCODE tSAC, "SAC" ; SAC, must be 3 chars! + TCODE tswap, "Swap Tank" ; swap tank (max. 9 chars ## pending translation + ENDIF + IFDEF _cave_mode + TCODE tGasNeedsCaveMode, "Gas Necess. Cave Mode" ; title for gas needs custom view + TCODE tDiveTurned, "Dv.turned" ; dive is turned (max. 9 char) ## pending translation + TCODE tCaveMode, "Cave Mode" ; cave mode activated (max. 9 char) + TCODE tCaveModeShutdown, "X-Cave-X" ; cave mode shut down (max. 9 char) + ENDIF + ; Divemode menu - TCODE tDivePreMenu, "Menu?" ; Menu? - TCODE tSetHeading, "Salva" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menu?" ; Menu? + TCODE tSetHeading, "Salva" ; Bearing (max. 6 chars) ; Simulator menu - TCODE tQuitSim, "Esci" ; Quit Simulation? + TCODE tQuitSim, "Esci" ; Quit Simulation ; Logbook - TCODE tCNS2, "CNS:" - TCODE tAVG, "Media:" - TCODE tGF, "GF:" - TCODE tSAT, "Sat:" ; Sat: + TCODE tCNS2, "CNS:" + TCODE tAVG, "Media:" + TCODE tGF, "GF:" + TCODE tSAT, "Sat:" ; Logbook units - TCODE tLogTunitC, "°C" - TCODE tLogTunitF, "°F" - TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tLogTunitC, "°C" + TCODE tLogTunitF, "°F" + TCODE tKGL, "kg/l" + TCODE tMBAR, "hPa" ; Logbook menu - TCODE tNextLog, "Pagina Seguente" + TCODE tNextLog, "Pagina Seguente" ; Reset menu - TCODE tReboot, "Riavvio" ;Reboot - TCODE tResetMenu2,"Sei sicuro?" ;Are you sure? - TCODE tAbort, "Annulla" ;Abort - TCODE tResetSettings, "Azzera Tutto" ;Reset all - TCODE tResetDeco, "Azzera Deco" ;Reset Deco - TCODE tResetBattery, "Azzera Batteria" ;Reset Battery - TCODE tResetLogbook, "Azzera Logbook" ;Reset Logbook + TCODE tReboot, "Riavvio" ; Reboot + TCODE tResetMenu2, "Sei sicuro?" ; Are you sure? + TCODE tAbort, "Annulla" ; Abort + TCODE tResetSettings, "Azzera Settings" ; Reset all ## pending translation + TCODE tResetDeco, "Azzera Deco" ; Reset Deco + TCODE tResetBattery, "Azzera Batteria" ; Reset Battery + TCODE tResetLogbook, "Azzera Logbook" ; Reset Logbook ; Set Time Menu/Set Date Menu - TCODE tSetHours, "Imposta Ora" ; Set Hours - TCODE tSetMinutes,"Imposta Minuti" ; Set Minutes - TCODE tSetSeconds,"Azzera Secondi" ; Clear seconds - TCODE tSetDay, "Imp Giorno" ; Set Day - TCODE tSetMonth, "Imp Mese" ; Set Month - TCODE tSetYear, "Imp Anno" ; Set Year + TCODE tSetHours, "Imposta Ora" ; Set Hours + TCODE tSetMinutes, "Imposta Minuti" ; Set Minutes + TCODE tSetSeconds, "Azzera Secondi" ; Clear seconds + TCODE tSetDay, "Imp Giorno" ; Set Day + TCODE tSetMonth, "Imp Mese" ; Set Month + TCODE tSetYear, "Imp Anno" ; Set Year ; Logbook Offset Menu - TCODE tLogOffset, "Devia Logbook" ; Logbook offset - TCODE tLogOffsetp1, "+1" ; +1 - TCODE tLogOffsetp10, "+10" ; +10 - TCODE tLogOffsetm1, "-1" ; -1 - TCODE tLogOffsetm10, "-10" ; -10 + TCODE tLogOffset, "Devia Logbook" ; Logbook offset + TCODE tLogOffsetp1, "+1" ; +1 + TCODE tLogOffsetp10, "+10" ; +10 + TCODE tLogOffsetm1, "-1" ; -1 + TCODE tLogOffsetm10, "-10" ; -10 ; Compass directions - TCODE tN, "N " ; N(orth),338°-22° - TCODE tNE, "NE" ; North-East,23°-67° - TCODE tE, "E " ; E(east),68°-112° - TCODE tSE, "SE" ; South-East,113°-157° - TCODE tS, "S " ; S(outh),157°-202° - TCODE tSW, "SO" ; South-West,203°-247° - TCODE tW, "O " ; W(West),248°-292° - TCODE tNW, "NO" ; North-West,293°-337° + TCODE tN, "N " ; N(orth), 338°-22° + TCODE tNE, "NE" ; North-East, 23°-67° + TCODE tE, "E " ; E(east), 68°-112° + TCODE tSE, "SE" ; South-East, 113°-157° + TCODE tS, "S " ; S(outh), 157°-202° + TCODE tSW, "SO" ; South-West, 203°-247° + TCODE tW, "O " ; W(West), 248°-292° + TCODE tNW, "NO" ; North-West, 293°-337° ; Color Scheme menu - TCODE tColorScheme, "Schema colori" ; Colour scheme - TCODE tColorSetDive, "Immersione:" ; Divemode: - TCODE tColorSetName0, "Standard" ; Standard - TCODE tColorSetName1, "Rosso" ; Red - TCODE tColorSetName2, "Verde" ; Green - TCODE tColorSetName3, "Blu" ; Blue + TCODE tColorScheme, "Schema colori" ; Colour scheme + TCODE tColorSetDive, "Immersione:" ; Divemode: + TCODE tColorSetName0, "Standard" ; Standard + TCODE tColorSetName1, "Rosso" ; Red + TCODE tColorSetName2, "Verde" ; Green + TCODE tColorSetName3, "Blu" ; Blue + + ; PSCR Menu and Settings + TCODE tPSCRMenu, "Menu pSCR" ; pSCR Menu + TCODE tPSCR_O2_drop, "O2 Drop " ; O2 drop + TCODE tPSCR_lungratio, "Lung Ratio " ; lung ratio + TCODE tBackToLoop, "goto loop" ; back to loop (10 chars max) ### new + + +; Language selection + IF _language_2!=none + TCODE tLanguage, "Lingua: " ; used in menu_tree + ENDIF - ; PSCR Menu and Settings - TCODE tPSCRMenu, "Menu PSCR" ; PSCR Menu - TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop - TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio + IF _language_1==en + TCODE tLang1, "Inglese" ; tLang1 is 1st language, enum context + ELSE + IF _language_1==de + TCODE tLang1, "Tedesco" + ELSE + IF _language_1==fr + TCODE tLang1, "Francese" + ELSE + IF _language_1==it + TCODE tLang1, "Italiano" + ELSE + TCODE tLang1, "" ; dummy target for options table + ENDIF + ENDIF + ENDIF + ENDIF + + IF _language_2==en + TCODE tLang2, "Inglese" ; tLang2 is 2nd language, enum context + ELSE + IF _language_2==de + TCODE tLang2, "Tedesco" + ELSE + IF _language_2==fr + TCODE tLang2, "Francese" + ELSE + IF _language_2==it + TCODE tLang2, "Italiano" + ENDIF + ENDIF + ENDIF + ENDIF diff -r 00b24fb4324d -r ca4556fb60b9 src/text_multilang.asm --- a/src/text_multilang.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_multilang.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,93 +1,140 @@ ;============================================================================= ; -; File text_multilang.asm Version 2.92 = 2.26 +; File text_multilang.asm V2.99c ; ; Implementation text in various selectable languages. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-06-12 : [jDG] Creation... +; 2011-06-12 : [jDG] Creation +#include "hwos.inc" #include "text_multilang.inc" -#include "hwos.inc" -; Because text are indexed by 12bits value in FSR register, they can't -; just be anywhere. It is safe to make them start in address 0xHHH000. -texts code 0x009000 +; Because text are indexed by 12 bits values in FSR register, they can't +; just be anywhere. It is safe to make them start at address 0xHHH000. +texts code 0x009000 ;============================================================================= - global text_1_base + global text_1_base text_1_base: - IFNDEF french_italian - MESSG "hwOS code in English and German!" ;---- PASS 1 : generate description block ------------------------------------ -tcode_idx set 0 -LANG set 0 -#define TCODE TCODE_1 -#include "text_english.inc" -#undefine TCODE +tcode_idx set 0 +LANG set 0 +#define TCODE TCODE_1 -;---- PASS 2 : generate text contens ----------------------------------------- -tcode_idx set 0 -#define TCODE TCODE_2 -#include "text_english.inc" -#undefine TCODE + IF _language_1==en + MESSG "1st Laguage: English" +#include "text_english.inc" + ELSE + IF _language_1==de + MESSG "1st Laguage: German" +#include "text_german.inc" + ELSE + IF _language_1==fr + MESSG "1st Laguage: French" +#include "text_french.inc" + ELSE + IF _language_1==it + MESSG "1st Laguage: Italian" +#include "text_english.inc" + ELSE + MESSG "1st Laguage: Default (English)" +#include "text_english.inc" + ENDIF + ENDIF + ENDIF + ENDIF + +#undefine TCODE + +;---- PASS 2 : generate text contents ---------------------------------------- +tcode_idx set 0 +#define TCODE TCODE_2 + + IF _language_1==en +#include "text_english.inc" + ELSE + IF _language_1==de +#include "text_german.inc" + ELSE + IF _language_1==fr +#include "text_french.inc" + ELSE + IF _language_1==it +#include "text_english.inc" + ELSE +#include "text_english.inc" + ENDIF + ENDIF + ENDIF + ENDIF + +#undefine TCODE ;============================================================================= + IF _language_2!=none - global text_2_base + global text_2_base text_2_base: - ;---- PASS 1 : generate description block ------------------------------------ -tcode_idx set 0 -LANG set 1 -#define TCODE TCODE_1 -#include "text_german.inc" -#undefine TCODE +tcode_idx set 0 +LANG set 1 +#define TCODE TCODE_1 -;---- PASS 2 : generate text contens ----------------------------------------- -tcode_idx set 0 -#define TCODE TCODE_2 -#include "text_german.inc" -#undefine TCODE + IF _language_2==en + MESSG "2nd Laguage: English" +#include "text_english.inc" + ELSE + IF _language_2==de + MESSG "2nd Laguage: German" +#include "text_german.inc" + ELSE + IF _language_2==fr + MESSG "2nd Laguage: French" +#include "text_french.inc" + ELSE + IF _language_2==it + MESSG "2nd Laguage: Italian" +#include "text_english.inc" + ELSE + MESSG "2nd Laguage: Default (English)" +#include "text_english.inc" + ENDIF + ENDIF + ENDIF + ENDIF + +#undefine TCODE - ELSE - MESSG "hwOS code in French and Italian!" -;============================================================================= -;---- PASS 1 : generate description block ------------------------------------ -tcode_idx set 0 -LANG set 0 -#define TCODE TCODE_1 -#include "text_french.inc" -#undefine TCODE +;---- PASS 2 : generate text contents ---------------------------------------- +tcode_idx set 0 +#define TCODE TCODE_2 -;---- PASS 2 : generate text contens ----------------------------------------- -tcode_idx set 0 -#define TCODE TCODE_2 -#include "text_french.inc" -#undefine TCODE + IF _language_2==en +#include "text_english.inc" + ELSE + IF _language_2==de +#include "text_german.inc" + ELSE + IF _language_2==fr +#include "text_french.inc" + ELSE + IF _language_2==it +#include "text_english.inc" + ELSE +#include "text_english.inc" + ENDIF + ENDIF + ENDIF + ENDIF + +#undefine TCODE + + ENDIF ;============================================================================= - global text_2_base -text_2_base: -;---- PASS 1 : generate description block ------------------------------------ -tcode_idx set 0 -LANG set 1 -#define TCODE TCODE_1 -#include "text_italian.inc" -#undefine TCODE - -;---- PASS 2 : generate text contens ----------------------------------------- -tcode_idx set 0 -#define TCODE TCODE_2 -#include "text_italian.inc" -#undefine TCODE - - ENDIF - -;============================================================================= - - END + END diff -r 00b24fb4324d -r ca4556fb60b9 src/text_multilang.inc --- a/src/text_multilang.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/text_multilang.inc Thu Nov 22 19:47:26 2018 +0100 @@ -2,87 +2,86 @@ ; ; File text_multilang.inc ; -; Implementation text in various selectable languages. +; Implementation of texts in various selectable languages ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-06-12 : [jDG] Creation... +; 2011-06-12 : [jDG] Creation ; ; Text definitions (text_french.asm example): -; TCODE tYes, "Oui" ; Yes -; TCODE tNo, "Non" ; No -; TCODE tLogbk, "Carnet de plongées" ; Logbook +; TCODE tYes, "Oui" ; Yes +; TCODE tNo, "Non" ; No +; TCODE tLogbk, "Carnet de plongées" ; Logbook ; ; Text direct usage: -; lfsr FSR1,tYes ; Load a 12bit text index -; call strcpy_text ; Copy to string buffer. -; PUTC '/' -; lfsr FSR1,tNo -; call strcat_text_print ; Append, and call word processor. +; lfsr FSR1,tYes ; load a 12 bit text index +; call strcpy_text ; copy to string buffer +; PUTC '/' ; place a single character into the text buffer +; lfsr FSR1,tNo +; call strcat_text_print ; append next text and call word processor to output all text to the screen ; ; RATIONALS: ; - The macro should define a label so that text files can be reordered -; to keep consistency while adding more option (and make translator life easier). +; to keep consistency while adding more options (and make translator life easier). ; ; - The text positions is keept in menu blocks for the menu processor. ; ; - library function take text number from the FSR1 register, because a -; lfsr instruction loads a 12bits constant at once. +; lfsr instruction loads a 12 bit constant at once. ; ;============================================================================= -; -; Pass 1: generate jump table, and define labels. -TCODE_1 macro label, text -tcode_idx set tcode_idx+1 - If LANG == 0 - global label +; Pass 1: generate a jump table and define labels +TCODE_1 macro label, text +tcode_idx set tcode_idx+1 + If LANG == 0 + global label label: - Endif - dw t#v(LANG)_#v(tcode_idx) - endm + Endif + dw t#v(LANG)_#v(tcode_idx) + endm ; -; Pass 2: generates string table. -TCODE_2 macro label, text -tcode_idx set tcode_idx+1 +; Pass 2: generates string table +TCODE_2 macro label, text +tcode_idx set tcode_idx+1 t#v(LANG)_#v(tcode_idx): - db text, 0 - endm + db text, 0 + endm ; ;============================================================================= -; strcpy_text : copy a multiling text into string buffer. +; strcpy_text : copy a multiling text into string buffer ; -; Input: FSR1 : text index -; Output: Buffer: filled with the text. -; FSR2: pointer to end of copied text (the null char). -; Trashed: WREG. - extern strcpy_text +; Input : FSR1 text index +; Output : Buffer filled with the text +; FSR2 pointer to end of copied text (the null char) +; Trashed: WREG + extern strcpy_text ;============================================================================= -; strcpy_text_print : Same as above, but calls word processor afterward. +; strcpy_text_print : same as above, but calls word processor afterward ; -; Input: FSR1 : text index -; Output: Buffer: filled with the text. -; FSR2: pointer to end of copied text (the null char). -; Trashed: WREG. - extern strcpy_text_print +; Input : FSR1 text index +; Output : Buffer filled with the text. +; FSR2 pointer to end of copied text (the null char) +; Trashed: WREG + extern strcpy_text_print ;============================================================================= -; strcat_text : Append a multiling text to FSR2 pointer. +; strcat_text : append a multiling text to FSR2 pointer ; -; Input: FSR1 : text index -; FSR2 : Current position (in Buffer) -; Output: FSR2: pointer to end of copied text (the null char). -; Trashed: WREG. - extern strcat_text +; Input : FSR1 text index +; FSR2 current position (in buffer) +; Output : FSR2 pointer to end of copied text (the null char) +; Trashed: WREG + extern strcat_text ;============================================================================= -; strcat_text_print : Same as above, but calls word processor afterward. +; strcat_text_print : aame as above, but calls word processor afterward ; -; Input: FSR1 : text index -; FSR2 : Current position (in Buffer) -; Output: FSR2: pointer to end of copied text (the null char). -; Trashed: WREG. - extern strcat_text_print +; Input : FSR1 text index +; FSR2 current position (in buffer) +; Output : FSR2 pointer to end of copied text (the null char) +; Trashed: WREG + extern strcat_text_print diff -r 00b24fb4324d -r ca4556fb60b9 src/tft.asm --- a/src/tft.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/tft.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft.asm ## V2.97 +; File tft.asm ## V2.99c ; ; Managing the TFT screen ; @@ -61,13 +61,13 @@ Parameter_out macro high_b, low_b movlw high_b - movwf PORTA ; Upper + movwf PORTA ; upper movlw low_b rcall TFT_DataWrite endm -basic CODE +tft CODE ;;============================================================================= ;; TFT_write_flash_image @@ -92,70 +92,70 @@ ;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... +; 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... +; 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... +; 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 +; iorwf WREG ; check height < 256 ; bnz TFT_write_flash_image_failed -; movf win_width+1,W ; Check width < 512 +; 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 +; 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) +; 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 +; 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 +; 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 +; movf win_height,W ; YES - add extra ; addwf PRODH,F -; rlcf TBLPTRU ; And carry into upper register. +; rlcf TBLPTRU ; and carry into upper register ;TFT_write_flash_image_1: ; incf PRODH,F ; pre-condition nested loops ; incf TBLPTRU,F ; ; ; Write pixels -; Index_out 0x22 ; Frame Memory Data Write start -; RS_H ; Data +; 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 @@ -164,13 +164,13 @@ ; 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" +; bra TFT_CmdWrite ; this routine "returns" ; ; ;---- Draw a 4x4 red square in place of missing images... ;TFT_write_flash_image_failed: @@ -191,22 +191,22 @@ global TFT_CmdWrite TFT_CmdWrite: - RS_L ; Command - clrf PORTA ; Upper + RS_L ; command + clrf PORTA ; upper bcf INTCON,GIE - movwf PORTH ; Lower + movwf PORTH ; lower WR_L - WR_H ; Tick + WR_H ; tick bsf INTCON,GIE return global TFT_DataWrite TFT_DataWrite: - RS_H ; Data + RS_H ; data bcf INTCON,GIE - movwf PORTH ; Lower + movwf PORTH ; lower WR_L - WR_H ; Tick + WR_H ; tick bsf INTCON,GIE return @@ -214,25 +214,25 @@ global TFT_ClearScreen TFT_ClearScreen: - Index_out 0x50 ; Window Horizontal Start Address + Index_out 0x50 ; window horizontal start address Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x51 ; Window Horizontal End Address + Index_out 0x51 ; window horizontal end address Parameter_out 0x00, 0xEF ; 0-239 - Index_out 0x52 ; Window Vertical Start Address + Index_out 0x52 ; window vertical start address Parameter_out 0x00, 0x00 ; 0-319 - Index_out 0x53 ; Window Vertical End Address + Index_out 0x53 ; window vertical end address Parameter_out 0x01, 0x3F ; 0-319 - Index_out 0x20 ; Frame Memory Horizontal Address + Index_out 0x20 ; frame memory horizontal address Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x21 ; Frame Memory Vertical Address + 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 @@ -240,11 +240,11 @@ movlw d'30' movwf tft_temp2 TFT_ClearScreen3: - clrf tft_temp1 ; 30*10*256=76800 Pixels -> Clear complete 240*320 + clrf tft_temp1 ; 30*10*256=76800 pixels -> clear complete 240*320 bcf INTCON,GIE TFT_ClearScreen4: WR_L - WR_H ; Tick + WR_H ; tick decfsz tft_temp1,F bra TFT_ClearScreen4 bsf INTCON,GIE @@ -254,7 +254,7 @@ bra TFT_ClearScreen2 movlw 0x00 ; NOP, to stop window mode - bra TFT_CmdWrite ; And return + bra TFT_CmdWrite ; and return ;============================================================================= @@ -306,7 +306,7 @@ 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 Parameter_out 0x00, 0x00 @@ -319,10 +319,10 @@ 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 + 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... @@ -350,10 +350,10 @@ Index_out 0x03 btfsc flip_screen ; 180° rotation ? - bra TFT_boot2 ; Yes + bra TFT_boot2 ; YES btfss screen_type ; display1? - bra TFT_boot1a ; no + bra TFT_boot1a ; NO Parameter_out 0x10, 0x00 ; display1 bra TFT_boot3 TFT_boot1a: @@ -361,7 +361,7 @@ bra TFT_boot3 TFT_boot2: btfss screen_type ; display1? - bra TFT_boot2a ; no + bra TFT_boot2a ; NO Parameter_out 0x10, 0x30 ; display1 bra TFT_boot3 TFT_boot2a: @@ -396,26 +396,26 @@ TBLRD*+ movlw 0xFF cpfseq TABLAT - bra display0_config_write ; Write Config pair to Display + 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. + tstfsz TABLAT ; end of config? + bra $+4 ; NO + return ; YES - done movf TABLAT,W - call WAITMSX ; Wait WREG milliseconds - TBLRD*+ ; Dummy read (Third byte of delay command) - bra display0_init_loop ; Loop + 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 +display0_config_write: ; with command in WREG movf TABLAT,W - rcall TFT_CmdWrite ; Write command - TBLRD*+ ; Get config0 + rcall TFT_CmdWrite ; write command + TBLRD*+ ; get config0 movff TABLAT,PORTA - TBLRD*+ ; Get config1 + TBLRD*+ ; get config1 movf TABLAT,W - rcall TFT_DataWrite ; Write config - bra display0_init_loop ; Loop + rcall TFT_DataWrite ; write config + bra display0_init_loop ; loop ;============================================================================= @@ -423,23 +423,23 @@ ; ; Trashes: WREG, PRODL ; Typical usage: -; clrf CCPR1L ; Backlight off +; clrf CCPR1L ; backlight off ; [draw splash screen] ; call TFT_DisplayFadeIn global TFT_Display_FadeIn TFT_Display_FadeIn: - movlw CCP1CON_VALUE ; See hwos.inc + 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 + 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 + incf CCPR1L,F ; duty cycle WAITMS d'2' decfsz PRODL,F bra TFT_Display_FadeIn_0 - bcf tft_is_dimming ; dimming done. + bcf tft_is_dimming ; dimming done return ;============================================================================= @@ -449,9 +449,9 @@ global TFT_Display_FadeOut TFT_Display_FadeOut: movff max_CCPR1L,PRODL - bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor! + bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor TFT_Display_FadeOut_0: - movff PRODL,CCPR1L ; Duty cycle + movff PRODL,CCPR1L ; duty cycle WAITMS d'1' decfsz PRODL,F bra TFT_Display_FadeOut_0 @@ -460,12 +460,12 @@ ;============================================================================= - 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 +box_std_block: ; use white color setf WREG bra box_common -box_black_block: ; Use black color +box_black_block: ; use black color clrf WREG box_common: box_color_block: @@ -509,7 +509,7 @@ ;init_pixel_write: ; movf win_leftx2,W ; mullw 2 -; rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) +; rcall pixel_write_col320 ; start address vertical (.0 - .319) ; setf WREG ; bra TFT_set_color @@ -522,39 +522,39 @@ 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 + 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 + 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 + bra pixel_write_col320_d1 ; YES ; Display0 btfss flip_screen ; 180° rotation? - bra pixel_write_noflip_H ; No - bra pixel_write_flip_H ; Yes + 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 + bra pixel_write_noflip_H ; YES for d1 +pixel_write_flip_H: ; flip d0 + movf PRODL,W ; 16 bits 319 - PROD --> PROD sublw LOW(.319) ; 319-W --> W movwf PRODL movf PRODH,W - btfss STATUS,C ; Borrow = /CARRY + btfss STATUS,C ; borrow = /CARRY incf WREG sublw HIGH(.319) movwf PRODH pixel_write_noflip_H: - Index_out 0x21 ; Frame Memory Vertical Address + Index_out 0x21 ; frame memory vertical address bra TFT_DataWrite_PROD ; and return... ;----------------------------------------------------------------------------- @@ -569,17 +569,17 @@ 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 + 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 + Index_out 0x22 ; frame memory data write start + RS_H ; data 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 + WR_H ; tick bsf INTCON,GIE return @@ -590,21 +590,21 @@ 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. + 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 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) ? + 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) + btfsc STATUS,Z ; Equal ? + return ; YES - done + movf win_top,W ; Y = top + index (bank0 read) addwf TABLAT,W rcall half_pixel_write_1 incf TABLAT,F ; index++ @@ -617,17 +617,17 @@ 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. + 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) ? + 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) + btfsc STATUS,Z ; equal ? + return ; YES - done + movf win_top,W ; Y = top + index (bank0 read) addwf TABLAT,W rcall half_pixel_write_1 incf TABLAT,F ; index++ @@ -639,72 +639,72 @@ global TFT_DataWrite_PROD TFT_DataWrite_PROD: -; RD_H ; Keep high - RS_H ; Data +; 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 + movff PRODH,PORTA ; move high byte to PORTA + movff PRODL,PORTH ; move low byte to PORTH WR_L - WR_H ; Tick + 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! + setf TRISA ; port A as input + setf TRISH ; port H as input + RS_H ; data + WR_H ; not write + RD_L ; read nop nop nop - RD_H ; Tick + RD_H ; tick nop nop nop - RD_L ; Read! + RD_L ; read nop ;nop ;nop movff PORTA,PRODH movff PORTH,PRODL - RD_H ; Tick + RD_H ; tick nop - clrf TRISA ; PortA as output - clrf TRISH ; PortH as output + clrf TRISA ; port A as output + clrf TRISH ; port H as output return ;============================================================================= -; Output TFT Window Address commands. -; Inputs : win_top, win_leftx2, win_height, win_width. -; Output : PortA/PortH commands. +; Output TFT Window Address commands +; Inputs : win_top, win_leftx2, win_height, win_width +; Output : PortA/PortH commands ; Trashed: PROD 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 +TFT_box_write_16bit_win_left: ; Wwth column in PRODL:PRODH btfsc screen_type ; display1? - bra TFT_box_write_16bit_win_left_d1 ; Yes + 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 + 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 + 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 + 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 addwf PRODL,F @@ -714,58 +714,58 @@ btfss STATUS,C decf PRODH,F - Index_out 0x53 ; Window Vertical End Address + Index_out 0x53 ; window vertical end address rcall TFT_DataWrite_PROD bra DISP_box_noflip_H ;---- Flipped horizontal window -------------------------------------- DISP_box_flip_H: - movf PRODL,W ; 16bits 319 - PROD --> PROD - sublw LOW(.319) ; 319-W --> W + movf PRODL,W ; 16 bits 319 - PROD --> PROD + sublw LOW(.319) ; 319 - WREG --> WREG movwf PRODL movf PRODH,W - btfss STATUS,C ; Borrow = /CARRY + 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 + movf win_width+0,W ; 16 bits PROD - width --> PROD subwf PRODL,F ; PRODL - WREG --> PRODL movf win_width+1,W subwfb PRODH,F - infsnz PRODL ; PROD+1 --> PROD + infsnz PRODL ; PROD + 1 --> PROD incf PRODH - Index_out 0x52 ; Window Vertical End Address + 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. + bra TFT_box_noflip_V ; NO ;---- 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) + 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 PRODH,W - bra TFT_DataWrite ; Lower (and tick) and return + bra TFT_DataWrite ; lower (and tick) and return TFT_box_noflip_V: ;---- Normal vertical window ---------------------------------------- @@ -773,55 +773,55 @@ movf win_height,W addwf PRODL,W sublw .240 ; 240 - top - height - movwf PRODH ; First byte + 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 + bra TFT_DataWrite ; lower (and tick) and return ;============================================================================= -; TFT_frame : draw a frame around current box with current color. +; 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_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 + movlw .1 ; row ~ height = 1 movwf win_height 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 + movff save_top,PRODL ; get back top + movff save_height,WREG ; get back height + addwf PRODL,W ; top + height + decf WREG ; top + height - 1 + movwf win_top ; top + height - 1 --> top rcall TFT_box ;---- LEFT column -------------------------------------------------------- - movff save_top,win_top ; Restore top/height. + movff save_top,win_top ; restore top/height movff save_height,win_height - movlw .1 ; column ~ width=1 + movlw .1 ; column ~ width = 1 movwf win_width+0 rcall TFT_box @@ -839,8 +839,8 @@ return ;============================================================================= -; TFT_box : fills current box with current color. -; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 +; 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 @@ -850,7 +850,7 @@ bcf STATUS,C rlcf win_width+0,F rlcf win_width+1,F ; x2 - rcall TFT_box_write ; Setup box + rcall TFT_box_write ; setup box global TFT_box_16bit_win_left TFT_box_16bit_win_left: @@ -859,58 +859,57 @@ rrcf win_width+0,F ;---- Fill Window -------------------------------------------------------- - Index_out 0x22 ; Frame Memory Data Write start + 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 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 + WR_H ; tick -; 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 + WR_H ; tick bsf INTCON,GIE decfsz PRODL,F ; row loop finished ? - bra TFT_box3 ; No: continue. + bra TFT_box3 ; NO - continue 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 + bra TFT_box4 ; NO - just loop + clrf win_color1 ; Yes - switch to black + clrf win_color2 ; - ... TFT_box4: movf win_width+0,W ; compare ? xorwf PRODH,W - bnz TFT_box2 ; Loop not finished. + bnz TFT_box2 ; Loop not finished movlw 0x00 ; NOP, to stop window mode rcall TFT_CmdWrite - ; Reset bargraph mode... + ; reset bargraph mode... setf win_bargraph return ;============================================================================= -;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB' +; Converts 8 bit RGB b'RRRGGGBB' into 16 bit RGB b'RRRRRGGGGGGBBBBB' global TFT_set_color TFT_set_color: - movwf tft_temp1 ; Get 8Bit RGB b'RRRGGGBB' - movwf tft_temp2 ; Copy + movwf tft_temp1 ; get 8 Bit RGB b'RRRGGGBB' + movwf tft_temp2 ; copy - ; Mask Bit 7,6,5,4,3,2 + ; mask bit 7,6,5,4,3,2 movlw b'00000011' andwf tft_temp2,F @@ -921,10 +920,10 @@ movlw b'10100000' dcfsnz tft_temp2,F movlw b'11111000' - movwf tft_temp3 ; Blue done. + movwf tft_temp3 ; blue done - movff tft_temp1,tft_temp2 ; Copy - ; Mask Bit 7,6,5,1,0 + movff tft_temp1,tft_temp2 ; copy + ; mask bit 7,6,5,1,0 movlw b'00011100' andwf tft_temp2,F rrncf tft_temp2,F @@ -954,10 +953,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 @@ -967,9 +966,9 @@ 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 + ; mask bit 4,3,2,1,0 movlw b'11100000' andwf tft_temp2,F @@ -1000,7 +999,7 @@ rrcf tft_temp1,F rrcf tft_temp4,F - rrcf tft_temp1,F + rrcf tft_temp1,F rrcf tft_temp4,F rrcf tft_temp1,F @@ -1009,27 +1008,40 @@ 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 + IFDEF _screendump + + global TFT_dump_screen_check global TFT_dump_screen -TFT_dump_screen: +TFT_dump_screen_check: + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; NO - clear flag + call rs232_get_byte ; try to read data from RS232 + btfsc rs232_receive_overflow ; anything received? + return ; NO - return + movlw "l" ; YES - load coding for screendump command + cpfseq RCREG1 ; screendump command received? + return ; NO - return +TFT_dump_screen: ; YES bsf no_sensor_int movlw 'l' - movwf TXREG ; Send command echo. + 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 + Index_out 0x50 ; window horizontal start address Parameter_out 0x00, 0x00 ; 0-239 - Index_out 0x51 ; Window Horizontal End Address + Index_out 0x51 ; window horizontal end address Parameter_out 0x00, 0xEF ; 0-239 - Index_out 0x52 ; Window Vertical Start Address + Index_out 0x52 ; window vertical start address Parameter_out 0x00, 0x00 ; 0-319 - Index_out 0x53 ; Window Vertical End Address + Index_out 0x53 ; window vertical end address Parameter_out 0x01, 0x3F ; 0-319 clrf ds_column @@ -1037,17 +1049,17 @@ dump_screen_1: btg LEDr ; LED activity toggle ; Dump even column - movlw .240 ; 240 lines, once. + movlw .240 ; 240 lines, once movwf ds_line dump_screen_2: - Index_out 0x20 ; Frame Memory Horizontal Address + Index_out 0x20 ; frame memory horizontal address movff ds_line,WREG ; d'0' ... d'239' - mullw .1 ; Copy row to PRODH:L + mullw .1 ; copy row to PRODH:L rcall TFT_DataWrite_PROD - movff ds_column,WREG ; Init X position. + movff ds_column,WREG ; Init X position mullw 2 - rcall pixel_write_col320 ; Start Address Vertical (.0 - .319) + rcall pixel_write_col320 ; start address vertical (.0 - .319) rcall TFT_DataRead_PROD ; read pixel rcall dump_screen_pixel @@ -1057,21 +1069,21 @@ rcall dump_screen_pixel_flush ; Dump odd column - movlw .240 ; 240 lines, twice. + movlw .240 ; 240 lines, twice movwf ds_line dump_screen_3: - Index_out 0x20 ; Frame Memory Horizontal Address + Index_out 0x20 ; frame memory horizontal address movff ds_line,WREG ; d'0' ... d'239' - mullw 1 ; Copy row to PRODH:L + mullw 1 ; copy row to PRODH:L rcall TFT_DataWrite_PROD - movff ds_column,WREG ; Init X position. + 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 pixel_write_col320 ; start address vertical (.0 - .319) rcall TFT_DataRead_PROD ; read pixel rcall dump_screen_pixel @@ -1086,55 +1098,59 @@ bra dump_screen_1 bcf no_sensor_int - clrf RCREG1 ; Clear receive buffer - bcf RCSTA1,CREN ; Clear receiver status + 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) + bsf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (screen dump) return + ENDIF + ;============================================================================= ; Pixel compression ; -; Input: PRODH:L = pixel. +; Input : PRODH:L = pixel ; Output: Compressed stream on output. ; Compressed format: -; 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). +; 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) + + IFDEF _screendump dump_screen_pixel: - movf PRODH,W ; Compare pixel-high + movf PRODH,W ; compare pixel-high xorwf ds_pixel+1,W - bnz dump_screen_pixel_1 ; Different -> dump. + bnz dump_screen_pixel_1 ; different -> dump - movf PRODL,W ; Compare pixel-low + movf PRODL,W ; compare pixel-low xorwf ds_pixel+0,W - bnz dump_screen_pixel_1 ; Different -> dump. + bnz dump_screen_pixel_1 ; different -> dump - incf ds_count,F ; Same color: just increment. + 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 ? + movf ds_pixel+1,W ; is this a BLACK pixel ? iorwf ds_pixel+0,W - bz dump_screen_pix_black ; YES. + bz dump_screen_pix_black ; YES - movf ds_pixel+1,W ; This is a white pixel ? + movf ds_pixel+1,W ; is this a white pixel ? andwf ds_pixel+0,W incf WREG - bz dump_screen_pix_white ; YES. + 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 + 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. + decf WREG ; save as 0..63 + iorlw b'10000000' ; mark as a color pixel movwf TXREG call rs232_wait_tx ; wait for UART @@ -1145,38 +1161,40 @@ bra dump_screen_pixel_1 dump_screen_pixel_2: - movff PRODH,ds_pixel+1 ; Save new pixel color + movff PRODH,ds_pixel+1 ; save new pixel color movff PRODL,ds_pixel+0 movlw 1 - movwf ds_count ; And set count=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 + 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 + decf WREG ; save as 0..127 dump_screen_pix_3: movwf TXREG call rs232_wait_tx - bra dump_screen_pixel_1 ; More to dump ? + 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 + 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. + 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 + rcall dump_screen_pixel_1 ; send it dump_screen_pixel_reset: - clrf ds_count ; But clear count. + clrf ds_count ; clear count return + ENDIF + END diff -r 00b24fb4324d -r ca4556fb60b9 src/tft.inc --- a/src/tft.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/tft.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft.inc +; File tft.inc V2.99c ; ; Declaring interfaces to the TFT screen and its Oxxx controler ; @@ -14,185 +14,217 @@ ;============================================================================= ; Writes two half-pixels at position (win_top,win_leftx2) -; Inputs: win_leftx2, win_top, win_color:2 +; Inputs : win_leftx2, win_top, win_color:2 +; Outputs: (none) ; Trashed: WREG, PROD - extern pixel_write + extern pixel_write ;----------------------------------------------------------------------------- -; Writes one half-pixel at position (win_top,win_leftx2). -; Inputs: win_leftx2, win_top, win_color:2 +; Writes one half-pixel at position (win_top,win_leftx2) +; Inputs : win_leftx2, win_top, win_color:2 +; Outputs: (none) ; Trashed: WREG, PROD - extern half_pixel_write + extern half_pixel_write ;----------------------------------------------------------------------------- -; TFT_frame : draw a frame around current box with current color. -; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 +; Draws 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, win_leftx2, win_width:1 - extern TFT_frame + extern TFT_frame ;----------------------------------------------------------------------------- - extern TFT_DisplayOff ; Power-off everything (need a boot next) - extern TFT_boot ; Initialize screen hardware - extern TFT_Display_FadeIn ; Smooth lighting - extern TFT_Display_FadeOut ; Smooth darkening - extern TFT_ClearScreen - extern TFT_box_write - extern TFT_box_write_16bit_win_left; With column in PRODL:PRODH - extern TFT_box - extern TFT_box_16bit_win_left ; With column in PRODL:PRODH - extern TFT_DataWrite_PROD - extern TFT_set_color + extern TFT_DisplayOff ; Power-off everything (need a boot next) + extern TFT_boot ; Initialize screen hardware + extern TFT_Display_FadeIn ; Smooth lighting + extern TFT_Display_FadeOut ; Smooth darkening + extern TFT_ClearScreen + extern TFT_box_write + extern TFT_box_write_16bit_win_left ; With column in PRODL:PRODH + extern TFT_box + extern TFT_box_16bit_win_left ; With column in PRODL:PRODH + extern TFT_DataWrite_PROD + extern TFT_set_color ; extern init_pixel_write extern pixel_write extern pixel_write_col320 extern half_vertical_line - extern half_horizontal_line - extern TFT_dump_screen + extern half_horizontal_line + + IFDEF _screendump + extern TFT_dump_screen + extern TFT_dump_screen_check + ENDIF ;============================================================================= -; Low level macros (for aa_wordprocessor and color_processor). +; Low level macros (for aa_wordprocessor and color_processor) ; - extern TFT_CmdWrite -Index_out macro low_b - movlw low_b - call TFT_CmdWrite - endm + extern TFT_CmdWrite +Index_out macro low_b + movlw low_b + call TFT_CmdWrite + endm ;============================================================================= -; A shortcut for TFT_box and TFT_frame call sequences. +; A shortcut for TFT_box and TFT_frame call sequences ; - extern box_frame_std, box_frame_common, box_frame_color, box_frame_color16 - extern box_std_block, box_black_block, box_color_block + extern box_frame_std, box_frame_common, box_frame_color, box_frame_color16 + extern box_std_block, box_black_block, box_color_block -; Erase a given screen area. -WIN_BOX_BLACK macro top, bottom, left, right - call box_black_block - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Erase a given screen area +WIN_BOX_BLACK macro top, bottom, left, right + call box_black_block + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -; Fill a given screen area with standard color (White). -WIN_BOX_STD macro top, bottom, left, right - call box_std_block - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Fill a given screen area with standard color (white) +WIN_BOX_STD macro top, bottom, left, right + call box_std_block + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -; Fill a given screen area with color from WREG (8bits rrrgggbb) -WIN_BOX_COLOR macro top, bottom, left, right - call box_color_block - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Fill a given screen area with color from WREG (8 bits rrrgggbb) +WIN_BOX_COLOR macro top, bottom, left, right + call box_color_block + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -; Draw a frame in standard color (White). -WIN_FRAME_STD macro top, bottom, left, right - call box_frame_std - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Draw a frame in standard color (white) +WIN_FRAME_STD macro top, bottom, left, right + call box_frame_std + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -; Draw a frame with color from WREG (8bits rrrgggbb) -WIN_FRAME_COLOR macro top, bottom, left, right - call box_frame_color - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Draw a frame with color from WREG (8 bits rrrgggbb) +WIN_FRAME_COLOR macro top, bottom, left, right + call box_frame_color + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -; Draw a frame with color from win_color (16bits in TFT format) -WIN_FRAME_COLOR16 macro top, bottom, left, right - call box_frame_color16 - db top, (bottom)-(top)+1, left, (right)-(left)+1 - endm +; Draw a frame with color from win_color (16 bits in TFT format) +WIN_FRAME_COLOR16 macro top, bottom, left, right + call box_frame_color16 + db top, (bottom)-(top)+1, left, (right)-(left)+1 + endm -WIN_FONT macro win_font_input - movlw win_font_input - movff WREG,win_font - endm - -WIN_TOP macro win_top_input - movlw win_top_input - movff WREG,win_top - endm +WIN_FONT macro win_font_input + movlw win_font_input + movff WREG,win_font + endm + +WIN_TOP macro win_top_input + movlw win_top_input + movff WREG,win_top + endm -WIN_HEIGHT macro h - movlw h - movff WREG,win_height - endm - -WIN_LEFT macro win_left_input - movlw win_left_input - movff WREG,win_leftx2 - endm - -WIN_WIDTH macro w - movlw w - movff WREG,win_width - endm +WIN_HEIGHT macro h + movlw h + movff WREG,win_height + endm + +WIN_LEFT macro win_left_input + movlw win_left_input + movff WREG,win_leftx2 + endm -WIN_COLOR macro win_color_input - movlw win_color_input - call TFT_set_color - endm +WIN_WIDTH macro w + movlw w + movff WREG,win_width + endm + +WIN_COLOR macro win_color_input + movlw win_color_input + call TFT_set_color + endm -;============================================================================= -; TFT_write_flash_image -; -; Inputs: cx, cy : Image center (in 0..160 x 0..240 range) -; image : flash image header's address -; Outputs: win_top, win_left, win_height, win_width -; image copyed on screen. -; Trashed: PROD, hi, lo -; -; extern TFT_write_flash_image -; extern TFT_write_flash_image_addr -TFT_WRITE_FLASH_IMAGE macro cx, cy, image - If LOW(image) != 0 - Error "Image "image" mis-aligned" - Endif - If (UPPER(image) & 0xF0) != 0x30 - Error "Image "image" not in image flash memory" - Endif - If (cx < 0) || (cx > 160) - Error "Image center's X "cx" not in 0..160 range". - Endif - If (cy < 0) || (cy > 240) - Error "Image center's Y "cy" not in 0..240 range". - Endif - ; Once we know image is aligned, we can use the compact (4bytes) - ; 12bit registers to pass the address: - lfsr FSR2, ((image)>>8) & 0xFFF - WIN_LEFT cx - WIN_TOP cy - call TFT_write_flash_image - endm +;;============================================================================= +;; TFT_write_flash_image +;; +;; Inputs : cx, cy : Image center (in 0..160 x 0..240 range) +;; image : flash image header's address +;; Outputs: win_top, win_left, win_height, win_width +;; image copyed on screen. +;; Trashed: PROD, hi, lo +;; +;; extern TFT_write_flash_image +;; extern TFT_write_flash_image_addr +;TFT_WRITE_FLASH_IMAGE macro cx, cy, image +; If LOW(image) != 0 +; Error "Image "image" mis-aligned" +; Endif +; If (UPPER(image) & 0xF0) != 0x30 +; Error "Image "image" not in image flash memory" +; Endif +; If (cx < 0) || (cx > 160) +; Error "Image center's X "cx" not in 0..160 range". +; Endif +; If (cy < 0) || (cy > 240) +; Error "Image center's Y "cy" not in 0..240 range". +; Endif +; ; Once we know image is aligned, we can use the compact (4 bytes) +; ; 12 bit registers to pass the address: +; lfsr FSR2, ((image)>>8) & 0xFFF +; WIN_LEFT cx +; WIN_TOP cy +; call TFT_write_flash_image +; endm ;============================================================================= ; TFT_write_prom_image -; -TFT_WRITE_PROM_IMAGE macro icon - extern icon, color_image - movlw LOW(icon) - movwf TBLPTRL - movlw HIGH(icon) - movwf TBLPTRH - movlw UPPER(icon) - movwf TBLPTRU - call color_image - endm + +; image referenced by a label +TFT_WRITE_PROM_IMAGE_BY_LABEL macro image_label + extern image_label + movlw LOW (image_label) + movwf TBLPTRL + movlw HIGH (image_label) + movwf TBLPTRH + movlw UPPER (image_label) + movwf TBLPTRU + extern color_image + call color_image + endm + +; image referenced by an address +TFT_WRITE_PROM_IMAGE_BY_ADDR macro image_address + movlw LOW (image_address) + movwf TBLPTRL + movlw HIGH (image_address & 0xFFFF) + movwf TBLPTRH + movlw UPPER (image_address) + movwf TBLPTRU + extern color_image + call color_image + endm + +; custom colors referenced by label +TFT_WRITE_PROM_IMAGE_CUST_COLOR macro colors_label + movlw LOW (colors_label) + movwf TBLPTRL + movlw HIGH (colors_label) + movwf TBLPTRH + movlw UPPER (colors_label) + movwf TBLPTRU + extern get_colors + call get_colors + bsf use_custom_colors ; will suppress read-in of the colors that come with the image + endm ;============================================================================= -; Macro to provides our own interface code. +; Macro to provide our own interface code ; -PIXEL_WRITE macro colRegister, rowRegister - movff colRegister,win_leftx2 - movff rowRegister,win_top - call pixel_write - endm +PIXEL_WRITE macro colRegister, rowRegister + movff colRegister,win_leftx2 + movff rowRegister,win_top + call pixel_write + endm -;INIT_PIXEL_WRITE macro colRegister -; movff colRegister,win_leftx2 -; call init_pixel_write -; endm +;INIT_PIXEL_WRITE macro colRegister +; movff colRegister,win_leftx2 +; call init_pixel_write +; endm -HALF_PIXEL_WRITE macro rowRegister - movff rowRegister,win_top - call half_pixel_write - endm - +HALF_PIXEL_WRITE macro rowRegister + movff rowRegister,win_top + call half_pixel_write + endm diff -r 00b24fb4324d -r ca4556fb60b9 src/tft_outputs.asm --- a/src/tft_outputs.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/tft_outputs.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.asm REFACTORED VERSION V2.97 SP1 +; File tft_outputs.asm REFACTORED VERSION V2.99e ; ; Startup subroutines ; @@ -9,8 +9,8 @@ ; 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 "hwos.inc" ; mandatory header +#include "shared_definitions.h" ; mailbox from/to p2_deco.c #include "tft.inc" #include "start.inc" #include "wait.inc" @@ -29,20 +29,41 @@ #include "i2c.inc" #include "colorschemes.inc" #include "calibrate.inc" - +#include "gaslist.inc" + + IFDEF _rx_functions +#include "rx_ops.inc" + ENDIF extern aa_wordprocessor + extern get_first_gas_to_WREG + extern get_first_dil_to_WREG + + extern tFirmware + extern tSerial + extern tTotalDives + extern tBatteryV + extern tUptime + extern tCalX,tCalY,tCalZ + extern tPPO2MIN + extern tPPO2MINCC + extern tPPO2Max + extern tPPO2DECO + + IFDEF _rx_functions + extern tFirmware_rx + ENDIF ;============================================================================= -gui CODE +tft_out CODE ;============================================================================= global TFT_divemask_color TFT_divemask_color: movlw color_green - btfsc divemode ; in Divemode? + btfsc divemode ; in divemode? rcall TFT_divemask_color_dive bra TFT_standard_color0 @@ -58,30 +79,42 @@ retlw color_scheme_divemode_mask4 ;3 - global TFT_attention_color + global TFT_memo_color +TFT_memo_color: ; information, values within normal range, things without a need to react upon + bra TFT_standard_color ; mH (Color schemes!) + movlw color_white + bra TFT_standard_color0 +;TFT_memo_color_dive: +; retlw color_white + + global TFT_advice_color +TFT_advice_color: ; advices to do something, but without essential need to actually do it + movlw color_green + bra TFT_standard_color0 +TFT_advice_color_dive: + retlw color_green + + global TFT_attention_color ; important things to be aware of and things that are developing towards a warning TFT_attention_color: - movlw color_yellow ; make this configurable? + movlw color_yellow bra TFT_standard_color0 TFT_attention_color_dive: - retlw color_yellow ; make this configurable? - - - global TFT_warnings_color + retlw color_yellow + + global TFT_warnings_color ; important things with immediate need to react upon TFT_warnings_color: - movlw color_red ; make this configurable? + movlw color_red bra TFT_standard_color0 TFT_warnings_color_dive: - retlw color_red ; make this configurable? + retlw color_red global TFT_disabled_color TFT_disabled_color: - ;movlw color_grey ; Default to OSTC grey (dark blue) movlw color_lightblue - btfsc divemode ; in Divemode? + 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 @@ -96,11 +129,10 @@ global TFT_standard_color TFT_standard_color: - setf WREG ; Default white - btfsc divemode ; in Divemode? + 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... @@ -117,26 +149,47 @@ retlw color_scheme_divemode_std4 ;3 + global TFT_color_code_tank_pres_sac +TFT_color_code_tank_pres_sac: ; color-code a tank pressure or SAC rate, data in hi:lo + btfss hi,int_not_avail_flag ; is the not-available flag set? + bra TFT_color_code_tank_pres_1 ; NO + bcf hi,int_not_avail_flag ; YES - clear not-available flag +TFT_color_code_tank_pres_0: ; entry point for outdated flag + bcf hi,int_outdated_flag ; clear outdated flag (it may be set) + 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_tank_pres_1: + btfsc hi,int_outdated_flag ; is the outdated flag set? + bra TFT_color_code_tank_pres_0 ; YES - handle alike with not-available flag +TFT_color_code_tank_pres_2: + btfss hi,int_warning_flag ; is the warning flag set? + bra TFT_color_code_tank_pres_3 ; NO + 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_tank_pres_3: + btfss hi,int_attention_flag ; is the attention flag set? + bra TFT_memo_color ; NO - set to memo color and return + bcf hi,int_attention_flag ; YES - clear attention flag + bra TFT_attention_color ; - set to attention color and return + + global TFT_color_code_gaslist -TFT_color_code_gaslist: ; Color-code current row in Gaslist (%O2 in hi) according to current amb_pressure +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 - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 + movff amb_press_10+0,xA+0 + movff amb_press_10+1,xA+1 movff hi,xB+0 clrf xB+1 call mult16x16 ; hi * p_amb/10 -; Check if ppO2>6,55bar - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra TFT_warnings_color ; Yes, warn in warning color -; Check if ppO2>3,30bar +; Check if ppO2 > 6.55 bar + tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2 > 6.55 bar ? + bra TFT_warnings_color ; YES - warn in warning color +; Check if ppO2 > 3.30 bar btfsc xC+1,7 - bra TFT_warnings_color ; Yes, warn in warning color -; Check for low ppo2 + bra TFT_warnings_color ; YES - warn in warning color +; Check for low ppO2 movff xC+0,sub_a+0 movff xC+1,sub_a+1 movff char_I_ppO2_min,WREG @@ -144,26 +197,35 @@ movff PRODL,sub_b+0 movff PRODH,sub_b+1 call subU16 - btfsc neg_flag - bra TFT_warnings_color ; too low -> Warning Color! -; Check for high ppo2 - movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings + btfsc neg_flag ; lower than ppO2 min? + bra TFT_warnings_color ; YES - set warning color and return +; Check for high ppO2 + movff char_O_deco_info,WREG ; bank-safe copy of deco info vector 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: + bra TFT_color_code_gaslist_deco ; YES - check against ppO2 max deco only + ; NO - check against ppO2 max travel/normal and deco +; Check for ppO2 max travel/normal + movff char_I_ppO2_max,WREG ; ppo2 max for travel/normal 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 + infsnz sub_b+0,F ; add 1 mbar to avoid warning on equal + incf sub_b+1,F call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - bra TFT_warnings_color ; too high -> Warning Color! - return + btfss neg_flag ; higher than ppO2 max travel/deco? + rcall TFT_attention_color ; YES - set attention color +; Check for ppO2 max deco +TFT_color_code_gaslist_deco: + movff char_I_ppO2_max_deco,WREG ; ppo2 max for deco + mullw d'100' ; char_I_ppO2_max_deco*100 + movff PRODL,sub_b+0 + movff PRODH,sub_b+1 + infsnz sub_b+0,F ; add 1 mbar to avoid warning on equal + incf sub_b+1,F + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; higher than ppO2 max deco? + bra TFT_warnings_color ; YES - set warning color and return + return ; NO - keep current color TFT_color_code_ceiling: ; color-code the ceiling depth @@ -172,32 +234,38 @@ SAFE_2BYTE_COPY rel_pressure,sub_a ; NO 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] + call subU16 ; sub_c = sub_a - sub_b : sub_c = rel_pressure [mbar] - int_O_ceiling [mbar] 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 + bra TFT_warnings_color ; YES - set to warning color and return + bra TFT_memo_color ; NO - set to memo 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: ; color-code the stop depth +TFT_color_code_stop: ; color-code the stop depth: memo color if below stop depth, + ; attention color if above stop but below ceiling, + ; warning color if above stop and ceiling + ; (ceiling depth is calculated using current GF) 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' - movwf xB+0 - clrf xB+1 - call div16x16 ; xA/xB=xC with xA as remainder: Divide/100 => xC+0 = current depth in meters - movff char_O_first_deco_depth,WREG; get stop depth in m into WREG - subwf xC+0,W ; compute current depth - stop depth - btfsc STATUS,C ; result negative? - bra TFT_standard_color ; NO - set to standard color and return - bra TFT_warnings_color ; YES - set to warning color and return - - -TFT_color_code_depth: ; with actual depth as rel_pressure in [mbar] in hi:lo and threshold depth_warn_mbar [mbar], 16Bit + bra TFT_disabled_color ; YES - set to disabled color and return + movff char_O_first_deco_depth,WREG; NO - get stop depth in m into WREG + subwf curr_depth,W ; - compute current depth - stop depth + btfsc STATUS,C ; - result negative? + bra TFT_memo_color ; NO - set to memo color and return + movff int_O_ceiling+0,sub_b+0 ; YES - get ceiling depth in mbar + movff int_O_ceiling+1,sub_b+1 ; - ... + btfsc sub_b+1,char_invalid_flag ; - is the invalid flag set? (bit 7 here) + bra TFT_warnings_color ; YES - set to warning color and return + SAFE_2BYTE_COPY rel_pressure,sub_a ; NO - get current depth in mbar + 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 + bra TFT_attention_color ; NO - set to attention color and return + + +TFT_color_code_depth: ; with actual depth as rel_pressure in [mbar] in hi:lo and threshold depth_warn_mbar [mbar] movff lo,sub_a+0 movff hi,sub_a+1 movlw LOW depth_warn_mbar @@ -212,25 +280,33 @@ bra TFT_color_code_depth_ppO2 ; check depth against MOD and return... TFT_color_code_depth_std: btfss neg_flag - bra TFT_warnings_color ; set to warning color and return - bra TFT_standard_color ; set to standard color and return... + bra TFT_warnings_color ; set to warning color and return + bra TFT_memo_color ; set to memo color and return... TFT_color_code_depth_ppO2: 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 - bcf blinking_depth_warning ; reset warning - bra TFT_standard_color ; no color coding, return. + btfss FLAG_bailout_mode ; YES - check if in bailout + bra TFT_color_code_depth_outside; NO - continue checking for outside ZHL16 model 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 +TFT_color_code_depth_outside: + movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings + btfsc WREG,outside_warning ; are we currently outside of the ZH-L16 model? + bra TFT_color_code_depth_warn ; YES + btfsc WREG,outside_attention ; are we near to outside of the ZH-L16 model? + bra TFT_color_code_depth_att ; YES + bcf blinking_depth_warning ; NO - terminate warning blinking + bcf blinking_depth_attention ; - terminate attention blinking + bra TFT_memo_color ; - set memo color and return TFT_color_code_depth_warn: - bsf blinking_depth_warning ; set warning + bsf blinking_depth_warning ; activate warning blinking bra TFT_warnings_color ; set to warning color and return... +TFT_color_code_depth_att: + bsf blinking_depth_attention ; activate attention blinking + bra TFT_attention_color ; set to attention color and return... global TFT_color_code_cns @@ -238,20 +314,20 @@ 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 - bcf hi,int_warning_flag ; clear warning flag (it may be set) + 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 flag - bcf hi,int_attention_flag ; - clear attention 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: btfss hi,int_attention_flag ; is the attention flag set? - bra TFT_standard_color ; NO - set to standard color and return + bra TFT_memo_color ; NO - set to memo color and return bcf hi,int_attention_flag ; YES - clear attention flag - bra TFT_attention_color ; - set to attention color and return + bra TFT_attention_color ; - set to attention color and return TFT_color_code_gf: @@ -263,7 +339,7 @@ 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 + bra TFT_memo_color ; NO - set to memo color and return TFT_color_code_ppo2: ; color-code ppO2 values (ppO2 in hi:lo [cbar]) by its warning flags @@ -284,11 +360,11 @@ 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 + bra TFT_memo_color ; set to memo color and return 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 + movff char_O_deco_info,WREG ; get the deco info 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 @@ -303,7 +379,7 @@ 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 bra TFT_color_code_ppo2_hud_nocc; not CCR... - btfsc is_bailout + btfsc FLAG_bailout_mode bra TFT_color_code_ppo2_hud_nocc; is bailout, hence not loop mode... movff char_I_ppO2_min_loop,WREG ; ppO2 min loop mode color coding bra TFT_color_code_ppo2_hud_cont @@ -311,15 +387,15 @@ 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 + bra TFT_memo_color ; NO - set memo 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 + bra TFT_warnings_color ; YES - set to warning color and return + bra TFT_memo_color ; NO - set to memo color and return global TFT_color_code_gas @@ -327,31 +403,30 @@ movwf up ; copy gas number (1-6) to up movlw color_white ; Default color dcfsnz up,F - movlw color_white ; Color for Gas 1 + movlw color_white ; color for gas 1 dcfsnz up,F - movlw color_green ; Color for Gas 2 + movlw color_green ; color for gas 2 dcfsnz up,F - movlw color_red ; Color for Gas 3 + movlw color_red ; color for gas 3 dcfsnz up,F - movlw color_yellow ; Color for Gas 4 + movlw color_yellow ; color for gas 4 dcfsnz up,F - movlw color_cyan ; Color for Gas 5 + movlw color_cyan ; color for gas 5 dcfsnz up,F - movlw color_pink ; Color for Gas 6 - goto TFT_set_color ; Set Color... + 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 +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 + call get_first_gas_to_WREG ; get 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. + 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 @@ -362,7 +437,7 @@ rcall TFT_standard_color STRCPY_PRINT "1" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode3 ; No, skip box + 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 @@ -372,7 +447,7 @@ WIN_LEFT surf_decotype_boxes_left2+.1 STRCPY_PRINT "2" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode4 ; No, skip box + 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 @@ -382,7 +457,7 @@ WIN_LEFT surf_decotype_boxes_left3+.1 STRCPY_PRINT "3" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode5 ; No, skip box + 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 @@ -392,7 +467,7 @@ WIN_LEFT surf_decotype_boxes_left4+.1 STRCPY_PRINT "4" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode6 ; No, skip box + 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 @@ -401,11 +476,12 @@ 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. + rcall TFT_standard_color ; reset color + decfsz hi,F ; type = 1 (First)? + bra DISP_active_gas_surfmode7 ; 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. +DISP_active_gas_surfmode7: + return ; done global TFT_show_color_schemes @@ -422,54 +498,54 @@ ; Show some demo screen ; Depth demo - call TFT_standard_color - WIN_MEDIUM .3,.54 + call TFT_memo_color + WIN_MEDIUM .3,.54 movlw LOW .5172 movwf lo movlw HIGH .5172 movwf hi bsf leftbind bsf ignore_digit4 - output_16 ; Full meters in Big font + output_16 ; full meters in big font bcf leftbind - STRCAT_PRINT "" ; Display full meters - WIN_SMALL .25,.66 - movlw LOW .5172 + STRCAT_PRINT "" ; display full meters + WIN_SMALL .25,.66 + movlw LOW .5172 movwf lo - movlw HIGH .5172 + movlw HIGH .5172 movwf hi PUTC "." movlw d'4' movwf ignore_digits - bsf ignore_digit5 + bsf ignore_digit5 ; (flag will be cleared by output_16) output_16dp d'0' ; .1m in SMALL font - STRCAT_PRINT "" ; Display decimeters + STRCAT_PRINT "" ; display decimeters WIN_FONT FT_SMALL ; Max. Depth demo - WIN_MEDIUM .64,.54 + WIN_MEDIUM .64,.54 bsf ignore_digit4 ; no 0.1m bsf leftbind - movlw LOW .6349 + movlw LOW .6349 movwf lo - movlw HIGH .6349 + movlw HIGH .6349 movwf hi output_16 - STRCAT_PRINT "" ; Display full meters + STRCAT_PRINT "" ; display full meters bcf leftbind ; .1m in SMALL font WIN_SMALL .87,.66 PUTC "." movlw d'4' movwf ignore_digits - bsf ignore_digit5 + bsf ignore_digit5 ; (flag will be cleared by output_16) bsf leftbind - movlw LOW .6349 + movlw LOW .6349 movwf lo - movlw HIGH .6349 + movlw HIGH .6349 movwf hi output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters + STRCAT_PRINT "" ; display decimeters bcf leftbind ; Divetime demo @@ -477,34 +553,45 @@ clrf hi WIN_MEDIUM .103, .54 output_16_3 ; limit to 999 and display only (0-999) - STRCAT_PRINT "" ; Show minutes in large font + STRCAT_PRINT "" ; show minutes in large font WIN_SMALL .139, .66 ; left position for two sec figures PUTC ':' bsf leftbind movff secs,lo output_99x bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font + 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 +TFT_divemode_mask: ; displays mask in divemode bcf FLAG_TFT_divemode_mask call TFT_divemask_color WIN_TINY dm_mask_depth_column,dm_mask_depth_row STRCAT_TEXT_PRINT tDepth - WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_TINY dm_mask_maxdepth_column_nvsi,dm_mask_maxdepth_row + TSTOSS opt_vsigraph ; graphical VSI bar enabled? + bra TFT_divemode_mask_1 ; NO + WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row ; YES - adopt position +TFT_divemode_mask_1: + btfsc FLAG_apnoe_mode ; in Apnea mode? + bra TFT_divemode_mask_2 ; YES - draw max depth + TSTOSS opt_2ndDepthDisp ; draw avg depth? + bra TFT_divemode_mask_2 ; NO - draw max depth + STRCAT_TEXT_PRINT tAvgDepth ; YES + bra TFT_divemode_mask_3 +TFT_divemode_mask_2: STRCAT_TEXT_PRINT tMaxDepth +TFT_divemode_mask_3: 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 -TFT_divemode_mask_alternative: ; Alt. mask for divemode +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 @@ -515,16 +602,16 @@ global TFT_draw_gassep_line TFT_draw_gassep_line: - btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode + 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 divemode_menu ; is the dive mode menu shown? + return ; YES - return + bra TFT_standard_color ; NO - set standard color and return ;========================================================================= global TFT_display_velocity -TFT_display_velocity: ; With divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0 +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 @@ -532,24 +619,24 @@ bra TFT_velocity_clear ; lower then threshold. Clear text and graph (If active) ; We have something to display - bsf display_velocity ; Set flag + 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 + rcall TFT_memo_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 ; graphical VSI bar enabled? + bra TFT_display_velocity_done ; NO + + btfsc alternative_divelayout ; alternative layout? + bra TFT_display_velocity_done ; YES - no graph! (no room when divetime minutes is three digits) + + 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! @@ -580,17 +667,6 @@ TSTOSS opt_vsitextv2 ; 0=standard, 1=dynamic bra TFT_velocity_set_color_static ; static ascend rate limit - ; get the actual depth in m - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - movff hi,xA+1 - movff lo,xA+0 - movlw LOW d'100' - movwf xB+0 - 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 @@ -603,35 +679,34 @@ 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 + TBLRD*+ ; get speed threshold + movf curr_depth,W ; current depth in m + cpfsgt TABLAT ; threshold > current depth ? + bra TFT_velocity_set_color_skip ; NO - loop + + TBLRD*+ ; get warning speed threshold movf TABLAT,W - movwf divA+1 ; Copy for graph routine + 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 + 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 + bra TFT_attention_color ; NO - set attention color and return + bra TFT_memo_color ; YES - set memo color and return TFT_velocity_set_color_static: movlw color_code_velocity_warn_high ; in m/min - movwf divA+1 ; Copy for graph routine + 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) + 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 + bra TFT_attention_color ; NO - set attention color and return + bra TFT_memo_color ; YES - set memo color and return TFT_velocity_disp: - WIN_SMALL dm_velocity_text_column, dm_velocity_text_row + WIN_SMALL dm_velocity_text_column, dm_velocity_text_row TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_velocity_metric ;TFT_velocity_imperial: @@ -639,7 +714,7 @@ 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 + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet movlw '-' btfsc neg_flag_velocity movlw '+' @@ -647,7 +722,7 @@ bsf leftbind output_16 bcf leftbind - STRCAT_TEXT_PRINT tVelImperial ; Unit switch + STRCAT_TEXT_PRINT tVelImperial ; unit switch return TFT_velocity_metric: @@ -657,37 +732,36 @@ movlw '+' movwf POSTINC2 output_99 - STRCAT_TEXT_PRINT tVelMetric ; Unit switch + 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 + 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 + 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 + 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 + 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 + 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) clrf xA+1 movlw .5 - movwf xB+0 ; Threshold for color warning (5 color normal + 2 color warning) + 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 + call div16x16 ; xC = xA / xB 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 + movff hi,xA+0 ; velocity in m/min clrf xA+1 - movff xC+0,xB+0 ; Step size + movff xC+0,xB+0 ; step size clrf xB+1 - 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 + call div16x16 ; xC = xA / xB with xA as remainder + ; xC+0 now holds amount of segments to show + movff hi,divA+0 ; copy back for numeric output movlw d'7' cpfslt xC+0 bra DISP_graph_vel_7 @@ -709,67 +783,70 @@ 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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: - btfss display_velocity ; Velocity was not displayed, do not delete + btfss display_velocity ; velocity was not displayed, do not delete return - bcf display_velocity ; Velocity was displayed, delete velocity now + 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 + TSTOSS opt_vsigraph ; graphical VSI bar enabled? + return ; NO - 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 + WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ; top, bottom, left, right return ;========================================================================= 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 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-.2, dm_menu_lower, dm_menu_left, dm_menu_right ; top, bottom, left, right - starts 2 pixel higher to completely wipe away the temperature display 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 + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return + btfsc FLAG_gauge_mode ; in gauge mode? + return ; YES - return + call TFT_clear_decoarea ; NO - clear stop depth and TTS call TFT_divemask_color WIN_STD dm_ndl_text_column, dm_ndl_text_row STRCPY_TEXT_PRINT tNDL ; NDL @@ -779,18 +856,18 @@ global TFT_display_tts TFT_display_tts: 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 - 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 + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return + call TFT_memo_color ; NO - set memo color + movff int_O_ascenttime+0,lo ; - TTS + movff int_O_ascenttime+1,hi ; - on 16 bits + 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 TFT_display_tts_1: WIN_MEDIUM dm_tts_value_column, dm_tts_value_row - output_16_3 ; Displays only 0...999 + output_16_3 ; display only 0...999 STRCAT_PRINT "'" return @@ -798,40 +875,40 @@ global TFT_display_ndl TFT_display_ndl: bcf FLAG_TFT_display_ndl - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return + 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 + call TFT_memo_color + movff char_O_nullzeit,lo ; get NDL from C-code output_8 STRCAT_PRINT "'" return - global TFT_big_deco_alt ; The big deco + 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 + btfss decostop_active ; deco stop shown? + bra TFT_big_deco_ndl_alt ; NO - show NDL ; Deco bcf FLAG_TFT_display_deko call TFT_divemask_color WIN_STD .70,.165 STRCPY_TEXT_PRINT tTTS ; TTS - rcall TFT_standard_color + rcall TFT_memo_color ; TTS WIN_LARGE .97,.170 - movff int_O_ascenttime+0,lo ; TTS - movff int_O_ascenttime+1,hi ; on 16bits + movff int_O_ascenttime+0,lo ; get the TTS + movff int_O_ascenttime+1,hi ; 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 + call TFT_disabled_color ; - switch to disabled color TFT_display_tts_alt_1: - output_16_3 ; Displays only 0...999 + output_16_3 ; display only 0...999 STRCAT_PRINT "" ; 1st Stop @@ -840,9 +917,9 @@ 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) + 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 ; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) STRCAT_PRINT "" ; m or ft after the stop depth @@ -855,28 +932,36 @@ 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 + movff char_O_first_deco_time,lo ; get stop time in minutes + tstfsz lo ; stop time = 0 ? + bra TFT_display_tts_alt_2 ; NO - print time + STRCAT_PRINT ".." ; YES - special treatment + bra TFT_display_tts_alt_exit +TFT_display_tts_alt_2: bcf leftbind output_99 STRCAT_PRINT "" +TFT_display_tts_alt_exit: goto TFT_standard_color ; and return... - + + TFT_big_deco_ndl_alt: ; NDL bcf FLAG_TFT_display_ndl bcf decostop_active ; clear flag (again) + btfsc FLAG_gauge_mode ; in gauge mode? + bra TFT_big_deco_ndl_alt_1 ; YES - skip NDL call TFT_divemask_color WIN_STD .70,.165 STRCPY_TEXT_PRINT tNDL ; NDL - call TFT_standard_color + call TFT_memo_color WIN_LARGE .97,.170 - call TFT_standard_color - movff char_O_nullzeit,lo ; Get NDL from C-code + movff char_O_nullzeit,lo ; get NDL from C-code output_8 STRCAT_PRINT "" - +TFT_big_deco_ndl_alt_1: btfsc FLAG_TFT_show_safety_stop - bra TFT_show_safety_stop_alt ; Show safety stop (And return) + 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 @@ -885,17 +970,17 @@ 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... + 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 ; YES - clear flag + bra TFT_no_more_safety_stop_alt ; - clear stop and return TFT_show_safety_stop_alt2: - bsf safety_stop_active ; Set flag - decf safety_stop_countdown,F ; Reduce countdown + bsf safety_stop_active ; set flag + decf safety_stop_countdown,F ; reduce countdown call TFT_divemask_color WIN_STD .50,dm_customview_row @@ -904,7 +989,7 @@ WIN_LARGE .90,.95 movff safety_stop_countdown,lo clrf hi - call convert_time ; converts hi:lo in seconds to mins (hi) and seconds (lo) + call convert_time ; converts hi:lo in seconds to mins (up:hi) and seconds (lo) movf hi,W movff lo,hi movwf lo ; exchange lo and hi @@ -919,50 +1004,80 @@ output_99x STRCAT_PRINT "" WIN_FONT FT_SMALL - goto TFT_standard_color ; and return... + bra TFT_display_exit_1 global TFT_divemode_warning TFT_divemode_warning: - bcf FLAG_TFT_divemode_warning - bsf dive_warning_displayed ; =1: The warning sign is shown + bcf FLAG_TFT_divemode_warning ; clear job flag + bsf dive_warning_displayed ; set advice/attention/warning sign is shown flag WIN_TOP dm_warning_icon_row WIN_LEFT dm_warning_icon_column - TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon + btfsc message_warning ; do we have a warning? + bra TFT_divemode_warning_1 ; YES - show warning sign + btfsc message_attention ; NO - do we have an attention? + bra TFT_divemode_warning_2 ; YES - show attention sign + bra TFT_divemode_warning_3 ; NO to both - must be an advice then + +dive_warning2_warning_colors: ; custom colors table for dive_warning2 icon - warning + db .4, 0 ; #colors, spare + dw 0x0000 ; color 0x00: outside black + dw 0xff80 ; color 0x01: triangle yellow + dw 0xff80 ; color 0x02: excl.mark yellow + dw 0xf800 ; color 0x03: inside red + +dive_warning2_advice_colors: ; custom colors table for dive_warning2 icon - advice + db .4, 0 ; #colors, spare + dw 0x0000 ; color 0x00: outside black + dw 0xffff ; color 0x01: triangle white + dw 0xffff ; color 0x02: excl.mark white + dw 0x0780 ; color 0x03: inside green + +TFT_divemode_warning_1: + TFT_WRITE_PROM_IMAGE_CUST_COLOR dive_warning2_warning_colors + TFT_WRITE_PROM_IMAGE_BY_LABEL dive_warning2_block ; output warning sign (with custom colors) return +TFT_divemode_warning_2: + TFT_WRITE_PROM_IMAGE_BY_LABEL dive_warning2_block ; output attention sign (with default colors) + return +TFT_divemode_warning_3: + TFT_WRITE_PROM_IMAGE_CUST_COLOR dive_warning2_advice_colors + TFT_WRITE_PROM_IMAGE_BY_LABEL dive_warning2_block ; output advice sign (with custom colors) + 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 - return - bcf dive_warning_displayed ; clear only once + bcf FLAG_TFT_divemode_warning_clear ; clear job flag + btfss dive_warning_displayed ; advice/attention/warning sign is shown? + return ; NO + bcf dive_warning_displayed ; YES - clear advice/attention/warning sign and its flag 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) + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return + rcall TFT_clear_decoarea ; clear decostop and decosum (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) + bcf show_safety_stop ; clear safety stop flag + bra TFT_display_exit_1 + + +TFT_display_deko_output_depth: ; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) TSTOSS opt_units ; 0=m, 1=ft - bra TFT_display_deko_output_metric + bra TFT_display_deko_output_metric ;TFT_display_deko_output_imperial: 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... + ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... movff lo,xA+0 movff hi,xA+1 movlw LOW d'334' ; 334feet/100m @@ -985,18 +1100,18 @@ bcf leftbind btfsc alternative_divelayout bsf leftbind ; left for alternative layout mode - bsf ignore_digit4 ; Only full feet + bsf ignore_digit4 ; only full feet output_16 btfsc alternative_divelayout - return ; Not for alternative layout mode - STRCAT_TEXT tFeets1 + 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 - STRCAT_TEXT tMeters + return ; not for alternative layout mode + STRCAT_TEXT tMeters PUTC ' ' return @@ -1004,165 +1119,125 @@ global TFT_display_deko TFT_display_deko: bcf FLAG_TFT_display_deko - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return WIN_MEDIUM dm_decostop_1st_stop_column, dm_decostop_1st_stop_row - 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 - output_99 + 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 ; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) + movff char_O_first_deco_time,lo ; get stop time in minutes + tstfsz lo ; stop time = 0 ? + bra TFT_display_deko_1 ; NO - print minutes + STRCAT_PRINT " ..'" ; YES - special treatment + bra TFT_display_exit_1 +TFT_display_deko_1: + output_99 ; output lo STRCAT_PRINT "'" - goto TFT_standard_color ; and return... - - - global TFT_decoplan -TFT_decoplan: +TFT_display_exit_1 + goto TFT_standard_color ; and return... + + + global TFT_decoplan_mask ; mask for deco plan +TFT_decoplan_mask: call TFT_divemask_color - WIN_TINY dm_custom_decoplan_title_column, dm_custom_decoplan_title_row + 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? - bra TFT_display_deko2 ; Yes - ; No, clear output and return - 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 - goto TFT_standard_color ; and return... - -TFT_display_deko2: + return + + global TFT_decoplan ; data for deco plan - stops 2 - 7 (stop 1 is shown in the main screen) +TFT_decoplan: + lfsr FSR0,char_O_deco_depth ; load base address of stops table + clrf ex ; will be used for auxiliary flags + call TFT_memo_color ; set default output color 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - output_99 - STRCAT_PRINT "'" - - movff char_O_deco_depth+4,lo - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - output_99 - STRCAT_PRINT "'" - goto TFT_standard_color ; and return... + ; 2nd stop + WIN_SMALL dm_cust_dstop_2nd_stop_column, dm_cust_dstop_2nd_stop_row + rcall TFT_decoplan_helper + ; 3rd stop + WIN_SMALL dm_cust_dstop_3rd_stop_column, dm_cust_dstop_3rd_stop_row + rcall TFT_decoplan_helper + ; 4th stop + bsf ex,4 ; flag we are on 4th screen position + WIN_SMALL dm_cust_dstop_4th_stop_column, dm_cust_dstop_4th_stop_row + rcall TFT_decoplan_helper + bcf ex,4 ; clear 4th position flag again + ; 5th stop + WIN_SMALL dm_cust_dstop_5th_stop_column, dm_cust_dstop_5th_stop_row + rcall TFT_decoplan_helper + ; 6th stop + WIN_SMALL dm_cust_dstop_6th_stop_column, dm_cust_dstop_6th_stop_row + rcall TFT_decoplan_helper + ; 7th stop + WIN_SMALL dm_cust_dstop_7th_stop_column, dm_cust_dstop_7th_stop_row + rcall TFT_decoplan_helper + bra TFT_display_exit_1 ; set standard color and return... + +TFT_decoplan_helper: + btfsc ex,0 ; no more stops to show? + bra TFT_decoplan_helper_1 ; YES - skip checking next entry - it will be empty, too + movff PREINC0,lo ; NO - advance pointer to get the depth of the 2nd, 3rd, 4th, ... stop + tstfsz lo ; is the stop depth = 0, i.e. no stop entry? + bra TFT_decoplan_helper_3 ; NO - show stop data +TFT_decoplan_helper_1: ; no more stop table entries + bsf ex,0 ; flag that there are no more stop table entries + btfss ex,4 ; are we on the 4th screen position? + bra TFT_decoplan_helper_2 ; NO - normal handling on this position + btfsc ex,1 ; YES - special handling, has any stop been shown? + bra TFT_decoplan_helper_2 ; YES - print normal blanking + STRCPY_PRINT " ---- " ; NO - print a "no stops" indication (blanking potential previous content, too) + return +TFT_decoplan_helper_2: ; no more stop table entries, blank potential previous content + STRCPY_PRINT " " ; wipe screen position by printing 7 spaces + return +TFT_decoplan_helper_3: + rcall TFT_display_deko_output_depth ; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) + movlw NUM_STOPS ; offset between arrays holding depths and durations + movff PLUSW0,lo ; get duration of the current stop + output_99 ; output duration to POSTINC2 + STRCAT_PRINT "'" ; append symbol for minutes and print to screen + bsf ex,1 ; flag that a stop was shown + return global TFT_clear_safety_stop TFT_clear_safety_stop: - bcf FLAG_TFT_clear_safety_stop ; clear flag + 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 - 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 - 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... + 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 + bcf safety_stop_active ; clear flag + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return + bra TFT_clear_safety_stop ; NO - 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 + 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... + ;bra TFT_show_safety_stop3 ; no room when menuview=1... call TFT_divemask_color - WIN_STD dm_safetystop_text_column, dm_safetystop_text_row + 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 + 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) + call convert_time ; converts hi:lo in seconds to mins (up:hi) and seconds (lo) movf hi,W movff lo,hi - movwf lo ; exchange lo and hi + movwf lo ; exchange lo and hi bsf leftbind output_8 bcf leftbind @@ -1171,212 +1246,197 @@ output_99x STRCAT_PRINT "" WIN_FONT FT_SMALL - goto TFT_standard_color ; and return... - - - global TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch -TFT_mask_avr_stopwatch: - ; The mask + bra TFT_display_exit_1 + + + global TFT_avr_stopwatch_mask ; mask for average depth and stopwatch +TFT_avr_stopwatch_mask: call TFT_divemask_color - WIN_TINY dm_custom_avr_stop_title_column1,dm_custom_avr_stop_title_row + WIN_TINY dm_custom_avr_stop_column1+.2,dm_custom_avr_stop_title_row + TSTOSS opt_2ndDepthDisp ; draw avg depth instead of max depth in main screen? + bra TFT_avr_stopwatch_mask_1 ; NO - draw avg depth in custom view then + STRCAT_TEXT_PRINT tMaxDepth ; YES - draw max depth in custom view then + bra TFT_avr_stopwatch_mask_2 +TFT_avr_stopwatch_mask_1: STRCPY_TEXT_PRINT tDiveTotalAvg - WIN_TINY dm_custom_avr_stop_title_column2,dm_custom_avr_stop_title_row +TFT_avr_stopwatch_mask_2: + WIN_TINY dm_custom_avr_stop_column2+.3,dm_custom_avr_stop_title_row STRCPY_TEXT_PRINT tDiveStopwatch - WIN_TINY dm_custom_avr_stop_title_column3,dm_custom_avr_stop_title_row + WIN_TINY dm_custom_avr_stop_column3-.8,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 convert_time ; lo=secs, hi=mins - WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row + bra TFT_display_exit_1 + + + global TFT_avr_stopwatch ; data for average depth and stopwatch +TFT_avr_stopwatch: + call TFT_memo_color bsf leftbind - movf hi,W - movff lo,hi - movwf lo ; exchange lo and hi - output_8 - 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 - STRCAT_PRINT "" - TSTOSS opt_units ; 0=m, 1=ft - bra TFT_update_avr_stopwatch_metric - ;TFT_update_avr_stopwatch_imperial + + ; total average depth or max depth + WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row + TSTOSS opt_2ndDepthDisp ; draw avg depth instead of max depth in main screen? + bra TFT_avr_stopwatch_01 ; NO - draw avg depth in custom view then + SAFE_2BYTE_COPY max_pressure,lo ; YES - draw max depth in custom view then + bra TFT_avr_stopwatch_02 +TFT_avr_stopwatch_01: movff avg_rel_pressure_total+0,lo movff avg_rel_pressure_total+1,hi +TFT_avr_stopwatch_02: 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 + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_update_avr_stopwatch1_metric ; 0 - metric + ;bra TFT_update_avr_stopwatch1_imp ; 1 - imperial +TFT_update_avr_stopwatch1_imp: + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet output_16 ; yxz - STRCAT_PRINT " " - ; Stopped average depth + STRCAT " " ; wipe out remains from last output + clrf WREG + movff WREG,buffer+.3 ; limit string length to 3 digits + bra TFT_update_avr_stopwatch2 +TFT_update_avr_stopwatch1_metric: + bsf ignore_digit5 ; no cm (flag will be cleared by output_16) + output_16dp .3 ; yxz.a + PUTC " " ; wipe out remains from last output + clrf WREG + movff WREG,buffer+.4 ; limit string length to 4 = 3 digits + 1 half-size decimal dot +TFT_update_avr_stopwatch2: + STRCAT_PRINT "" + + ; stopped average depth + WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row 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 + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_update_avr_stopwatch2_metric ; 0 - metric + ;bra TFT_update_avr_stopwatch2_imp ; 1 - imperial +TFT_update_avr_stopwatch2_imp: + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet output_16 ; yxz - bcf leftbind - PUTC " " + STRCAT " " ; wipe out remains from last output 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 + movff WREG,buffer+.3 ; limit string length to 3 digits/characters + bra TFT_update_avr_stopwatch3 +TFT_update_avr_stopwatch2_metric: + bsf ignore_digit5 ; no cm (flag will be cleared by output_16) output_16dp .3 ; yxz.a + PUTC " " ; wipe out remains from last output clrf WREG - movff WREG,buffer+.4 ; limit string length to 4 digits/chars - 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 + movff WREG,buffer+.4 ; limit string length to 4 = 3 digits + 1 half-size decimal dot +TFT_update_avr_stopwatch3: 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 -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 - 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 " " - goto TFT_standard_color - -TFT_ceiling_metric: - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a - bcf leftbind - bcf ignore_digit5 - STRCAT_PRINT " " - goto TFT_standard_color + + ; stopped dive time + WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row +TFT_update_stopwatch: ; jump-in point for stopped dive time in compass custom view + movff average_divesecs+0,lo ; average_divesecs is incremented outside ISR + movff average_divesecs+1,hi + call convert_time ; converts hi:lo in seconds to minutes (up:hi) and seconds (lo) + movlw .100 ; display layout will change if minutes become >= 100 + cpfslt hi ; minutes < 100 ? + bra TFT_update_stopwatch_2 ; NO - display hours:minutes + ;bra TFT_update_stopwatch_1 ; YES - display minutes:seconds +TFT_update_stopwatch_1: + movf hi,W ; exchange lo and hi + movff lo,hi ; ... + movwf lo ; ... + output_8 ; output minutes or hours + PUTC ':' + movff hi,lo ; restore lo + output_99x ; output seconds or minutes + movlw .5 + call TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + clrf WREG + movff WREG,buffer+.5 ; limit to 5 chars + STRCAT_PRINT "" + bra TFT_display_exit_2 +TFT_update_stopwatch_2: + movff hi,lo ; transfer minutes (low byte) to lo + movff up,hi ; transfer minutes (high byte) to hi + call convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) + bra TFT_update_stopwatch_1 global TFT_CNS_mask TFT_CNS_mask: call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row + WIN_TINY dm_custom_cns3_column1, dm_custom_cns3_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 -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_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 + WIN_TINY dm_custom_cns3_column2, dm_custom_cns3_title_row + btfsc FLAG_oc_mode ; in OC mode? + bra TFT_CNS_mask_1 ; YES - print fTTS label + btfsc FLAG_bailout_mode ; in bailout? + bra TFT_CNS_mask_1 ; YES - print fTTS label (label will be printed, but a fTTS will actually not be calculated) + TSTOSS opt_calc_asc_gasvolume ; bailout volume calculation requested? + bra TFT_CNS_mask_1 ; NO - print fTTS label + STRCPY_TEXT_PRINT tCNSBO ; YES - print bailout label + bra TFT_CNS_mask_2 +TFT_CNS_mask_1: ; OC or bailout + STRCPY_TEXT_PRINT tCNSfTTS ; print fTTS label +TFT_CNS_mask_2: + WIN_TINY dm_custom_cns3_column3, dm_custom_cns3_title_row STRCPY_TEXT_PRINT tCNSnow - goto TFT_standard_color ; and return... + bra TFT_display_exit_2 + global TFT_CNS TFT_CNS: + bsf leftbind ; CNS at end of normal dive - WIN_STD dm_custom_hud_sensor1_column+.5,dm_custom_hud_data_row + WIN_STD dm_custom_cns3_column1+.3,dm_custom_cns3_row 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 + output_16_3 ; output as xxx STRCAT_PRINT "% " ; fTTS / Bailout CNS, if enabled - 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% -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 "---" + WIN_STD dm_custom_cns3_column2+.2,dm_custom_cns3_row + btfsc FLAG_bailout_mode ; 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 + btfss FLAG_oc_mode ; YES - in OC mode? + bra TFT_CNS_2 ; NO - show CNS% +TFT_CNS_1: ; not in bailout, no volume calculation, and/or in OC mode + TSTOSS char_I_extra_time ; fTTS extra time 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 call TFT_color_code_cns - bsf leftbind - output_16_3 ; output as xxx - bcf leftbind + output_16_3 ; output as xxx STRCAT_PRINT "% " bra TFT_CNS_4 TFT_CNS_3: - call TFT_standard_color + call TFT_memo_color STRCPY_PRINT "--- " TFT_CNS_4: ; current CNS - WIN_STD dm_custom_hud_sensor3_column,dm_custom_hud_data_row + WIN_STD dm_custom_cns3_column3+.3,dm_custom_cns3_row 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 + output_16_3 ; output as xxx STRCAT_PRINT "%" - goto TFT_standard_color ; and return... - - - global TFT_hud_mask ; The HUD mask -TFT_hud_mask: +TFT_display_exit_2: + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_ppo2_sensors_mask ; mask for ppO2 sensors +TFT_ppo2_sensors_mask: call TFT_divemask_color - WIN_TINY dm_custom_hud_column1,dm_custom_hud_row + WIN_TINY dm_custom_hud_sensor1_column+.4,dm_custom_hud_title_row STRCPY_TEXT_PRINT tDiveHudMask1 - WIN_TINY dm_custom_hud_column2,dm_custom_hud_row + WIN_TINY dm_custom_hud_sensor2_column+.3,dm_custom_hud_title_row STRCPY_TEXT_PRINT tDiveHudMask2 - WIN_TINY dm_custom_hud_column3,dm_custom_hud_row + WIN_TINY dm_custom_hud_sensor3_column+.2,dm_custom_hud_title_row STRCPY_TEXT_PRINT tDiveHudMask3 - goto TFT_standard_color ; and return... - - - global TFT_update_ppo2_sensors ; Update Sensor data -TFT_update_ppo2_sensors: + bra TFT_display_exit_2 + + + global TFT_ppo2_sensors ; data for ppO2 sensors +TFT_ppo2_sensors: ; ; Definition of the output: ; @@ -1384,7 +1444,7 @@ ; _calibrated _O2 _logic _ppo2 Output Color ; _ok _sensorX _sensorX _sensorX ;----------------------------------------------------------------------------------------------- -; 0 -/- -/- -/- "----" TFT_standard_color +; 0 -/- -/- -/- "----" TFT_memo_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 @@ -1393,21 +1453,22 @@ bsf leftbind ; sensor 1 btfsc sensor1_calibrated_ok ; valid calibration? - bra TFT_update_hud1b ; yes - btfsc sensor1_active ; valid HUD data for this sensor - bra TFT_update_hud1b ; yes + bra TFT_update_hud1b ; YES + btfsc sensor1_active ; valid HUD data for this sensor + 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 + WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_row+.5 + call TFT_memo_color 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 + WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_row 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 + bra TFT_update_hud1d ; YES ; valid calibration, but not in use tstfsz o2_ppo2_sensor1 ; sensor value = 0? bra TFT_update_hud1c ; no @@ -1422,37 +1483,35 @@ ; sensor has valid calibration and is in use 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 + 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: ; 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 TFT_update_hud2a: ; sensor 2 btfsc sensor2_calibrated_ok ; valid calibration? - bra TFT_update_hud2b ; yes - btfsc sensor2_active ; valid HUD data for this sensor - bra TFT_update_hud2b ; yes + bra TFT_update_hud2b ; YES + btfsc sensor2_active ; valid HUD data for this sensor + 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 + WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_row+.5 + call TFT_memo_color 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 + WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_row 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 + bra TFT_update_hud2d ; YES ; valid calibration, but not in use tstfsz o2_ppo2_sensor2 ; sensor value = 0? - bra TFT_update_hud2c ; no + bra TFT_update_hud2c ; NO ; valid calibration, not in use and value = 0 call TFT_attention_color ; output in yellow bra TFT_update_hud2e @@ -1464,37 +1523,35 @@ ; sensor has valid calibration and is in use 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 + 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: ; 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 TFT_update_hud3a: ; sensor 3 btfsc sensor3_calibrated_ok ; valid calibration? - bra TFT_update_hud3b ; yes - btfsc sensor3_active ; valid HUD data for this sensor - bra TFT_update_hud3b ; yes + bra TFT_update_hud3b ; YES + btfsc sensor3_active ; valid HUD data for this sensor + bra TFT_update_hud3b ; YES ; no valid calibration - WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5 - call TFT_standard_color + WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_row+.5 + call TFT_memo_color 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 + WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_row 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 + bra TFT_update_hud3d ; YES ; valid calibration, but not in use tstfsz o2_ppo2_sensor3 ; sensor value = 0? - bra TFT_update_hud3c ; no + bra TFT_update_hud3c ; NO ; valid calibration, not in use and value = 0 call TFT_attention_color ; output in yellow bra TFT_update_hud3e @@ -1505,42 +1562,39 @@ TFT_update_hud3d: ; sensor has valid calibration and is in use 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 + btfsc voting_logic_sensor3 ; sensor value agrees with other sensor's values? + 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: ; 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 TFT_update_hud4: ; closure - bcf leftbind - goto TFT_standard_color ; and return... - - - global TFT_surface_sensor ; Update Sensor data in surface mode + bra TFT_display_exit_3 + + + global TFT_surface_sensor ; update sensor data in surface mode TFT_surface_sensor: - movf hardware_flag,W + movf hardware_flag1,W sublw 0x11 ; 2 with BLE btfsc STATUS,Z - return ; Ignore for 0x11 + 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 - btfsc sensor1_active ; valid HUD data for this sensor - bra TFT_surface_sensor1 ; Yes + bra TFT_surface_sensor1 ; YES + btfsc sensor1_active ; valid HUD data for this sensor + bra TFT_surface_sensor1 ; YES call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor2 ; Skip Sensor 1 + bra TFT_surface_sensor2 ; skip sensor 1 TFT_surface_sensor1: movff o2_ppo2_sensor1,lo - call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo + call TFT_color_code_ppo2_hud ; with ppO2 [cbar] in lo clrf hi bsf leftbind output_16dp .3 ; x.xx bar @@ -1549,15 +1603,15 @@ TFT_surface_sensor2: WIN_SMALL surf_hud_sensor2_column,surf_hud_sensor2_row btfsc sensor2_calibrated_ok - bra TFT_surface_sensor3 ; Yes - btfsc sensor2_active ; valid HUD data for this sensor - bra TFT_surface_sensor3 ; Yes + bra TFT_surface_sensor3 ; YES + btfsc sensor2_active ; valid HUD data for this sensor + bra TFT_surface_sensor3 ; YES call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor4 ; Skip Sensor 2 + bra TFT_surface_sensor4 ; skip sensor 2 TFT_surface_sensor3: movff o2_ppo2_sensor2,lo - call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in lo + call TFT_color_code_ppo2_hud ; with ppO2 [cbar] in lo clrf hi bsf leftbind output_16dp .3 ; x.xx bar @@ -1566,52 +1620,54 @@ TFT_surface_sensor4: WIN_SMALL surf_hud_sensor3_column,surf_hud_sensor3_row btfsc sensor3_calibrated_ok - bra TFT_surface_sensor5 ; Yes - btfsc sensor3_active ; valid HUD data for this sensor - bra TFT_surface_sensor5 ; Yes - + bra TFT_surface_sensor5 ; YES + btfsc sensor3_active ; valid HUD data for this sensor + bra TFT_surface_sensor5 ; YES call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor6 ; Skip Sensor 3 + bra TFT_surface_sensor6 ; skip sensor 3 TFT_surface_sensor5: movff o2_ppo2_sensor3,lo - call TFT_color_code_ppo2_hud ; With ppO2 [cbar] in 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 "" TFT_surface_sensor6: +TFT_display_exit_3: bcf leftbind goto TFT_standard_color ; and return... - global TFT_sensor_mV -TFT_sensor_mV: - call TFT_standard_color + 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 " - + rcall TFT_sensor_mV_helper + 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 " + rcall TFT_sensor_mV_helper 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: " + rcall TFT_sensor_mV_helper + bra TFT_display_exit_3 + +TFT_sensor_mV_helper: output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " - bcf leftbind - goto TFT_standard_color ; and return... + return global TFT_sensor_surface_warning @@ -1620,7 +1676,7 @@ 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 + 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 @@ -1628,7 +1684,7 @@ 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 + 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 @@ -1636,12 +1692,12 @@ 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 + 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 + bra TFT_display_exit_3 global TFT_menu_calibrate @@ -1673,13 +1729,16 @@ 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 + bra TFT_display_exit_3 global TFT_clock TFT_clock: + IFDEF _ostc_logo WIN_SMALL surf_clock_column,surf_clock_row + ELSE + WIN_SMALL surf_clock_column+.7,surf_clock_row + ENDIF TFT_clock2: ; called from divemode clock call TFT_standard_color movff hours,lo @@ -1716,7 +1775,7 @@ ;============================================================================= - 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 @@ -1756,7 +1815,7 @@ STRCAT_TEXT_PRINT tMinutes ; Last Stop WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) - STRCPY_TEXT tLastDecostop + STRCPY_TEXT tLastDecostopSurf movff opt_last_stop,lo output_8 STRCAT_TEXT_PRINT tMeters @@ -1771,7 +1830,6 @@ global TFT_debug_output TFT_debug_output: - return WIN_TINY .80,.0 call TFT_standard_color lfsr FSR2,buffer @@ -1783,13 +1841,13 @@ STRCAT_PRINT "" return - global TFT_divetimeout ; Show timeout counter + 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 + call TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_memo_color + STRCPY 0x94 ; "End of dive" symbol movff opt_diveTimeout,WREG ; in [min] mullw .60 movff PRODL,sub_a+0 @@ -1799,7 +1857,7 @@ 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) + call convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) movf hi,W movff lo,hi movwf lo ; exchange lo and hi @@ -1807,78 +1865,62 @@ 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 ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" 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. -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 -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? + tstfsz WREG ; is there room for the message? + return ; NO - done + btfsc FLAG_oc_mode ; YES - in OC 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 + TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? + bra TFT_display_ftts_1 ; NO - print fTTS label + STRCPY "B/O" ; YES - print bailout label + bra TFT_display_ftts_2 +TFT_display_ftts_1: ; OC or CCR/pSCR but no bailout volume calculation STRCPY "@+" ; print fTTS label -TFT_display_ftts_3: - movff char_I_extra_time,lo - bsf leftbind - output_8 - PUTC ":" +TFT_display_ftts_2: + movff char_I_extra_time,lo ; get fTTS delay time + bsf leftbind ; print with alignment to the left + output_8 ; print fTTS delay time + 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 -TFT_display_ftts1: + call TFT_memo_color ; set memo color + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_display_ftts_3 ; NO - keep memo color + bcf hi,int_invalid_flag ; YES - clear flag + call TFT_disabled_color ; - switch to disabled color +TFT_display_ftts_3: + btfsc hi,int_not_yet_computed ; is the not-computed-yet flag set? + bra TFT_display_ftts_4 ; 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) + iorwf hi,W ; extra_ascenttime = 0 ? + bz TFT_display_ftts_5 ; YES - show "NDL" + movff char_O_deco_info,up ; get deco info vector + btfsc up,deco_steady ; fTTS = TTS ? + call TFT_advice_color ; YES - set to advice color (green) + btfsc up,deco_decreasing ; fTTS < TTS ? + call TFT_advice_color ; YES - set to advice color (green) + output_16 ; NO - show ascent time + PUTC "'" ; - minutes symbol + bra TFT_display_ftts_6 +TFT_display_ftts_4: + STRCAT "---" ; "---" for not computed + bra TFT_display_ftts_6 +TFT_display_ftts_5: + STRCAT_TEXT tNDL ; "NDL" +TFT_display_ftts_6: + movlw dm_warning_length ; dive mode string length + call TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - 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 - goto TFT_standard_color ; ...and return + bcf leftbind ; clear left alignment + goto TFT_standard_color ; ...and return ;============================================================================= @@ -1896,19 +1938,28 @@ TFT_temp_surfmode_common: STRCAT_PRINT "" WIN_SMALL surf_temp_column,surf_temp_row + call TFT_memo_color 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 - btfsc blinking_better_gas ; blinking better Gas? - return ; Yes, no update of temperature now - WIN_SMALL dm_temp_column,dm_temp_row + 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 + btfsc blinking_better_dil ; blinking better diluent? + return ; YES - no update of temperature now + WIN_SMALL dm_temp_column,dm_temp_row + call TFT_memo_color + btfsc alternative_divelayout ; in alternative layout? + bra TFT_temp_common ; YES - proceed with temperature + movlw index_compass_dm ; NO - index of compass custom view + cpfseq menupos3 ; - compass shown in custom view? + bra TFT_temp_common ; NO - proceed with temperature + bra TFT_update_stopwatch ; YES - show resettable dive time instead of temperature TFT_temp_common: - call TFT_standard_color SAFE_2BYTE_COPY temperature,lo ; get current temperature TSTOSS opt_units ; 0=°C, 1=°F bra TFT_temp_common_1 @@ -1917,7 +1968,7 @@ rcall TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required 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? + ; temp is positive, is it less than 10°C ? tstfsz hi bra TFT_temp_common_1a ; >25.5°C, skip here movlw .100 @@ -1926,13 +1977,12 @@ bsf leftbind output_16dp d'4' ; x.y°C bcf leftbind - bra TFT_temp_common_3 ; Done. + bra TFT_temp_common_3 ; done TFT_temp_common_1a: PUTC " " ; NO - write a space instead of the minus sign TFT_temp_common_2: - bsf ignore_digit5 ; ignore decimal + bsf ignore_digit5 ; ignore decimal (flag will be cleared by output_16) 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 cpfseq lo ; is there a space sign on the unit position? (happens between +1 and -1) @@ -1962,11 +2012,11 @@ 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 + btfsc menupos1,2 ; > 3 ? + movlw dm_menu_item4_column-.8 ; YES + movwf win_leftx2 + + movff menupos1,lo ; copy menu position movlw dm_menu_item6_row dcfsnz lo,F movlw dm_menu_item1_row @@ -1978,33 +2028,45 @@ movlw dm_menu_item4_row dcfsnz lo,F movlw dm_menu_item5_row - movff WREG,win_top + movwf win_top movlw FT_SMALL - movff WREG,win_font + movwf win_font STRCPY_PRINT "\xb7" ; print cursor return + global TFT_active_gas_divemode -TFT_active_gas_divemode: ; Display gas/Setpoint +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 - bra TFT_active_gas_divemode2 ; NO - print in normal rendering + btfsc divemode_menu ; is the dive mode menu shown? + return ; YES - return + btfsc FLAG_apnoe_mode ; in apnoe mode? + return ; YES - return + btfsc FLAG_gauge_mode ; in gauge mode? + return ; YES - return + btfss FLAG_oc_mode ; in OC mode? + bra TFT_active_setpoint ; NO - show setpoint and gas mix + bra TFT_active_gas_divemode_oc ; YES - show OC gas + +TFT_active_setpoint_bail: ; bailout case + tstfsz menupos2 ; any option shown? + bra TFT_active_gas_divemode_oc ; YES - do not overwrite with bailout text + WIN_SMALL dm_active_dil_column, dm_active_dil_row + call TFT_attention_color ; print plaint in yellow + STRCPY_TEXT_PRINT tDiveBailout ; "Bailout" +TFT_active_gas_divemode_oc: ; common part for OC and bailout + movff int_O_breathed_ppO2+0,lo ; color-code the output of the gas by the ppO2 it yields + movff int_O_breathed_ppO2+1,hi ; + call TFT_color_code_ppo2 ; with ppO2 [cbar] in hi:lo + btfss better_gas_available ; check if a better gas is available and a gas change shall be advised + bra TFT_active_gas_print ; 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 + bra TFT_active_gas_print ; 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 +TFT_active_gas_print: + 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 @@ -2012,24 +2074,25 @@ bcf win_invert ; reset invert flag goto TFT_standard_color ; ...and return -TFT_active_setpoint: ; Show setpoint - btfsc is_bailout ; are we in bailout? + ; in CCR / pSCR mode - and maybe in bailout +TFT_active_setpoint: ; + btfsc FLAG_bailout_mode ; in bailout? bra TFT_active_setpoint_bail ; YES - show "Bailout" instead of setpoint - movff int_O_breathed_ppO2+0,lo + + ; on the loop + movff int_O_breathed_ppO2+0,lo ; color-code the output by the ppO2 of the loop gas mixture movff int_O_breathed_ppO2+1,hi 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 + btfss secs,0 ; timebase for blinking effect: on even second? + bra TFT_active_setpoint_print ; YES - print ppO2 with normal rendering + btfsc setpoint_fallback ; NO - 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_ppo2 + call TFT_attention_color ; text in yellow TFT_active_setpoint_com: ; blinking common part bsf win_invert ; set invert flag TFT_active_setpoint_print: @@ -2045,21 +2108,18 @@ TFT_active_setpoint2_a: STRCAT_PRINT "" 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 -TFT_active_setpoint_diluent: - btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode + call TFT_memo_color ; revert to memo color +TFT_active_setpoint_diluent: ; diluent gas + movff int_O_pure_ppO2+0,lo ; color-code the output + movff int_O_pure_ppO2+1,hi + call TFT_color_code_ppo2 ; with ppO2 [cbar] in hi:lo + btfss better_dil_available ; check if a better diluent is available and a diluent change shall be advised 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_dil ; YES - toggle blink bit... + btfss blinking_better_dil ; 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 + call TFT_attention_color ; YES - print in yellow 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 % @@ -2067,58 +2127,52 @@ call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 STRCAT_PRINT "" bcf win_invert ; reset invert flag - goto TFT_standard_color ; ...and return - - - global TFT_show_mode_divemode -TFT_show_mode_divemode: + call TFT_memo_color ; set memo color + btfsc menuview ; is the dive options menu shown? + return ; YES - do not overwrite it WIN_TINY dm_active_dil_column+.45, dm_active_dil_row+.3 - btfsc is_bailout ; in bailout? - return ; YES - btfsc FLAG_ccr_mode ; NO - in CCR mode? - bra TFT_show_mode_divemode_ccr ; YES - write CCR label - btfsc FLAG_pscr_mode ; NO - in pSCR mode? - bra TFT_show_mode_divemode_pscr ; YES - write pSCR label - return ; NO - done -TFT_show_mode_divemode_ccr: - call TFT_standard_color ; set standard color + btfsc FLAG_ccr_mode ; in CCR mode? + bra TFT_active_setpoint_ccr ; YES - write CCR label + btfsc FLAG_pscr_mode ; in pSCR mode? + bra TFT_active_setpoint_pscr ; YES - write pSCR label + return ; NO to both - should not happen, anyhow: done +TFT_active_setpoint_ccr: STRCPY_TEXT_PRINT tDvCCR ; print "CCR" return ; done -TFT_show_mode_divemode_pscr: - call TFT_standard_color ; set standard color +TFT_active_setpoint_pscr: STRCPY_TEXT_PRINT tDvPSCR ; print "PSCR" - return + return ; done 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 + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnoe, 4=PSCR tstfsz lo bra TFT_display_decotype_surface2 TFT_display_decotype_surface0: - STRCAT_TEXT_PRINT tDvOC ; OC + 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 + 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 + 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 + 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 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 @@ -2137,109 +2191,110 @@ 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 + global TFT_display_decotype_surface1 +TFT_display_decotype_surface1: ; used from logbook and from deco calculator (simulator.asm) + tstfsz lo ; lo holds 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR bra TFT_display_decotype_surface1_2 - bra TFT_display_decotype_surface0 ;OC + 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) + STRCAT_TEXT_PRINT tDvCC ; CC + bra TFT_display_decotype_exit TFT_display_decotype_surface1_3: decfsz lo,F bra TFT_display_decotype_surface1_4 - bra TFT_display_decotype_surface3_1 ; Gauge + 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 + bra TFT_display_decotype_surface5 ; pSCR + bra TFT_display_decotype_surface4_1 ; Apnea ;============================================================================= - global TFT_splist_surfmode ; Show Setpoint list - extern gaslist_strcat_setpoint + global TFT_splist_surfmode ; show setpoint list TFT_splist_surfmode: - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bcf better_gas_hint ; do not mark the best gas/diluent (to be used in dive mode only) ;SP 1 WIN_SMALL surf_gaslist_column,surf_gaslist_row clrf PRODL - call gaslist_strcat_setpoint ; Show SP#+1 of 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# + 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# + 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# + 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# + 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 +TFT_gaslist_surfmode: ; displays gas list + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint + bcf better_gas_hint ; do not mark the best gas/diluent (to be used in dive mode only) ;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 + call gaslist_strcat_gas_cd ; 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 + call gaslist_strcat_gas_cd ; 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 + call gaslist_strcat_gas_cd ; 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 + call gaslist_strcat_gas_cd ; 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 + call gaslist_strcat_gas_cd ; append gas description of gas #PRODL (0-4) to current string STRCAT_PRINT "" bcf leftbind + bcf win_invert ; clear flag for inverted output 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 +TFT_dillist_surfmode: ; displays diluent list + bsf FLAG_diluent_setup ; use CCR diluents... + rcall TFT_gaslist_surfmode ; use OC/BAIL routine + bcf FLAG_diluent_setup ; clear flag return ;================================================================== @@ -2249,35 +2304,33 @@ 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 + 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 + 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 hi:lo 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 + call TFT_fillup_with_spaces ; fill up 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 + bcf win_invert ; reset invert flag return TFT_depth_metric: @@ -2285,9 +2338,9 @@ 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... + 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 @@ -2301,11 +2354,11 @@ movff lo,sub_b+0 incf sub_b+0,F movlw d'0' - addwfc sub_b+1,F ; Add 1mbar offset + addwfc sub_b+1,F ; add 1mbar offset call sub16 ; sub_c = sub_a - sub_b movlw ' ' - btfss neg_flag ; Depth lower then 10m? - movwf POSTINC2 ; Yes, add extra space + btfss neg_flag ; depth lower then 10m? + movwf POSTINC2 ; YES - add extra space clrf sub_a+1 movlw d'99' @@ -2313,12 +2366,12 @@ 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_depth2 ; Yes, display manual Zero + btfss neg_flag ; depth lower then 1m? + bra tft_depth2 ; YES - display manual Zero bsf leftbind bsf ignore_digit4 - output_16 ; Full meters in Big font + output_16 ; full meters in big font bcf leftbind bra tft_depth3 @@ -2326,45 +2379,44 @@ STRCAT "0" ; manual zero tft_depth3: - STRCAT_PRINT "" ; Display full meters + STRCAT_PRINT "" ; display full meters ; .1m in MEDIUM font 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] - call TFT_color_code_depth ; Color-code the output + ;call TFT_color_code_depth ; color-code the output - not needed, furthermore: seems to cause problems if not commented out... PUTC "." - movlw HIGH d'30' ; Display 0.0m if lower then 30cm + movlw HIGH d'30' ; display 0.0m if lower then 30cm movwf sub_a+1 movlw LOW 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.3m? - bra depth_less_0.3mtr ; Yes, Show ".0" manually + btfss neg_flag ; depth lower then 0.3m? + bra depth_less_0.3mtr ; YES - show ".0" manually movlw d'4' movwf ignore_digits - bsf ignore_digit5 - output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters - bcf win_invert ; Reset invert flag + bsf ignore_digit5 ; (flag will be cleared by output_16) + output_16dp d'0' + STRCAT_PRINT "" ; display decimeters + 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 + STRCAT_PRINT "0" ; display 0.0m manually + 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 +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 call TFT_color_code_depth ; Depth is already in hi:lo ; Show depth in Full meters @@ -2374,14 +2426,14 @@ bsf leftbind output_16 bcf leftbind - STRCAT_PRINT "" ; Display full meters only - bcf win_invert ; Reset invert flag + 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 +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 + bsf depth_greater_100m ; set flag return TFT_depth_blink: @@ -2389,48 +2441,53 @@ 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_prev ; did we have warning previously? + 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 + bra TFT_depth_blink_warn ; Yes - so we have warning now but not previously + btfsc blinking_depth_attention; do we have attention set now? + bra TFT_depth_blink_warn ; Yes - so we have attention now but not previously ; no warning in previous cycle, no warning now, reset all flags - bcf blinking_depth_prev ; reset prev flag + bcf blinking_depth_prev ; reset previous flag bcf blinking_depth_toggle ; reset toggle bcf win_invert - ; all done - return + return ; all done 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 - + btfsc blinking_depth_warning ; do we still have the warning? + bra TFT_depth_blink_prevwarn_1 ; YES + btfss blinking_depth_attention ; do we still have the attention? + bra TFT_depth_blink_prevwarn_nowarn ; NO - clear the depth area +TFT_depth_blink_prevwarn_1: ; 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 + 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 + bra TFT_depth_blink_reset ; 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 + ;bra TFT_depth_blink_set TFT_depth_blink_set: ; clear the area with color - movlw color_red ; that should not be hardcoded... + call TFT_attention_color_dive ; default to attention color + btfsc blinking_depth_warning ; in warning mode? + call TFT_warnings_color_dive ; overwrite with warning color 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 @@ -2449,36 +2506,39 @@ ; if it's still warning... btfsc blinking_depth_warning call TFT_warnings_color + btfsc blinking_depth_attention + call TFT_attention_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... +TFT_custom_text: ; show the custom text + call TFT_standard_color + lfsr FSR0, opt_name ; source + WIN_SMALL surf_customtext_column,surf_customtext_row1 ; 1st 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 ; 2nd 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 ; 3rd 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 ; 4th 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 ; 5th row + bra TFT_custom_text_2 ; show up to 12 chars, print and return... TFT_custom_text_2: @@ -2486,14 +2546,14 @@ 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 length reached ? - bra TFT_custom_text_3 ; NO: loop + 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 + clrf POSTINC2 ; mark end of string goto aa_wordprocessor ; print and return @@ -2501,7 +2561,7 @@ global TFT_update_surf_press TFT_update_surf_press: - WIN_SMALL surf_press_column,surf_press_row + WIN_SMALL surf_press_column+.8,surf_press_row call TFT_standard_color SAFE_2BYTE_COPY amb_pressure, lo movff lo,sub_a+0 @@ -2509,15 +2569,15 @@ movff last_surfpressure_30min+0,sub_b+0 movff last_surfpressure_30min+1,sub_b+1 call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; Pressure lower? - rcall update_surf_press2 ; Yes, test threshold - tstfsz sub_c+1 ; >255mbar difference? - bra update_surf_press_common ; Yes, display! + btfsc neg_flag ; pressure lower? + rcall update_surf_press2 ; YES - test threshold + tstfsz sub_c+1 ; >255 mbar difference? + bra update_surf_press_common ; YES - display movlw d'11' ; 10mbar noise suppression 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... + bra update_surf_press_common ; YES - display + 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 @@ -2531,8 +2591,8 @@ 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 + WIN_SMALL surf_press_column+(4+1)*8,surf_press_row + STRCPY_TEXT_PRINT tMBAR ; mbar (hPa) return update_surf_press2: @@ -2540,14 +2600,15 @@ movff hi,sub_b+1 movff last_surfpressure_30min+0,sub_a+0 movff last_surfpressure_30min+1,sub_a+1 - goto subU16 ; sub_c = sub_a - sub_b ; and return... + goto subU16 ; sub_c = sub_a - sub_b and return... ;============================================================================= global TFT_update_batt_voltage TFT_update_batt_voltage: - movff batt_percent,lo ; Get battery percent - call TFT_color_code_battery ; Color-code battery percent + movff batt_percent,lo ; get battery percent + clrf hi + call TFT_color_code_battery ; color-code battery percent ; Setup charge indicator btfsc cc_active bsf win_invert @@ -2557,18 +2618,25 @@ movlw color_green btfsc cc_active call TFT_set_color - WIN_TINY batt_percent_column,batt_percent_row - bsf leftbind - output_8 - bcf leftbind - STRCAT "% " - movlw 0x00 - movff WREG,buffer+4 ; Only "xxx%" - STRCAT_PRINT "" + + IFDEF _ostc_logo + WIN_TINY batt_percent_column,batt_percent_row + ELSE + WIN_SMALL batt_percent_column+.2,batt_percent_row + ENDIF + + output_16_3 ; display only last three digits from a 16 bit value (0-999) + STRCAT_PRINT "% " bcf win_invert call TFT_standard_color + + IFDEF _ostc_logo 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 + ELSE + WIN_TINY batt_voltage_column+.15,batt_voltage_row + ENDIF + + 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 @@ -2580,7 +2648,7 @@ PUTC 'V' movff buffer+8,buffer+6 movlw 0x00 - movff WREG,buffer+7 ; Only "x.yV" + movff WREG,buffer+7 ; only "x.yV" STRCAT_PRINT "" return @@ -2599,7 +2667,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 @@ -2613,84 +2681,84 @@ global TFT_convert_signed_16bit TFT_convert_signed_16bit: - 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. + 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 ; 16 bit sign change negf lo btfsc STATUS,C incf hi - return ; and return + return ; done ;============================================================================= 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_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_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 + 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 + output_99x ; with lo = month or day or year PUTC '.' - movff hi,lo ; now lo = day or month or month + movff hi,lo ; now lo = day or month or month output_99x PUTC '.' - movff up,lo ; now lo = year or year or day + movff up,lo ; now lo = year or year or 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 + ; 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_short_1 - ; opt_dateformat is 0 - ; Use MMDD(YY) + ; 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 + 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) + 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: bsf leftbind - output_99x ; with lo = month or day + output_99x ; with lo = month or day PUTC '.' - movff hi,lo ; now lo = day or month + movff hi,lo ; now lo = day or month output_99x bcf leftbind return @@ -2699,7 +2767,7 @@ 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 day,lo movff month,hi @@ -2712,410 +2780,295 @@ global TFT_max_depth_alternative TFT_max_depth_alternative: - bcf FLAG_TFT_max_depth_alt + bcf FLAG_TFT_max_depth ; The "mask" 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 -;TFT_max_depth_alt_imperial: + btfsc FLAG_apnoe_mode ; in Apnea mode? + bra TFT_max_depth_alternative2 ; YES - always draw max depth + TSTOSS opt_2ndDepthDisp ; draw avg depth instead of max depth? + bra TFT_max_depth_alternative2 ; NO - draw max depth + STRCAT_TEXT_PRINT tAvgDepth ; YES - print avg depth mask + movff avg_rel_pressure_total+0,lo ; - get avg depth, low byte + movff avg_rel_pressure_total+1,hi ; - high byte + bra TFT_max_depth_alternative3 +TFT_max_depth_alternative2: + STRCAT_TEXT_PRINT tMaxDepth ; print max depth mask + SAFE_2BYTE_COPY max_pressure, lo ; get max depth into hi:lo +TFT_max_depth_alternative3: + call adjust_depth_with_salinity ; compute salinity setting into lo:hi [mbar] + call TFT_memo_color + WIN_LARGE dm_max_alt_column,dm_max_alt_row + TSTOSS opt_units ; 0=m or 1=ft? + bra TFT_max_depth_alt_metric ; 0 - use alternative metric version + bra TFT_max_depth_imperial ; 1 - use common imperial version TFT_max_depth_alt_metric: - WIN_LARGE dm_max_alt_column,dm_max_alt_row - bsf ignore_digit4 ; no 0.1m + movff hi,sub_b+1 ; backup hi in sub_b+1 + movff lo,sub_b+0 ; backup lo in sub_b+0 + bsf ignore_digit4 ; no 0.1 m 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 "." - movlw d'4' - movwf ignore_digits - bsf ignore_digit5 - bsf leftbind - output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters - bcf leftbind - return + WIN_MEDIUM dm_max_dm_alt_column,dm_max_alt_row+.25 + bra TFT_max_depth_metric3 ; continue with normal metric version for decimal 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 + bcf FLAG_TFT_max_depth + btfsc FLAG_apnoe_mode ; in Apnoe mode? + bra TFT_max_depth1 ; YES - different handling in Apnoe mode + TSTOSS opt_2ndDepthDisp ; draw avg depth instead of max depth? + bra TFT_max_depth2 ; NO - show max depth + movff avg_rel_pressure_total+0,lo ; YES - get avg depth, low byte + movff avg_rel_pressure_total+1,hi ; - high byte + bra TFT_max_depth3 +TFT_max_depth1: + btfss FLAG_active_descent ; are we descending? + bra TFT_max_depth2 ; NO - show normal max + SAFE_2BYTE_COPY apnoe_max_pressure,lo ; YES - get apnoe_max_pressure + bra TFT_max_depth3 TFT_max_depth2: - SAFE_2BYTE_COPY max_pressure, lo + SAFE_2BYTE_COPY max_pressure,lo ; get the "normal" max depth TFT_max_depth3: call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - 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 - 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 - output_16_3 - STRCAT_PRINT "" - return - -TFT_max_depth2_metric: - WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + movlw .039 ; load encoding for 99.84 m + cpfslt hi ; is depth to show > 99.84 m ? + bra TFT_max_depth3a ; YES + btfss max_depth_greater_100m ; NO - was depth > 100 m during last call? + bra TFT_max_depth3c ; NO + bcf max_depth_greater_100m ; YES - clear flag, last depth shown now not > 100 m anymore + bra TFT_max_depth3b ; - clear depth area +TFT_max_depth3a: + btfsc max_depth_greater_100m ; YES - was depth > 100 m during last call? + bra TFT_max_depth3c ; YES + bsf max_depth_greater_100m ; NO - set flag, last depth shown now > 100 m + ;bra TFT_max_depth3b ; - clear depth area +TFT_max_depth3b: + WIN_BOX_BLACK dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt ; top, bottom, left, right +TFT_max_depth3c: + call TFT_memo_color ; set output color 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 - - btfsc max_depth_greater_100m ; Was depth>100m during last call - rcall TFT_clear_max_depth ; Yes, clear depth area - bcf max_depth_greater_100m ; Do this once only... - - movlw .039 - cpfslt hi - bra max_depth_greater_99_84mtr - - movlw HIGH d'1000' + TSTOSS opt_vsigraph ; graphical VSI bar enabled? + bra TFT_max_depth4 ; NO + WIN_MEDIUM dm_max_depth_column, dm_max_depth_row ; YES - adopt output position +TFT_max_depth4: + TSTOSS opt_units ; 0=m or 1=ft ? + bra TFT_max_depth_metric ; 0 - use metric version +TFT_max_depth_imperial: ; 1 - use imperial version + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet + output_16_3 + bra TFT_max_depth_exit +TFT_max_depth_metric: + btfss max_depth_greater_100m ; depth to show > 100 m ? + bra TFT_max_depth_metric0 ; NO - show meters and decimeters + bsf ignore_digit4 ; YES - show full meters only, i.e. ignore digits 4 and 5 + bsf leftbind + output_16 + bra TFT_max_depth_exit +TFT_max_depth_metric0: + movff hi,sub_b+1 ; copy hi to sub_b+1, will also be used to back-up hi + movff lo,sub_b+0 ; copy lo to sub_b+0, will also be used to back-up lo + + movlw HIGH d'999' movwf sub_a+1 - movlw LOW d'1000' + movlw LOW d'999' movwf sub_a+0 - movff hi,sub_b+1 - movff lo,sub_b+0 - incf sub_b+0,F - movlw d'0' - addwfc sub_b+1,F ; Add 1mbar offset - call sub16 ; sub_c = sub_a - sub_b + call sub16 ; sub_c = sub_a - sub_b movlw ' ' - btfss neg_flag ; Depth lower then 10m? - movwf POSTINC2 ; Yes, add extra space + btfss neg_flag ; depth lower than 10m ? + 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 - 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 - STRCAT "0" - -tft_max_depth3: - call TFT_standard_color - STRCAT_PRINT "" ; Display full meters - 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 - WIN_SMALL dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row - - SAFE_2BYTE_COPY max_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - - PUTC "." - + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; depth lower than 1m ? + bra TFT_max_depth_metric1 ; YES - manually display a zero + bsf ignore_digit4 ; NO - no 0.1 m + bsf leftbind ; - align left + output_16 ; - display full meters + bra TFT_max_depth_metric2 +TFT_max_depth_metric1: + STRCAT "0" ; display a zero +TFT_max_depth_metric2: + STRCAT_PRINT "" + ; .1 m in SMALL font + WIN_SMALL dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row + TSTOSS opt_vsigraph ; graphical VSI bar enabled? + bra TFT_max_depth_metric3 ; NO + WIN_SMALL dm_max_depth_dm_column, dm_max_depth_dm_row ; YES - adopt position +TFT_max_depth_metric3: + movff sub_b+1,hi ; restore hi + movff sub_b+0,lo ; restore lo + PUTC "." ; print decimal point movlw d'4' movwf ignore_digits - bsf ignore_digit5 + bsf ignore_digit5 ; no 0.01 m, flag will be cleared by output_16 bsf leftbind - output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters - bcf leftbind - return - -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 - bsf ignore_digit4 - bsf leftbind - output_16 + output_16dp d'0' +TFT_max_depth_exit: + STRCAT_PRINT "" bcf leftbind - 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 - 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. - SAFE_2BYTE_COPY apnoe_max_pressure, lo - 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_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 - 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 - 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' - STRCAT_PRINT "" - return + goto TFT_standard_color ; and return... ;============================================================================= 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 - btfsc no_more_divesecs ; Ignore seconds? - bra TFT_divemins2 ; Show minutes only + btfsc no_more_divesecs ; ignore seconds? + bra TFT_divemins2 ; show minutes only tstfsz hi ; hi = 0? - bra TFT_divemins_clr ; No, show mins only + bra TFT_divemins_clr ; NO - show mins only movlw .99 cpfsgt lo ; bigger than 99? - bra TFT_divemins1 ; No show mins:secs + 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 - ; Clear rest of seconds + ; YES - remove second display for the rest of the dive and clear seconds + 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 + bra TFT_divemins2 ; - show minutes only TFT_divemins1: - ; Print out the minutes, up to 99min, only 2chars ! - call TFT_standard_color + ; Print out the minutes, up to 99 minutes, only 2 chars! + call TFT_memo_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 + output_99 ; displays only last two figures from a 8 bit 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 + WIN_SMALL dm_divetime_secs_column, dm_divetime_secs_row ; left position for two sec figures 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 + bsf leftbind + output_99x ; displays only last two figures from a 8 bit value with leading zero (00-99) + bra TFT_divemins_exit ; and return... TFT_divemins2: ; Full minutes only - call TFT_standard_color + call TFT_memo_color WIN_MEDIUM dm_divetime_minsonly_column, dm_divetime_row bcf leftbind output_16_4 - STRCAT_PRINT "" ; Show minutes in large font - return + bra TFT_divemins_exit ; and return... + global TFT_divemins_alternative TFT_divemins_alternative: - bcf FLAG_TFT_divemins ; Clear flag - call TFT_standard_color + bcf FLAG_TFT_divemins ; clear flag + call TFT_memo_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 + STRCAT_PRINT "" ; show minutes ; Print out the seconds in medium WIN_MEDIUM dm_divetime_alt_column+.60, dm_divetime_alt_row+.25 PUTC ":" + movff divesecs,lo bsf leftbind - movff divesecs,lo output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) +TFT_divemins_exit: + STRCAT_PRINT "" bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - return + goto TFT_standard_color ; and return... ;============================================================================= global TFT_display_apnoe_surface TFT_display_apnoe_surface: + btfsc menuview ; is the options menu shown? + bra TFT_display_apnoe_surface_1 ; YES - skip title 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 +TFT_display_apnoe_surface_1: + call TFT_memo_color WIN_MEDIUM dm_apnoe_surface_time_column, dm_apnoe_surface_time_row movff apnoe_surface_mins,lo output_8 PUTC ':' movff apnoe_surface_secs,lo output_99x - STRCAT_PRINT "" - return - - 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 - return + bra TFT_display_apnoe_exit ; and return... + + + 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_memo_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 + bra TFT_display_apnoe_last_m_metric +TFT_display_apnoe_last_max_imp: + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet + WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row + output_16 + bra TFT_max_depth_exit +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 (flag will be cleared by output_16) + output_16dp d'3' + bra TFT_max_depth_exit + global TFT_display_apnoe_descent -TFT_display_apnoe_descent: ; Descent divetime +TFT_display_apnoe_descent: ; descent divetime movff apnoe_mins,lo 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) - 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 + call TFT_memo_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 ':' bsf leftbind movff apnoe_secs,lo output_99x - bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - + 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 + call TFT_memo_color movff divemins,lo clrf hi WIN_MEDIUM dm_apnoe_total_divetime_column, dm_apnoe_total_divetime_row + bcf leftbind 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 + call TFT_memo_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 ':' bsf leftbind movff divesecs,lo output_99x +TFT_display_apnoe_exit: + STRCAT_PRINT "" bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font + goto TFT_standard_color ; and return... + + + global TFT_apnoe_clear_surface +TFT_apnoe_clear_surface: + ; clear surface timer (TODO: partly wipes out options menu, too) + WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ; top, bottom, left, right 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 -TFT_serial2: - 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 -TFT_serial4: - 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" - call TFT_standard_color - bcf win_invert - return - else - movlw softwareversion_beta ; =1: Beta, =0: Release, >= 2: Service Pack - tstfsz WREG ; release? - bra TFT_serial_6 ; NO - bra TFT_serial_8 ; YES -TFT_serial_6: - decfsz WREG,F ; Beta? - bra TFT_serial_7 ; NO - STRCAT_PRINT "" ; YES - call TFT_warnings_color ; - WIN_LEFT .160-4*9/2 ; Right pad - STRCPY_TEXT tBeta - bra TFT_serial_8 -TFT_serial_7: - STRCAT " SP" - movlw softwareversion_beta ; STRCAT destroyed WREG - decf WREG,W - movwf lo - bsf leftbind - output_8 - bcf leftbind -TFT_serial_8: - STRCAT_PRINT "" - call TFT_standard_color - bcf win_invert - return - endif - ;============================================================================= -; For the Information menu: append firmware x.yy version. - - 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 - STRCAT "_en+de" - ELSE - STRCAT "_fr+it" - ENDIF - bcf win_invert ; Reset invert flag - return +; append firmware version to current string, including color-coding global TFT_cat_firmware TFT_cat_firmware: @@ -3126,39 +3079,134 @@ PUTC '.' movlw softwareversion_y movwf lo - output_99x + output_8 bcf leftbind - ; Check firmware date - movlw firmware_expire_year-.1 - cpfsgt year ; > threshold? + rcall check_expiry + btfss aux_flag return - movlw firmware_expire_month-.1 - cpfsgt month ; > threshold? + bsf win_invert + goto TFT_attention_color + +;============================================================================= +; check if firmware is within expiry period, will return aux_flag set if not + +check_expiry: ; check if it is time for a firmware update + bsf aux_flag ; set firmware as expired by default + movlw firmware_expire_year ; start with checking year + cpfsgt year ; current year > expiry year ? + bra check_expiry_Y ; NO - continue checks + return ; YES - expired +check_expiry_Y: + cpfseq year ; current year = expiry year ? + bra check_expiry_ok ; NO - must be < then, OK whatever month & day + movlw firmware_expire_month ; YES - continue checking month + cpfsgt month ; current month > expiry month ? + bra check_expiry_M ; NO - continue checks + return ; YES - expired +check_expiry_M: + cpfseq month ; current month = expiry month ? + bra check_expiry_ok ; NO - must be < then, OK whatever day + movlw firmware_expire_day ; YES - continue checking day + cpfsgt day ; current day > expiry day ? + bra check_expiry_ok ; NO - must be <= then, OK + return ; YES - expired +check_expiry_ok: + bcf aux_flag return - movlw firmware_expire_day-.1 - cpfsgt day ; > threshold? + +;============================================================================= +; append firmware BETA status to current string, including color-coding + + global TFT_cat_beta_rel + global TFT_cat_beta_release +TFT_cat_beta_release: ; entry point for printing "Release" / "Beta #" + bsf aux_flag + bra TFT_cat_beta_common +TFT_cat_beta_rel: ; entry point for printing "Rel." / "B. #" + bcf aux_flag +TFT_cat_beta_common: + IFDEF __DEBUG + STRCAT "DEBUG" + goto TFT_warnings_color + ELSE + movlw softwareversion_beta ; =0: release, =1: beta 1, =2: beta 2, ... + movwf lo ; copy to lo + tstfsz lo ; release version? + bra TFT_cat_beta_1 ; NO - must be beta version then + btfss aux_flag ; YES - shall show long version? + bra TFT_cat_beta_2 ; NO - show short version + rcall check_expiry ; YES - check expiry date + btfsc aux_flag ; - within expiry date? + bra TFT_cat_beta_4 ; NO - give update cue + STRCAT "Release" ; YES - print "Release" + return ; - done +TFT_cat_beta_1: + btfss aux_flag ; shall show long version? + bra TFT_cat_beta_3 ; NO - show short version + STRCAT "Beta " ; YES - show long version +TFT_cat_beta_1a: + bsf leftbind + output_8 ; print beta version number + bcf leftbind + goto TFT_attention_color ; and return +TFT_cat_beta_2 + STRCAT "Rel." ; short version for "Release" return - - ; Show in "change firmware" style - movlw color_yellow - bcf win_invert - goto TFT_set_color ; and return... +TFT_cat_beta_3 + STRCAT "B." ; short version for "Beta" + bra TFT_cat_beta_1a ; append beta version number +TFT_cat_beta_4 + STRCAT "update!" ; print update cue + goto TFT_attention_color ; and return + ENDIF + +;============================================================================= +; For the Information menu: firmware version + + global info_menu_firmware +info_menu_firmware: + lfsr FSR1,tFirmware + call strcat_text + rcall TFT_cat_firmware + PUTC " " + rcall TFT_cat_beta_rel + STRCAT_PRINT "" ; print buffer to screen + return + +;============================================================================= +; For the Information menu: firmware version of the RX processor + + IFDEF _rx_functions + global info_menu_firmware_rx +info_menu_firmware_rx: + lfsr FSR1,tFirmware_rx + call strcat_text +; bra TFT_cat_firmware_rx ;(and return) +;TFT_cat_firmware_rx: + movff rx_firmware+0,lo + bsf leftbind + output_8 + PUTC '.' + movff rx_firmware+1,lo + output_8 + bcf leftbind + return + ENDIF ;----------------------------------------------------------------------------- -; For the Information menu: append serial number +; For the Information menu: append serial number global info_menu_serial - extern tSerial info_menu_serial: lfsr FSR1,tSerial call strcat_text global TFT_cat_serial TFT_cat_serial: clrf EEADRH - clrf EEADR ; Get Serial number LOW + clrf EEADR ; get serial number LOW call read_eeprom ; read byte movff EEDATA,lo - incf EEADR,F ; Get Serial number HIGH + incf EEADR,F ; get serial number HIGH call read_eeprom ; read byte movff EEDATA,hi @@ -3168,10 +3216,9 @@ return ;----------------------------------------------------------------------------- -; For the Information menu: Append total dives +; For the Information menu: append total dives global info_menu_total_dives - extern tTotalDives info_menu_total_dives: lfsr FSR1,tTotalDives call strcat_text @@ -3185,9 +3232,8 @@ bcf leftbind return -; For the Information menu: Append battery voltage +; For the Information menu: append battery voltage global info_menu_battery_volts - extern tBatteryV info_menu_battery_volts: lfsr FSR1,tBatteryV call strcat_text @@ -3196,15 +3242,14 @@ 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 + 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 + ; For the Information menu: append uptime global info_menu_uptime - extern tUptime info_menu_uptime: lfsr FSR1,tUptime call strcat_text @@ -3215,7 +3260,7 @@ movlw LOW .3600 movwf xB+0 movlw HIGH .3600 - movwf xB+1 ; One day = 3600s + 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 @@ -3223,49 +3268,39 @@ clrf xB+1 movlw .24 movwf xB+0 - call div16x16 ; xA/xB=xC with xA+0 as remainder + call div16x16 ; xC = xA / xB with xA as remainder movff xC+0,lo - movff xC+1,hi ; Full days + movff xC+1,hi ; full days bsf leftbind output_16 PUTC "d" - movff xA+0,lo ; Full hours + movff xA+0,lo ; full hours output_8 PUTC "h" bcf leftbind - return ; Done. - - extern tCalX,tCalY,tCalZ + return ; done + + global menu_cal_x menu_cal_x: + lfsr FSR0,compass_CX_f 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 + bra menu_cal_common global menu_cal_y menu_cal_y: + lfsr FSR0,compass_CY_f 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 - + bra menu_cal_common + global menu_cal_z menu_cal_z: + lfsr FSR0,compass_CZ_f lfsr FSR1,tCalZ +menu_cal_common: call strcat_text - movff compass_CZ_f+0,lo - movff compass_CZ_f+1,hi + movff POSTINC0,lo + movff POSTINC0,hi call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required bsf leftbind output_16 @@ -3277,7 +3312,6 @@ ; ppO2 menu global divesets_ppo2_min - extern tPPO2MIN divesets_ppo2_min: lfsr FSR1,tPPO2MIN call strcat_text @@ -3286,7 +3320,6 @@ bra divesets_ppo2_common global divesets_ppo2_min_cc - extern tPPO2MINCC divesets_ppo2_min_cc: lfsr FSR1,tPPO2MINCC call strcat_text @@ -3295,8 +3328,6 @@ bra divesets_ppo2_common global divesets_ppo2_max - extern tPPO2Max - extern tbar divesets_ppo2_max: lfsr FSR1,tPPO2Max call strcat_text @@ -3305,7 +3336,6 @@ bra divesets_ppo2_common global divesets_ppo2_max_deco - extern tPPO2DECO divesets_ppo2_max_deco: lfsr FSR1,tPPO2DECO call strcat_text @@ -3314,30 +3344,30 @@ ;bra divesets_ppo2_common divesets_ppo2_common: - movwf up ; Save default value + 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. + 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. + 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 + 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 + 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: @@ -3347,8 +3377,8 @@ 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 + 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: @@ -3356,55 +3386,56 @@ return global TFT_fillup_with_spaces -TFT_fillup_with_spaces: ; Fillup FSR2 with spaces (Total string length in #WREG) +TFT_fillup_with_spaces: ; fill up FSR2 with spaces (total string length in #WREG) movwf lo ; save max. string length into lo - movf FSR2L,W ; Get current string length + 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. + 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. + PUTC " " ; add one space + decfsz lo,F ; all done? + bra TFT_fillup_with_spaces2 ; NO - loop + return ; YES - 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_memo_color STRCPY "Desat:" movff int_O_desaturation_time+0,lo movff int_O_desaturation_time+1,hi - call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) - bsf leftbind + call convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) +; bsf leftbind movf lo,W movff hi,lo movwf hi ; exchange lo and hi... - output_8 ; Hours + output_99x ; 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? +; bcf leftbind + movlw surf_warning_length ; only use surface string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) +; movlw .0 ; not needed +; movff WREG,buffer+11 ; not needed STRCAT_PRINT "" - 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_memo_color movff char_I_altitude_wait,WREG tstfsz WREG bra TFT_nofly_time_1 @@ -3415,93 +3446,197 @@ 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) - bsf leftbind + call convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) +; bsf leftbind movf lo,W movff hi,lo movwf hi ; exchange lo and hi... - output_8 ; Hours + output_99x ; 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? +; bcf leftbind + movlw surf_warning_length ; only use surface string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) +; movlw .0 ; not needed +; movff WREG,buffer+11 ; not needed STRCAT_PRINT "" - bcf win_invert return ;============================================================================= 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - ;bcf win_invert - ;return - goto TFT_standard_color + bra TFT_warn_att_info_exit ; and return... + 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 +TFT_warning_fallback: ; show fallback warning + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + bra TFT_warn_att_info_exit ; and return... + + + IFDEF _rx_functions + + global TFT_advice_switch +TFT_advice_switch: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_advice_color + STRCPY_TEXT tswap ; "Swap Tank" + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + bra TFT_warn_att_info_exit ; and return... + + global TFT_attention_transmitter +TFT_attention_transmitter: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_attention_color + STRCPY_TEXT tTransmitter ; "P.Transm." + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... + + global TFT_attention_pres_reading + global TFT_warning_pres_reading +TFT_attention_pres_reading: ; entry point for attention + call TFT_attention_color ; use attention color + bra TFT_common_pres_reading ; continue with common code +TFT_warning_pres_reading: ; entry point for warning + call TFT_warnings_color ; use warnings color + ;bra TFT_common_pres_reading ; continue with common code +TFT_common_pres_reading: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO - done + STRCPY_TEXT tPressure ; "Tank Pres" + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + bra TFT_warn_att_info_exit ; and return... + + global TFT_attention_sac +TFT_attention_sac: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + movff int_O_sac_rate+0,lo ; copy SAC rate to hi:lo + movff int_O_sac_rate+1,hi ; ... + call TFT_color_code_tank_pres_sac; color-code the output + STRCPY_TEXT tSAC ; "SAC", needs to be exactly 3 chars long + STRCAT ": " ; ": " + output_16_3 ; print as xxx + PUTC " " ; print a dummy char to have string termination at the correct place + movff buffer+.7,buffer+.8 ; move decimal digit one position to the right + movlw "." ; load coding of a decimal point + movff WREG,buffer+.7 ; place it before decimal digit + STRCAT_PRINT "" ; dump buffer to screen + bra TFT_warn_att_info_exit ; and return... + + ENDIF global TFT_info_deco -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? +TFT_info_deco ; show info when decompression obligation is decreasing + rcall TFT_warning_set_window ; sets the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO - return + call TFT_advice_color ; actually it is a memo, but we break the rules here and display in advice color (green) + STRCPY_TEXT tDecoInfo ; write "Deco Zone" + movlw dm_warning_length ; select divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" ; print buffer + bra TFT_warn_att_info_exit ; and return... + + + IFDEF _cave_mode + + global TFT_info_cave_mode +TFT_info_cave_mode: + rcall TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the message? 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) + call TFT_memo_color ; YES - set memo color + STRCPY_TEXT tCaveMode ; write "Cave Mode" + movlw dm_warning_length ; select divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" ; print buffer - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... + + global TFT_info_dive_turned +TFT_info_dive_turned: + rcall TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the message? + return ; NO - return + call TFT_attention_color ; YES - set attention color + STRCPY_TEXT tDiveTurned ; write "Dv.turned" + movlw dm_warning_length ; select divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" ; print buffer + bra TFT_warn_att_info_exit ; and return... + + global TFT_warn_cave_shutdown +TFT_warn_cave_shutdown: + rcall TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the message? + return ; NO - return + call TFT_warnings_color ; YES - set warning color + STRCPY_TEXT tCaveModeShutdown ; write "X-Cave-X" + movlw dm_warning_length ; select divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" ; print buffer + bra TFT_warn_att_info_exit ; and return... + + ENDIF 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO movff int_O_gradient_factor+0,lo ; bank-safe copy gradient factor movff int_O_gradient_factor+1,hi ; - call TFT_color_code_gf ; Color-code Output + 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) + 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 ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" bcf leftbind bcf win_invert +TFT_warn_att_info_exit: 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? + tstfsz WREG ; is there room for the message? return ; NO call TFT_attention_color ; set attention color as default movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings @@ -3509,17 +3644,17 @@ call TFT_warnings_color ; YES - reconfigure to warning color STRCPY_TEXT tMicroBubbles movlw dm_warning_length ; divemode string length - btfss divemode ; in Divemode? + 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) + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; 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? + tstfsz WREG ; is there room for the message? return ; NO call TFT_attention_color movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings @@ -3527,105 +3662,135 @@ call TFT_warnings_color ; YES - reconfigure to warning color STRCPY "X-ZHL16-X" movlw dm_warning_length ; divemode string length - btfss divemode ; in Divemode? + 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) + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... global TFT_warning_gas_needs_warn global TFT_warning_gas_needs_att 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... TFT_warning_gas_needs_war_helper: - incf warning_counter,F ; increase counter + incf message_counter,F ; increase counter btfsc gas_needs_warning ; is it a new warning? return ; NO - do not show the gas needs custom view again - bsf gas_needs_warning ; YES - memorise it's an old now + bsf gas_needs_warning ; YES - memorize it's an old now bra TFT_warning_gas_needs_helper_com TFT_warning_gas_needs_att_helper: - incf warning_counter,F ; increase counter + incf message_counter,F ; increase counter btfsc gas_needs_attention ; is it a new attention? return ; NO - do not show the gas needs custom view again - bsf gas_needs_attention ; YES - memorise it's an old now + bsf gas_needs_attention ; YES - memorize it's an old now TFT_warning_gas_needs_helper_com: - 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 + btfsc alternative_divelayout ; in alternative layout? + call switch_layout_to_normal ; YES - switch to normal layout + movlw index_gas_needs_ascent-1 ; custom view number one below gas needs view + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> gas needs view will be shown 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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... + + + global TFT_warning_no_BO_gas +TFT_warning_no_BO_gas: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_attention_color ; select attention color as default + STRCPY_TEXT tnoBOgas ; "B/O Gas X" + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + bra TFT_warn_att_info_exit ; and return... + + + global TFT_advice_gas_change +TFT_advice_gas_change: + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_advice_color ; set advice color + STRCPY_TEXT tgaschange ; "Change?" + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + bra TFT_warn_att_info_exit ; and return... global TFT_warning_sensor_disagree -TFT_warning_sensor_disagree: ; Show sensor disagree warning +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 + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + movlw dm_warning_length ; divemode string length + rcall TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... + bra TFT_warn_att_info_exit ; and return... TFT_warning_sensor_dis_helper: btfsc sensor_warning ; is it a new warning? return ; NO - do not show the gas needs custom view again - bsf sensor_warning ; YES - memories it's an old warning now - clrf menupos3 ; set fake current view number - bsf toggle_customview ; initiate toggle of customview -> sensor view will be shown + bsf sensor_warning ; YES - memorize it's an old warning now + btfsc alternative_divelayout ; in alternative layout? + call switch_layout_to_normal ; YES - switch to normal layout + movlw index_ppo2_sensors-1 ; custom view number one below ppO2 sensors + movwf menupos3 ; set custom view number + bsf toggle_customview ; initiate toggle to desired custom view -> ppO2 sensors return ;============================================================================= -TFT_warning_set_window: ; Sets the row and column for the current warning +TFT_warning_set_window: ; set the row and column for the current message ; ignore warning (now)? - decf warning_counter,W ; -1 + decf message_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 + btfss alternative_divelayout ; in alternative layout, do not divide... + rrcf WREG,W ; (message_counter-1)/2 + cpfseq message_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 + 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 +TFT_warning_set_window3a: + btfss message_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 @@ -3636,7 +3801,7 @@ 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 + btfss message_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 @@ -3649,40 +3814,39 @@ 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 - call TFT_color_code_battery ; Color-code battery percent + rcall TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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) + 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 ; fill up 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 -TFT_gf_mask: - ; The mask + bra TFT_custview_exit1 ; and return... + + + global TFT_gf_factors_mask ; mask for GF factors +TFT_gf_factors_mask: call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row + WIN_TINY dm_custom_gf_column1+.4, dm_custom_gf_title_row STRCPY_TEXT_PRINT tGFactors - WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row + WIN_TINY dm_custom_gf_column2+.2, dm_custom_gf_title_row STRCPY_TEXT_PRINT taGFactors - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + WIN_TINY dm_custom_gf_column3-.3, 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 + call TFT_memo_color + WIN_STD dm_custom_gf_column1, dm_custom_gf_row bsf leftbind movff opt_GF_low,lo output_8 @@ -3691,183 +3855,254 @@ output_8 STRCAT_PRINT "" ; Show aGF (Static) - call TFT_standard_color + call TFT_memo_color TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater - bra TFT_gf_mask2 ; Show "---" instead + bra TFT_gf_mask2 ; show "---" instead btfss use_agf call TFT_disabled_color - WIN_STD dm_custom_agf_column, dm_custom_agf_row + WIN_STD dm_custom_gf_column2, dm_custom_gf_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... - + bra TFT_custview_exit1 ; and return... TFT_gf_mask2: - WIN_STD dm_custom_agf_column+.10, dm_custom_agf_row + WIN_STD dm_custom_gf_column2+.10, dm_custom_gf_row STRCPY_PRINT "---" + bra TFT_custview_exit1 ; and return... + + + global TFT_ceiling_GF_tissue_mask ; mask for ceiling, current GF and tissues +TFT_ceiling_GF_tissue_mask: + call TFT_divemask_color + WIN_TINY dm_custom_ceiling_column+.2,dm_custom_ceiling_title_row + STRCPY_TEXT_PRINT tCeiling + WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row + STRCPY_TEXT_PRINT tDiveTissues +; collides with ceiling output and not really needed, too +; 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 + TSTOSS char_I_deco_model ; in GF mode (0 = ZH-L16, 1 = ZH-L16-GF)? + bra TFT_custview_exit1 ; NO - no GF info in none-GF mode + WIN_TINY dm_custom_gf_column1, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tGFInfo + bra TFT_custview_exit1 ; and return... + + + global TFT_ceiling_GF_tissue ; data for ceiling, current GF and tissues +TFT_ceiling_GF_tissue: + WIN_MEDIUM dm_custom_ceiling_column,dm_custom_ceiling_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_tissue_cGF_m + call convert_mbar_to_feet ; convert value in hi:lo from mbar to feet + output_16 ; yxz + bra TFT_ceiling_tissue_cGF0 +TFT_ceiling_tissue_cGF_m: + bsf ignore_digit5 ; no cm (flag will be cleared by output_16) + output_16dp .3 ; yxz.a +TFT_ceiling_tissue_cGF0: 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 -TFT_gf_info: - WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row + STRCAT_PRINT " " + ; Show tissue diagram + call DISP_tissue_saturation_graph; show char_O_tissue_N2_saturation and char_O_tissue_He_saturation + ; Show current GF + TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + bra TFT_custview_exit1 ; no GF info for none-GF mode + WIN_MEDIUM dm_custom_clock_column+.3, dm_custom_gf_row + movff int_O_gradient_factor+0,lo ; gradient factor absolute, 100% = on M-line of straight Buhlmann + movff int_O_gradient_factor+1,hi ; hi byte holds flags + call TFT_color_code_gf ; color-code output + output_8 ; need to print lo only, int_O_gradient_factor value is limited to 255 + STRCAT_PRINT "" + WIN_STD dm_custom_clock_column+.40, dm_custom_gf_row+.5 + STRCAT_PRINT "%" ; % is printed in color set by TFT_color_code_gf, too + bra TFT_custview_exit1 ; and return... + + + global TFT_gf_factors ; data for GF factors +TFT_gf_factors: + WIN_STD dm_custom_gf_column3, dm_custom_gf_row movff int_O_gradient_factor+0,lo ; gradient factor absolute (Non-GF model) movff int_O_gradient_factor+1,hi - call TFT_color_code_gf ; Color-code Output + 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 +TFT_custview_exit1: + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_clock_batt_surfpress_mask ; mask for clock, battery and surface pressure +TFT_clock_batt_surfpress_mask: 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 + STRCPY_TEXT_PRINT tTime ; "Time" + WIN_TINY dm_custom_battery_column, dm_custom_battery_title_row + STRCPY_TEXT_PRINT tBattery ; "Battery" + WIN_TINY dm_custom_surfpres_column+.8, dm_custom_surfpres_title_row + STRCPY_TEXT_PRINT tSurface ; "Surface" + ; Show Surface Pressure (done in mask, because it's static during the dive) + call TFT_standard_color + WIN_SMALL dm_custom_surfpres_column, dm_custom_surfpres_row + movff last_surfpressure_30min+0,lo + movff last_surfpressure_30min+1,hi + output_16 + PUTC ' ' + STRCAT_TEXT_PRINT tMBAR ; mbar (hPa) + bra TFT_custview_exit1 ; and return... + + + global TFT_clock_batt_surfpress ; data for clock, battery and surface pressure +TFT_clock_batt_surfpress: + ; Update Clock 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 + call TFT_standard_color + movff hours,lo + output_99 + PUTC ':' + movff mins,lo + output_99x + PUTC ":" + movff secs,lo + output_99x + STRCAT_PRINT "" + ; Show Battery Info + WIN_SMALL dm_custom_battery_column, dm_custom_battery_percent_row + movff batt_percent,lo ; get battery percent + call TFT_color_code_battery ; color-code battery percent +; bsf leftbind output_8 - bcf leftbind +; bcf leftbind STRCAT "% " movlw 0x00 - movff WREG,buffer+4 ; Only "xxx%" + 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 + call TFT_memo_color + WIN_SMALL dm_custom_battery_column, dm_custom_battery_volt_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" + 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 + ; Surface pressure is shown in mask because it is static + bra TFT_custview_exit1 ; and return... + + + global TFT_pscr_info_mask ; mask for pSCR info +TFT_pscr_info_mask: rcall TFT_mask_ppo2 call TFT_divemask_color - WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row + WIN_TINY dm_custom_pscr_drop_column, dm_custom_pscr_title_row STRCPY_TEXT_PRINT tPSCR_O2_drop - WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row + WIN_TINY dm_custom_pscr_ratio_column, dm_custom_pscr_title_row STRCPY_TEXT_PRINT tPSCR_lungratio - goto TFT_standard_color ; and return... - - global TFT_pscr_info ; Show pSCR-ppO2, drop and lung ratio + bra TFT_custview_exit1 ; and return... + + global TFT_pscr_info ; data for pSCR info TFT_pscr_info: ;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 + WIN_MEDIUM dm_custom_ppo2_column,dm_custom_ppo2_row + movff int_O_pSCR_ppO2+0,lo ; copy pSCR ppO2 to hi:lo movff int_O_pSCR_ppO2+1,hi - call TFT_color_code_ppo2 ; color-code output + call TFT_color_code_ppo2 ; color-code output bsf leftbind - output_16dp .3 ; x.xx bar + 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 + ; Show drop + WIN_STD dm_custom_pscr_drop_column+.11,dm_custom_pscr_row + call TFT_memo_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 + WIN_STD dm_custom_pscr_ratio_column+.5,dm_custom_pscr_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: + bra TFT_custview_exit1 ; and return... + + + global TFT_gas_needs_ascent_mask ; mask for gas needs ascent +TFT_gas_needs_ascent_mask: + WIN_TINY dm_custom_gas_column_title, dm_custom_gas_mask_row 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! - clrf up - 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 - 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 + IFDEF _cave_mode + movff char_O_deco_info,WREG ; get the deco info vector + btfss WREG,gas_needs_cave ; are the gas needs calculated for cave mode? + bra TFT_gas_needs_mask_ascent_1 ; NO - show as direct ascent needs + bsf gas_needs_mode_last ; YES - remember last results were for cave mode + STRCPY_TEXT tGasNeedsCaveMode ; - "Gas Needs Cave Mode" + bra TFT_gas_needs_mask_ascent_2 +TFT_gas_needs_mask_ascent_1: + bcf gas_needs_mode_last ; remember last results were for direct ascent + STRCPY_TEXT tGasNeedsAscent ; "Gas Needs Ascent" +TFT_gas_needs_mask_ascent_2: + ELSE + STRCPY_TEXT tGasNeedsAscent ; "Gas Needs Ascent" + ENDIF + STRCAT_PRINT " (bar)" ; " (bar)" + bra TFT_custview_exit1 ; and return... + + + global TFT_gas_needs_ascent ; data for gas needs ascent +TFT_gas_needs_ascent: ; LIMITATION: there is only space for 4 gases on the screen - if 5 gases have a pres_need > 0, then only the first 4 will be shown! + IFDEF _cave_mode + movff char_O_deco_info,WREG ; get deco info vector + btfss WREG,gas_needs_cave ; are the gas needs calculated for cave mode? + bra TFT_gas_needs_ascent_1 ; NO - continue below... + btfsc gas_needs_mode_last ; YES - were the last results calculated for cave mode? + bra TFT_gas_needs_ascent_3 ; YES - mask still valid + bra TFT_gas_needs_ascent_2 ; NO - redraw mask +TFT_gas_needs_ascent_1: + btfss gas_needs_mode_last ; NO - were the last results calculated for direct ascent? + bra TFT_gas_needs_ascent_3 ; YES - mask still valid + ;bra TFT_gas_needs_ascent_2 ; NO - redraw mask +TFT_gas_needs_ascent_2: + rcall TFT_gas_needs_ascent_mask ; redraw mask +TFT_gas_needs_ascent_3: + ENDIF + clrf up ; initialize gas index (0-4) + WIN_SMALL dm_custom_gas_column1+.5,dm_custom_gas_row1 + rcall TFT_gas_needs_helper + WIN_SMALL dm_custom_gas_column1+.5,dm_custom_gas_row2 + rcall TFT_gas_needs_helper + WIN_SMALL dm_custom_gas_column2+.5,dm_custom_gas_row1 + rcall TFT_gas_needs_helper + WIN_SMALL dm_custom_gas_column2+.5,dm_custom_gas_row2 + rcall TFT_gas_needs_helper return TFT_gas_needs_helper: - call TFT_standard_color + call TFT_memo_color 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 - 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 + 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 + rlncf WREG,W ; multiply by 2 + incf WREG,W ; add 1 to address high byte + lfsr FSR1,int_O_ascent_pres_need ; load base of ascent press needs + movff PLUSW1,hi ; read HIGH(int_O_ascent_pres_need[up]) 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_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 @@ -3876,33 +4111,30 @@ 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 ":" + PUTC ':' ; ":" 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 - rlncf WREG,W ; multipy by 2 - lfsr FSR1,int_O_tank_pres_need+1 ; read upper part of integer - movff PLUSW1,hi + rlncf WREG,W ; multiply by 2 + lfsr FSR1,int_O_ascent_pres_need ; load base of ascent press needs (default) + movff PLUSW1,lo ; read LOW(int_O_ascent_pres_need[up]) + incf WREG,W ; add 1 to address high byte + movff PLUSW1,hi ; read HIGH(int_O_ascent_pres_need[up]) 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 - movff int_O_tank_pres_need+1,WREG ; get HIGH(int_O_tank_pres_need[0]) which hold flag for invalid data + 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 + movff int_O_ascent_pres_need+1,WREG ; get HIGH(int_O_ascent_pres_need[0]) which holds 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 + call TFT_disabled_color ; YES - print gas need in disabled 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) + 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) 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... + bra TFT_custview_exit2 ; and return... global TFT_mask_ppo2 ; helper function for several custom views @@ -3910,28 +4142,28 @@ 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? + btfsc FLAG_bailout_mode ; 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 + WIN_TINY dm_custom_ppo2_column-.2,dm_custom_ppo2_title_row ; tuned position for longer text (-8 = on leftmost edge of display) STRCPY_TEXT_PRINT tppO2Dil ; print "ppO2(Dil)" - goto TFT_standard_color ; and return... + bra TFT_custview_exit2 ; 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? + btfsc FLAG_bailout_mode ; 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 + WIN_TINY dm_custom_ppo2_column-.2,dm_custom_ppo2_title_row ; tuned position for longer text (-8 = on leftmost edge of display) STRCPY_TEXT_PRINT tppO2Mix ; print "ppO2(Mix)" - goto TFT_standard_color ; and return... + bra TFT_custview_exit2 ; and return... TFT_mask_ppo2b: ; OC mode or bailout - WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row ; normal position + WIN_TINY dm_custom_ppo2_column-.2, dm_custom_ppo2_title_row ; normal position STRCPY_TEXT_PRINT tppO2 ; in all other modes - goto TFT_standard_color ; and return... + bra TFT_custview_exit2 ; 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_ppo2_column, dm_custom_ppo2_row movff int_O_pure_ppO2+0,lo ; copy ppO2 of the pure gas to hi:lo movff int_O_pure_ppO2+1,hi call TFT_color_code_ppo2 ; color-code output @@ -3939,21 +4171,21 @@ 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 + bra TFT_custview_exit2 ; and return... + + + global TFT_ppo2_ead_end_cns_mask ; mask for ppO2, END/EAD and CNS 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 + WIN_TINY dm_custom_cns_column, dm_custom_cns_title_row STRCPY_TEXT_PRINT tCNS2 - goto TFT_standard_color ; and return... - - - global TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + bra TFT_custview_exit2 ; and return... + + + global TFT_ppo2_ead_end_cns ; data for ppO2, END/EAD and CNS TFT_ppo2_ead_end_cns: ;show ppO2 rcall TFT_display_pure_ppo2 ; show ppO2 of the pure gas @@ -3967,57 +4199,58 @@ 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 + WIN_STD dm_custom_cns_column+.3, dm_custom_cns_row movff int_O_CNS_fraction+0,lo movff int_O_CNS_fraction+1,hi - call TFT_color_code_cns ; Color-code CNS output + call TFT_color_code_cns ; color-code CNS output bsf leftbind - output_16_3 ; Displays only 0...999 + output_16_3 ; displays only 0...999 bcf leftbind STRCAT_PRINT "%" +TFT_custview_exit2: 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 +TFT_end_ead_common_imperial: + 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 + call convert_mbar_to_feet ; convert value in hi:lo 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 + bra TFT_end_ead_common_exit TFT_end_ead_common_metric: 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) + call TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" return - global TFT_sensor_check_mask ; show ppO2 of O2 and Diluent mask + global TFT_sensor_check_mask ; mask for sensor check TFT_sensor_check_mask: call TFT_divemask_color - WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_s_check_title_column, dm_custom_s_check_title_row STRCPY_TEXT_PRINT tSensorCheck - WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_ppO2_column, dm_custom_s_check_title_row STRCPY_TEXT_PRINT tppO2O2 - WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_ppDil_column, dm_custom_s_check_title_row STRCPY_TEXT_PRINT tppO2Dil - goto TFT_standard_color ; and return... - - global TFT_sensor_check ; show ppO2 of O2 and Diluent + bra TFT_sensor_check_exit ; and return... + + + global TFT_sensor_check ; data for sensor check 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 + WIN_MEDIUM dm_custom_ppO2_column, dm_custom_s_check_row movff int_O_O2_ppO2+0,lo ; copy ppO2 of pure O2 to hi:lo movff int_O_O2_ppO2+1,hi call TFT_color_code_ppo2 ; color-code output @@ -4026,7 +4259,7 @@ 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 + WIN_MEDIUM dm_custom_ppDil_column, dm_custom_s_check_row movff int_O_pure_ppO2+0,lo ; copy ppO2 of pure gas to hi:lo movff int_O_pure_ppO2+1,hi call TFT_color_code_ppo2 ; color-code output @@ -4034,7 +4267,8 @@ output_16dp .3 ; x.xx bar bcf leftbind STRCAT_PRINT "" - goto TFT_standard_color ; and return... +TFT_sensor_check_exit: + bra TFT_custview_exit2 ; and return... ;============================================================================= @@ -4042,21 +4276,20 @@ TFT_surface_lastdive: call TFT_divemask_color WIN_TINY surf_gaslist_column,surf_gaslist_row+.5 - STRCAT_TEXT_PRINT tLastDive ; Last Dive: + STRCAT_TEXT_PRINT tLastDive ; "Last Dive:" WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)+.5 - STRCAT_TEXT_PRINT tDivetime ; Divetime + STRCAT_TEXT_PRINT tDivetime ; "Divetime:" WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)+.5 - STRCAT_TEXT_PRINT tMaxDepth ; Max. Depth + 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 movff surface_interval+0,lo ; NO - show dive interval movff surface_interval+1,hi - call convert_time ; lo=mins, hi=hours + call convert_time ; converts hi:lo in minutes to hours (up:hi) and minutes (lo) movf hi,W movff lo,hi movwf lo ; exchange lo and hi @@ -4075,21 +4308,21 @@ movlw LOW .3600 movwf xB+0 movlw HIGH .3600 - movwf xB+1 ; One day = 3600s + 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 + ;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 + call div16x16 ; xC = xA / xB with xA as remainder movff xC+0,lo - movff xC+1,hi ; Full days + movff xC+1,hi ; full days bsf leftbind output_16 PUTC "d" - movff xA+0,lo ; Full hours + movff xA+0,lo ; full hours output_8 STRCAT_PRINT "h " TFT_surface_lastdive_2: @@ -4107,13 +4340,13 @@ 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 + rcall convert_mbar_to_feet ; convert value in hi:lo 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... + bsf ignore_digit5 ; no cm (flag will be cleared by output_16) movlw d'1' ; +1 movff WREG,ignore_digits ; no 1000m output_16dp .3 ; xxx.y @@ -4121,19 +4354,19 @@ TFT_surface_lastdive2: STRCAT_PRINT "" bcf leftbind - return ; Done. + return ; done. ;============================================================================= global TFT_surface_tissues -TFT_surface_tissues: ; Show Tissue diagram in surface mode +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? + 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 @@ -4145,14 +4378,14 @@ 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) + movwf 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 + movwf win_leftx2 ; column left (0-159) + movlw surf_tissue_diagram_right-surf_tissue_diagram_left-.4 ; max width for N2 bars + movwf win_width lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' @@ -4161,26 +4394,26 @@ surf_tissue_saturation_graph_N2: movlw surf_tissue_diagram_top+.23 ; surface mode addwf hi,W - movff WREG,win_top ; row top (0-239) + movwf 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 ---------------------------------------------------- - movlw surf_tissue_diagram_left + .24 ; start position for He bars (.15 without x2) - 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 + movlw surf_tissue_diagram_left+.24 ; start position for He bars (.15 without x2) + movwf win_leftx2 ; column left (0-159) + movlw surf_tissue_diagram_right-surf_tissue_diagram_left-.24 ; max width for He bars + movwf win_width lfsr FSR2, char_O_tissue_He_saturation movlw d'16' movwf lo ; 16 tissues - clrf hi ; row offset + clrf hi ; row offset surf_tissue_saturation_graph_He: movlw surf_tissue_diagram_top+.23+.57 ; surface mode addwf hi,W - movff WREG,win_top ; row top (0-239) + movwf win_top ; row top (0-239) rcall surf_tissue_saturation_loop ; show one tissue decfsz lo,F bra surf_tissue_saturation_graph_He @@ -4191,7 +4424,7 @@ 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... @@ -4205,7 +4438,7 @@ 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 up - movff win_width+0,WREG ; get max window width (win_width) + movf win_width+0,W ; 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 – @@ -4218,22 +4451,25 @@ goto TFT_box ; and return... ;============================================================================= -; Draw saturation graph in dive mode. +; 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 + WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159 ; outer frame + + ;---- clear area showing leading tissue number as it may not be printed over + WIN_BOX_BLACK dm_custom_tissue_diagram_top+.16, dm_custom_tissue_diagram_top+.16+.10, dm_custom_tissue_diagram_left+.32, dm_custom_tissue_diagram_left+.32+.8 ; top, bottom, left, right movlw .1 - movff WREG,win_height ; row bottom (0-239) + movwf 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 + movlw dm_custom_tissue_diagram_left+.3 ; divemode + movwf win_leftx2 ; column left (0-159) + movlw .159-dm_custom_tissue_diagram_left-.4 ; width + movwf win_width lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' @@ -4247,10 +4483,10 @@ ;---- 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 + movlw dm_custom_tissue_diagram_left+.8 ; divemode + movwf win_leftx2 ; column left (0-159) + movlw .159-dm_custom_tissue_diagram_left-.14 ; width + movwf win_width lfsr FSR2, char_O_tissue_He_saturation movlw d'16' @@ -4261,16 +4497,46 @@ rcall tissue_saturation_graph_loop ; show one tissue decfsz lo,F bra tissue_saturation_graph_He - goto TFT_standard_color ; and return... + + ;---- Print Number of leading Tissue ------------------------------------- + + ; TODO: some flicker due to overwriting by tissue bars + + movff int_O_gradient_factor+0,WREG ; get current gradient factor (only low byte used for value) + tstfsz WREG ; current gradient factor = 0 ? + bra tissue_saturation_graph_0 ; NO - print number of leading tissue + movff char_O_deco_info,WREG ; YES - get deco info vector + btfss WREG,deco_ceiling ; - do we have a ceiling obligation? + goto TFT_standard_color ; NO - can ascent directly, don't print number, set standard color and return + ; YES - print number of leading tissue +tissue_saturation_graph_0: + movff char_O_lead_number,lo ; get number of leading tissue as 0-15 + incf lo,F ; adjust to 1-16 + movlw .10 + cpfsgt lo ; is it > 10 ? + bra tissue_saturation_graph_1 ; NO - will output a single digit number + ; start position for a 2 digit number + WIN_TINY dm_custom_tissue_diagram_left+.32,dm_custom_tissue_diagram_top+.16 + bra tissue_saturation_graph_2 +tissue_saturation_graph_1: + ; start position for a 1 digit number + WIN_TINY dm_custom_tissue_diagram_left+.32+.4,dm_custom_tissue_diagram_top+.16 +tissue_saturation_graph_2: + call TFT_standard_color ; set output color + bsf leftbind + output_8 ; print number in leftbind, i.e. without leading zeros or spaces + bcf leftbind + STRCAT_PRINT "" ; finalize output + return tissue_saturation_graph_loop: addwf hi,W - movff WREG,win_top ; row top (0-239) + movwf 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 + btfss WREG,7 ; check if flag for increasing tissue pressure set bra tissue_saturation_graph_loop_1 ; NO - keep color movwf up ; YES - buffer WREG movlw color_orange ; select color for tissues with increasing pressure @@ -4293,90 +4559,400 @@ 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 + call TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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 + call TFT_color_code_cns ; color-code CNS output bsf leftbind - output_16_3 ; Displays only 0...999 + 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) + 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 ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" bcf win_invert - goto TFT_standard_color ; and return... + bra TFT_custview_exit3 ; and return... 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 + call TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + 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 ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... - - - 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 - 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 - call TFT_color_code_ppo2 ; Color-code output + bra TFT_custview_exit3 ; and return... + + + global TFT_display_ppo2_warning +TFT_display_ppo2_warning: ; with ppO2 including attention/warning flags in hi:lo + call TFT_warning_set_window ; set the row and column for the current message + tstfsz WREG ; is there room for the message? + return ; NO + call TFT_color_code_ppo2 ; color-code output + btfsc FLAG_bailout_mode ; in bailout? + bra TFT_display_diluent_2 ; YES 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:" + STRCPY_TEXT tdil ; YES - 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_2 ; NO - continue with OC + STRCPY_TEXT tmix ; YES - print "Mix:" bra TFT_display_diluent_3 TFT_display_diluent_2: - STRCPY_TEXT tppO2 ; OC mode or bailout, print "ppO2:" + STRCPY_TEXT tppO2 ; bailout or OC mode, 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) + movlw dm_warning_length ; divemode string length + call TFT_fillup_with_spaces ; fill up FSR2 with spaces (total string length in #WREG) STRCAT_PRINT "" +TFT_custview_exit3: goto TFT_standard_color ; and return... + + 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 + ;============================================================================= global TFT_LogOffset_Logtitle TFT_LogOffset_Logtitle: STRCPY_TEXT tLogOffset PUTC ":" - call do_logoffset_common_read ; Offset into lo:hi + call do_logoffset_common_read ; offset into lo:hi bsf leftbind output_16_4 bcf leftbind PUTC " " - return ; No "_PRINT" here... + return ; no "_PRINT" here... ;============================================================================= +; RX Functions + + IFDEF _rx_functions + + global TFT_pressures_SAC_mask ; mask for pressures and SAC +TFT_pressures_SAC_mask: + call TFT_divemask_color + ; pressure reading 1 + WIN_TINY dm_custom_tankdata_pres1_col, dm_custom_tankdata_mask_row + movff char_I_pressure_gas+0,WREG ; =0: disabled, =1..10: gases/dils + bcf aux_flag ; selector for disabled / need set to disabled + call TFT_pressures_SAC_mask_helper ; print gas composition or " ---" if disabled + ; pressure reading 2 + WIN_TINY dm_custom_tankdata_pres2_col, dm_custom_tankdata_mask_row + movff char_I_pressure_gas+1,WREG ; =0: need to reading 1, =1..10: gases/dils + bsf aux_flag ; selector for disabled / need set to need + call TFT_pressures_SAC_mask_helper ; print gas composition or "Need " if 0 + ; SAC rate + WIN_TINY dm_custom_tankdata_SAC_col, dm_custom_tankdata_mask_row + STRCPY_TEXT tSAC ; "SAC + STRCAT " (" ; ( + STRCAT_TEXT tLitersMinute ; l/min + STRCAT_PRINT ")" ; )" + bra TFT_custview_exit3 ; and return... + +TFT_pressures_SAC_mask_helper: + tstfsz WREG ; pressure reading assigned? + bra TFT_dive_tankdata_mask_helper_1 ; YES - print gas composition + btfsc aux_flag ; NO - check auxiliary flag + bra TFT_dive_tankdata_mask_helper_2 ; 1 - print "Need " + STRCAT_PRINT " ---" ; 0 - print " ---" + return ; - done +TFT_dive_tankdata_mask_helper_1: + decf WREG,W ; (1..10) -> (0..9) + bsf short_gas_decriptions ; just "Air", "O2" or "xx/yy" + call gaslist_strcat_gas_WREG ; print composition of gas/dil in WREG (0..9) + bra TFT_dive_tankdata_mask_helper_3 ; finish with adding "(bar)" +TFT_dive_tankdata_mask_helper_2: + STRCPY_TEXT tNeed ; "Need" +TFT_dive_tankdata_mask_helper_3: + STRCAT_PRINT "(bar)" + return + + + global TFT_pressures_SAC ; data for pressures and SAC +TFT_pressures_SAC: + ; check mode for second reading + bcf aux_flag ; clear auxiliary flag by default (reading 2 is pressure) + movff char_I_pressure_gas+1,WREG ; =0: need to reading 1, =1..10: gases/dils + addlw .0 ; dummy operation to set status register flags + btfsc STATUS,Z ; gas selected = 0 (i.e. no 2nd pressure reading) ? + bsf aux_flag ; YES - set auxiliary flag (display position of reading 2 shall show need to reading 1) + ; get data of reading 1 + movff int_IO_pressure_value+0,lo ; copy pressure 1 to hi:lo + movff int_IO_pressure_value+1,hi + movff char_I_pressure_stat+0,ex ; copy status data + ; pressure of reading 1 + WIN_STD dm_custom_tankdata_pres1_col+.4,dm_custom_tankdata_row + rcall TFT_pressures_SAC_helper_1 ; print pressure if available, else " ---" + ; battery status of reading 1 + WIN_SMALL dm_custom_hud_sensor1_column+.4+.36,dm_custom_tankdata_row + rcall TFT_pressures_SAC_helper_2 ; print or clear down arrow as low bat indicator + ; get data for reading 2 + btfsc aux_flag ; shall reading 2 show need to reading 1 ? + bra TFT_pressures_SAC_1 ; YES + movff int_IO_pressure_value+2,lo ; NO - copy pressure 2 to hi:lo + movff int_IO_pressure_value+3,hi ; + movff char_I_pressure_stat+1,ex ; - copy status data + bra TFT_pressures_SAC_2 +TFT_pressures_SAC_1: + movff int_O_pressure_need+0,lo ; YES - copy need to pressure 1 to hi:lo + movff int_O_pressure_need+1,hi ; + clrf ex ; - set status data to 0 +TFT_pressures_SAC_2: + ; pressure of reading 2 + WIN_STD dm_custom_tankdata_pres2_col+.2,dm_custom_tankdata_row + rcall TFT_pressures_SAC_helper_1 ; print pressure if available, else " ---" + ; battery status of reading 2 + WIN_SMALL dm_custom_tankdata_pres2_col+.2+.36,dm_custom_tankdata_row + rcall TFT_pressures_SAC_helper_2 ; print or clear down arrow as low bat indicator + ; SAC + WIN_STD dm_custom_tankdata_SAC_col+.6,dm_custom_tankdata_row + movff int_O_sac_rate+0,lo ; copy SAC rate to hi:lo + movff int_O_sac_rate+1,hi + btfsc hi,int_not_avail_flag ; SAC rate available? + bra TFT_pressures_SAC_4 ; NO - print " --.-" + call TFT_color_code_tank_pres_sac ; color-code the output + output_16_3 ; print as xxx + PUTC " " ; print a dummy char to have the string termination at the correct place + movff buffer+.2,buffer+.3 ; move the decimal digit one position to the right + movlw "." ; load coding of a decimal point + movff WREG,buffer+.2 ; place it before decimal digit + movlw " " ; load coding of a space character + movff buffer+.1,up ; get the character in front of the decimal point + cpfseq up ; is it a space? + bra TFT_pressures_SAC_3 ; NO - continue + movlw "0" ; YES - load coding of a zero + movff WREG,buffer+.1 ; - place a zero in front of the decimal point +TFT_pressures_SAC_3: + STRCAT_PRINT "" ; dump buffer to screen + bra TFT_custview_exit3 ; and return... +TFT_pressures_SAC_4: + call TFT_disabled_color + STRCAT_PRINT "--.-" ; output for no SAC data available + bra TFT_custview_exit3 ; and return... + +TFT_pressures_SAC_helper_1: + btfss hi,int_not_avail_flag ; pressure available? + bra TFT_pressures_SAC_helper_1a ; YES - print pressure + call TFT_disabled_color ; NO - use disabled color as default + btfsc ex,char_transmitter_lost ; - transmitter lost? + call TFT_attention_color ; YES - use attention color + STRCAT_PRINT " ---" ; - print " ---" + return +TFT_pressures_SAC_helper_1a: + btfsc hi,int_warning_flag ; out of range (signaled by warning flag)? + bra TFT_pressures_SAC_helper_1c ; YES - special treatment + call TFT_color_code_tank_pres_sac ; NO - color-code the output + bsf ignore_digit5 ; - no 0.1 bar (flag will be cleared by output_16) + movf lo,W ; + iorwf hi,W ; - pressure value = 0 ? + bnz TFT_pressures_SAC_helper_1b ; NO - print value + STRCPY_PRINT " 0" ; YES - print a zero manually + return ; - done +TFT_pressures_SAC_helper_1b: + output_16 ; print hi:lo + STRCAT_PRINT "" ; dump buffer to screen + return ; done +TFT_pressures_SAC_helper_1c: + call TFT_color_code_tank_pres_sac ; color-code the output (clears all flags) + STRCPY_PRINT ">400" ; print ">400" + return ; done + +TFT_pressures_SAC_helper_2: + btfss ex,char_transmitter_low_bat ; low battery flag set? + bra TFT_pressures_SAC_helper_2a ; NO - wipe out down arrow (low bat indicator) + call TFT_attention_color ; YES - use attention color + STRCPY_PRINT "\xb8" ; - print down arrow as bat low indication + return +TFT_pressures_SAC_helper_2a: + STRCPY_PRINT " " ; wipe out down arrow (low bat indicator) + return + + + global TFT_menu_tank_pres +TFT_menu_tank_pres: ; imprinting function for main menu / tank setup + call TFT_standard_color + ; get ID + lfsr FSR1,opt_transmitter_id_1 ; load base address of opt_transmitter_id + movf gaslist_gas,W ; get current gas + rlncf WREG,W ; multiply by 2 because IDs are 2 byte in size + movff PLUSW1,lo ; copy opt_transmitter_id+0[gaslist_gas] to lo + incf WREG,W ; increment index + movff PLUSW1,hi ; copy opt_transmitter_id+1[gaslist_gas] to hi + ; show pressure + WIN_SMALL .90, .61 ; column, row (+/- 27 per row) + call get_pres_by_transmitter_id ; get pressure into hi:lo + tstfsz WREG ; do we have valid tank data (WREG=0) ? + bra TFT_menu_tank_pres_1 ; NO - transmitter not found + call TFT_color_code_tank_pres_sac ; set output color according to flags + bsf ignore_digit5 ; no 0.1 bar (flag will be cleared by output_16) + output_16 + bra TFT_menu_tank_pres_2 +TFT_menu_tank_pres_1: + call TFT_disabled_color + STRCAT " ---" ; output for no pressure data available +TFT_menu_tank_pres_2: + STRCAT_TEXT_PRINT tbar ; " bar" + bra TFT_custview_exit3 ; and return... + + + global TFT_surface_tank_pres +TFT_surface_tank_pres: ; show pressure reading above surface pressure + WIN_SMALL surf_decotype_column+.6,surf_decotype_row+.30+.47 + movff int_IO_pressure_value+0,lo ; copy pressure from 1st reading, low byte + movff int_IO_pressure_value+1,hi ; copy pressure from 1st reading, high byte + btfss hi,int_not_avail_flag ; pressure reading 1 available? + bra TFT_surface_tank_pres_0 ; YES + movff int_IO_pressure_value+2,lo ; NO - copy pressure from 2nd reading, low byte + movff int_IO_pressure_value+3,hi ; - copy pressure from 2nd reading, high byte + btfsc hi,int_not_avail_flag ; - pressure reading 2 available? + bra TFT_surface_tank_pres_1 ; NO - show not avail message +TFT_surface_tank_pres_0: ; YES - show pressure + call TFT_color_code_tank_pres_sac ; set output color according to flags + bsf ignore_digit5 ; no 0.1 bar (flag will be cleared by output_16) + output_16 + STRCAT_PRINT "" + bra TFT_surface_tank_pres_2 +TFT_surface_tank_pres_1: + call TFT_disabled_color + STRCAT_PRINT " ---" ; output for no pressure data available +TFT_surface_tank_pres_2: + WIN_SMALL surf_decotype_column+.38,surf_decotype_row+.30+.47 + call TFT_divemask_color + STRCAT_PRINT "bar" ; can not use tbar because it has a leading space + bra TFT_custview_exit3 ; and return... + + + global TFT_surface_tankdata +TFT_surface_tankdata: + lfsr FSR1,rx_buffer ; load base address of RX buffer +; bra TFT_surface_tankdata_debug ; comment in for +++ debug version +++ + WIN_SMALL surf_customtext_column,surf_customtext_row1 + rcall TFT_surface_tankdata_print + WIN_SMALL surf_customtext_column,surf_customtext_row2 + rcall TFT_surface_tankdata_print + WIN_SMALL surf_customtext_column,surf_customtext_row3 + rcall TFT_surface_tankdata_print + WIN_SMALL surf_customtext_column,surf_customtext_row4 + rcall TFT_surface_tankdata_print + WIN_SMALL surf_customtext_column,surf_customtext_row5 + rcall TFT_surface_tankdata_print + return + +TFT_surface_tankdata_print: ; max 12 char + call TFT_standard_color + movff POSTINC1,hi ; ID high (+0) + movff POSTINC1,lo ; ID low (+1) + tstfsz hi ; ID high = 0 ? + bra TFT_surface_tankdata_print_1 ; NO - slot in use + tstfsz lo ; ID low = 0? + bra TFT_surface_tankdata_print_1 ; NO - slot in use + STRCAT_PRINT "---- " ; YES - mark as unused and clear rest of line from previous remains + movf POSTINC1,W ; - dummy read (+2) to advance index + movf POSTINC1,W ; - dummy read (+3) to advance index + movf POSTINC1,W ; - dummy read (+4) to advance index + bra TFT_surface_tankdata_print_3 +TFT_surface_tankdata_print_1: + movf hi,W ; copy ID high to WREG + output_hex ; 2 chars + movf lo,W ; copy ID low to WREG + output_hex ; 2 chars (4 in total) + movff POSTINC1,hi ; pressure high (+2) + movff POSTINC1,lo ; pressure low (+3) + call TFT_color_code_tank_pres_sac ; needed to clear the status flags before output + bsf ignore_digit5 ; no 0.1 bar (flag will be cleared by output_16) + output_16 ; 4 chars (8 in total) + PUTC " " ; 1 char (9 in total) + movf POSTINC1,W ; status (+4) + andlw .7 ; mask out battery voltage + bnz TFT_surface_tankdata_2 ; branch if battery is not completely drained + call TFT_warnings_color ; output in red + STRCAT_PRINT "XXX" ; "XXX" for low + bra TFT_surface_tankdata_print_3 +TFT_surface_tankdata_2: + addlw .28 ; add offset of 2.8 Volt + movff WREG,lo ; + output_99 ; 2 chars (11 in total) + PUTC " " ; dummy char 1 char (12 in total) + movff buffer+.10,buffer+.11 ; move decimal digit of battery voltage one position to the right + movlw "." ; decimal point + movff WREG,buffer+.10 ; place it before decimal digit + STRCAT_PRINT "" ; print buffer to screen +TFT_surface_tankdata_print_3: + movf POSTINC1,W ; dummy read (+5) to advance index + return + + +; TFT_surface_tankdata_debug: ; surface custom view debug output + ; call TFT_standard_color + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*0 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*1 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*2 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*3 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*4 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*5 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*6 + ; rcall TFT_surface_tankdata_debug_print + ; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*7 + ; rcall TFT_surface_tankdata_debug_print + ; return + +; TFT_surface_tankdata_debug_print: + ; movff POSTINC1,hi ; ID high (+0) + ; movff POSTINC1,lo ; ID low (+1) + ; output_16 + ; PUTC "," + ; movff POSTINC1,hi ; pressure high (+2) + ; movff POSTINC1,lo ; pressure low (+3) + ; call TFT_color_code_tank_pres_sac; needed to clear the status flags before output + ; output_16 + ; PUTC "," + ; movff POSTINC1,lo ; status (+4) + ; output_8 + ; PUTC "," + ; movff POSTINC1,lo ; date (+5) + ; output_8 + ; STRCAT_PRINT "" + ; return + + ENDIF + +;============================================================================= global adjust_depth_with_salinity 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 simulator mode + btfsc simulatormode_active ; do not apply salinity in simulator mode return movff opt_salinity,WREG ; 0-5% adjust_depth_with_salinity_log: ; computes salinity setting (FROM WREG!) into lo:hi [mbar] @@ -4384,30 +4960,30 @@ movwf up movlw d'105' ; 105% ? - cpfslt up ; Salinity higher limit - return ; Out of limit, do not adjust lo:hi + cpfslt up ; salinity upper limit + return ; out of limit, do not adjust lo:hi movlw d'99' ; 99% ? - cpfsgt up ; Salinity lower limit - return ; Out of limit, do not adjust lo:hi + cpfsgt up ; salinity lower limit + return ; out of limit, do not adjust lo:hi movff lo,xA+0 movff hi,xA+1 - movlw d'102' ; 0,98bar/10m + movlw d'102' ; 0.98 bar / 10 meter movwf xB+0 clrf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 100) - movff up,xB+0 ; Salinity + call mult16x16 ; xC:4 = xA:2 * xB:2 + 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 = xC:4 / xB:2 with xA as remainder movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value + movff xC+1,hi ; copy corrected values back to lo and hi 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_mbar_to_feet: ; convert value in hi:lo from mbar to feet movff lo,xA+0 movff hi,xA+1 @@ -4438,8 +5014,8 @@ ;============================================================================= - 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 + 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 diff -r 00b24fb4324d -r ca4556fb60b9 src/tft_outputs.inc --- a/src/tft_outputs.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/tft_outputs.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.inc REFACTORED VERSION V2.97 +; File tft_outputs.inc REFACTORED VERSION V2.99e ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -8,43 +8,48 @@ ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code -; Surface mode +; Surface Mode extern TFT_surface_lastdive - extern TFT_show_OC_startgas_surface ; Show first gas and "OSTC2-like" active gases - extern TFT_serial + extern TFT_show_OC_startgas_surface ; show first gas and "OSTC2-like" active gases 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_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_surface_sensor ; update sensor 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_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_cat_beta_rel ; add beta/rel. to current string + extern TFT_cat_beta_release ; add beta/release to current string + extern TFT_surf_set_bearing ; Menu extern TFT_LogOffset_Logtitle - extern TFT_show_color_schemes ; Yes, update the color schemes + extern TFT_show_color_schemes ; update the color schemes + extern TFT_show_time_date_menu -; Dive mode +; Dive Mode extern TFT_display_cns extern TFT_divemins extern TFT_depth + extern TFT_max_depth extern TFT_temp_divemode - extern TFT_max_depth - extern TFT_active_gas_divemode + extern TFT_active_gas_divemode ; active gas and setpoint extern TFT_divemode_mask + 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_display_ndl_mask extern TFT_display_tts extern TFT_display_ndl @@ -55,79 +60,110 @@ extern TFT_display_velocity extern TFT_display_deko extern TFT_mask_ppo2 - extern TFT_display_ppo2 + extern TFT_display_ppo2_warning extern TFT_update_batt_percent_divemode extern TFT_display_apnoe_descent extern TFT_apnoe_clear_surface extern TFT_display_apnoe_surface extern TFT_display_apnoe_last_max extern TFT_display_ftts + extern TFT_clear_divemode_menu ; clear the divemode menu 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_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_clear_safety_stop ; clear safety stop + extern TFT_warning_fallback ; show fallback warning extern TFT_warning_gas_needs_warn extern TFT_warning_gas_needs_att + extern TFT_advice_gas_change extern TFT_warning_sensor_disagree extern TFT_warning_IBCD - extern TFT_CNS_mask - extern TFT_CNS + extern TFT_warning_no_BO_gas extern TFT_display_eod_cns extern TFT_warning_mbubbles extern TFT_warning_outside - extern TFT_display_pure_ppo2 extern TFT_info_deco - extern TFT_show_mode_divemode + +; Divemode Custom Views + extern TFT_avr_stopwatch_mask ; mask for average depth and stopwatch + extern TFT_avr_stopwatch ; data for average depth and stopwatch + extern TFT_ppo2_sensors_mask ; mask for ppO2 sensors + extern TFT_ppo2_sensors ; data for ppO2 sensors + extern TFT_sensor_check_mask ; mask for sensor check + extern TFT_sensor_check ; data for sensor check + extern TFT_pscr_info_mask ; mask for pSCR info + extern TFT_pscr_info ; data for pSCR info + extern TFT_gas_needs_ascent_mask ; mask for gas needs ascent + extern TFT_gas_needs_ascent ; data for gas needs ascent + extern TFT_decoplan_mask ; mask for deco plan + extern TFT_decoplan ; data for deco plan + extern TFT_ceiling_GF_tissue_mask ; mask for ceiling, current GF and tissues + extern TFT_ceiling_GF_tissue ; data for ceiling, current GF and tissues + extern TFT_CNS_mask ; mask for CNS values + extern TFT_CNS ; data for CNS values + extern TFT_ppo2_ead_end_cns_mask ; mask for ppO2, END/EAD and CNS + extern TFT_ppo2_ead_end_cns ; data for ppO2, END/EAD and CNS + extern TFT_gf_factors_mask ; mask for GF factors + extern TFT_gf_factors ; data for GF factors + extern TFT_clock_batt_surfpress_mask ; mask for clock, battery and surface pressure + extern TFT_clock_batt_surfpress ; data for clock, battery and surface pressure + + +; Surface Custom Views + extern TFT_sensor_mV ; Misc extern TFT_standard_color extern TFT_disabled_color + extern TFT_memo_color + extern TFT_advice_color extern TFT_attention_color extern TFT_warnings_color extern TFT_divemask_color + + extern TFT_color_code_gas + extern TFT_color_code_gaslist + extern TFT_color_code_cns + extern TFT_color_code_tank_pres_sac + 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_display_pure_ppo2 ; helper function + extern TFT_debug_output + + +; Alternative 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 + extern TFT_big_deco_alt ; the big deco + + + IFDEF _rx_functions + extern TFT_pressures_SAC_mask ; mask for pressures and SAC + extern TFT_pressures_SAC ; data for pressures and SAC + extern TFT_menu_tank_pres ; update tank data when in tank setup menu + extern TFT_surface_tank_pres ; update tank data when in surface mode + extern TFT_surface_tankdata ; show the tank pressure data in surface customview + extern TFT_attention_transmitter ; show attention for transmitter + extern TFT_attention_pres_reading ; show attention for pressure reading + extern TFT_warning_pres_reading ; show warning for pressure reading + extern TFT_attention_sac ; show attention for SAC + extern TFT_advice_switch + ENDIF + + IFDEF _cave_mode + extern TFT_info_cave_mode ; show info that in cave mode + extern TFT_info_dive_turned ; show info that dive is turned + extern TFT_warn_cave_shutdown ; show warning that cave mode has shut down + ENDIF \ No newline at end of file diff -r 00b24fb4324d -r ca4556fb60b9 src/varargs.inc --- a/src/varargs.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/varargs.inc Thu Nov 22 19:47:26 2018 +0100 @@ -10,54 +10,54 @@ ; 2011-05-27 : [jDG] Creation. ; -VARARGS_BEGIN macro - movff TOSL, TBLPTRL - movff TOSH, TBLPTRH - movff TOSU, TBLPTRU - endm +VARARGS_BEGIN macro + movff TOSL, TBLPTRL + movff TOSH, TBLPTRH + movff TOSU, TBLPTRU + endm -VARARGS_GET8 macro register - tblrd*+ - movff TABLAT, register - endm +VARARGS_GET8 macro register + tblrd*+ + movff TABLAT, register + endm -VARARGS_GET16 macro register - tblrd*+ - movff TABLAT, register+0 - tblrd*+ - movff TABLAT, register+1 - endm +VARARGS_GET16 macro register + tblrd*+ + movff TABLAT, register+0 + tblrd*+ + movff TABLAT, register+1 + endm -VARARGS_GET24 macro register - tblrd*+ - movff TABLAT, register+0 - tblrd*+ - movff TABLAT, register+1 - tblrd*+ - movff TABLAT, register+2 - endm +VARARGS_GET24 macro register + tblrd*+ + movff TABLAT, register+0 + tblrd*+ + movff TABLAT, register+1 + tblrd*+ + movff TABLAT, register+2 + endm -VARARGS_ALIGN macro - local no_tblptr_align +VARARGS_ALIGN macro + local no_tblptr_align - btfss TBLPTRL,0 - bra no_tblptr_align - incf TBLPTRL - movlw 0 - addwfc TBLPTRH - addwfc TBLPTRU + btfss TBLPTRL,0 + bra no_tblptr_align + incf TBLPTRL + movlw 0 + addwfc TBLPTRH + addwfc TBLPTRU no_tblptr_align: - endm + endm VARARGS_END macro - ; Compute string length (modulo 256): - movf TOSL,W - subwf TBLPTRL,W - - ; Then 24bit add to return address - addwf TOSL,F - movlw 0 ; Clear WREG, but keep carry - addwfc TOSH,F - addwfc TOSU,F - endm + ; compute string length (modulo 256): + movf TOSL,W + subwf TBLPTRL,W + ; then 24 bit add to return address + addwf TOSL,F + movlw 0 ; clear WREG, but keep carry + addwfc TOSH,F + addwfc TOSU,F + endm + diff -r 00b24fb4324d -r ca4556fb60b9 src/wait.asm --- a/src/wait.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/wait.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,19 +1,32 @@ ;============================================================================= ; -; File wait.asm V2.98 +; File wait.asm V2.98c ; ; Wait routines ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2004-01-31 : [chsw] Initial version. -; 2007-05-11 : Updated (OSTC code). -; 2011-10-18 : [mH] Timings tested with oscilloscope +; 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 +wait CODE + + +; ========================================================== +; WAIT 1 second (Warning: Do not use for time critical routines. Can be between 0 and 1 sec!) +; ========================================================== + global wait_1s +wait_1s: + ; Wait until "next second" flag is set + bcf onesecupdate + btfss onesecupdate + bra $-2 + return + ; ============================================================================= ; WAIT 1 MILLISECOND (Not exact: 1,008ms +/- 30,5µs + worst case ISR latency) @@ -24,12 +37,12 @@ movwf wait_counter WAITMSX2: setf TMR5H - movlw .255-.32 ;32 x 31,5µs = 1,008ms + movlw .255-.32 ; 32 x 31,5µs = 1,008ms movwf TMR5L - bcf PIR5,TMR5IF ; Clear flag + bcf PIR5,TMR5IF ; clear flag WAITMSX3: btfss PIR5,TMR5IF - bra WAITMSX3 ; Wait loop + bra WAITMSX3 ; wait loop decfsz wait_counter,F bra WAITMSX2 return diff -r 00b24fb4324d -r ca4556fb60b9 src/wait.inc --- a/src/wait.inc Thu Oct 11 21:06:29 2018 +0200 +++ b/src/wait.inc Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File wait.asm V2.98 +; File wait.asm V2.98b ; ; Wait routines ; @@ -23,5 +23,5 @@ ; asm routines in hwos.asm extern speed_eco ; SPEED_ECO: 4MHz extern speed_normal ; SPEED_NORMAL: 16MHz - extern speed_fastest ; SPEED_FASTEST: 64MHz - + extern speed_fastest ; SPEED_FASTEST: 64MHz + extern wait_1s diff -r 00b24fb4324d -r ca4556fb60b9 tools/dev_ostc3_firmware.hex --- a/tools/dev_ostc3_firmware.hex Thu Oct 11 21:06:29 2018 +0200 +++ b/tools/dev_ostc3_firmware.hex Thu Nov 22 19:47:26 2018 +0100 @@ -1,7682 +1,7682 @@ -:000000b65a07c8e1fae666cff9eb4e0e01c409 -:000010b2ebb643d1315570d3068294edae4107 -:0000204e410e0a399ff229a07b31df43db1ab8 -:0000303dd62c0d3b1ebe4889f06b9be77353d9 -:000040ce29b7dce7790c614d6eed4138a975e1 -:000050db8dbcc842f70058134aa06dabd61d66 -:0000609a8bb87ae59e6449fad272a8e6559ee9 -:000070dc6f84b104e37fe5bbdd82ffcc4d48ff -:0000806aaac249bd895b8f17cddb738ac6f3bb -:0000902cdc9ec30ae48b5fa929a519aea0cfc6 -:0000a096c0389250e1802dbe94664ad420bae0 -:0000b0368f199dd865319d17549f64b8e31c0a -:0000c0b523b4a10b280d430c3918f4e364d398 -:0000d0fc2105fdbb9a4f4c6dc5dd9b7bf10857 -:0000e0cb75f11e452e3a626630720493aabfa0 -:0000f078ad7d64802538d2792dcbed0dd13557 -:0001006adf4fb9b80e5ceebb9779de0183ef63 -:000110089c213d3e7d844ab2af575301a3bd98 -:00012096dcec4880ae1f51688ddf03f26303ca -:0001301147b5d0b730d1748efa17171d83c42c -:000140e631e0a8e09cae05c4af2442756c0550 -:000150a382c0dd7257abf62e88b8731ce0970a -:000160dc3bc34d66dc6273f82cb65e63efab9b -:0001707883d879196aa1cb74798c513d7627b5 -:000180dbaeb7612de2716b941d22d0111732c8 -:0001902cef5c318cd1cf6863cf63f05cafba1b -:0001a039e0156c435e0968964d59712f4e78a8 -:0001b0534e1472e61708cd97ab89332ad1e114 -:0001c03759a2f0a297e98c8b11b945a3b64bc3 -:0001d0179c1495f52b564f39caa689021e2d9b -:0001e01616ab41b854ab7d7b9f18c39e5b12bf -:0001f05a4e8eae2e2dcb8c3affa5ecb8f6cce1 -:0002009e7309783c8976700ee6f578c0ee43cf -:00021064c2bb030bcdd26f40b6d03fa60655e0 -:000220d8485c18e322714eddc9a84e7af74281 -:000230aa19dafbe40b955254042db75e9d7733 -:000240d6397f228ed92d29f6f79060ff77015d -:000250a8a3b107df9d957a9bac315b76d5f0ce -:000260f6b4322a9f2a40fd8510a319dc5abec4 -:0002701f3f75b6c91e76e797650814df7681bd -:000280ea3462a0162c8b22f5ba9e2ffce0209d -:000290d8afde2a649d725a01f4635d8c4d9e60 -:0002a0525b4acc083aceca031d2d951a7fa1ae -:0002b086b23348fc862ce4ddac454c798a8e74 -:0002c00f82282fa61cfe4c50a722c261e8e950 -:0002d07aefd7636072e7ee909d2fa1a64ad9e8 -:0002e0d342cb8a3b92c4fe2e8e398b1229aca7 -:0002f068207f730cecd6b9ecd5bea767adc1b9 -:0003008bda5153671a07724040229c12cbd1d3 -:000310a67a4cf674b7fa0e5b541adbd42020b1 -:0003202683bb279e70d127becf75fe3cd0a014 -:000330bc318161691ab20460414b33a009a993 -:000340b366781b4a056188f3e6024d206b9b41 -:0003504f03d29cb5e0581c95c9f10e611fef3f -:00036016aa0a3c635003a43c91f8ec758d0c3e -:000370c8ac434236d6e822b1600dd66ce6df5d -:000380e7a37050f6f3c3cff38e3eaafd373581 -:0003901527f66dc5a7d9cbdd2257300109c6ff -:0003a06c392b0d2347a2407b6d63e59a354753 -:0003b0c238f1eb1590ae4b8b69c07c2d878b6e -:0003c07647dfb0a524e2236b4bf06747288f2c -:0003d004f19f169adb79c4d32f8cb145e782c4 -:0003e028e6579ea3f5657508cb759cfca3a296 -:0003f09c1524b25bbefd72bcdbecbed8251ea5 -:00040007cded4540ca0534d0885446c50e70e3 -:0004104bfd7a63a3edd7082835c32f78b6b76e -:00042033d763360532e4c4242cd5bfc3a4002e -:000430824924da4015696ebe1c715fbef2e011 -:0004400d5708362b10d40bf911b9a4de6a8f34 -:000450339c8e9e3d22826ca6c49be25d3b21d5 -:00046013af3692683208ebe0f7af51a51bc584 -:000470c400d5922e59902e9573d778046ce493 -:000480d679e118b613bd372d39308528ec111b -:000490afdbb6c033f23da4750034847197e5cb -:0004a07c806bedbcba87e67717a5675a426c7f -:0004b0f8027488c0acb57bfddcac4081eacee0 -:0004c0add387301b9b7415abec6bacde6c4aa9 -:0004d0c15272e0325ea649e934b2062c2f3acd -:0004e0635b67c285a51a0d80bce24fc256aaf8 -:0004f017f6585f3b71ae9d45ac05535129647f -:00050019ad520844816e95fd8cd3fa4dab7368 -:000510c0ab94974934550c12a93c1ef78cb38d -:0005202128fb44ce5050335375f82f763aabaa -:00053076bafda71d4f044c7819df2431929c91 -:0005405f3e013012b16e8af106711da6625c44 -:00055027d179b0b5653da215ebf35691fc25d1 -:0005603fab990d10f60fb91753ec2de2967fdc -:0005709f14d0a96c1bfe6a2cc66c50e85f9034 -:00058004bdf33278ad0604051720398a0863a2 -:000590b2bf628619f16979e50bfc70cebeb35c -:0005a0f359753b0b08b3a3f1cf22458ff92bbe -:0005b087a00b1950b9f98061ae907bed45714e -:0005c0a04885766db00b6f0fa74c7f08a82062 -:0005d0de472ade34585ca46e3c8b2b8361f6b4 -:0005e00e11e4751d81adcdcefe0b5d885fba37 -:0005f05d63b3d4d97212fbab64149bbe837302 -:000600dac24d8aaf70143c1a549c98c1394e4f -:00061082fac172a3e1878b7541bf6e6fb44c9a -:000620b536f515416c4e1ae73ed6d5025520c0 -:0006300bf9c6c4dfda019713aaa226812d4c7f -:0006401090b97b0ee2b92174c7fb0c1ffdcfd5 -:0006501986303693ce7212c75f2979f5877e0c -:000660a414da886c7070864dc90648155bb413 -:0006707bc01e9a78b5d83a32c7c068b5b888e4 -:000680c949efe4cdd5fbab95324473001a1bed -:00069066dcb8ea3c775984b6b27a4fe4912441 -:0006a0f2824b9f9d522e0f13b71f47f34876b9 -:0006b0e22ae98a56b5252bd9aefbc9a3794e7c -:0006c0e95fe21817bf55808760cabc6c02a2f1 -:0006d08a96907d49c70a64b986ba7817fa8ebd -:0006e027db630ca50b69d930f0ec088a9fea75 -:0006f09c9e500085c92d411bab9b69ebb42b6a -:000700db81b8d717a8e174d6de91583ccf2644 -:00071016c071813941fadf213d173b9b6cc3a7 -:00072026badc5e29f577a15eb9e3c18c0c4d08 -:000730774381d2b4c8ca74ecff2fce48430f7f -:00074073c6249631fc57bb07150a3020dff8ee -:0007502dda1ad2738c4d16e102647bfd726cb7 -:000760803f7507b355d17668c29450f09a3480 -:000770df79f6254ad9029869c59a2642fe8cc2 -:000780a8188487d251fdc51ddd58b4d8503cd0 -:000790237248618f88906b5ffad5d6a90b72f9 -:0007a0d77c5f6d48b1e933687e1be1b948e409 -:0007b02710e73c60892f8a61d028663fdbd75b -:0007c03d509fd7f7b067982c0b647d4bd7dc3a -:0007d0df507dd55fd93b381fa8cdd821e6790b -:0007e030c571c902c49d98a4e9bfe6eac935d3 -:0007f00a43867726c67bdcb4b6af6ff9e1535a -:0008003806c787d2dc8cc13a7c9923d1796133 -:00081050e54ac82a8f4f50cff18bace3c976b9 -:00082028c03666e945f9c0dfad82d8bc4971a3 -:000830a54f6fe31d12057cefb186cf62f1576b -:000840df5225063c493a70420713c219000458 -:000850cbefd5eaea2abccb450bd05c2fbec8e3 -:0008601253eea6b6956ea7426dbeaf3a024807 -:000870deb5e1cf3b171cad36622657a5f8b58a -:000880dbd0f9f73aece1cabda212b95cc9d8a2 -:00089049b5fb8a5fa71f03987c3f82566d1c49 -:0008a07a4619a04b2630bfc26055eddb77dea8 -:0008b075bf6691deb55f3ae21ad2c4dc12babc -:0008c0ff9bb495fd27604adbd881f2df493768 -:0008d029b7c01a6b5425943e3e648527cdc7d4 -:0008e0cdee3fe247a115f2dc1c23500120808a -:0008f0f8d54ec0a4e1868f6f6849f1d3b30ec4 -:000900b3e6c85b9c717f81243cb35fe1dde852 -:00091044cfd430fdb321799654a7c103bb2666 -:000920597f60e9d060d86545a74384044d6cc9 -:000930e32181ba395e8a6538c9d76e928506a7 -:0009409cf09a39468d23e71706bac8787ff27c -:0009501e52e76d5b7aeef5775db66486b67a56 -:0009602a8f327592492d2f0a00ff87424a9927 -:00097074ba32339dc9790f5e5f73d5410a7049 -:000980b7ef8eff4ab1e2f2c4b87ab2f0ea9e8c -:00099000b046855e74f69076faa9b38c70ac27 -:0009a08eb673be8a538076a1754d40817e05a6 -:0009b0ed2920dab15825cb8402a21cb87806d8 -:0009c07b389b4c639add2d009748ea4466ce3c -:0009d007390ef6382e329d224ea17389de41c6 -:0009e038c4c84dc775d69258c3b4c8825c725f -:0009f0f7cb8d16a142de33089c4f61da9f97bb -:000a00d3991d4845e835edd39748b23daaffd2 -:000a106b84f1bdbb7ce452094d82c88ba55981 -:000a20a671f2032e4b968e2330f742d1ce700c -:000a308def0ffcda643a4a95df15e8fb241ee6 -:000a40529f1f7635a6a5ac909581f6e9fa8a6a -:000a50d2050a12abd052f7d4ec5eefd0ffc6dd -:000a6061fc526e31b7088551f47d975ae4e5e7 -:000a703dffad093b2a0d53ae26ed7867117d3f -:000a801a55e873943ec498abbc15c9db7745fd -:000a900f61c1a9a3ac20af761431d4b0483842 -:000aa09b30eb743762862c71a3762920a88cc4 -:000ab06216ca15cdaed609c847ed6e9723f439 -:000ac0edeb14bfc204ac005f59115fe497e14e -:000ad0f48ba9c3cadf32ef0eb261a72a75ec67 -:000ae0d0931655863475659537285d96f7c63a -:000af02e3e96deb9d489c2fd2c9b43eee97379 -:000b00acd90824daa6766805ac92d909de4089 -:000b10622103cfd87efcdf9e728733aec0c598 -:000b209f65b5db94261f509ff65ce153ac6d88 -:000b3084cd23ada9504c1102b0aba2c7728dbc -:000b40f822f2a77759fad48d2f05969701a4ce -:000b5050e36d47b83723c48c1f01007b450d51 -:000b609faeb603e819d6d9134de4c5f49f0439 -:000b703c84db84406b7bfee26940d6af67f837 -:000b80d5835285299585fcbc387d0313fe3878 -:000b9013000d44920e3022dac6f14bf29d30ba -:000ba027c562dca2ff556c5581241239c21b8d -:000bb07eeee16592efacb82e7d703e0f68e345 -:000bc0e182d126ba3ac8b7aef374d371d8831c -:000bd000cafaa6b9290b95296703cbe98d8339 -:000be07fc693396c34df008fcfa5b6a80da96a -:000bf099a81eb0f64ec790abd3cbbe22505763 -:000c00a733e435c75310b1586b5ffd12832daa -:000c1051a3fb47314620c3c92e57d0e9cd1f31 -:000c20acc39dfc72b59e33da9042f36c39fac4 -:000c301b8b62ec6fd5158f233db39fad631b52 -:000c405fbb56c59903c77fd2f345c4a8c527f2 -:000c507220858206bc4673c242c0d5332f451b -:000c6029128225d2618b435388695fca886753 -:000c704a83cb5cae913baa935262dfacc9068d -:000c80bfd27e7ec4db6b983bc43b2e29abf229 -:000c90003e75ac874bd30da6f8b63f42f3fee4 -:000ca07b868fad8a5d0a9b3ed52721c14e5f32 -:000cb008c0af21ca6240901adc7170c0f93f11 -:000cc0ababc73582fd5cc151112e67c5634462 -:000cd0a9f9bd7b2acd1f35758fecaae68c3be1 -:000ce0c3bad9fd4dd6c0ea1bcbfbd41f142685 -:000cf05282c7da6268c856aefde79e2ec8f350 -:000d00871e7e4a95c4440e3742cfb261974a5f -:000d1070498d8fed4e825cf4facbd60fddc6c5 -:000d209e25d6f18fe5703b649d86be501cf92c -:000d30c26ebe370451b0e0b170ef7df3612620 -:000d40af29265388773d5076148b89a58083a3 -:000d501007f44f124e58f2def6ca98bec876ea -:000d60e67ba8c5544018d8c6d88175f10affd6 -:000d707e000e81c1d24cf8f4300266ad924934 -:000d8012918567248356e686f3da2d700fcb01 -:000d90f3159e0f019a4680d605ea750c5423e3 -:000da0a8f52041f81880f8fe0ef97c4474ce97 -:000db0d24711f07eaf42e51e0cc3530189f3e0 -:000dc0492f08fbc50daaf21b6a3babd231910d -:000dd05ec2c6705a317ac4574d6962ebfe944c -:000de0674bb35f2638e1e14daaca7c2903992d -:000df0b870b39f16cc58f26dbd841baf17aea5 -:000e002fd1d9d9c0ebb1f0ec44334fad8bff8a -:000e10b0832581223d5ff8eb4db85dd27b925f -:000e2070d7d4eb88389438d576dd61afd9fc91 -:000e30aaf9015514bb0540875abb83e16312b0 -:000e409153ccc35a4cb851fa5b004ea3451fdf -:000e508a8d82740efd121519844e25e70648ed -:000e6018b5919051f8fa67e42c6bc4d0828269 -:000e704c970672a1689952f5b61c32dd6bfcb8 -:000e8015c4bf93f9384b60ee48049a3873e122 -:000e90253812181677bb44bb9779cb21fa043f -:000ea07d3a22b7cb947f69f00ac5a4dfaeea45 -:000eb02c5fa9ea03dccebf9cc264f4adecfbfe -:000ec01df56fc615e36774c843c7921dd93936 -:000ed0a5770411099f460a3d2f5222b8d0f429 -:000ee084a80f7b44c54f2d9a0e5e34aa913683 -:000ef033ffa82746815be3be7b3b29cda43867 -:000f001ba8d2b012f61139a25794506a4f6436 -:000f1013f8e692eefa079fbb89690bd1130750 -:000f20a22929beb4b6fa74e9fc9356c2738f46 -:000f30201a01793c6737fefbb1d09680b8e8a1 -:000f404b4a8e8acbc8ea9db434a9e3b27ac7a0 -:000f5037628198ccb0db1ba1c7d58c1eefd854 -:000f6065cf67791c7d28502362e4e26fdafc68 -:000f706133076700d939ccb996e2c1df260024 -:000f80244e82f1f396bf85a8ef5cd8e4ba84ce -:000f9051f293bd3ac2910a42270441b2ca837b -:000fa005399ffba2a2e4af176731d333fb3f7d -:000fb0f71828e42b1a071befd1b2a9281946a1 -:000fc06678e778cbf84f51b1a96f803006c290 -:000fd0767c77ffc0afc9162eae99d4ab209474 -:000fe0001bad3fddbdb01bd42a67663c7d3bd7 -:000ff02b3cfb9af722fccd3e94d08f80bc6688 -:001000ddd9da2b2b9f4fb962fedba4147099de -:001010dc2108da166dba279dcadbcaf8aef93d -:00102076fc2299545f4e110796be0b74c7d570 -:001030445c6ba5b30850325bafa6259d64b632 -:001040aba2010dcf748b201b64cfc984a4fe6f -:001050c0d7032050ec9f367aed57ea6810cc7e -:001060f41adfac48a39a1ed547f68870ed2523 -:00107060321cd44c5258ecdaad87b4a4749814 -:001080eaa41784875e34d384ad1b0ca09a9f51 -:0010907a2e87ec9a53dd1b8789ea879a030e20 -:0010a07a195c0f8633bff251fbfa089f07f5f0 -:0010b025e24654680de7ece2c53315ea218812 -:0010c03fc2830c65e956250c339f5c72cad937 -:0010d0b329b96708028d9def12b87ce1ac7459 -:0010e09e2f7afb96795ec14a59be8ac7935d20 -:0010f079c9d5ddeefcbb4e0dd73a7de6699bc0 -:0011005da59ee7727faf060199ff60fe226278 -:001110a445473a8479a50f4648804927a74191 -:0011203008ef754f5d881f9e76cc365a4666d2 -:001130114c08308734c61710660901a30b5c62 -:0011402ceaebf26230afc278369c807c72652c -:001150bfd20da5d787d68ee7706c1c9f1e869b -:001160cc8e4d82d0f3fbb4734e891a7c288679 -:00117014836e5bdaaec9e618f559325a7c6d10 -:0011800fc46a179cf398ab083020f41effc213 -:001190aed2bb0b749e15b25204a84c811d293e -:0011a065ad7e0332035f9a23451df6ebb8c42f -:0011b059a150ea7fdfd1535449bd0b90e5e517 -:0011c0043ef681854209451f189f407c449ee9 -:0011d05748cda8a0107b22b9e6685856b5bf29 -:0011e0d32689720646dbe1dfff7dec346c81d2 -:0011f0ba7b7585d07d38e7c66463a01b8e6509 -:00120095273bbd7e2e682acd2960643d44d7f0 -:0012101abba1376da51f5b97c2ee278ab54410 -:0012208036892a853608d468d329635b737bd9 -:0012305177cabab77874d8b63c7943af314b0f -:001240e53ef3ca5b302677badf0ae21dfe018e -:0012500d64f8f2b6ed9ae07fe64c7ddac07983 -:00126087a8eac7250cfaa2b6e4b510c2c482f1 -:001270317405c7f4556357ecca53f28618b4d3 -:0012806b2c6da2bf20aa2df0a235b3f7ce0172 -:001290ea4108141d708d9c1865e71db5986d2f -:0012a098e80bfdccea526995f56b02fb622722 -:0012b0f5133a67f0b950f52a3f1a3f8b612ca8 -:0012c0e162ad898cc955e890de2abd36506b51 -:0012d0f60dc519667f021c552dab28730abf98 -:0012e03d0002271d2075dffb0f1c3128805605 -:0012f0c2b230c3f28438f40ed7b6c44330c790 -:0013003b5dd9842eab9560bba065d86a9d875d -:001310db00bb02919a972e7489cebdd73613fa -:0013208470167129c8f3b90057a07a7259ceca -:001330eba00ef5a728bb14c64d263474f96fc7 -:001340ad617fc9652593e644ee73b3b10ede0a -:00135056f683da6968f5beeb4d881b2b414210 -:001360ffad1f997dbbf29f45e100bdc7fc8b20 -:0013700c39938f198f788222cc07633216cccd -:00138020b163bf08cc07f26704003b104b7ac0 -:001390aaa60f89405d4ccf49fdfcce45eb5af7 -:0013a067a0a44675efb22a35c27d543849b99d -:0013b02000da6cdbb3fe35eb06d6617b3610ca -:0013c065412aa37e71c545574793bc631caa38 -:0013d0f429920fb0647902f81fd84f9705ccee -:0013e0a89de6ded843ed70e35bf333fd0b81e7 -:0013f0bc142a1c4d062b3024859adb0d3d4ced -:001400b81cb6cd383227addc2516ea16b5960a -:001410abc91be71c32202e02b328b22bcd6dad -:001420a59829b41ad45da211f842779d08ebc1 -:001430bf8838329e5fad335738678771c3da3c -:001440b76c51987e6b710f375e21a4ed452cfb -:001450c72659736f33271107d491896bff3fc4 -:001460bd9bb87222155b927502f86d10cb6f11 -:0014704655228d99e2e75d5bd78a1efdb9e917 -:0014807fd7fdac8e5e9cc9b9584f37c4600ad0 -:001490d31cae200b6a80f912b06c71bff95536 -:0014a01c1100601f7dc3a09ecbd76381424235 -:0014b0db418943b4d86e6d5b5517e17041d5e1 -:0014c0863c2d9acb7330ccee0f032488a77d0e -:0014d0d72498d6d7131651a160909353d3619e -:0014e0c3477b5bd168fdb557d6da043be6c95f -:0014f0f7ecf0929ee3887e9fc20e3da049f1fe -:001500606edb30979e157c705aa40fb2ac61aa -:0015106c6212e66b4d344236e800fd17a8c8d2 -:001520c01a976d8af7fa96f41c6d56f81a5017 -:0015300a085a5903b6aea594a6e152d7a0ad1f -:00154058b25230858ee3eb64f3cc2dc3bcd5a9 -:0015505093dea446e6a1479f845e116b4d8b06 -:001560d168eb7576be8591ca32ca14ed88293b -:001570277f3d5a28ac28600b5813ba32ddceb5 -:001580a112e35b808b3e3e31109c98a2686715 -:0015900ad040f0637ea5498eadec4fd290bfeb -:0015a0180ff8df351ecb366a917a830dc73c57 -:0015b0ac8e934211ae4686d007544970312bb2 -:0015c009280202786ba8bcfc3df1766ab0253d -:0015d05ae7a89504efe8e38f88d084653d79f1 -:0015e0dbcae274b0de7102ae280088cf67fc6c -:0015f091be0db2ebcca12ae3aa295e2f77a744 -:001600103f9110a18c333f7e15bac5c43ad922 -:0016100feec161419103cfaabad3addf2de5ae -:001620cce088cc38ffdf87e245434729246201 -:001630d16d0278c0d208997eb5cc663026a914 -:001640551bcf55ff2790723d2c74906aea7cea -:001650030e39543f6678a54f2e30934dc14c37 -:0016602fe62377270f7c6d1e94e9ff6ea51bd9 -:00167083077f244c86c0e6a87831c77672a7fa -:001680486059cda51e4c1201ac38d2c423cb79 -:001690fa97654e4357787b3cbe0ed21416113a -:0016a0b14592231284e771bbe8391de358c1f2 -:0016b09d3b089b546cf3c0940de0293e937f62 -:0016c0c3947714e8f90b9369a3f56c3d0816e3 -:0016d0706b0a164157486c0e2971fabf856820 -:0016e050fb54e6f0275297cc57ac17a9b73e7f -:0016f00cbd77b11ffdf22716d3df7feb9dd347 -:001700e994af4867c580e7dd54eeeccd788edc -:001710d3e2208b659f8b4f9f308c803a0b517f -:0017206bb1094f6b324b930f4a2177fc9e0c8d -:001730564a1a3a0f7aa149ef955c942027974a -:00174047053ba1fce8dde7a10d6af0427bb640 -:00175087c0e541eaf0af02a30a095e7a066298 -:00176006aff710199bbaad7555de9dece63a48 -:001770c3fe26c2810f495602279af7018672d0 -:0017806deb2ee53aef529ba2ec86989be27c5f -:001790cc8cdab92c1ab3234fc7eb70b9117094 -:0017a0d1fb444a7eb36e0f6ef63eeb8027dd24 -:0017b0c741b28c911d3bde311bae3c6b688b8d -:0017c0845557f50edf9dccef2055abc1e98797 -:0017d0958df83dfb055d2dfdc7f2bc729b20bd -:0017e0fdb4793ee521fbaf5748b170075281f9 -:0017f0b01687885e437155a598748544dee8b3 -:0018004354dfaa352580790a5e418649551000 -:0018107b0e363a44a1426dcb6b64737e770272 -:0018200ead1267f43980f21d809bc3777ebfed -:001830b1ce433465ed075967a0fbb2adcb18bf -:0018404a83bd647e7e5fe50f4a391d296370b9 -:0018500526c05a7f105aa54b7248520e416192 -:00186017ef8a2f91c545b72ff1891aa52e28b1 -:001870e1404ffacd6dfd11d9e8d049ed5fb22d -:0018807237e4b1417b094587eda3811051bc69 -:001890ab0d94777a3b7c4001205e87c34353cc -:0018a05bfe7d37246b9b12638d3f81a84b2e71 -:0018b09affb2e4e16773532e2e5618ace89152 -:0018c0ba01bc6e68f099a60f28819f7998414c -:0018d0bf0956ff075cbc807ae2f921e1d79147 -:0018e0acf87753ec8145e5359f74cc67b7b593 -:0018f0d242675a68d84efa5b321028c54694aa -:0019009eb3d994c50e27a68e22957a24500013 -:001910f9af1884b5838e4e0508ddcefcd1994e -:001920dea85d0bceb7d6b83277518ab18e0c25 -:001930f7dcec1b2815ccf26c4dc0185b3c1bb1 -:00194057ae6e6ea9e4cebedc36cc6df8f78364 -:00195075e0b1e16bf53fd9c0aa8897ee016a3b -:0019602b1b2ce225f7cb23d728b4b2f8ae6877 -:0019709389d02c1afc33448246ab2947775cd7 -:00198068ad308af38a13640eba7b043c61df5a -:00199052c982bfab4c4ccdbfc01c4997188081 -:0019a09941b6bafe2a0b9c7ea8dfa5c5abec38 -:0019b0d9954c5112f5e1d5b51946a52ab92b83 -:0019c0e12857de503425959a9d7bfd2d2fdc9d -:0019d0a7dd6c4597c0ae330dc594a7f144f361 -:0019e0614eba6a2f4d6486d626d92f45a2b1d2 -:0019f0a6ba9189c3f9579b315f53655f2cf448 -:001a00fa3fe729b2309fb970bf4375584ee982 -:001a10a295ed4d5a45267ef563e4c8398a0c0d -:001a205bf234d14ff10f6461b1ab4f89ce1027 -:001a303baf6b0976463600e4642e20a498b13a -:001a400c413b3f66d6488e8dcd2b6eaf24502c -:001a5064f5736afc5f40ad79f7c36be12e1732 -:001a60cfaae3964c4a0803804b4a426f52b427 -:001a7062d397d233554ab5353bb720fffd9d2a -:001a80bed2784e2b7862ba79762beba79c3426 -:001a90460c8a571281eabc6ff6fb86d8e8a78f -:001aa0b86bc8d687249965fdc2bef1fafb8dfd -:001ab03b57e1baac50b25bdd54c21e72dfc05f -:001ac01a651c65d61b8e7870b56ee8fb443431 -:001ad0fd1b68cd25fada9ea7ef591e7610d2a1 -:001ae0361c7e6c744bce0b4565b712d358d11b -:001af0ff10b0e04614ca1a593aef3675c4636a -:001b00f17e369351560dbc2e0af7abb1cadd83 -:001b1057344467c96ddd30ba90fc08fa197327 -:001b2001693eab328b2279ef5327c645fb6474 -:001b30263e5a90187045a887fb10670868f9dc -:001b401b1419f24bd3f604614501ca27f7de3b -:001b50aa442c1e66ff9ad7512d3ba63552e42a -:001b600e1aa53d935e4bcedaa25c8d5187c508 -:001b70c2c9ed5b69004ed7a6aa111dc5fe206e -:001b805f2e09379e4dd343c913c6a7e47e1bc8 -:001b907c024a69d2a20e5eff38c6883be01448 -:001ba0398fa9415fd80919bf18f70e2af39b40 -:001bb0ddd0d596b1be95b4c8ef39baace28584 -:001bc0c45093828fe84fd5ff826f3c7b538c14 -:001bd00d38e96b1a848bff0c082b74992a320f -:001be0bfbc2f78cff901d1913d35f36ea7814e -:001bf04ea83fa2ae909339e865aedb1e024c8e -:001c00242cd95abf9a869c4c5654242cf68178 -:001c108e4b5a05ee88bb9e26938d875239e41d -:001c207e978ab1471c8edddac06fce5b4368f7 -:001c30c3fa2df22efb2763ba53620900a979c9 -:001c4016e4e7b1185bf14ff5688d6fb14e0333 -:001c506a4471fd1a1f6ad62aacedd813604eb6 -:001c6083aeca184919564925aec34ca6d53532 -:001c7040311a85e8afa5a5a8bc19b0944b0bbb -:001c80fdd7f5d749049d9b7730782c77c27b0a -:001c90b21cb37d7d398ead74b31b9e792b4a2f -:001ca01d484b307237b24ba1bb670230fb0cf2 -:001cb0749f6391964219f3ae5740b5ea84092a -:001cc0838c2a20b0486245b77ba907c08eeace -:001cd0c2e82d157c343f0f000e7873316dc468 -:001ce08fc8f17481c1b28b8c265af12a8455cd -:001cf066a8d34d93e5666a79d0227c19825892 -:001d00a5e88ad731dec4a75c307aa37a5424be -:001d10d73ffc2b800518fef0df3d6ecdafc65b -:001d20598979df92a540062b5f6fd0229dd9e9 -:001d30094169cd993caa03128f3c3a944065ce -:001d40ba571bb1a03cc4457f1c0b5863ee6f44 -:001d5054a35ec3aa7963ffddbe823d35e02bf3 -:001d60d2f2942846fcc7bb43328972e7c93624 -:001d700ea4dea4282d8d8a0f1e80d0d1790218 -:001d80416a48b6054abddfc5dd51696727703c -:001d90f72fe139a9c9ba0edb13ccd16d45ee99 -:001da0e7ae89ff4eeae5b56126dfc68711c51b -:001db076bc6e58ddd2d851fedf60f1567c71d1 -:001dc08437dcd1d2b9eee8381b1aa42b870e68 -:001dd0fdc1db69df6f5dd5d71944d34df8656a -:001de02505bbdd6f66cebed24fb9ec792e750a -:001df0887f3029ecfc061f302433c06dabdded -:001e00593470d38c7c9561b1e676000ec7c30a -:001e105b575060a31ab70235a0e2ece16cece3 -:001e20a19f849b391f305f6a1b13691dbd8767 -:001e30fb6ba3382a4c03838b5bab227e850d7e -:001e40b9391825501e7df33d22ac33d447af98 -:001e50ff0ab7d77538a235b5600cd79734c314 -:001e60c9898e4acb45c0f4e0062b554f9bd25d -:001e70fb105e7fa5eba146be21fc9ee2f00926 -:001e8077602103f021ae6556c79d3544812b47 -:001e90ffea4cc83d9ac4858714b81c3aa93eda -:001ea0a25c204c0ca600ae8fb46193635ef842 -:001eb016058da2b553d932dc7d1c894a1a2cb9 -:001ec0f768440f293f7dc2ee020f3e0995fe4c -:001ed04d2289fed062343c21a7763fbae08773 -:001ee047d23c2af53805a000c7169562c1c150 -:001ef044cd17cb49fbab2fa7637ad5d0e442c2 -:001f0075fef4815b8f5b33ba9ce3e59a082ab5 -:001f106765c4a45e3642d5614a61b60a6e2537 -:001f202201f89d3e084ad4258e7bcb2d522b28 -:001f30261f8b63d1d53f841bd0f0fcbde56817 -:001f40d5b1f04caf2d6e7512b98cb34e733aed -:001f504d8bbf982facd9887bf2243fc8954a05 -:001f60186007682faffb9a54c5db20defa8b42 -:001f7049e7d96f50abb95849e722011ccabc0c -:001f80c574539beeba47fc4066c37e0b7fe8d7 -:001f90d628fb32a262e05d302579d98dd97383 -:001fa0a2b16f0927205cfe162359103b56209d -:001fb058e90afc1391f3ffdee07b9a05a619e0 -:001fc07ce875304e3e39597758fad195b1d7c2 -:001fd0e0c4b5446a603184e141e519487e0f5d -:001fe01d427de9bacd3dbdc341004dea52205a -:001ff0fc5783d90bdd25391d7a6a49a37eb71f -:0020009898dec963e1ebc46becf280f6e353e9 -:0020104976db9e1e9789a23e2e7799ddc85cb0 -:002020715aafd7976143b62cac1889b5240060 -:002030bf8afc15c2f51d3b4d387b16b292d957 -:0020401c27465e38d0fcbae993c7e9de6f67b8 -:002050ac1802e232346c5cd006fc150b2b8c1a -:002060ce59dfc8ee2d72ec5b469fb21dc29e7e -:002070df994c43af481d9aa901f845b2eabb93 -:002080524b6b00b7e3785686b46d519e8e1108 -:00209031470a2e4ad538e6758fde8ff41274ef -:0020a06f559aaaba7ec9e0298bf64917cef2f4 -:0020b019518c88fd9cb50c2a72dd44a6ffd0fa -:0020c0e5f7a7c5f70858680dc98900c383af3c -:0020d01ce39b95d173cdf03470b190bb9b2436 -:0020e0fc8e430da6b397cc3f96f73d37dd1997 -:0020f0abdc6aa60bd4d8757b240a06e4fd921e -:002100fd27399dcf48b8a254b3c447e82368fb -:0021100ef0eb0e6cbed274f44249f3dcb7a881 -:00212069a23076586de8e6d1f5701efe336b91 -:002130f6951c80a6c7254fe7ebdd179c77dd1e -:00214072fd9b7b8e199ef24707d47198624758 -:0021506b8dbcfbcc5922fee60b8dc8f1438584 -:002160354ad4db5284e5e7c72f1bb88f733b72 -:00217084c14d5b27e80c0dbb9d7ed96e1fe1c7 -:002180b1f96d782022dd9316cf8ac0f8687d7a -:002190a8718738d6de98dd5bc2f43ab653f58b -:0021a08bca44480b9802500447d5d83b180ca4 -:0021b033c15e0f1988610eae5a6635f21172cc -:0021c0ea72383e6c053a70b55a09b22f022cbc -:0021d02b0fd4312606fc1350fcaa82757449db -:0021e030f289ceaefa04638e7147dba9d43919 -:0021f022462024605c2b4d304ecbc142b17d3d -:00220040159cf32839d2ac1f102e5ab92a3709 -:0022106e9d8c7df390faecc73193406fcc3dae -:002220caa8a318af2a425b1a8962c3696e4e82 -:002230be10394460e7f7921488855c79229452 -:00224012e59209710c1f98e7969261fd754f1c -:0022509d765b70ff912618d91692209044a075 -:002260c80966d17b92e9aed320343fda72ceed -:0022709068758f87b4534f62074bc8f8246da6 -:0022802981847d0cab9e687b333f8052bfae70 -:00229091997e32e51a97d64291e4dc177f29ed -:0022a02596b8d61ed20672e896468530720453 -:0022b03756904f36d16751cf4243244ecb0c6b -:0022c0ac28ec316fb055a79cb4b0b0ac22f3fd -:0022d0f0e18ff2105ec5b8c62c3f712faf01d8 -:0022e0812ad7923157b3b4198b9c97e7340a1d -:0022f06f6c6162203f521cf3a2143f320f2376 -:002300968fd3043cc924de6496ddddb8556fc2 -:00231075e8c94287fc759b1a8ea54c1e514710 -:00232082b3688b757611da45bb7bb74878992e -:0023302b14bcbae1c2380fd1fbc7343c8626ec -:002340d1e0130edf014b49ee8aff06d4438b5e -:0023509b23c0321977644ecadd89a84aa544d6 -:002360a9809f38ee215cbf38e00648ecb546cf -:0023706b9c5c4b582ac7a0fa4e5f2dca5b63c1 -:0023800d5936df4d7ac38bd3cb949d3ff011a4 -:002390b84c78c5fff0704f32e9d69df4d11e04 -:0023a0ee939fbcd066b45a924cb23b5dd68680 -:0023b0c02165d41e78d9295db44c69124a9d7a -:0023c07eb5374f8b3313b2cd56e40be64fd340 -:0023d027d4a4893165e7ec4240a2133ea6d86b -:0023e0b00191ab3e116c57135dcae97e544543 -:0023f0ab858d8318b625117858514f1a6037cd -:00240039ea70342a13e560c9d3d09b3d8bcab2 -:00241082d38feeedf8061307dbbda41a6f0341 -:002420d40571517f93f22563d73ded53a2c36a -:002430f2a16793eaa3685cae3275d026fdc6aa -:002440ae9b09405e8b2f0906d36e4d711559af -:0024500bf35638dc7ad485698ea6a35bcd4488 -:0024605c020c5288072776eba351169d296cfa -:00247078726f3ae2d132b692ca57bc3685a15f -:002480d5e1165e0ce737fa2e3c5aeada6747fa -:00249035549c726bb1df5c2f110cb4a9979419 -:0024a0f05a132b915e3d28087abd2e7038e4e8 -:0024b08bc5b71b34b30399183aaf8d2570b724 -:0024c05216c3b300b867a5fac03fdf5f4373ba -:0024d0ae94d17e559a746ddaf9cfb1b157c6c0 -:0024e08a6393d7c2aef4df618db97e732ec8fc -:0024f0b032e7cafb3071f4727d365acdb8f371 -:00250016618eaa8bbbb7eef0f04fc1d02d18ea -:002510ada1f1a95f155499a4a1af5366f2a7ae -:002520765e6a3a81efa3d6ae2351e7ab2b93fe -:002530eaefffc7ef2d2437297cb039bce46ad9 -:0025409fee83eaa8371031413c693b51093e49 -:00255018c0938762190447f33629604e9c9164 -:002560caca38a6ad239acd14bb2bd1aa17046a -:002570d5dc4c1fbb1220ddf83b66881d4ccb4e -:00258066c4f91363f3cb516ce17eb7a70a593c -:00259085e80aee247f392a47e5969eace8cada -:0025a009c29f90732f1b38cbf2e05148e1fcd2 -:0025b07c0a1e55c0ca7753ea2e0129519eda87 -:0025c0f697361971c7e50eca6660f628514bde -:0025d02e3b0ed170e31b358e42f058d636e816 -:0025e044afdccfa0f4bdebfe1930a765e8ca3b -:0025f09c824c9a4714647add339de154e850a5 -:002600a5c79c72bae68e9f1beeacfdd4348c94 -:0026106087391fde24811b836239c682a71498 -:00262020a3e96671b4dcfb93d048810383f896 -:00263068dcb92e17d7e516a8bc1c3844e4f936 -:002640ed4ff7ddbf1e9eaeeb4e7473da9b8ed5 -:002650b703aa551f076947d2d24bb35bab3ada -:00266018e949eca30da1782bf210556223a74f -:002670f199524172f8696df4ef383a49ab4561 -:002680765dacad10d86fce97489709f6a47f75 -:0026907dc2a7b445aabd029758f2399a5935d4 -:0026a03acb02ee9496ba8f5555aacffaaaf1f0 -:0026b08797e404993ab78c7bd8c423c71a4650 -:0026c0a2b42dddb9ee63dc395bfc1a6b3f5223 -:0026d061efbd46e9b9c8f93d40d14c4850bae0 -:0026e0a6b7ad4c9bcc0864e4442cd0d24d73c8 -:0026f0ac31be8ddd15d75304779dd8c66af191 -:00270074143c88844db59a57e196c647bd1730 -:0027104f38734188fda278bd5c2fb86ca3565d -:002720f968ccc82a7e08fae2502e4f894bcb02 -:0027300e97a2d31de568a7af86b26ace84114d -:002740cd138f9e94d09c260d95639cde5fbe9a -:002750d1bcc5344b53e663578ba86619b71bd3 -:002760822bfa3d41795b28b9d3e45a4efafb18 -:002770efc6a72037c69f88c6b7ce12a1548c8a -:002780b8310aa060c6ed74be2070cf5a9b9122 -:002790b435558026372d4323ca6f1a4a1a92e9 -:0027a033258827757051797ec0d842090c2248 -:0027b05702816ee05b246beea3b913359f994c -:0027c023526cc11ee399ff97b1e18d34fc8064 -:0027d08a1c2e783cb044635ca15d0ecf100f7f -:0027e06901d5239aa8b32ee5cad7d2092afe59 -:0027f04ac750a280b78d354510ca69ab82cbd5 -:00280042348a81d223ea423fbdbb40c1267247 -:00281063cd896180da8ce48d5e5dc015a0b946 -:0028209905291ac67df06812b592c29b74416f -:002830801f52fd3cee8423b598bf362435e361 -:00284055d03f374569adfce80b6aa2223f0e1e -:00285066c7ae509672b38c456fa4460a970f26 -:0028608b40cf284bcfca592987f78dae6d0b39 -:0028703bb6e8b2242cd7a2fa6cbeb311e4a6ce -:0028805666b2e51642f9ad4878dc9071a0ed19 -:002890584838df30562ce4495f47b01632675a -:0028a024004d9a6401e053e30c0599ff9b42c7 -:0028b0cb666de0c22f82291ebb1fc0963ce974 -:0028c0297e2d9365882237ff4912e531969d0a -:0028d0653c72d2decff7807dda71bc982da97e -:0028e0ee76117080625a4ad36d3be558a05ce7 -:0028f0569af962e793418e31b427b423098998 -:00290081a863c31ba944ef0cb410d25a08a29f -:002910dd437814c358686720d313285c8bc828 -:0029208816289e7659d7a9bc0df9bdca4fe779 -:002930dd90b564920f4bebaa10ccb157698273 -:002940311e112c8d80ac5f4bf5c4c90d0dc1c7 -:0029506216a401705f9ea61a8d103bcc7d6e56 -:0029601a128f22a7883dfcade7e96c356e4b85 -:002970d9966d77d226d5ad868415e04b954657 -:002980c92d1eea0cff368f18846ecf59e44c58 -:00299053da06c3d968cdebd26b52cb94dc22fc -:0029a036dfa7eabe15279b5521e04c955c6ec0 -:0029b0f19dee7e18fef52f784a086d781f9ded -:0029c095ab927a6ea00a3b237e4b57f1b2042c -:0029d0173229434ed8fb2aef36fed7e8cbcae8 -:0029e07029354d807c98300018e56ef2040bb0 -:0029f01902c0ec0096f7fbd882e1eed4959f46 -:002a009de379e7f47f4f1f3c4c19c4d031411a -:002a1050194dd2a62523c581ad9700e4f7ac39 -:002a20ea6bc638246198a366c825f81bde4260 -:002a30c32eea1fe6fee820139c5abc55294675 -:002a408c3c722a550b9d41c16cb0bad8f3fe9f -:002a506c1452e78185a9d21d874aa5db126861 -:002a60c5f86942cdf2d17c8d01f1ae3291faf3 -:002a7009b8f0a5a65b300d88e85c41f21e2578 -:002a8005bb72579d54c8fed90594c97cf7745b -:002a907d696d42157507f87abc58f63295fe33 -:002aa0683e7b5ccd8f1ce7a4cf95edb8535375 -:002ab05861ed2679fcf2202a03bb591e899ac2 -:002ac0cd18c161683f789fa57f514e4dc8a094 -:002ad04d839ad99abff23a4faca6079f389908 -:002ae0063ca74cb8fe846dda02c508904999ec -:002af064538df9667d53620161af68b5550e16 -:002b00a25ddafc024ac0287b583b1f19bc378a -:002b10988b44a9eacf429e549ec31437dfe858 -:002b206356e01accc8162a4d1251e69fd2c00d -:002b3082123f5054c18f437bc96393872d8d12 -:002b4005b6333964d1dc0768dc258685773d3c -:002b5010b4dd25fbd4bdcd79ba591213462f45 -:002b605efaf18901584c440677082d42c0d511 -:002b703da0317a49dc55333d63ea7064c2c045 -:002b804ffe8078e4924a8b2dc4ca01408fed77 -:002b9077ae37d7f377798d051721916a72a46e -:002ba021441edc7aa27e5c913d77f18f51634b -:002bb03765829519d724224d4392e193b10a96 -:002bc0c2ef202a040af724f1574baa6ac37374 -:002bd0561bac2c0a0853d4f53459e69d9eee0b -:002be08787f8eb71284aad44ae4d5fb8e37f93 -:002bf0ca11c9c2c791d03d06609f17e4429e21 -:002c007bd3142a38a99e38cc16ccf08b53ba06 -:002c1050589976395c025e1d1f3d1e4ffc5a51 -:002c209526b5d355f225fb796ba3d1322d801f -:002c307e6558fd9b46b9d08968555a4da713a6 -:002c40b285db8b0f2dcd2d238c2d89fd1b2c8d -:002c50220119db7bba197c11f63706ca87a9cc -:002c60c9a4c077a8aecf86fb42b9f8f0b721a9 -:002c704c427f2e1737e0905b4e7e338d6803dc -:002c8078ee46deefd526fa1eead970bf7255f3 -:002c90fdb443eb69b040c61cd6d8e88803b635 -:002ca013ba8ab1f21b91fdba6e0ceecf11d5b6 -:002cb0391828cbcc4f80964555b7db83aa4163 -:002cc0246710c0a13e0c2a1e1ff9e4b820285d -:002cd06b6a686d1497186dbe0109a65c34aade -:002ce0df9f8a57c3ab527498fc2cfa52995279 -:002cf098c7f5c536ecbf74ab4035ef1490a0cb -:002d00d5f6a546da93745d09f1a91ee2db53cf -:002d10133b304888fac285f3baeed846293d2e -:002d20a52507c6aa353f65a3ae216d5bd602df -:002d30d185a0326080c5488e9e891848c75fee -:002d40b055efb43f412031cf61840273cea467 -:002d506d588457fae93aa75ff447714db98532 -:002d60be5d01854752ec3c5271539190b32cfa -:002d7018e98a75f49f9674c3f004585df837f0 -:002d80e50d2118d4befbe91e3965d9ba62f5a3 -:002d90abebae5ac1e15da0dfe35940461c2903 -:002da004fa56d7b49bb578330176cc0efcec82 -:002db0bab723aea1c927f688ef67176d03ac49 -:002dc0524c395f76209159bd2d9d5b32bcb19e -:002dd070ad3b4bcd3f1012fcbe7b3e6c1c6b94 -:002de0a2cf35809441b28dce0d87876bef4d53 -:002df0a7125b02bde7c070a6f53098d9b0ace6 -:002e0051a4b9b37f58d49e506591fc3a310d01 -:002e109d0325d250cc0e648bb2d05ce37d78d8 -:002e2058c085add28a2c287c81e0b2faa830cb -:002e300c434a23b4c7570ea80df2bf57384684 -:002e40e9fc4dc0f67b9b5007da6af042151c5d -:002e5013b3340e87acd21bd68a93a5c5eccc79 -:002e600611663d818508797e860dd61416e3ae -:002e7046b5ee19f20a9e6d822a9794c9558c91 -:002e80d0fc6c8fb750b3b0da3c4354d1176113 -:002e90e196ce328952f5a03809099c7943e360 -:002ea0c19a84141f3d17899dcdbd73d349f0ba -:002eb0f22964af50bf6a6330a7bdc5003d4bf9 -:002ec0c108f6ccc345eef06a1e46af0f9ab3e5 -:002ed08b184d3dc40c64ea2cd7b66f2861a7fb -:002ee0f5b68aa1817613aa021818f7d99cd397 -:002ef0b17b974c20a2e41cf110485479a99435 -:002f005570a70bc9c6424de3807a0b97914f34 -:002f1024300ea86c21ff4222b3382f1f259ea9 -:002f20d67adbe0e56e6f4d5ba2d297a282597e -:002f30700ebe1ff35a7961d560892593a804be -:002f408ae993253c92b581b1e0dc0df42afb25 -:002f50d698da335dcdefbc37f961fcaa6cd642 -:002f603a5d20e1bad0e36da94dffd6d2d84820 -:002f70608e0c9c544d0427001023b38912ec64 -:002f8084a7aed628a31da653bfc38dfca19be0 -:002f90760c497d6ba3e77c434883f58d5d31dc -:002fa01a5e9db0e446a99cc4bbcb9af3554592 -:002fb060da4fce5a47ea653068f41f1a0899a3 -:002fc018893b85737853b7bd94162d40b3af30 -:002fd05f6594458574c9e660c77163ac0fd4df -:002fe0654f0b9929f41b1ba27782e1b071ed2d -:002ff04a76257d05dd2fad836541c26640f20e -:00300086560f3ccbcaf94cddd1d69103cafb0d -:0030103d75c8f590457f2e92f024ce25c3cb5f -:003020e2bc733b1d42f42f4d543c82c7ddcc0d -:0030304f5f1a4bab651b5efd7a6f256da6c598 -:003040fa77dc89ca1964487b9632180450c0de -:0030505e54b8a6db57326b43603c6af6b83779 -:003060ec2780a7c9b2ab7c2f026537a207ae62 -:003070427c556f9392818b5858b0ec14d82a59 -:0030800490f3724e651df839f18226d91bb609 -:003090a8dabf71877e7e97ad28fcc3ca23338c -:0030a01b22dc4155a0524bfe5bcd54c47b46d2 -:0030b06e9382547cf8c5bdb0a0457c01af9eb0 -:0030c0bd2f2f03bb6c840cb603fe2719627835 -:0030d050a1708f1e18b48c3a4b7703c82475f7 -:0030e02ab86a0c6a1194c3d25bb02a689e2a55 -:0030f0d490e6f8e5d92f152fe00295f0b6883b -:0031008cad781a09816e25f917b77c72b5ab5c -:003110cab01262a15b9be316df2a86ef40768a -:003120123b1c479282c1bbd8576f3ae4dcdb06 -:003130f73375345100f00875124a9c96bb98d5 -:00314000396822b5e6db1e32dd14b2267c45f7 -:003150e96e20fbfb67fac59d23295840a562f3 -:0031604755cfe3365a574496b769da73d32b6a -:003170e875a49f537eb3e6cc6609bf46ab7584 -:0031807fc9ddc55a6bfd67087bbfce8f438dec -:0031902f15d903dbb21ce7638f2868f095100c -:0031a03115e904e43a57d2af698790f2eaca31 -:0031b0cfa78462ba5caf1439f8411ddfb34f0c -:0031c083375e01f937c3d37f92fdb5aa93cde2 -:0031d03abee87a1efb8806f43579459c635966 -:0031e0fd34cf15a93cf01314e58412023af323 -:0031f09d3e17477eec7c48b05cb3083b6758dc -:003200896a074252d87cd0a14f8c575f3806f2 -:003210b4173d94b64568bedc0151c4d3ce5292 -:003220629389713a6dd1e1cf68e54737bb390c -:00323023454198e1df177f0de9bd3bbe2be3f8 -:0032409555cb7472f03bf15e78dff879e2c83d -:0032504d27301179490a3b40a6bf50b6abc34d -:0032604169e15755bcbe9acfb57232c01c6c03 -:003270e269efc475909e64fbd34abbea75984d -:003280245886df19b058478be5eff0ab1f7dac -:003290a0641db812ce48b94a90f21b7246489e -:0032a0b38a84a44de3e00430abc0d9e7c9cc81 -:0032b06d594556d9227f6462079cf2def2e265 -:0032c00a471b0c25bb5ca3fd19ae67ea3fe954 -:0032d003d8991300e986c7f8332f6da3f32339 -:0032e01dacb077e299e9a71fe36fda48751d6d -:0032f0fed36de266cc626dae696223045ae472 -:0033007b8f4b247099a45bcda3c2398cf11508 -:00331038e04c6fbfda09fa98f7e760da359678 -:003320ca2c5accb62044d6dbc7866c0db2f06b -:003330e30050fcdd5741756af92a25e16449ee -:003340fa6826c68f47d44d2b31ec4c2a3e441e -:00335083ebec309b3205245117cad46d240fcc -:0033600a6ee47794aff211a1409ea04624b7d1 -:0033702d57f56417d6e70117600e8c1537d393 -:00338048e6057a9d9b46715dfcc41ce972b627 -:003390c3abf7df2d29a0fa4ff9179c0b07fbd5 -:0033a0702f42b638bd96324afb9b338b37a1e2 -:0033b00f0887a674faed291f8afd6aa7a35b88 -:0033c0f708049b7000528329e1d726e968e299 -:0033d0716353b8b54bae24f1c493f745df72b1 -:0033e09fc514def22caad7e5702fc8cca7ebdf -:0033f00e68839640153375b87eff7e4165e858 -:0034008ea7e2377652d806f9aa4d9a322a8949 -:0034103fcfb48c625b5f2a77973c8652b348ea -:003420bf3fe21350fc78f2b88653a09d65fe43 -:0034301b405d23611df4ed24593b2c7cf07a35 -:003440a925c044f4229faa96eacdeeff3a407e -:003450ae2f35b4ede4ddd922e3b1230a4c6bd0 -:003460ac443992ca5d8c0088baf3c411c2e951 -:0034702a2d7432c283ac9928706919d2a8d2f3 -:0034804f6d9ded16fbb32129096142c310e398 -:00349041ec0bd239f50f15e7dba1e28e3809f6 -:0034a0a7e06483670feff9294d93178f244819 -:0034b006e4cf2323f6bac2f95b138728072c50 -:0034c05420d4306714e3a52c8d33d43ff55788 -:0034d0303c175b6070696d5f75d435734eca57 -:0034e01dc2807f410756daaeee33dde254b8b0 -:0034f0f1ac111f7c34549d1638e4c625eeb194 -:00350038337fe5eb2f5e2a89a8683d090022be -:00351070e4485d4944c8540f6b482c7a1e08f3 -:0035209d29cf3e9af9e4d235d70a608b94e13d -:003530b1ce86ed23e62582d869276019ed7987 -:00354034ab18dd5f00ecb5c5ffb621c0f6cc5c -:0035507c293c5e6617a0248445560ba6acec65 -:003560345e359f793ec8422a2a51665111ea83 -:003570ea0155ed8066ffad87e4cab4d297cbc4 -:0035802f9b4c5962de9ea3b7ccf1aaf4a38d4d -:0035901b2348ff6b296f8ba910a8ce52bee9ac -:0035a0329e5c933ec6cdd907c5b8e98e1e6a33 -:0035b049df0f4f28db8329f44910d7c53b12a1 -:0035c0455457152fb39e8dcac3c758cc16581f -:0035d0fcab58d8a68eaa5bd063308a6e0c86bb -:0035e0cbe3081e37e20348578b894be7e8d860 -:0035f06ec20859cfc3e42a211b65f397421676 -:00360005e4c063a73d31344fbfe3425059b747 -:00361088e62588b131ac618d63543e5eaa7512 -:0036200e4ee18fde9d179d56c3e617b1fb1103 -:0036305eb104a741e0cbc6f56d444de5229bc5 -:0036409dfe39559cd147ba959cc04615d4a9b4 -:0036503fd0c19e34da48303f3c6c0e9d65e227 -:0036605a2fba7a278a7c9adbee54b0bc6ff4f0 -:00367089a0c5b4ccd06cd2362fef0e265733f8 -:003680097f724ea4c70440246a783b899bf053 -:003690ab69f7009e1afc1c010ae4585a2b652d -:0036a046c84fa0eee3a07653ebfda0e9b07161 -:0036b0ba0e91c72cdeb9fdc70c4fde18b93320 -:0036c007e19b569c5ffa040433ccf25d66378e -:0036d030c43240b4c7f0eb1288f33319977cac -:0036e0fe1aa26f60cac4ab478bbce8a684d6c4 -:0036f082c8c817f81a98bc4ae0fc45881c883c -:003700c840034faa0cb89cb734b485e79d1099 -:00371077e116326d1867d26c580ee8ec92acfc -:003720821c78ad2f4cfe9f7b0c958b76338ce1 -:003730ec09a6c35c3db30d66bae3df0da4e00c -:0037401c2841ce0571febe86f6690023f0769f -:003750a73cee73cb9e27ce5c1670103f933c52 -:00376020dc01af25db70f7876348404e3cc657 -:00377068f1c43c8e5552117d1047170ce84856 -:0037801dd6b88066ceda95f54399ee90693078 -:003790ef362e6f5cbfafbd6aecb1d6772f22a0 -:0037a044c24b4e731c0374bf103609db2afce0 -:0037b0ceca51376f4a5f5718eef460ce914209 -:0037c0bf9d76462da6701561d5120b8c97689d -:0037d0d099e69f45ce0c7469b2e23bbe0caecb -:0037e0dcc2b0ed243173cc28793a8e7aca4e7f -:0037f0f80d82615d46199d10c55bdf0c584bf3 -:0038006731edee97f003c924d55b658f2eba94 -:003810241cc66151c88c9c057a4816253faa57 -:00382049f835f2b57fbebde4305086251a3dd5 -:0038304ca0d3d71370d5b8835490acd63b1bb8 -:0038400cc26ef6f070f6cab9b51e4cc0e582cd -:00385014a580776f990c4430c737716fb56f70 -:003860e0d531d73470f0074d4b6f5e0b1510f8 -:00387085247a4f91c4ef14f45438fbf1801703 -:003880790974153cff3d6125b8325da1fb2a91 -:0038908d68bb412170ca9a772330f2767600ec -:0038a08bb969364479786b5bf7c05d25fe926c -:0038b0fd0cd207b10eda76ee79e4a662ff2a2c -:0038c05401617469be035b5c543d3da5d3ee61 -:0038d016d2ec5b89098b0618aaee99cc3600cf -:0038e0f407396680cead2b760e92b1884a8903 -:0038f016970a2e5a3ee14e6c3eaf5165d5d09e -:003900550399af72fc40a2990a6107b44c43dc -:0039100c18390a03157a9fcb10214acaffe29d -:0039208e0067716fbd8f382115734cec4531c5 -:003930a984ebbb8cb1b4eb29d81299fa8edc51 -:0039403c877c01d92c9556010b8755efeb27e9 -:003950834ce2cecfc8741fb0a2cc5dc6592ab3 -:0039609fb59e058024729854becf26914fa2ad -:0039706a7fc8c1a7a1c17d112210ad01afa9ed -:00398087ac88cfc8aa521ea7f0438815843d03 -:0039906271cd5658678c1e3737d139bb57e370 -:0039a09c5888cd4b66fa371012cd70a3d59d19 -:0039b0a96d2cfccf9b0867ad0e291b91333fa5 -:0039c0c3cba2c1ca9425d1bc822a3db92bf847 -:0039d09808526417a4682e2f42aff44e058b57 -:0039e048fdbd91d514eb9d634c33b9299115f6 -:0039f08ff609832c16e4293548659286a87bd1 -:003a00b337c57bcef643d5e74ad4f3686ce5b5 -:003a10368e88899f1789a31eddc3681e2eab40 -:003a20515e50465aff006b09a7bc4d37cf414b -:003a3026989bb79092d4efbb3a546a5c7bf4fd -:003a40d5aee6fb58cd723a5b779ff0cc9372db -:003a508c75c3e62ea47693f2e9f966214aace7 -:003a60e95e318db836976323aad33a689b00cd -:003a70d160bfa183ca1ea93e66fbe0647f4a98 -:003a80165670cf2c3cc50a3c576cde4b186a29 -:003a90f6527bccc0185e5183907619d271eda6 -:003aa07c45a2410323e4598f46659a870fe598 -:003ab090d4456a680bcafe56e792bfc9b19c0b -:003ac0d7a37ab38bccd22416c0e16c696aa638 -:003ad0864c16b11e19a45181a5e368df2f6233 -:003ae03148bea4aa11d32b9722fa601549c753 -:003af048071f2240e9bded52078adc30b6ada3 -:003b00fb0ccff6e9ef1a48a4529cf407393819 -:003b1014e29ed5e88fad4a511d77d7da2ffeab -:003b20924e7b9d33bb56db3ef547f7a85b2688 -:003b30d3b6700272621d3d4985f1c16d059193 -:003b40911e826fdc30d74d69fae732519e5db3 -:003b50d3192fced7c1fa73665c65ee373f5a9f -:003b60d4a2611236bb4119f4ae2727873bbf0b -:003b7024ced0c0b6548a328107176d93ee0a9d -:003b80b0ab7c9fe3990afe52b7471a7c4b9e7c -:003b90925074db4594c8f819c56feb81285b76 -:003ba054fbe20d0a2349e35f8922ca9d166328 -:003bb0c430166ba33cb788f5aa9cb27d22b5ad -:003bc034590b51999cad6e9b4d19b3f3118285 -:003bd01851cd7d8811391a2f01e5f9487a0149 -:003be0ca51138521e1de2bc08be1ee9821c2af -:003bf0030008cc51fae2fc17768935cb50484c -:003c004816f6486b334d93ad4ee40423ed048f -:003c10d48f1abe2b200e149111d75e91e517d7 -:003c20cba52b59ae26c86220cd1c0d56a20312 -:003c3088dfa96392f914e546349fd7f3331ad2 -:003c40e375fd4c6341dba17abfcda52843152e -:003c503ac33e9a550d376709ccdb6193cab98f -:003c60234d548781057f59bca2fcbee080190d -:003c70e8a8de7f4707f7d17d422eb64e488c5a -:003c80aaa67c42c0d76bf1c41b309dc087caed -:003c90470be164aae0a2877fc10bf00c81e3a7 -:003ca0650099b459f623452da2333446284cdd -:003cb0603ccc0c5b265aa1269544fde12749f1 -:003cc0442663c409031d8f9b3b6d3bccf2188f -:003cd0c56fec82f17bac10deaa8ac17dbcdef0 -:003ce07133bfae8248aad16f15bc4e2b70922d -:003cf029cbc89f8e091bf8b28ccd6339aff733 -:003d00f4b13432b4d957702e9cb6ace161f700 -:003d10427043f618a98faa673be9e0771c0711 -:003d20be2a14e74c63fcd4c4dc163a0564a77a -:003d30da7f728c2a7bb9c7671b4eb861202585 -:003d409cfcd9481e44c431971a0c76690c57fe -:003d50437ab8976bdeea3208b3dfe9c3522984 -:003d6096bc7a8e3e2eb212e04f2962573a3c0d -:003d702ce60355ee3f18fde23f62079889922c -:003d80b7b499738e54f6433cdfb49d51dbfef0 -:003d90252fb561c1d718734273969e9e815593 -:003da0f8bfc0e6fbde444ce6aec60a94004108 -:003db0e93aefd02c7ab8cd08ecdc546e4a445c -:003dc0c49a61f3802d04dae81f36c41fea26e4 -:003dd0be1e87b887ae7b36537b69039a89ae1a -:003de00ab70fd0f2ec48e70d8677c40be23d28 -:003df0372f86669f2afd240f24ad2c525a5ceb -:003e0035dd3deca7eba59067485b1ed1d80b9f -:003e104c9e8a638661e4318638db712c2a9426 -:003e202c8994587b876c65b3b2d5952590a7fa -:003e3058597aaf85ae223493c814ea09ebbe2c -:003e4036011da5ff3fac2d37ff08b9033d17de -:003e508a5db1f887a0fb7cf23fc3a78ac721a4 -:003e60c82d3e0509aa0f377b6dbb40b2401ed9 -:003e708d67b35573ac9a8a58f4307f8f315462 -:003e8094c8c47b5d3685fb637262d9000fe36c -:003e909b268b4986e252f28e28bf2681b85a0d -:003ea0b372cd446ba981422a11d7549139f230 -:003eb06ec36f8fc7c36fffc8774a9cdfd14382 -:003ec0eebb5fc573b5b54e50c54205df42168f -:003ed0c924eb6d5229ddf25f499b805d61b025 -:003ee0efed51af6b73fb8480f0a105504e8117 -:003ef02a4798c3d7a208a5847c79c99abcf760 -:003f0016712284f35f719c41dde6a506ea97ac -:003f1081ff992370c0ba2feea4803ae2349bff -:003f207537544481a941c8225782f08910c663 -:003f3000957e5054383c6b96d9bccc05e43c60 -:003f40201dbdb840a857662bd8889aec763ad9 -:003f50bfb2998aa10ccb24cd407cefad0080f4 -:003f6096c8d8536f7e565fb069aeff4d5c506e -:003f70ffb0aba85beb3780164c7b532a3b02a0 -:003f809317f733e556ac6d3e470ebbf058d2a8 -:003f90151f2e92eb8eb1b9c9fd0d91c422a367 -:003fa0cbd62f82b38d328e8db561c2d7007bbf -:003fb05d53d50e5f574e5170ffa89c7bb40109 -:003fc064f460ba63b192ee5501ed4fbe5d4908 -:003fd00173a73df11be41404649680da1669e6 -:003fe0e874cef94d8a6533918c085cd49331dd -:003ff0ca18889515dd1b7d01b716853589a206 -:0040009b12efc4608254caee3bfd9bfb20dd3c -:0040106c0fbea0a4c6b2e24f3d86467dfeea21 -:0040201e255f78827eb0b91f9f9e5bbc0782a6 -:004030981e140e5c7a3b5b5308fdc4554d4fc1 -:0040409da389b312012855d43f1eb8c4e33d6c -:004050fd8744e5b6a87dabe8b016303a32217e -:004060d28a2077be8449593eabc7e8efcc74e1 -:0040703262856147657cfd9a8e2d78af673c38 -:004080afd5abea82795f038d0e35654acfc30a -:004090089ee351e40982238221a11c90d44e69 -:0040a085c8c82b4b2501b50e817db06dc6e2a7 -:0040b0efa09b957b98ecd7ac4fd31409cab51d -:0040c0b0150118ded011e0f1b9adc13cac7852 -:0040d00e4c5736d555b7ca54fada445c3f9248 -:0040e00eb8a48ba52aa9940ba0c5c50de78053 -:0040f03b73622013c3d1888df3ff04c571cc9e -:004100e26603c64320167d8c6ae0c9ad9effc1 -:0041101a4b49b668fca479b47987f5c465fe08 -:004120dc390f6ab556735ad686898b0602a35f -:0041303610291edb89058fd9dd02e89462eee2 -:004140fac44b8e85d3b8954731724f07a53356 -:00415072daa2dad7cac01dcec16b31b804d1bf -:004160d056f41bb6695dc6eaf09feafe278566 -:0041708641e984d197a5c2f18bc9c11e3e7627 -:0041808561d80dd1695710b328bdb478798ca2 -:00419026766ed9deb3d9d0a719cdfa5796be3f -:0041a04d5371b00102febf6ea041f6b76dbbc2 -:0041b0d7436497f6b9dad419f7d9f7753f47de -:0041c00fc4e3977d9df19ec566275af5d180a4 -:0041d00267beebe40cf8cbb1bab289137b3304 -:0041e0e58fcd87a73cab68bce72c75939217fd -:0041f02db20839593099e6c0bbe23dc5d0d87a -:00420049d7528ac9218c2fa5cf0aa929ff83e1 -:0042104b41f0bf336597c2a899d2b40c96c3de -:004220b8958d2780747a5d37ee92170642dc77 -:0042304efe93f562ea58ff64bf09d47afe8b3b -:004240a42ddf9154d384ac55f2bd78bbc3786d -:004250e9f42b082ca023893574a127f89d216c -:0042602e4e03e02448012c633f8eb1b556675c -:004270b2288c68ae575503cd6506af4e616bff -:0042807edc6bc13b7f520ae2c65de51d33cfca -:004290723ee7e413b78259c30f00dad259e9f6 -:0042a02d787b6e36d38cd76d5ecf8b54dce40c -:0042b09a273b7dae38b9c638469a0b14f42fcb -:0042c0471d7237d7aedb2bf81e2df9dbad0488 -:0042d0a9dc955244f1e969940fef92ad214350 -:0042e001eaa052c13e413abc60e6de2969863d -:0042f0fa59c64355ef308238dabf3a288db775 -:004300f4996343ef71c12f8293e09c2bdd3086 -:004310be1db98d200e4ebdb2e95f73668d3a91 -:004320a26634a3c0c55546d315f739d2e6c3a0 -:0043308c1a6664d206c49e8403a741e1d829c1 -:00434035fa6031f317c6aa61b372d95600fc5c -:004350a70e7bc86226846f1791489e8cd03560 -:00436092421d5dfb74fbf18c3f9ac01ca5b3eb -:004370be30f032781a3373ad5d8b8f861cbc20 -:004380d8cf68db9352088f2542a1df9067b78a -:0043905891cc7cc5b51fbe387329a5e3139465 -:0043a0f9c6fa3b83df2a58cd9782c1868f8d0b -:0043b082cc3e41fd5139f7ca6f4a83383b8f40 -:0043c0f9d26a2d6cf2bea1f0d6695bb49e068e -:0043d03b4e61e5b51722f1fd055f7ff3cd5a3c -:0043e0cacc21670b0366bab22da9450b6728fe -:0043f0db305a26f50fd0d3e79f87fcd1d609ee -:00440065d0f3c0b903cf20a3d2adb2830d3cf3 -:00441027f828dd72887ac2dbf26fd4fcff785e -:0044200d1c18be28676e55995c5f8cff3bc97c -:004430da252ed64b32945cfb55c85edf258df7 -:004440cf420bf3c5bead2da41377f0a59de401 -:0044501db10002c2185d6828c5adf3797f0c38 -:004460adf85e1b94e6730fccc1173f015aef6d -:0044704f9280010cb472e757e69a97a89def03 -:0044807147666ce2e7d6683d5d35636fdf0be4 -:0044908703ef6eeaad9f1b340aebd19dc8a989 -:0044a059a22dfcdbe2bc01cde88e3d9ed1e3f7 -:0044b0dd4e4d9a8ba4cf79e87783e5f64a3be2 -:0044c06923e3cc21104c613406c016055fd6d7 -:0044d058f9964f374501f33f3ad0db94120c94 -:0044e001a30c0fb32ff6dd4b3bb1f31666759b -:0044f0c40b169d35a81959d4e69e7c831f514a -:00450022a463bf71225e17a9b54b733a29130f -:004510a3555be5e0bdb9bb4f1ccdbb41f45e00 -:0045202dabff3de4d8ebc4c3fbf662acf67cc3 -:00453073cb4eb4a1b1a1545d218503ba0c6dab -:0045408a368b37d4915444d4c90fa662beaacb -:0045507a78f21d09d310ee111f8f56901ef5c4 -:0045607eeb78f02b74977be655b6bc193be106 -:004570088c2d3098aaaa5b2a0e3f8509e75a54 -:004580935f6fabd335987dd7c4515906a0d9ac -:004590b94edf2729f0bd87f16849647334a147 -:0045a015a985d2c461b6ec1dcbfe8b357fe108 -:0045b0702437443022b4949f4f0622a93569bc -:0045c0fd1cc078f1b0a2fc37a6d78e00b829dc -:0045d0a0f61ffb7fa1f6b61e28a1ccf3f4c10b -:0045e0fe0d4592170d7d229e218a1220aeb4a6 -:0045f02bf3544709115cb049cfdf981e6bbb6c -:0046006a3201f6acc07cc66a153a99a90348c5 -:0046103ab8ecdacb9dcc7c06881fa7f7fa236b -:0046207c11568567d7a283f5924338074a1146 -:004630cf15f96b71f8a0591e6e0edce5f4692b -:004640a9d70606880361c467754177d4eba835 -:004650a8e00083cdca5bba2c175bbff4c3db37 -:004660886799506e7bf08a3149491e3b88a2e7 -:004670285ca8bc1a523073ea62bb1daf90defd -:00468078e4f6fbde62579612f3ab399f03ba04 -:0046909da52fc3b6af082f0e6e3f971fd5b032 -:0046a05b1bd60ec5c39c23f73ac2f6becc302f -:0046b02582b2de8fe351719f185471e98c64cd -:0046c01a1202f05b38529b084c9b929159383e -:0046d0a9c42b9ce78162b197bc08c2d85a0d65 -:0046e05aa2cc3a612622483b9062c8724540a6 -:0046f013b214ccb310ab192216b425a7850b0c -:00470038abbaed69159483f3b5ef81ff9963a2 -:0047108346f23c9788de3e1df3240f0550fb45 -:00472044bc93e75993358a38a8e04ed6d7bff6 -:004730662b839c4c289645047f2cda4ee52f12 -:004740635e709e925e465e2a526c34a24b4b41 -:0047501f0e9341b9ecba758d536409160b7c67 -:004760511c704bd51c81232227c29f4ad3e703 -:00477086bd32c35eb97c44bee544e22935829b -:0047803b65913a6b7d4901b8e33806e3bbcdf3 -:0047904fe67148be2570d1da127e8fcc469df3 -:0047a06a95c1d1911f6cf298285657471a09c0 -:0047b036936b2d704e79977860e85ea0c3bdf5 -:0047c0ed5c69e5f36f9818d4358531d50400b1 -:0047d05b00409b8a759d899a693027ae545190 -:0047e05dfd6349c3589184b9536044ac87398d -:0047f025b29554e6002f62159bb1f3ea7c6c70 -:0048008885ada487c292953f389254ea35c5b1 -:00481008bbef14b24d4d0c60c14abaf9340ebf -:004820953c5df49c4d8a10647fc48767c92958 -:004830c02e04d2cb7765ed6ef9e88f8d7abd9a -:004840eadd59b6063e9dc00eab55badbca09d6 -:004850cfe0a453b5011794a98f9bf3cafbd314 -:004860d475487a66603a6c500dfed706579c7e -:004870a6f664b9f8ba4abd5131f69a0bbf0174 -:004880edf9185e4c8ef644b9f50a969c079cda -:004890a285f028b4f15d0096f6a1ffd58fd680 -:0048a0f63c12da06b7ef0c6637f62c61bb2fcb -:0048b07166dc0d712f246e02b63415ecaf1e4b -:0048c0476dc33089c779f10d3705cd50acd3d0 -:0048d06ee0db05f57b85959421504d601a4111 -:0048e0f277c712795fc0ec019efc10a0d1079f -:0048f0aaad155a1eaa52404135ce9a9c26331b -:004900fc179f1d9ac02285ed4bfc5fbe8534dd -:004910f1dfa14898fb87b624707ab81d0634b8 -:004920a4f99738b7d38701edbe380baae9f0cc -:0049304dd94e61c1cc0219d9881f8a672198ce -:004940102d515a8f104e064fb7c8f38ec0c68b -:00495075432cee42e402f461fcd5fd2893002c -:004960913b0ebdda04a9fbc4ab872eef129e96 -:0049702465c2a1d9dc1b8181e5c7701a1a5a60 -:004980910287b054144508a389edc8fe1cdc48 -:004990d966cc8e22d54cd0c2b581c8e23fbe3e -:0049a0d4d6f39cbb0b9084f3e32a0c8125238e -:0049b0f5a757aad6a031d82ec51999a14da2e3 -:0049c01fbc5cf962b3366e9ee610d1bb70366a -:0049d0612559ee76906ac5dc542c6808ac9418 -:0049e018a6c66986fbf4c04d3852c381ba2df7 -:0049f0be26acf95890ecada03b8d2660cc1a6b -:004a0003027871a34e1869be36a01ed0c94d2e -:004a103d881a8f1631302de4a3ad21ceffb2e7 -:004a202991d074a96477d6bc40902d20041eec -:004a30a9cb9ac16f1170d5754c85d2a5d9372d -:004a40bce89b4215a0f1a33b51c880dde8f499 -:004a509acadd44cdfe63b2d9fb8de9bb6240c8 -:004a60e97b0e6125b53d8880b0daf25fafe436 -:004a70cfeef576ca566c1ce17dd434dbed0969 -:004a807bee15a51917eed188dce0d2fcdd5f84 -:004a901a7d3541644109a85f9506ee8467d716 -:004aa0a41f2d8acaff0518c57dbdef48d8c685 -:004ab0eec976cc8039d959215396ee7b7f629c -:004ac0d783b143b4336f1efc4c1d2a91d64cec -:004ad016e56b05471aa8cd4007f8181f53b0bc -:004ae029cc1da11a03377b5f1b02aabee915ab -:004af021c1434342e899c575e99e222c8c232a -:004b001a388ff5a280e150739c45017ffcf5ad -:004b107747fef3513f80495f996a20a33e81b1 -:004b20564ce0537fc54f264ef961201ad14321 -:004b309011497bb826e9569eb4456a7321ab49 -:004b40fe9fbe82ad4c01fbdfbce0e75d2fba6a -:004b502d3049e501ed73dd0997006b242cde6f -:004b60ce08b0e17277901820c795b12d09a9f1 -:004b70471e25525663d263bbe3dc8a784d4208 -:004b8073262c1270d0d1dc45c7b2684c1c99c1 -:004b9087bab1dd4d4a418075ff1fddcb478fc6 -:004ba0a1d68025cdb20673a9f1cd1d74a8b786 -:004bb0cc3520f60eb481fd4ba4fc58b51db401 -:004bc010a89df6ba9485c4afcf1aa53afcc3ad -:004bd020fcb4c4cac3023fc34eb2d994a39d23 -:004be0f6d0a5b5f2d54dd93f5038600991fcf4 -:004bf0f1b437fd3981d1803d63d6c200d8e92c -:004c009195d588d15ca611e6dd1b256af4fe97 -:004c10c7e7d90a683242b6b8139b7507188c8d -:004c20f381e9843b8dc6ea59a6980b3e7740e2 -:004c305e15ded7b03ddc1398d29ffe4589ee3d -:004c40ae498f0ae6085147263914ac57819e1c -:004c50c8d9a3603eca2f3c9e4feee0635879c6 -:004c604d026beb6bf04f252fde601cf07184af -:004c70fbfb39f106b7639cecd52f042602184a -:004c802f4a623615b364d2a51eec647131e105 -:004c906f3a1be6b6d6d894f0a25714daf3258a -:004ca020425ccd062ce0357f114bf0a92f49a0 -:004cb0b2ff5a779f45e4b25914c000842cde08 -:004cc07de8445e5dca316c3352ab8c7b05cc22 -:004cd03e8a28a1d1d3eefed5213432426093ea -:004ce04ce13cc24fa4d1aeda7e7d64b596ac8a -:004cf0ed05834e82a866da69283065d5609fa4 -:004d007b6748472c244d0cb0d334a63aa384f5 -:004d10e192a9caf9653b01659e0f07e17c2193 -:004d20436968bc5f1fdc50c0f75065f075957b -:004d30b001c517df512c1a2396c23ff60d3e3c -:004d40fa9812247dfdc5691c9b4651269c2ed4 -:004d5083640bb00640dbd910c1149b2adc3a04 -:004d60c8576826c94a4f5fea0ad261c3724e91 -:004d70802855405140737d7f213022ade48459 -:004d80b5808ddadfb1c32bb1fdb637e947de04 -:004d90dca39706e8fa4bbcdc9d9a0b3d3a7ef2 -:004da0933cf2028db0a422a78b26bd57258d45 -:004db0643634389640b27b3003eb3ff025bd1f -:004dc0cdbe53cd958d0637c7d7ae2741d91697 -:004dd09e38702a9e9512a597dbf9fe74b8b61d -:004de044244a9b560b8a0ad19383aae191ced7 -:004df02f39ea3d7cca493eed3b248ce11fce7d -:004e00eaf3b205cc35647a023a416ea20cb160 -:004e109e2ba7bbaca496ceb02069aa2b6fb3f8 -:004e20f246abbce8dff435a39068fd1288e104 -:004e30735ed16479d69f9e6ddd6809b516f9a0 -:004e40dcc53b70f2608992320d278b36dba778 -:004e50cf4b15b1b39486602e704ffa8ba82d14 -:004e60cbcc454bdbeac7efa04b46015b97a5f5 -:004e70eb6ad973203c5c580a78346b63b09f33 -:004e80a1c56e8a4c39381ca6b8ecb0e23dbd57 -:004e90234f0cab2f5be4d1d0056153a22aac83 -:004ea053787c7924011293c74aba543f7b10f6 -:004eb060e00fbfcdccb2f977f07f9361c93dcc -:004ec0dbd75b460e79e07b8fc3813810a26d74 -:004ed009d6894833dfa06785ed4cfe563b30dc -:004ee00ee9315f2e7c895a097698b3a4015660 -:004ef09835d0fc5640ca0b3265d7f4ce985455 -:004f0025b2f65846e5f4146869604cefec74d1 -:004f102baf3cc14f10f8495f83e0f2ada0dbbe -:004f203808b49e6051eabbfec7f3275a1bfcd0 -:004f30024056d8f46cbc6703e913c2814b251d -:004f40a0bfb8144c735de96cb293fe34255bfa -:004f5011eeac95709bf94a75e868ca30d7560a -:004f6035b05db155c443ae22902693dddda034 -:004f70389c482aa132f9197aa4b08d88cfb3b9 -:004f80a26e3e55794b0d4c6d58ae79bfc3f46b -:004f90ace5cabc543d1b2b916a93d20b1a51d0 -:004fa0dcabb5dbc3e42052d4d87f164e62819e -:004fb075c73082c9e466727782b3c029a79e76 -:004fc0a50f38df4550dc13d092d5eb58ada968 -:004fd0b33beced4dc72ff638a7c55eae185ab7 -:004fe094532aef53ea53443925e71babe762ea -:004ff0a97030b42a410510b847a3839f3c2fbc -:005000483a1cbe5249e766f729fc48f8229629 -:00501073067231277fcbed40bcae2a8f779c0a -:005020e89ee4f027d3ec29aa26bfb5aee7567b -:005030fe94b581334acd3c9783acfd88ed52dc -:0050404648e5f070f6f9c695203f56d3c39640 -:00505043929fd807bdfb86b76c4723fd90930b -:005060e0c42eb91dc7825ff702cee667ab1404 -:005070f0a7c1cb8e8b92ee71e9c23eb47fd306 -:00508016f293364e97712d57b106e95db1a668 -:005090bc498b8bdfaa95287332806158bccb1b -:0050a063930397a436535774f1ede8fe0dd34c -:0050b09b30cf5d5bf1976b24c4317164ccc5e9 -:0050c05161b07a97eebc5d6446295b878819f5 -:0050d05abedea1fdb31f6c1f5060519e6d36f0 -:0050e08a1179b6a0f66fa964fce3c055754a82 -:0050f0fb56e0c491dee351ab8301038395d80b -:005100fe9902f24032276da96506a05ec9a86d -:00511082a4fd03262e395fcd119a5bf441d317 -:00512022ac0241a652ec7257b735d4ae6ebd39 -:0051300c53f9964c7563a71a66a24b9bb87fe4 -:005140b17d4360d5e9970a032dbc65c8c092e1 -:005150e47dc44d73565fb41076bade50da3c26 -:005160ee9645d6131f1f3595d091e146e4d915 -:0051707a5977393cb777f0b05aba74760874e0 -:0051801b231c25329affaa34665ee000edce76 -:0051901dc74b01c3625681a35cd37a9345ccbb -:0051a0ba1ad45b6c1251a3d453d6d77b2e1ac4 -:0051b00f3d235d1d09986213096675d01a70b0 -:0051c079fd5117b27cec1d36050bb96665927d -:0051d0df16f19f2eabda5b6857420d0216d843 -:0051e0f6f7ca066eb406d13b7d32400b8018d9 -:0051f0e3552ec8e080a350172fe8d37b72fb09 -:005200d91c8eedc108dd6064a92868e0ba358e -:00521086a239745e85ee623c0bc8ff8bf7fea2 -:0052204f979789125118e9c56bf9101e1fadb2 -:005230487b73d9783e90d36c569c8571c2e4fa -:005240d437515d10a8605d951f50e530d4af6c -:0052502a1cf5b7a2571f8b2d491754186984b7 -:005260e5d86fd08cc8830e73e2abcf9d8a1b53 -:0052701fb9d1e4072bb9c03cba0c412102b419 -:005280e85e1c059b732ae4a6a6b37aaeede412 -:005290d608f9ad1d0231e60b794bbe0f126c3a -:0052a0d638646af3d6b6b1c5a29ed85f63a2eb -:0052b0f6beedc1d44f61a4fcd7e71e11158cbb -:0052c0912320ad7ffb7972736806f690a2b61d -:0052d0c8304298bac34f3b9149cfb4481e7703 -:0052e0de7c5422f45426e99f6914f80296cf62 -:0052f076913b7dca2070e85114b3ef29f7583d -:005300e071a9da7df86d5eaace54e51d27845d -:005310a376238846053afaf5a06e144072dc06 -:005320252b9a93416a63087f66dbb1d50de995 -:00533057e3d369135767b8845b5e0733624a0a -:005340da3f211e7ab0c789cc8136723a5762fb -:0053508613bdab0163550117db3d4b3e6433e2 -:00536006d0c7739497f59f0e2ec0105f4ace54 -:0053702bb46535aa6b19d35af449c3c02755db -:0053805d64820fc25b7d7ad0c6ee10d0839d27 -:00539095566742134006cbc0297123fd6e7596 -:0053a00eb8f6cf294c91f6103d613a960a1292 -:0053b09562ca2ec780086f19d791c828009514 -:0053c0e082dd49e1b5d801cbf8ff56a7d41c7c -:0053d00a47b517b4a35de1c1b6c158423851cf -:0053e06654cc8a12464a24f5b2ed06513b7f99 -:0053f07cb1f9799ec619ae6b6aceb2d9a7d08c -:005400f4e5f5169ce8836df00aa6e3f1b6ee67 -:0054101048e5a94bd1e6f7b523d070940c2f1b -:0054200442389472277688c4b44740acc1343e -:0054309c97a9b82989680519a2dfaca6306d93 -:0054407339aeec3f657fddd197b60a1b31be05 -:0054503af0839daa535332b33f8bfa4573156a -:005460f9018bc00c25d96ffc031eff57ca3934 -:0054706c29532c21f921d25fddaf0e4683953c -:005480e3b41a066f0b824eecfe2cac5cc7f118 -:005490327ba4c1f6907e0ba5fd486ccc0cc6c0 -:0054a01564949707aab5c4c6ec915986820ccd -:0054b046dab1586dbd7a02fbeff29cba8fc96d -:0054c0b83963a5020d62199d8f0e3f657bc790 -:0054d07935cf2d41db890b5aeaf89ceb3704cd -:0054e0bb73a5befce503de231dc70dfeac1dd4 -:0054f087c6085d008e3971d901c9e7a1badcff -:0055001fb0551d22ed65d5ad1edc291891b789 -:005510118b9fa24e3deaac234422e2b2f985b9 -:005520d1d41364b017bf7a9999b1be50b4978d -:00553090c03052286566e900eb92d200eb2d5a -:005540e5ea5f7062595556fd9075eeb146d3bf -:0055505407bee3b80efcfd037f92cd16b7b634 -:0055608fc4a2b897a635b58734a761c78fefad -:005570581db7d822925a787aa88ae0cb93b9bb -:005580e682886be33723da4fc697737fd77fba -:005590c6a007a4d28fd94d042ca12b90d97f50 -:0055a0318530313f7082b079c34ddd6b1a4555 -:0055b050a19004ae44e1608d4476a093865bf3 -:0055c0f4ae8573290b3bee4c30ee73938a786d -:0055d0ff965e56b68607df4164daa882925798 -:0055e0973b593d1a3ff62703114ec2418ad7bc -:0055f045fa687cd3de49042d6fe5e967f67ceb -:005600d4a404d3228ba37e58c5eef0d07abec2 -:0056108d156f8e52d29d1e2547dc6f0d0a66fd -:005620d6439dede6c478e659bd42892eda0aeb -:00563090c6d45dab0ed5e2de41da762ae1da69 -:005640b2ffb2e8dce3ebe92b394d058c1332f8 -:0056504a5498e6845278f42a4dc2885d6d7266 -:005660ff82a5a4e7a3ee21f721dd7e26af5752 -:00567080703a8ef1770df377de8733d36d7a2a -:00568025b18a20a12309190cec3c2b3905dbff -:005690d4c2e2a379c454bbd0cb00e519f635a0 -:0056a034270ee23507ba07a73441a580e21039 -:0056b006fc72fda39b634d7e9080a8a7a9d6ce -:0056c0552476d0c35e02ab8f6dd2f628c54465 -:0056d098cbc859f71585e30609b05038b8c9bf -:0056e099b86c59601279d2431d46f0d22334f8 -:0056f0b97196157b05e6fdac8f0e5142f65afa -:005700a9d4d7cb9115ccf01af46f96de54eac5 -:005710cc85d28f6bd01aa5365521d8266dd5d9 -:0057202f79470c56bd23d383f3208b50e62e47 -:0057300bc4f22cf68a0cb1ff7d9eeefab98da7 -:0057408439f94e1ebe141b653fcb9ce42525d0 -:0057509edf239d0ae288d265a970edec785199 -:0057608af9810b4f70393af16fd6670c30f5b2 -:005770d5f9edcccf8baf0be1b241a24f7d8462 -:005780d87cd60405b7c883fa63e86dbe837b24 -:005790286039342621983bfe08e74fe5ad9edb -:0057a08e5d95ea387a9153ce46840b092c483d -:0057b04dac9507a5fd4c3c90ef1473b438b502 -:0057c0d3a51f9a77d29690ec164665fb22100b -:0057d091148bd77f118e8aa08bfa4706ee603d -:0057e0b34354adef2432647c28b61028d324f3 -:0057f026d53453430148ba28e9f3ddaea14e43 -:005800ca3560d0e033d640e623856df64b2297 -:005810c376ebaa7a8b219aa578672e27342d1a -:005820da044fd8d6c1cc0a9d2f841598235947 -:005830658de337e18942aee010b79d24174303 -:00584000f7d38d8f2681158db46b4da7da1453 -:005850e2c139a6a459c4520b9a826c08c1fd95 -:005860e8c3249506ee4f2706d15f410c2c7e72 -:005870323ef5377f753881908f6ccfd491636b -:005880fec11c3ec2abf524cc51ec8fd1390a99 -:00589094c310c569aa19721428ded4ce4e3a8e -:0058a07b20a45d8c88fced6d4f1429f9522a94 -:0058b0a32f17ed85d4731abc47cd2ec4d61a58 -:0058c0f5a4384297100016f500dc792519c575 -:0058d004fb841cb45bd830f1fe8c5a43e7d104 -:0058e0f08a272d1bac85bbd7fcfca5c4799075 -:0058f070ea6af6eaa371e31ea4d417dc676bec -:005900b9b050be37d8ff2204a1b672763ee8ac -:00591045f326db33391f34bcbe769fb1ab6782 -:005920d0a6bc68599ce57ea2c8f7aa053ce73f -:005930a0312965807b026377dcefb99067abd6 -:0059407549066a1b5d898b34e1cece8bc5fa57 -:0059504815a207e8f7d9d2abd0a18284f31342 -:005960e6f7761d4039ffe27672be5443a805f4 -:005970ccd8d5feb9a6ee5163865b7f9a47abe2 -:005980ac8cd1f93bf8f1da72b8526b9e105332 -:005990eb77888a960eaf57c63c0a24b722e75b -:0059a0452e18b7ba1af60891c6a402e8bb09df -:0059b09bcb3cfe58707290425c2a6ebb34ddda -:0059c0dfc8641d8c90ba0ec351cd918ea8a511 -:0059d06575f43c22c6bb9e910fb2749ddd1cb8 -:0059e02062d1f0533027968b7942bd8ab8a84a -:0059f0a87fef736f9ed58fd310526647784bea -:005a0016517830c6683693dfadd46f6bf7e0c4 -:005a107776b8caa6068b030fdf156f0c3b95a9 -:005a2075c7c5322a2282add2b37f02a87a441d -:005a30df1b3b11668330250fd727d49b22356d -:005a405f540705414a049ee5f7aed636fdd7e2 -:005a50b2faa35a30d369d32cd41bf8f72e49e3 -:005a6022a2b7652de91fb784007ee480378de6 -:005a70bb9b87bc8d71cf4dfbb7777635c9daad -:005a809a7b05fa537efaa341845107aa329fd3 -:005a9081f9877b066da0fb92e05c52460171fd -:005aa0f23928fc1084ae85c53362b88b7a991d -:005ab0268a138113cbf1db96300b4f71619d7c -:005ac03657e6936ea395be14ff0584ccd7149e -:005ad0cb5e05a4c28ea9d4426abd18eca34493 -:005ae0f77d0df916a82591f845f043127067da -:005af0e704d1649aad58994a3731b18a02912f -:005b003ec598dd5759bd02d4b0b95006efe455 -:005b102b3851117352550dfc51420c12055225 -:005b201c6ff947b63556af11976b5aabb1aa4e -:005b30c9286d7aa81c20416b5b319c7fc39a03 -:005b401e24b39e370a754cc94d2fdd66344e73 -:005b50610b1fe634aa445b07d3ec88b0bbdfc3 -:005b60e889f1a855f655d80dc8a3a301a04bb6 -:005b7061b5983b7c725f7656a232cdaf42fd9a -:005b80db3b5fbe4686dc5254dcf39d7d619adb -:005b904d4b9345fe8308e7ba730570f00dc0c8 -:005ba0c39dc714cfc9a4bb4cc0308bde051a56 -:005bb0c529b61ab91901d46cb4496806272888 -:005bc091e776c757c8db4cea893b845dd2da58 -:005bd044e3facb4847a1b19bacdf58456ea7e8 -:005be01814ced39c6075d7a90be5f33c4ee228 -:005bf038520a46bc771a01d0d9865d9565d650 -:005c0007e6bcfd3926c2fa5c31997b9c1e796f -:005c10c10c65a0e9404ad11ac992f1544d65ed -:005c2069007c955abfba5e2ce61605527dea6e -:005c307ef0d9291929f28efd933012429317d8 -:005c40df29d7804b191ea2f9c860b0d249ce51 -:005c50ea531d48fc9f0d1dc62fac51ec4137b1 -:005c602d2734c62a65f7c5383b087360eb5378 -:005c7001ddb10d5993790c20056b20b8ae3c15 -:005c805eeec23ff630126351c61d1ee65eb1f6 -:005c90b349051b1c192d72ac0ae3d143df8c11 -:005ca06f51c5a93b68c2d856cbb0b48c6abec2 -:005cb0d3f8500d8e4d07de6532487b1b9f6cdb -:005cc032fb809d17b120a93e7eeade12298d20 -:005cd0c3a5245bed5af7d26d2dbce275e98451 -:005ce043d024c715122a66d1f8aa4d97eb91ec -:005cf0207ef590f6cfc147a920a59017e05fd4 -:005d002353251080a07255c1cf9708186559e2 -:005d102b3ae4b53e0f651277bd068c10673ff7 -:005d200cabc0223deeca64f4b7993c714910eb -:005d30ddd6511230c291f163553c02dadd4a4d -:005d403f41fa43fe284d543b8d8358160fa70d -:005d50d91b240ee2c4b09edf2f71e0d43b4010 -:005d6055798d3338ce33b0febab607f17ff762 -:005d705dddf0632b79d58d44f61ac8ee1dbd4b -:005d8020c48bbd351878d0a93f1f833267b5fd -:005d90417d11c3932b9f34494ecb9b78a7c702 -:005da08a3ec3c353206d6204ec486afcb35d19 -:005db0705480db92c665024de16d99e261a29c -:005dc0595bf0168cb185469ed44e3b7f8dfa25 -:005dd06a8dcd8ade92d2c68058a8d2ca28912a -:005de04022f900966c46973e056ef054f07641 -:005df0754a1f1a98dd95d6bb50babbd9bcf65b -:005e00a9ed2da3abc0c55df5ae0995071b382e -:005e10e4530fcfec6aba5cda97028b2d44fdaf -:005e20e27218eb6a44b723e824c1477ecccc4f -:005e309cf829a1f58d3eb7f8f2c97aebd37e63 -:005e4003ecf3d4eadac51e73ef13ca1f45db7a -:005e50fc07522b78025eb12a070d256b406424 -:005e601fdc0381271d43ffadfc59deb0f333d7 -:005e70aff3c608af22c6009765c3c09bc3947c -:005e80dda050fd7143274aea1f5c86251eb66a -:005e903b5de6dd1246468872907008f0ce1cca -:005ea0c4ef1db80077bce52515b03f9f934ceb -:005eb04d0b3c9a9cde6522270c42b095f4a914 -:005ec08d6152ff9af257755859bbc22354d744 -:005ed0eb12dc6815bd98fe56877227d19fb067 -:005ee000d88bcc3c2a9ca93c78dbf4e034ae69 -:005ef01b563bf1e1b5d503434ed604d92c793d -:005f00a9229d2335c234e44eb50294eb0304a6 -:005f106fc12c7aabc097cd58ca6ccdbec3b422 -:005f2038a98aac8ce96f6be7acf4eda9831798 -:005f302ab8879f564cc2bfc6bff40874ee663a -:005f40f958ac9bbb463a24b4db6f4a4a9877e1 -:005f50b7f7df08a70a5e58f7b22b557d1c7ff6 -:005f60c94a97ef534fe4056524288f731463dc -:005f704d21e12bf2fb98c3c6557386c0feaad7 -:005f80c706cf2e7088bc02e33bf713de691d68 -:005f90b0eea222a2ec89dbd35ef3d646e2a949 -:005fa0665d2bc5b518482cd4621f2c0b00e401 -:005fb0f9114eadbc1c394e6cbfd54a2f7c9742 -:005fc089a5b98049734fee073262e9bbdf5609 -:005fd09a6743a2804f9b10e5fa6001c34dea45 -:005fe0b6e91aac5639bc24f0d5974b99043c58 -:005ff0ccbb91a6fe4b1dc7113cbd7a10e22c50 -:00600080a763e3b6c557149758d35d2723a1aa -:006010b27c1cb17ffa5d65c5a350186618065a -:006020fcdb86879361e43601a4c8c1acf879ce -:00603038da0955581b28954348075bcb56a2db -:006040cdb4860362daa78daa6e23b42403d42a -:0060506a4229daf21543980da018d33bd2e05c -:006060e80737e9ff46629465528f0a54245caf -:006070851a4e4f4924304d7d7350bfd485e126 -:00608024546fd83bd8526fe76939fca6937a11 -:006090893ef4c334b30eb018160c805af3e706 -:0060a0ed0fbc97f2abea9544d50aba0e7852d4 -:0060b05e2162a188507d8aed33a4a505cc2d15 -:0060c036405a17d2213b1efba1fefb9d96ecf4 -:0060d08fdfda6efd46871ee5d6e215f8dae211 -:0060e09fcecb65bb16155ab6223dd680b728df -:0060f00254dee091d5d8c70aa081ff66b6595b -:00610018fe9c949240f3295baefe8ad9d7e302 -:00611065b8c89d5d4a21d2675de2f40ca0055c -:0061200b70a9017303dbdb7ddbc35aabf20d2a -:00613024e98fa9855c5cb8412f559bade60d05 -:0061406eea77bcdde2bc638dbdd60d4e9af02e -:006150276cb8938d3034bcd7101a354f7c35d9 -:006160a9a4b1b2089fdd41ce28196d314092c1 -:00617077229a13a0498a6070b50066d319e605 -:0061806147b08c8823411d18abff1a218d4fbd -:006190fbb627e8ad4e0bd6c505d5fcec227aa2 -:0061a0eb17788e41729dbec7def9e709ccb85e -:0061b0dd0277c709db1e36a28e4a9b0744cd0f -:0061c09a46e5c6eaa5a9c38bda7cd34462e6e1 -:0061d0281a16de5d5eeca9cc2d55707afab778 -:0061e049be7a5013b36c0f51d770c10943c935 -:0061f0de5f9c56096dfec078b14404f6dbaeef -:00620027c61ce6bcdd018457dcd61cd5d7dbdc -:006210d573dd16691e813d4aba08f39ee0cbcb -:006220b79e9519c601c3e3e7ea589a252a6ade -:006230efe283fdcb09ef138ae7c7c54e9e8e14 -:006240ea4ca1b8a7860d833053ba08a8878d63 -:006250ab868178e261135427fe940094457345 -:0062603e1c47390615c705b4469405ac02dbd0 -:006270d35dadbbc4b855df469c303b80b88df6 -:006280a426965114fa8fd261a753f1a7457061 -:0062904ee0f80dea5e0c5ba5644fdce9dd0902 -:0062a0afa87846dd8145b8a578bb237dacb54b -:0062b0e190335fa7d9c714ce1a62d0427fabb3 -:0062c05c0590cf6e16be6d4d1580a5f7f9245e -:0062d0b6eaac1a19e935a58390ebd37d0e2c3f -:0062e050672e2e7c0166c36565eb338a3ae2d0 -:0062f09fb9c4c06c5dcf7d30003d0592cde118 -:00630019335afc77da3f016d6cd56734331604 -:00631065cff01c06ef55465a80d487d1ccc11e -:006320801f422cdb03b359e8b22250dd31d193 -:006330db54ef2b3756be023e4e24902b737dd7 -:0063407472979ff73ded59d56681991ece2247 -:006350aedcc69794b5372c269c6209dea3d9af -:006360515abb3302a6ae6db6ecd076b59c579b -:006370ba2aaab559132eb0878f6ba93b6af449 -:00638099fb1ded639b7d1c1fa4ba97a0830de7 -:0063900a88f255a8d71b465f9e481511d032d6 -:0063a0c7f6d19ae21f27e389637e1a84172e7d -:0063b0c6ea2d85ea280d9af3cb80366e1ab095 -:0063c0d2d0787da794fc7daeb8791a0505cbe9 -:0063d05f9b1442a4d168323f864672daebab54 -:0063e0a786559d630003c1512dca405221a914 -:0063f00475a47ef556f12f56bfefccfb8dcab0 -:006400cee5fe343059edd95528307e03923b5b -:006410fa2f817129e5858a4571484fa33bdbfc -:0064203db09a4cc18c138e5904ec8c39a7b470 -:00643026d4ebc2d12f07c4dad2c62a1340791b -:006440897829cb9d586b4a0361eb738ce4a7d9 -:0064506cb59fd3507c1a06b7f0fe968d8b4968 -:006460f29e4957ce7b98f2548198b9c096bf9c -:0064709f3d831137f0f6c2a7b0e3d0a40de999 -:006480aa25b3e8fa6c74915f306a5c494f5ccd -:00649089e24dfdb7ceaf6793db9f6475096aab -:0064a0814224cde04cb2ac2b72616edd9cfc77 -:0064b01a652ab3733b449c8e0abc81c7d7bb50 -:0064c08263ab91757129db7258d71c10d9b944 -:0064d0e455bd5487f047de15d8dd1f3ee595da -:0064e06bc48837ee3c74a6d3f1bc204335b3a4 -:0064f03325605e3aa743b74d44b273c6e39e1d -:006500e6fa7696c3d49f016af9809c0d1cebfd -:0065108f82f085794046c5a6ce9fceaa160a32 -:006520127dcdf48080ab84d39609f3097fb20b -:0065306e95f0ae67dffd2950162e1aa1787cc9 -:00654038788b3c208fb1c61fac4cc82fb430cb -:0065504290477348fdcec469027679421da859 -:0065600c543b4ec30b7dfae7e3d89571d0ee34 -:006570b0b3f0cca5985a80d1ed37dd83c6264e -:0065809d890b269a95c327d3f2f3eb56bacb03 -:006590fb008cf21e017fadb4567c45a35ec4d7 -:0065a01d9a5198755a7e84d1ead9e7d45f2384 -:0065b0eb59addf7b6dadaf1edeade1e3657ac7 -:0065c0cde8ecd4eb03c38d4225ac24eac8142e -:0065d0dd0aca7ffefa872d97962e38c1b8b47e -:0065e0e41ee6422737453a05a3577139e2a519 -:0065f01b29c1fe7a41df141e702227d96e8ef8 -:006600fb729b8d513f3e4d7d4e44316d11fadc -:006610c8de1e7cb13244ea4bd20e4877efa9db -:00662059c5b13dc86ed201b1087a83c1934689 -:00663060e666d544c6a114da76dbe26e06d8e9 -:00664027d5bc96e6087a19f772edd24938cc8b -:00665086f8ac64e5f00bd6e4b8f7abba4d9d4c -:006660f3f8972ee81e723bfb809081672b7d9b -:0066703e092fbc0891d4e58d3f99dd2bcb9967 -:0066806c06707f6cce12aed6044b13f8d7e685 -:006690a2396c6e671cc0f633cb6bab0863ee4b -:0066a0db0cfeaeacbf824854fd894c3cd2edfa -:0066b08a7b3f7a5c554c60c2667c1ab4c75473 -:0066c0f37e36fcac82f40b1f11bcc1255ffb84 -:0066d01f843ff2767a5b88e85eb4850dbacb55 -:0066e08c01389fab42e43b76fe6b2eac468597 -:0066f088f7c626eea76e48ac847da478a57f5f -:0067005e4a42db457f18fa68a44a893e502d2c -:006710e77f65462d564648243e436fcd609930 -:006720c71b48a5296ecdc0eb90ea3b8431555a -:0067309d2091ff18fc04857efaaa4deae2609e -:006740df459d583cd3fd55e627dfb784e924c9 -:00675079099cee80291d53ef1d14876b79c2db -:00676048984015738ac8e6cd2a4410695712e3 -:006770e0b215b7623d4a6d6ec4807f4c545ab4 -:0067809a8206dd64050ceb6fb03bd5ce966263 -:006790131f6c2739d5b340825e18dccb632fc0 -:0067a0d4ef9dc22e9a48bbbdfd62aa57d987f2 -:0067b0bdc4d5c47f59ddd17ab323cc61a9940f -:0067c099c9c2a982e181426a466dddfc1c61a9 -:0067d0e70496593b526dd4f9ea7e034bf3335a -:0067e0e040018628869c33264390d7ea584d0b -:0067f0d2ac08dffcf20c9996a0f0e9a878b5d6 -:006800d58d65b3d9ca056787c184e25956a519 -:006810c43e489827157ec4773aca63910a1f45 -:0068207b740f60259494d446bdbfa4149ac994 -:006830e4e719d77e367506d6d1ecfa56fe6afc -:006840868e7137743816ab6b17e65e4e5b8c92 -:0068500da9c691ed0f1578872cad76c7b1eccf -:00686050e5f89e4187fb6ef0932ef5b76b92fa -:0068705c17baa42ef9fe8837becc01a27e5565 -:0068805823133801e5ececaefd4e74329f1b68 -:006890a6f07e70cf9226527f55bc35efbdcf97 -:0068a07e1ddbb479780d30e0ee6be26f40f38c -:0068b096c43b3b6bb306da4d948b265e6889fb -:0068c01c712ccb8339af86e220440b5548fd42 -:0068d0b8277b52ffd54327f91722f9cb0ae7e9 -:0068e0169f8e74fbcd43ca020e1605dc95dd53 -:0068f06da4cc1ff9d61715ed41872b6627325b -:0069006e9c995afd26bfd0537e8e558cdc099f -:006910d680432d4e6489fdb0c3fe087fe17e62 -:00692060f6974c1904a4552ea1c1c8a8c0278f -:0069300d2b8f0447a61fb611473ab11b976a61 -:006940ef8b5bfa559458ae71cf8576ffd2cd61 -:006950d6b60af2706c509682d301dcf71adc35 -:0069608e4df79e708b19f6c9e7190762b9e292 -:0069701cc223729c71dd446d4ed12b6bdd2c2e -:0069802b377e610f76e2c25148b46705e87564 -:006990de4d2cd3b6642570791ff771b63b61ed -:0069a0d93d5a9101a5045f72d325e87cbfb1cd -:0069b09190b680fb394cdf043ca0990cbf2f9a -:0069c0523275656d4e2ee658c0f2f1c6e980e0 -:0069d08754c2ea0b9a19d3cb81c69cb5a00612 -:0069e0c860236bdf7a7a2cd7c99808f19fe6c4 -:0069f0e91a381c4e1285009b502c7aa9323aa5 -:006a00f3033422ce686c2c3bb0b6a684b2704d -:006a1052f065c1cbc5c70e8b3f3a5d45edb09e -:006a2065ea8e1017a084377611ac0ed772a5ba -:006a30f845079dbad85d612e3bf2e138233edb -:006a4004357db46ce31475a63c24fd928a5584 -:006a506dc990df0023d3c66212a5f21dd823f3 -:006a600a14057d1cff48b53d3f9b5c62edc0c8 -:006a70d0085fb57bc50bd78797260c059f0598 -:006a808251fb66a9b2520c059fbf6c583f8db0 -:006a9036b0e49cd7602bd5f779d4a96fd2d3c1 -:006aa0b040cc7ad8b940212c6bc483653132d3 -:006ab0fac59b61d6362d9124529438eeb9072d -:006ac02a46774ea9fbfd50e72b1fba23a5268b -:006ad014492dc0ec54019674f250d91ab18f34 -:006ae0d8280a59d6fd52066b6009022c5de344 -:006af0b6f601b8845f0864d0a4a7e7b666d8c7 -:006b00e569d9810f8eb44f3442cc82d0871b76 -:006b109e81c8f8161941a82b840143d30aa047 -:006b207a8da83a3557f61011760806e065a1f3 -:006b30f7db6c803cc45fb0ab80afe421071492 -:006b4036375469e4daab6cd82f2c7b8689f200 -:006b50952091861f09958627f5209512b9b0e1 -:006b60dd9564eb587aa5f88567223e93d06212 -:006b707ad95095b5a3d6401228975bbec6ee58 -:006b807c7b69f978c4159ea3f38ef157690d2d -:006b9017f43521e55e4d35004db3d936607d0e -:006ba0ba015530e99159b08f78def74d42c3d4 -:006bb070c39b3ae1d6914c1b6b2eaf65a91eae -:006bc0158930fcb68b31f5e795044999c0975b -:006bd01be31c2723b15d1b2d42f5f3b772f1d2 -:006be0b7cd83444dddc0883bd41a2051b83d19 -:006bf05dcd2b71e46f4d4771f9d1a96bff0332 -:006c00e12a4a73a7ef36fce47454f9e46f9040 -:006c10082f819ef168900dbf0901a299d50549 -:006c2077e4597e9d0bc052f9bcb0d91b109fdb -:006c30adcf3a1239cf797d86f5217ea88962cb -:006c4075c9da9d7778dea96a48806b5ac372e6 -:006c5034da223886b984bff1f8f1a69d21ecdd -:006c60af06f1906b9c8fba62cc16621901f79f -:006c706aebfcbcda81fe0b18426981cafce53d -:006c8035cb5d4341f9bd3546bdef41544f3539 -:006c90089b00e822879d9f72aa56c3f64fba8c -:006ca048651cc5705225790a7e5481c8109079 -:006cb01c382f9adbdec9ebfa8800cd1ef8cf42 -:006cc067cf35059ff0771c45146a439ff14930 -:006cd0b70708e87440246900c5c9e90c2ffe52 -:006ce08da6a7406381dda0cb8a3f6d885e0ae6 -:006cf039c4026b8a6ad5eba53154c219367f80 -:006d0051746a16bd3da4fb37d267061281bc18 -:006d10a0ff2d63e0d4c9ea5ac4e794eb25c124 -:006d20b14ad945bc4138cde77db153fbd1c802 -:006d308ec38a30dd40eab6df631f40e856e2f5 -:006d4012587d6d06037ec2b7bc29bf1f94a6b6 -:006d50b47f35eb99fcba02ec9100d3aa5e10ce -:006d60923f39a9eeba74fc0ef85827a5b327d6 -:006d707b2bb6a1540276f628dd4ed0cb9a5a55 -:006d80215208964c24a1d1099d9cbcf7473cad -:006d901cd756de6256e020af4db4421ab6b381 -:006da06ddf46320dd0c1a651c87e006a877972 -:006db06677bd466ede99ab37d884e95dc0cfba -:006dc03a83eba9ee90727d428c6f1d4aca5096 -:006dd0cc09946fd9eb2821a3d1d54afbaf8d5a -:006de044d835bf14eb32c0cc0105ad9019342f -:006df02e22b4fefed103eaba63bf95627104d2 -:006e007a07640964b53f0e25f12dd57405acdd -:006e1054598334ba527dc9fd8309b48c34f913 -:006e2051a4f0e9726c34610132458f607ae8c0 -:006e30213b1e5599503b5691c15dd328d402e2 -:006e40f0ac6daa0c42ef891eace56d460cb10d -:006e5077dfcd76f4bfb3b7ac5c2d8c92849ce3 -:006e600414256d7746bafbb5e6c7401a64969e -:006e70e43d081c32b59f7de57970f285ddca61 -:006e803839b5686f99fd51a109783332691175 -:006e9015e2dc2d7e7fc86b10e5cb908338d66f -:006ea05b3012348f93b8c165a102ab9bbe49e8 -:006eb032bcf13caf0c6a6103eeca97c2ed6c70 -:006ec09e148c38eee75b9a0c16274965177ae2 -:006ed0158f2e512eafeb325f5e2094ef8324cc -:006ee013d0f67027e4fa23da78e47318542391 -:006ef0a30e0f9c176046e9be72069e06dc3644 -:006f00e205321f8845ec4548cb5c26c10ddf4f -:006f100ce4dc16e6edfcdb9c6851b74f748834 -:006f20f2a3f6da723c4d506b15bd3046a8c595 -:006f30dde3a6bc8ddd5411fb918aceb9d48716 -:006f40bbe84f3f91ea12fa57e4d2a4966f7409 -:006f50bbfa4ddac03aac42003a05858de8043b -:006f6024731bdfc4fda7dce3fcc346369eb528 -:006f70272910c7f23e42f87eed5aced3087df3 -:006f807c12fe770426301f442f9606020bb57a -:006f9083724cc9937aecabae1cb36fe99a135f -:006fa0e4976a60cb02802d94e3ffe6c04b7a7e -:006fb0838001283d3807805d19029e18bb455c -:006fc0da2ce97004f9497f6d2435cc8ea5723c -:006fd0efffa04634d1a46173b2647332385ceb -:006fe0b8b066c04b9caac167cc644099f13f60 -:006ff03b57655284917166ebd0d2a0e8689b88 -:007000ba08048b3925bcb49efec7db21340177 -:0070104148236f4b0d468e24e8de9fd422110c -:0070203380acf541c62a00b486910bf6675a96 -:0070301d520ba4d6da1b3e498e6b4433e8d0bb -:0070408429638950172e81cbc368e346538a45 -:007050e8dd89c919a84f522cf48fad34e90543 -:007060620b4a8bb89ca00f789d4f9529d4e80e -:00707089f69acb3b5208c0cf22c9bf048b9c8c -:007080e8c9cec8efbee5eeadd4df7cc8d4c8e8 -:0070903eb6e649d1599a63a5f2771e4300273a -:0070a01bb19626bb2879a4429830fc75623a34 -:0070b039ee363c88fe2e106fa977137f45e681 -:0070c00309fd02b5ee485a9285662e7715be3d -:0070d0b141520d3ecde9b1003faa0b48b10169 -:0070e0a0e526a3521c41d361c970bbac313912 -:0070f0d06ba896a5dc0902e8f4a144c3484b46 -:007100219691c3fb5151439bea83c4160b5567 -:007110848cc3833d30b752bc512e4a86119994 -:0071206a0660a777cf93f709c76f9eb628da1f -:007130493eea9d46de93839c6aefdb979fba64 -:0071406476c23533caf3b8d37aede6f75e4a78 -:007150ae5ac8437166a73d6c7ab2d96bc47d79 -:00716071d7d4fc52b236c3939a754c1d208f20 -:0071709b6ffa54ca0bc54f2668c6f396b0398d -:007180a26e9eb969fa7e821bd13f45d00525c1 -:007190c64335695f352419c00ee5239634ac55 -:0071a0a19a7c113b10c0d2a4f14b0b1afa70b8 -:0071b0678133cf536b253419ab1c4ab2fd4fa9 -:0071c094eb2df582befd3a8033f052c456bf5d -:0071d062bc0f549179d19fe3b6cdc22eb08501 -:0071e05551a98f5a8d1e531df3c8b0a6994a8a -:0071f037582f23c211487bad7d3cafff3498f0 -:007200ee7fa987dc06aab2f4c79b17b94d3830 -:007210c35600957596e16596314fb70a327302 -:007220064202210276e59504c25ea1cc5b4a78 -:007230440cf47be6f30bcd7bc1176d07d99353 -:0072408282a841a55ea8d93ed6c7fe229f525a -:0072502c7839abfd4e04f2948b84d530239da4 -:0072600f2b52e50abebf8e5ecaf9ca7c46f92f -:0072703eb3e6bcf68937dedd3a2ed1208c5ac7 -:007280e57c173fa239dd4471bd1459c1757561 -:007290d66aaa1625d7423a3ae82f45bbe62bc0 -:0072a037947e06619c2d117fa6f354bf346f81 -:0072b0e98c3124afa76a94e638b397b3be0032 -:0072c0ec3d142c5780c252c7871df69af9a895 -:0072d0a6a98cc89ff41ef0a064ad9be841a08b -:0072e00c504e62df19c02208aac253957f5f24 -:0072f0869797327117069c45980d0e72a34da9 -:00730043d1c5f76e9ca166b6f427dba884f8c2 -:0073101cfdea5806d194ff10d49baff1adf3b0 -:007320f7c2b797f4f03a90e7eddd1ee2f88b8c -:007330521cd00d845605640bda11e69e61b41d -:007340a4e375a4354c2844f45b83b91edfeb0e -:007350f0c921bd7fc6fb8f52804f106f55f3aa -:0073602167ec69f685abb6906faac5237ef2c4 -:007370f460f85eea6cfcf86e7e219769092aef -:00738005ea38d3a63ab4492d6d57e9d6aa85c2 -:00739060e9889c0b92495d5938847e993f7362 -:0073a0782568892bdf915f4b2dbc7dfae7295b -:0073b09537b488cefc4c32f08d5db254da3248 -:0073c0a482e16b259ed4966aea702a0d3c8b92 -:0073d09a999e552929edb2c833da8c36b13dab -:0073e07f077271b6b0bd8e5b007172bdac07bf -:0073f08d896fb881b6314ec899ca20690016d5 -:0074004253e0345c09dcfb564fb07fc5ba6dee -:007410294d2c761a3ba227e73c8715fd502fad -:007420e1f6997960bd43d4c0c456842075f21d -:0074301ab09491aa2610a6fe7ccd099a3957f6 -:00744099be933d4a2b37947e446b4acc5eaee6 -:007450adf61629a0584f329f7a794ccb7b862c -:00746099b18077e00f8ac7e91019bf82c93966 -:007470bc0a73b8dee8b2c095606e1cd8d2b91e -:00748070372bcbdb619a737e4bd468f914fcf7 -:0074903173b25cd132980776598dd306c04018 -:0074a0018de49c39377d2cfb30dcc1298c45ea -:0074b04978658180bf60d8b5bcbac380d53152 -:0074c04bac2344131c6697570d0c7bf2a13c62 -:0074d09f3e95cc367a9d937970b20e26c15f54 -:0074e0cffae02a96d79b92d41e5ad8335805a3 -:0074f0666f01f55dadfecb9d123f242b51a18a -:0075009edaadda54cc0009adbc9d966544ac91 -:007510c5aaf0389a75f945dbb30598cb452fb3 -:0075204c9d82b45a18747ff045c8bbefd4eacf -:0075307d9ffba08de618353fd3d5bf3444ed07 -:00754080a39768ce48860ced9595f71d15432c -:00755064c775718f141fc5c614853743489c24 -:0075606d532b0c43a786adf10916275cd29c9e -:0075706506797a5a9daf5f0984243686a3ae7c -:007580b79f1f27aacaec65b7b491b44a0d9c33 -:0075902712537ad45f7dc51e4f701faa53c8f4 -:0075a024845460e1a550f57de2f8b7b7b87f2f -:0075b0e0b2d523d3f9f7ad9f899bb7b3285560 -:0075c0e51232245c12648946be623d06a2d55e -:0075d0d2f91bb153658c56d5477f5ff94873ae -:0075e02d8cccdee0ce6325dfce1b8ed123300b -:0075f03c78ebcfc88b6f5523d5a4d672ff9aef -:007600409dd02358189abeeaf0e35af202114a -:0076108f6ae2d3e3f4d4af258682d4b23a0318 -:0076201f61bc08e1790336bed47cd8a95cb996 -:00763016db380570b6a827182d54ddc47ab60a -:007640ef637df3573f6aae252acc8c8fead1df -:0076503b6568604ad09f5d037177f8f201fa8d -:0076609d9a2c429bc06121d8c7f7d920fde5ad -:007670902efe3211e5acf70a034c3526d63c27 -:007680a4a6c09d4a1cfed72efe62739d5493a0 -:007690ccf10eae59fecfd35e950f927909ae6e -:0076a08ebd991c154042bbb0ff200b9c0037a3 -:0076b042c4446ed3f531fd5f9e42ccb46e9ff2 -:0076c03427c027eeb9e3614b88e93a4266757e -:0076d076cbf6fcfbab366c6217ca03d5fda82a -:0076e03bf83b96ebe39b2ec720729ba8350447 -:0076f021480d71459b3bd5f4c57f93feb372f7 -:007700dbd21a615ec85c577e9d387b7a9e8762 -:007710d60881ff6f49dd6d6c3f8e4520380087 -:007720b13c971a5934dfdb32b407e6e2a487b8 -:00773017fc43ea672c51a6a4d78817024c9941 -:007740b25a0c9ceda35cc4ab7e4a4b46a8094d -:0077508d423b921dc2577178080d108a242d9a -:007760aab8a229f27ad5036bb701051725f128 -:007770ce6739f2ee460e52f07e5af23c931357 -:0077806489c609538a938fb42b4455867347e3 -:0077902fe00422f81a1e99112f1b45bfc0e0a4 -:0077a00b5a8d065e6d9ae08a5d52ec31bc9061 -:0077b0f647cb002091eb59289a784cbd4285b0 -:0077c049d91b598c42b8922bd46a395369acb8 -:0077d042039a55a1bc763eacae1138781c4b91 -:0077e0cf84f6a5acddd79a231f05b46d9a44c6 -:0077f0a135729c383bf0bc50840eea450c3ff2 -:007800446bc08ce1f5a5a7c5068346058ff259 -:00781005e9090b0296c580d0c1727a34d4c217 -:007820767a7a1e3cad39c7ee4d2e491229af31 -:007830ba9916c0a09a8e41d43cf53cf9de4d89 -:0078406d2b95c24d0c084ebdd07acc610603ff -:007850ba3539b5694fe79220dfa36d461d1aff -:0078606e7a4490d4dba69c444d25ace15025b6 -:0078708ee2a3949ce22b8b7c06a8611c10f11a -:0078800829a776083d63abf7fa5c30805f5428 -:007890b1434c54613c8c97202b093c2d8c9c80 -:0078a0b484eb59ca52c081f58f27d3fec2465d -:0078b03473d4d079a33aa7236347c6c085d1bb -:0078c047dcbb077d772fbe2697a76c500c3e3c -:0078d0f7d712d5b6b8d7a6b13d873987675535 -:0078e02be3843d367b7d7aa78edd88f278578b -:0078f04c2b00c27d92401456769c4bca77e756 -:0079003476ec9c6eca87b554155b3bf8dd1dd7 -:0079103da56844eea86e3d8146b5c787131d0c -:0079204acb05f580dc9e118a55ac89961bcc21 -:007930e7c21f59024db7b6066bd9abcfeda8e2 -:007940a4299adee7eba622221d20fb55710e5a -:007950aeaf9006e9701ede51de8842cf69c215 -:0079605ffc9c573c976ddb988ede8f274b1332 -:007970cac6be0ae9a2d01f1b80d1ef7d03512a -:00798006018c8f50aef3793fa8a1b2daf3268e -:00799035a9bf2fe2345aa8d0f758c268695c5f -:0079a0490998a7c47d825d7762ff034b696390 -:0079b0f2e69caa91071fc03cf81e89819ff0e6 -:0079c071fbf99bd704e612314403083e98bbd5 -:0079d0e29bfae0417d1d6db647517a66faccdf -:0079e0df1e11cf8f8acdce6748854b795bf367 -:0079f01a2f663c1bcaafdd45786f4a46b9c7ab -:007a00c134b6877d123c6efe1d516b2b16dca2 -:007a100eb5ea62f01a6f08480d68594ded1a61 -:007a20a3f91e2b9c24b23a1ebdf5cf98d5b29e -:007a303d6a6fc9c115be32e664114d07673327 -:007a40ab27b52b9ddc2c34bf3447dba2c3fb06 -:007a508dde258e88c187b264bd8601a8ca7162 -:007a60840ba7c94d7e696137d59eaaa3d234ac -:007a70a02cad0a8b8d78d93701f542e5b529c2 -:007a80867ccefafbdba108ac6f7945434a2b7f -:007a90a1fe9a46df8ab348f9c01318712e373b -:007aa0dd2094531333d2916c0ae4a7f5981a23 -:007ab060261e7a5b6c7383953d142477ee214a -:007ac071f1b187309cb07f7025a8b9d8f23d34 -:007ad091ba5959a26b2efe980375a38b3404a3 -:007ae036264678471af148c395e3a309ce2c9e -:007af07fe56269360afe8f94cd7bb796bc4258 -:007b0044eb6a53ba5c96cc91acaaa75c30d991 -:007b10db7d3c34f2a47bff87b43e1f97401c71 -:007b205843457a7e6b2aaeb8540dc10a5b7772 -:007b30b2d24a9948525943f9ce62627754196b -:007b40df8c28cc17be6dc8cfc39fe10697e62a -:007b50700d1cee77b7fc74e3cb640fcf4b1c80 -:007b60e7d254b6011273694418abf09819e3b9 -:007b701fb17d0c1d394e0dfcdd574855f714b0 -:007b8079ce05aba897fc278feb3db87ff9f55b -:007b90598811ed2b1816d07c0a36d88ac9b333 -:007ba069d8aa068f0040a70c154d7c9012a7ea -:007bb00b5f9b188a95df5c1043d60058215c5b -:007bc09e682310cbe376f4327f82953ed177f5 -:007bd055a82fefbec9646f8b4049fcb671570b -:007be0756515cdf3f97f7b65619f49beaad41e -:007bf0d641dc713c672dd71ca9f913273ceb7c -:007c003663a19b9f65cdda4c8609ce8f8bd6cd -:007c10b727128042b7b847bfc175f0aa53c40e -:007c205edc8c03d7173e8ebee8dfc635b25c1c -:007c30c34818bdc82f0a2beac252f58180af5a -:007c408de125aebbbff6feca93ff33e9d36c64 -:007c50fdb8615ceb839e89d576868f15c509b4 -:007c60a453191296f46d92b1bc3203d1c5b6f1 -:007c70e2767fb32baea8606344568b0a1c2f74 -:007c80c50db0ee8e7837f251fd6ebb62735702 -:007c901bec43acb8e454d5c3b62ba8b8b2579c -:007ca036b5174b53658d88b81a7b8e71a3383e -:007cb023a3ca42082c5a653996dbb43bcace00 -:007cc0f97ee4435ed8f6e5d1da6cb4dd46d02e -:007cd0dc32a66e18477928d06d17c27d24370b -:007ce0d6f993489237b6fb0f2a09fe49ab3634 -:007cf0fa601d75065a1a27cd6e385e3100727b -:007d00163a2464f6370289b8fb5b9f73e0bbb8 -:007d10cdc455a5f4c7c6de94429302a0841933 -:007d20c0e5f67b148a5062f1464b872953ca99 -:007d30127bd6769ff3d069de7d98f88c36b381 -:007d403f00f54a9b9933532dd577edbd465509 -:007d50d3e6c2d41d5868f6a7f3ae4824c29076 -:007d60b7dc7793047288fd9fd3bcd08840d067 -:007d70ff8d436b9997229c8d0fdb43fdff970f -:007d80d4b6534ecebdb12d8c821e6cef1964c2 -:007d90a68a42a9f06690a818bbc86660c72905 -:007da0f14df569c40115c8a44bb33711914d88 -:007db09839a9211091ca9ed720484c88d3df44 -:007dc02eadc991d35e65d67db86423e95de3c1 -:007dd0d0cae173aa5b6ba0d81a28cb6b1af067 -:007de06aa8122a43556bea89516f58295a9d7a -:007df087f00b5074bcc4d2b928109c2a4bcbdc -:007e0027912be479d77acf80a35cb4ca64808c -:007e10f369a69aac5629f51546ff465ae0bc5d -:007e20f2e0357031af79e65539a4463a5a70a2 -:007e30f4a4cff5d3555efc877aaa06a03fec1f -:007e408125959e0a6e326a7c57b1b1ef8e9a82 -:007e50c885bb870cfc6a8f57e6bb16210ee013 -:007e60fac50594c35d6191d65f0fa433e98d18 -:007e70b3bb6a5f796aa80dbd8286860a1b6f68 -:007e80c9bb61bad3e0ac9fb89aeb010eb48136 -:007e902ca3f063e44124fa2f594080c0974d63 -:007ea0e11fa58e40f4b03cccab4e9e3a7698db -:007eb09d32b0bcb73d473f0ac26a415e13f37a -:007ec086dc10c67f119a5fae73f7ce71d68b5c -:007ed0d8608627dff276bce2c05acfab55375f -:007ee0fe45222a7580d8f0b1d56be408f85ff8 -:007ef04f6e818ff884666b858d6fc4ac6d8422 -:007f0057ec6f71c700745172014db1b6155b79 -:007f102e9e27f45ccdafcbd2f2138559a300a2 -:007f20d08e57a7f6556e2621c12baf41a55d6b -:007f30c020ebd5b3c6bb8da0074b1ec9b523b5 -:007f404ec5286d99924270388582f478af38bc -:007f50724627554781c6f28a7a45c9576cba26 -:007f60c8dd720fde1ab27ffd904362b42806e1 -:007f70ce67c5c9b52bae8a3dfa6d85c762bcce -:007f80552967e3e1ae0238ad7cca2bfeced1f4 -:007f905fe822a8b4ccf061654018fb3e8f9955 -:007fa05e5cb69b4f1d18cc1224e1c225ca1e87 -:007fb04531b789dada19966dd2b98ea76e2e67 -:007fc041ef9741b3552a48be79abf5f4dd9278 -:007fd06e190daddacb24aeb37854e94500a25d -:007fe0b9bf1890bae7fb5580dd5a5b839a68ff -:007ff0cff2d55ea7ef06b7f852f14902898c70 -:008000d4f46f893f87181293516288edcab9e6 -:008010a5f0ac4c0d39a23fb24295bb672d3d6a -:00802011813f219b81fb5615093b64741a23de -:008030217d6c6259bb6e675fabb7baa39abdcb -:0080402e4beed1fc232b79bac858994aabd283 -:008050301576327b32a3703bf7d2d3348774da -:008060783802be4259ad5218140ddaf0de20d8 -:008070c9dc6d2a0611427c158383e62a0264ea -:00808071345953dbe4e401e4cedb050a53aa94 -:0080901b4c95d6280f114bce7a5ff0e044803c -:0080a054ad0a685caff9033dc112860ddf17e5 -:0080b09620f858ca916fd0579b0e8ce05ff3ce -:0080c06a621db6f0ffc9c2e54aee2c2e1ae28a -:0080d0204bad6ba1b8b6050ebff1f7af57e049 -:0080e04e4a1f8c5666ee88189ec786eb37f4b2 -:0080f0b976af7e70e7564b71e1cbcd804f9b86 -:008100a1a456649c591033decaf271a7bb8d2a -:00811027313330e412c808b275def1c2fc72ba -:008120cacc04497fae1c81e97066ba9934ee2b -:008130dc2daf128effbdc4a68ca90ed79e8d5b -:008140445d95f14df1f0418bb3a8ff36ad1666 -:00815044ebf1a45b33b57d2b98843ad77fd4ca -:008160e92ba4a6cf4f3d47ecfef9e987b0f0d2 -:008170e5a14d7af61e720cdb2c97aada46219b -:0081805f5408e77d70b3c66bcafb6c940be340 -:00819050ac7574c519602c7a4a3e50199ee86f -:0081a0f2639e7294276a76379d15dbc1f782c7 -:0081b0c2e3381d9eedcf8e9642d8e094f5c66f -:0081c06c9b9a22aa2da32555e093f68d29c894 -:0081d0c0cafe8918b4e4798015e2fcd5dbb207 -:0081e03ebfe5bc465d7c076cb66f9e5bf70af9 -:0081f0e4c2f16c783fd2ccb50cd77baa658917 -:008200415f24c9e55aeb87f5331336ed731c05 -:008210d13dfb877e2a1a84cdf20ee8bd1c096a -:0082205cc6fbfee0fc7c858acf09f6fc5a1a0b -:008230e09c08531712bed401da2e4ed4b42afe -:008240060c9393136090cfd0543f5d1019699d -:008250f76de62175b868df0c22f9e1781cd562 -:0082607fc20523562ae3ed7e0eb6b6e2c8eb4e -:0082707a0743f95cc77fb0724f8efb3f1851ac -:008280db182540cbff893e8d01566f6b57a7a0 -:008290ff27e6696d2cf46b1f41f3c2dc1350b4 -:0082a09cd9b1fe3de851e47d92047d99ea3c02 -:0082b0e054e078c34f69597b1bd1b67dff466b -:0082c056db27c1b142f01b37f758e09029809a -:0082d0f383ad7c7c0662d708cda19b611a6faf -:0082e00f07a27367ac30058d49670c2f9b953b -:0082f0523ea0c9b7b2c150193f3e631c68d1bc -:008300be5b87d32d468b82f1ee3085e0493bd4 -:008310d54c041f5bb88638a7f916bf9a499ef2 -:008320d12b2ffa8e7e4da6419d758e43a1dd4f -:008330d0d8afb1f2015f5b01868d3e49a9d450 -:00834087a016a6838ddc8eff81fc5d8a2d9ab5 -:008350e14fc87f4719fe94208e9a19a8795777 -:0083603b65f157a20c31a1bd65919ec66ffa13 -:00837017a188dd6605c02c9549afde73c0dd1c -:008380889ea5703f4cae4b49aafe5bda698c10 -:008390147e643767e97c2759f24a4b5259696d -:0083a035a36e6322a9f11266e2fbe9a3d8c591 -:0083b07f77ff4f2d8703f65254efff7523e940 -:0083c07d09c4db837b0821d28ef5ac8e126dd3 -:0083d0741d9926edcfe6ab92d7c4620d26f86e -:0083e035f6b5b175f5d000ee37fdabf805e091 -:0083f0b707ce48159248afd0355de9d3de1f8e -:0084006380a810fa678c5f0dea352146cb60fe -:0084104e58da2d728d09e55a24916bc2342bd2 -:008420f89097d2748666e0db3dde15e158522f -:0084306f61682a82a9defbf1cd8302dfd4d49e -:008440fcbfb47e23007594e6e2908d9ca46c96 -:008450de8466f6755680f4f58d4fe37ec178e0 -:008460b38e66d408beb79aeb0d05ab0b653ec9 -:00847097382db1b072a6643797d34edd3ed71e -:00848010e37025ba1f2b8490244c094ff1e229 -:008490c7237693aa44f713c26b37265fba5338 -:0084a01a28ed290a95716a95519612338a78a1 -:0084b040d74c153821a8c4725c356040ad788e -:0084c00314a261274b7109de156697b892c60e -:0084d0a0111e0005bf927a0ccf0c3915b0370a -:0084e0fbf2b6d56e25acda5c7782e77d265bf8 -:0084f09b64974864b65ae70ac47b38701e3b22 -:0085008a4148b587a4e8148979843aa436a159 -:008510dd412b9adc38f4543f94e70d037bf3ce -:008520bba68045541c6cc07e9fc3166631272a -:0085309333825a1a027f39d9b40cf1afca9551 -:0085403d520be365c36085cf09a056309ffcb9 -:0085502fbefe58865bd9cc0f3b3e84141b42dd -:008560906f6db23b4ee3eda2b4297befd76420 -:0085703f5f0f383322d6c6360a2bc5eb847e63 -:00858021678a1a7bae6c3e5bc6959a53f54cf9 -:008590ed3cfd983d682cdc87528f5ee78cede3 -:0085a042ee981a76a4c2fb6d6758fe3e0431ad -:0085b0145ab0eb0e68ba1cbc458560c5fbc040 -:0085c0edb11f0b62bfe586662b7703091381d2 -:0085d09d12f97f21f93825f294bf21a9a6e794 -:0085e09011f13af9a6270e208b5a9c659e4e5d -:0085f05152b46d70c4d05aa49892cd4cd15aea -:0086008d0c27d2c25685de4abf5b0774a3eca9 -:0086105c4544c5ffc8bb199b31098b8d394105 -:008620d883abdf7449ad04b9caf1d521d940cb -:008630db9b5714ed4994b50042c3d7ea82f404 -:008640175014dfa0f1deb6f48130f7c0690aaa -:008650af8a5de9da757cfcc38bc65bc6236cb7 -:0086602dbaa53509c52cf7f4d0b628fd5642a9 -:008670932ba0bf61130b774340495eb9b14e31 -:008680c9302f973528064c3e24cfab8d4fb465 -:008690aad20295b2cb8b66484c819fe3d2c026 -:0086a0c7a44a9d538933f6e95db65977b1be47 -:0086b0ce96ec04096b377eae9c0b60b55a5fe9 -:0086c07242f8ec3767c0fdac139f6318c4eb14 -:0086d02effc437ce45d216adb2b4884be327c9 -:0086e0d2d0487f83b97bbed2693cd3a2145dd0 -:0086f09357876583c0f48ac91990a97afe7dd0 -:0087003455795aef5b04773645a697e750070a -:00871078476993455b3d1777b3828ac3105f00 -:008720674fbbddc537a61ae305e7bb75a803b7 -:0087308bf121e8398417d4febea15c4488f599 -:00874025373333bf25e95fe95e9135741f9273 -:00875091d1993fe6a798415868e131ed7567ee -:00876051cbbedc25d9bef01584b176c0d8296f -:00877030cc471813d2c2b2c8de7918a52c668f -:00878040e1868b3279e8bd60c0c7e6a0671028 -:00879007933cbb10c91c696bad9198e1777758 -:0087a0cd26d54f13aa9ca6e8c1793135f9cfde -:0087b09a2b8b218ee9baba640ce18ea7d2f293 -:0087c049f4655d94b76aba467a481addb64f31 -:0087d0fb15a9168ae50394765d34e29fa29b97 -:0087e00eb61a3a69b6d5b06582cf2b77fd2fec -:0087f00c4e8b3d76d8422f3427b51f83fccdd0 -:008800ee3d3208616cbe83f880ba82c3b71bb3 -:008810da9458bc1d38f37e6b3d17f6853f8597 -:00882013d2aa180cba094a46342fe5b09f4c36 -:008830f5ad82b75bb8cebb5ec9c3206de4a60c -:008840feca769cb0ba01d401e103e7f9d2b5e1 -:008850b15e31469c9a6eeae8f6ec2f61ff81dd -:0088601ba112f25047ecc5c60dc9d9a8811c44 -:0088702c3dcf6cc14bfe587dabd632c1d5fe0a -:008880237b3159c6d206e2b7325491cdf87c14 -:0088901f3efd87d285d0d4efbfdebe78e8fc32 -:0088a0e11583ebe9e9c6fe26b0e2a53cf72962 -:0088b0baae89cd5fd528ef0647541111c1d7e3 -:0088c0acda8bb8084986e706ced0554c9bafc7 -:0088d08e3776baae026f45548ae0fb68f4b48d -:0088e06ef2a75797708f4c6ff1b35721ccdbec -:0088f041328e8f747936b4725d7dcf6a96de96 -:008900d888956b539e7ab98557a6efea4764be -:0089105b0353e12bb96b0db9f14315b0130c42 -:0089201153633b1ff46c1f26d34a903d9b9b37 -:008930998d3906a576325c3ea6458c34ef446c -:008940b6261f8bc2e3874fbbeb3fab00727b6b -:008950ec8a2a05c86b044a555791f3d1870786 -:008960314dcec4d70847c5a7304d5009c7b10e -:008970208d8e8603530df9e02e03877569ce2c -:0089803da03d668e501e31f036515247912798 -:008990766280f78fbb6d13f87820c607876b1c -:0089a0a59ab508a84a529b46647e7b076621ab -:0089b0d99301fa55e1e00bb2dc1a6cf7f06ed4 -:0089c094868244bada503b1443c92a8d15f870 -:0089d035fbb8c51b24d4abb43c1e6af435b52a -:0089e0a9d5d676e1a41ad6cebdfafd7c486632 -:0089f09aa39deaa6081defcf151937a18fbc14 -:008a00b1461cdd20ab78bb394dca39becb985a -:008a1029861a4e688ef640f853839da1e2a082 -:008a200d99d7570561fbe53babd608dd9df975 -:008a308f50499998690604e00307788e3a6d0c -:008a40515e9ccbe3683bde6ee9ffe76db4c992 -:008a509c86bfc7c01096c22e828f88d211c3c5 -:008a600516f06c424f89ec2648b608e3138747 -:008a70bdd2b7dbba20f74856dae55f3abaf1ec -:008a80810496120af58c330f723c1494521eb9 -:008a906802847eee36611f62ff7b05403401e2 -:008aa0d3404585e417995f0e038cfa1bb932b9 -:008ab0e5007c17c818591d01006b396b4c279b -:008ac0a09fa28e6383b2edda53c4f18e883fd6 -:008ad03ba18b259486b9094d8bfebcac68f406 -:008ae0cc59fbe5f2c7a8e075f56b2b3a4b20db -:008af056173f3e82e9080766a12d0c73ead5a2 -:008b00970f1a7e1aa9ede02a1e60e5c7a9be9c -:008b102e86ca9f4b8335904689cf1abffa6d93 -:008b20f5839f7d9e6c6b86652b1cf46f0fc00f -:008b30c3104fbaedca93bf80eadc2a679243ea -:008b40ac5e2579797a132bda521d9f4a9ef11d -:008b500b96c94a384f0cdb5fc25493ac6d8054 -:008b60afbaab8296738caefcd61c9daf59c670 -:008b709c3e874c3220eb91a595797375de8b07 -:008b8040a21fd7709bb7bb1b386365066fa680 -:008b9050a8873fc4eb4d6e554faf12b2a1f106 -:008ba0d627f52b2367b41fdaed366ad01a2afb -:008bb0fd289e5fd149b527183ac856a341ce69 -:008bc0759fab3e464cbd0bef15a86d4c9b97cd -:008bd0f012ae2a748cf8d9b06933041eade070 -:008be015e718e541389ee0aff9101642d678cf -:008bf08e99fd894c6886ca4d448979dc2c6fb2 -:008c0035bd3704f40220ea4a8215a885d7464f -:008c102feb3126be4358453eefd5354478c56a -:008c202a5e21a856b6b34acd825774310a4cab -:008c30694bc7f781a1f02d7b89fcc88b95a774 -:008c400f1087d650cd0765faf05420a02497b2 -:008c50ee0fa34531537d95e936e97691d56caf -:008c60a90afe74241f4dcf92c3b5a601ecad84 -:008c70ce1b9dbf007de3ce7ea266074a33c3dd -:008c80abd411d4aa0bc5253dc6886b075de09f -:008c9004c910a3f6dc5a9b45181bbb650165c6 -:008ca01f57f0d58e89607acb4075e023e0a80c -:008cb00e96803f8c0b260456642eb5ae3b9398 -:008cc068ec88a60fed1ec7e62be2c551f65533 -:008cd0cdcb79343fe7d8d9450c425d818ea9e4 -:008ce005933424dfcf691474462fdad4c4831a -:008cf0e39a9b829a76b44f4f3c49319ed45aec -:008d00f62b62a922ca2a18ae956bceb2d194d4 -:008d10bbb89903a85ade0c7281d4391c51b6b2 -:008d20881a106a6c6762fdc3e35ea411550d36 -:008d30d7e0a147d6514cfbba8957bf798507f1 -:008d40ffbdfeef7dd123c5937cdf45c0593e0b -:008d5007c2f36fd6ff7e0695913d5fa88fe645 -:008d60118ede3f2abd9225ac3c25b12c08e967 -:008d70391659268f6b9c82b50ed5ef1acda071 -:008d809bba540fb7d6416046ef634c10b80493 -:008d90484f81f27ef34758fa77edc134cd9a4f -:008da0bbf466f4bfbec4a539a6077198899f1d -:008db07aa1143d4324c0069c81bcd8652b2017 -:008dc07f1c12e7eb9c0fe9ab4dd3a86b4faa48 -:008dd05bf1bcab0c04090c5b56d52c57f7a616 -:008de0bf1205e4b4f635173ac8519939de5132 -:008df084bd8b2c5eb1975cb99c703e52a65874 -:008e008c6e95ae231eefc334a03b0e52aa0e0b -:008e10999ea08e4a230baa118455bbf0f7bf0b -:008e204887d91c31ed0fdc0f9cd2c69ab4c211 -:008e3006a876efa31586cf50bc0531250e39ea -:008e40de138f9e4fe7c47a43082612a050e0a5 -:008e509c1a5b1f841e9c4299b75f5173b61394 -:008e60d17b03cfaea8313f8c6a0ea428a56844 -:008e70cbbba564934ab573c630ffa28d11c5a1 -:008e8074863ef567e5a992aae1275e241f60a1 -:008e90a005565d7c6b2737f7532b213125b890 -:008ea00b9a1fbdbcdc957b49f141eaf102a7f1 -:008eb0096566c84d33d9d70ecc96ff6d3374f2 -:008ec0fa570e3f89aef84a1d1a36a46e782bf8 -:008ed07362c74143ffc9802268064db81cf3f1 -:008ee09c6fcb101ffdcc028cc9b23042dbbf83 -:008ef01070763b03a91dd3f6b599e9fede8c23 -:008f000b010636bf63deb5aec4ebc738aefbb5 -:008f1094f77f74c12b3eee2d857e8edbc7cacc -:008f20dc74a21392769ab113ea3591c7537bd3 -:008f301ed2978eb1406d5775d49607c1c4b1f2 -:008f403133c4ef196ef1543735f58518028fe9 -:008f5056283e4a6b07219184a1a17876876712 -:008f60109df001d6fd543ae6828dda8abe4ac1 -:008f7003f4a2e1e0ecfb711e7023694ca05856 -:008f801b8f00cac45b729f865904c690fc1af6 -:008f90d70c4d1783a7c630e1e99640f79be1b5 -:008fa03c6ecf42fd23ca23280a50e9ef6ae56a -:008fb055e8076c526e91f3a4d9724ab56c9fd1 -:008fc081d29535704bff2989ce2c746bc87b36 -:008fd0d07165dccd77318ad5417697cf102a02 -:008fe048751bdf12ca1c1221f581986ea96ae5 -:008ff032e0e39c9e06b1eaf78fd844d1f6e268 -:0090008d0ca1cb418f1d7e85be457664d86588 -:00901052a26076ed4d232a8faaa978284dbac9 -:0090203e30d18512a1db33c8758ece4216803d -:00903040ef6c6154a4aa1252747f379b66c96a -:009040c5e6bf26cc36c60759ed7a5fd1731af9 -:009050b53bde0cda7bfb087bc4ab81bcef1d06 -:009060992d13c6cd44b775dfb89c824a6ba4eb -:0090708908e4f85b12d2384350b5eb6410a3e0 -:009080acea4421a1393e0347629b5de441a6a8 -:009090b84a2eb1622a8ccc75e54a64cdb484a9 -:0090a06d3edcbf4b7880c84f2ed70c45fbeebc -:0090b0754c40f01295b00ac39030dc190b1e40 -:0090c04132103e9abf0666c25f99f0bcedaea4 -:0090d08d0cc7f29162bbf0645c822867ad4d33 -:0090e002a4f6c7d12c3329832cb72ec1edb165 -:0090f0b46085f49cdb7c7746260008b2c39105 -:0091004b7b624165647b49d9d9bcad1a12f8da -:009110c2e3a6a1eb6cf8242cd03b183f0d34a7 -:009120dabe421667d052b51005b88ee9cff555 -:009130797839cbb16684fd64da6ace974c77d2 -:009140a3285e0a73494986db1658c05a0fefae -:00915099538a38a40561ef8db24b7ba0d42b3e -:0091602345b9e2bf75c4d86b8195b537e88749 -:009170536e64eddf182300b275a6b28f2a5f29 -:009180ebfa6d75125994ce417bf93ba09c914b -:009190658bd29fcd36ba132e076939d8a303cf -:0091a025a2ef063635fa3dae27257dbc9ea2b2 -:0091b0be6b5e3095f043193a9b1a3a1ba680ad -:0091c0d55cefbddd12e2c7cf9fd4340a77fff1 -:0091d0271a08691e9817958a0b420acb92d333 -:0091e0644dd01c7b1cabc55b67b5aab022b6f5 -:0091f095bc61af9fee3c2287f42c856a64d1db -:009200852380f10a9477922f4f011d7dfb3d05 -:0092103da3c6127748c176d5931a841134843e -:00922084596d976c70868faef6268043f32f13 -:0092308f13c8b5055d5b70542f2e0137670b03 -:009240b39a66e741951d91471a83090f69bcf3 -:009250fcbaa7fb5042fdfdeb4fb3976c741dc2 -:0092602c77cccf4986b51f0b87100585dbcc19 -:00927075059a780fcf5708a125909e8b564d9d -:0092803facd30eb7fbcd393cf5baf22e901ca5 -:00929079a54f5fa8ac209bb818c85456a43b76 -:0092a0ca0c08d1258a4950a9e5db0ed722a2fd -:0092b06859caf354bba8236a357eeb429ab31c -:0092c05d4d27e9caa3870c4de0ff5e11100612 -:0092d0eee9eadb7643567f83d222935dd47708 -:0092e0906f74b595af0e7b823c56a50e9e9b00 -:0092f06140203c2c78a52137a0ff00743cc922 -:009300c5f9c4c7e30544aec0e5cd050581a05c -:009310a7eb2fbc330e0f6e1852e86e75fb9fe8 -:0093200a5bcd981277491d3b4247e9ce8e7467 -:009330845809664c685b57f96bf296238e1ce0 -:009340dd9568abf1f83d1c1bb5e7808a39b7c8 -:00935050c3999db2728bc1150eeaf277fd8b49 -:009360f0b9b7c933ccbf114298b09118c85cf0 -:009370f927d81fb6583cc52e43dfc17becd6bd -:0093807d28dfeb8f1ab05d3561bbefedc3cfe1 -:009390cdc5ef283593af1b97d13926385ea54d -:0093a02081df5e4a679f0577c348902cc9ad8d -:0093b0329d8714b6098eed19b80fcb8a648936 -:0093c067b99876cc54a970fe3dc5aa792a2d78 -:0093d0d78ce7fd8485e63cd479802cebea9029 -:0093e093381fbf39f5956090ba60e202385562 -:0093f0c14e2c996eaf65426a71ef4bb129c494 -:00940011a2cdc291b5707f824d84d6d2613574 -:0094109f469e4cf1204917559a7b86c6cde5b4 -:009420c483d7ffc90259a23d8e92fcedf773c3 -:0094306c77fb126cb12bb574e04ef76eefffd4 -:0094404fa0729686b1e0949226619f1c50c313 -:009450b5aee3678bab3b8e008c9447792b90ab -:0094600f3aa800d26d2848db73ee2c6257a2e0 -:009470f247f5826a0c34e37d5a96d88cc5df53 -:009480eea90832d3c62d39300cd320528f03f9 -:009490ca957d30c2bb734c471043ecae4f1558 -:0094a071b12a508f48c8597a9a9e40db639187 -:0094b040623580066cceafd34af23e93c63493 -:0094c05a7e641b63c0693f3b97d8e1b02f5cc9 -:0094d05e688bdd96767bd0e3939cd234b64067 -:0094e07e869479d0ffe869f6443dd0dc88d1ec -:0094f0392fcf75fe09c563bf63c0daf2dd7c66 -:009500a863dda3b70545dd28629521941f2620 -:0095103dae155664eeca618dba96e4cc8dc8b4 -:0095207defba3161af8a7ed4a43e01d53a5428 -:0095300fe006c8655ec2fc1a19e19bd30f715f -:009540ae53ae64c3f24a42c599d7988aeca900 -:0095501564916285283b3e1b3c16f65dce062f -:009560231350826a79b34821d1c9e457ae0fc7 -:00957043df963a4b92eed546156583029531c2 -:009580275cd549fc4add6dff67e33fc92d248e -:00959026f219ebfe8c096d8c381e3ed90a1d8b -:0095a0489f7eedb2a5ca90abd39deb40ffdfdf -:0095b0becd887b9ef249e970077e841bd22ded -:0095c0b123f6e9148824b86c731da20c15dd6c -:0095d088a49c36028032877b0cee4433bebc7e -:0095e03ab50d49a6f1fbdf9efa0f8ebe194738 -:0095f06e04d7c45727f3c57d3d51eae7f56c7f -:009600baed34c835e14b51aa107b5746e47da3 -:009610bc84bdef2d51eca5420f3871c5b6c0cd -:009620db67ebcc23e6c71a33fd7ca8cadadb90 -:0096300dd7bffa0b3e2c5bca70516c212e91dc -:009640335cbddc72d36a85b3965a3478a0a5f4 -:0096500a11cc90a4742987d22f415340db8e29 -:009660da3293049fc18cd9bf61cb471023d72f -:009670fd00136e31b0d22c479c016935886fa7 -:009680d94d2850b22cdf9272ddf91e777942d9 -:0096906b9f200149ed25d9b3285cc732b0edbb -:0096a056fda7e91ac019b2454396570657af1e -:0096b04f065868d173aadb38a10293e44a591f -:0096c09525da2ac180bfa057d061a6ba571353 -:0096d043949e4f65603c251506f074ba4fad7a -:0096e000abcd0da7e0b553958442dfffc5132d -:0096f0299754a0e3d87b4134adb89f39cb1d85 -:009700a7bacb302b27db5249e1921a47481efb -:009710d1911dd99ec36fb04663be5fa273566b -:0097200a863d265f0910c14ef2a37bc04f7aa1 -:00973039d4cecb119295d3fd232bd636ece6d2 -:009740b57269a40cd7018ecdc1748f99753983 -:0097500f40e752fabbe3e9992c4b98bd8835e8 -:0097605ed401e8d7f76b89c53b6a607ed00c8d -:0097708fa2ac828e618ea8bbc7df7a05e96a27 -:00978042b7c5b3858bd22eefcc8be4e2dd9e5b -:009790f0393001cf37e6f39b7f53140531400b -:0097a0584175cdef9889535422cf9b2bb7271a -:0097b00a897d6741813c77858b2ff416da38d2 -:0097c0478b947dd12fa5fbb8ab2a10d8c77599 -:0097d050220f186938bf2fb245096ee0f8c92d -:0097e0a83aee180709d15bdde2dfca0ad0f288 -:0097f0c60661d3cc25f11f4b3c81771d46244d -:00980059bda733e9bbde0ed5a975f3d0510339 -:00981090019f0151269254b1929300c769e04b -:009820593e19202d8647d191943779bd7ebd6a -:009830b5255c0574dd3298d5508a2deea4f42f -:0098409207d510b58820185dec143bcc4c43d6 -:009850109fde3fe4fd84b2cb453d27101daaf6 -:009860ff72bab2c76cf88ccc06d6462936cd0f -:00987002c297e3a878faf1f4e9e21227fd2e05 -:00988079314add7712b9aec3810ccec4a2b502 -:0098906fd1f09b491b0cf40d69f5b5640152b9 -:0098a06ea02e5dfc3a8120ff5e550423fa0ee2 -:0098b0d97824a43a5517fde95834b342e1e8b8 -:0098c01eb68ce7d68f1a35157de21dfe3c4eb2 -:0098d0a07e5c4e562cea4a0bafc00608bda9ea -:0098e0dbc97153b249bcdf05240aa507f0d77d -:0098f034708314fcb709a4eded930d4155747e -:009900badf16e6485053183c9c5283f5374872 -:009910e83631c2a944a49be4f4727486107f3c -:009920ce7a08d38a5b0db859edb7e1e741b3a7 -:0099303bc3747fcca9abaa7055144db50b62c1 -:0099407e2a7776f57ac5814bcdc0b0f6fcc659 -:009950588d5364ea1e49541aac7d341e1e024f -:009960508ffd355c8dcaed3f3a6fff1ad5402d -:0099706a6311452378f05c4c9742d82c7d17c4 -:0099807c6d948bb2c198a7842f6f3abd13b658 -:0099906f494ba5c29a5277635d956382f599a4 -:0099a003e10d10062fd14af0863dfe6552407d -:0099b0762f2ff59b0de3f3fd23a7dbbb98ae7f -:0099c04861ba2dbdabb62a83a8c2b176a46a51 -:0099d0713ab2802a74e842b36517449dc1f462 -:0099e0ccb1cc54021e504e380cfe03f1c52acf -:0099f0f31267a3dc50f0675b656967cbdbba4b -:009a004c507f26d2e847a4ded3a56658d6361a -:009a109553ab3ef6f33b3efa9dc53d4598ff24 -:009a201bcc9f0b4d7196e0f1edc099e0df1a00 -:009a30476caeb734c8ea7be7ef9b470fb55b43 -:009a4037646c24db1caa71c54873ab082ea929 -:009a50530007c097a31847594c77a985d02d19 -:009a60f01087eccc8664d7280d3390c95ea7c8 -:009a70d3ca1404f7a0981b1aec8ecd1a06127d -:009a80a3e673b8be8830e1ef6d3b02ed676904 -:009a900281dc5d8a4ef4e3dcbd07bfbd9a01b4 -:009aa0e9d48eeaf2594c9d07f66b604c232954 -:009ab0f8770dac917e9db691f59b19afb8a64b -:009ac0cf1aa7d987186ef7325b56b51439d5b0 -:009ad03dcff5eb0e7ad04271878c445cb12b25 -:009ae01da19c55a432c79f7429cf771ac399a7 -:009af0271e88b5a6332c0fe56e68cd5550bf16 -:009b00a72e3b42e4c0b2e53efb711aa586e57c -:009b10cc99ef5446beba760bc93ce6c0ca987b -:009b205239d425f63c5489c0a99519ad13028e -:009b30c74ddc9b4e5c6dc5089536933b3049e0 -:009b4049a1ff3d9f318c60da7218c426e3c707 -:009b508d3ab0f170f3fc209ddee8ff9c250085 -:009b60da73244ec11088aaa985068dd888cd2a -:009b705bd643691a16329c47b6992b2b5ab41d -:009b800a24146ded45a1fb3554e26e75cf547e -:009b90edeadba8c976001117804b2e0b4ff377 -:009ba00fabe7b1bc72dcce21f45adb085e9c79 -:009bb0fa159a4169cfd0c810a51ee32e3393ec -:009bc06b15c8ee7de71b2897117621e3423cb6 -:009bd0c6bf909ebea18cdd5d8820e765ba475b -:009be072a3041486c9e988dcdab5b24ba32105 -:009bf0b1f2c639023946be410bb4f039fb80d2 -:009c009dc08c0bc0327ffe5e248b7ee36f4335 -:009c1055d8cc1351a74f402b6fe6d80ffa6b7e -:009c20c3f13baa2da716a597c88348163e2d5f -:009c3036fc15aabb89bff5e1730e79f41a359e -:009c40b08c35cb9f1a35026802840c6f624acb -:009c505cc06583ca1bacbf39ec09302b64ce39 -:009c60e521c125af6df15453d8e2c8a01f5fb7 -:009c7048c3fbd56c69bcddf2d9d396e81dbff1 -:009c80f16decd9f27fb50eb9195e51cb6ca187 -:009c904648a62730ee95613ec4b047b95c5fd7 -:009ca041cfe042c68cfda99fafb6b5b4259125 -:009cb01bd6d649bb8697f98ce19fede1666f24 -:009cc06f07ed1655002dcc10a209aaf34ec5a9 -:009cd06c717d3fa2b0d95ce31c52a792bab1c6 -:009ce06c29f34150aded7bb9b5ded914b32e15 -:009cf054e5628305a708f946768f15e1ea935c -:009d00bc15be93c1423db54c53fea951996dae -:009d107b106c3d843c432c0299eecaf4814853 -:009d20cf06fefb4d75c2358b026c50e2dacbdf -:009d30e066bbb3753ad6209884187af047afa7 -:009d40a4b1eecf884bb00c29485a93c6bfcda2 -:009d50928de2011cd8d6b57ad54bebfe1f3d34 -:009d60874b3520acaee122a156398afd2133ec -:009d70dabfe95f40687756d2d0233452f0fcce -:009d80fcf9c9b73e54ec2b8d089fd297623405 -:009d90b8598c3d05287ca170278f09e7fb035d -:009da03701b57279d6628280f8143b7e97d46d -:009db00bc55cbea41e35817e791f89079c59d3 -:009dc06c1770b1e81f2401041700c1940fa0ac -:009dd01194e7dce7b4fa80333dd406ab93c0fd -:009de0c721a71c59298c4bad9980f8284d2be8 -:009df09a558a90a84693163f1b7d5ad805559f -:009e0050cdffb8788b3f2c91cc22721432eebd -:009e10d202e30a60326f416ae5dd56a96591a4 -:009e2065d95276ea0217611a0ad18fc7bfe9b6 -:009e3064e1579c6070991edeb0f539327564d6 -:009e402b4def09633f12caf72f667c3b8ae430 -:009e50c6db4cd12a806ef81e388a59bec2008a -:009e60269efbbf6d2545e5f1d0b4f8d4c15144 -:009e70d1e99780de47ebb5c37aa73005b989ea -:009e80ba14cf3818951407e63c7348e6ad32e3 -:009e905e56f9ea047fcd3a78665f7ef914df8e -:009ea0c7f2279c4b03f7f2cf88368bc84fedb7 -:009eb0bd8c5048d993e5e1bddc6a3d358c743b -:009ec0f61cabf697fb41f8015dbc68fd35d41c -:009ed0008f64740249b35a013ab677bc0a7ba9 -:009ee09a79b07ec507f46ce4b61fd7bbbe3d1b -:009ef0f845ae9a14cc54264d33a552a427d630 -:009f00e5b155f4c4e23795da173af071781376 -:009f10a8350947bb98155e81e47d9b69f60c6e -:009f20a33817dccde16c1679f4b8ed633a1b5e -:009f30f7a65de40362617618f71399830e6024 -:009f40482ec225e052cda3685961b815a565ba -:009f5045ad67b0c6f6540e6f26e6ec6dab8ec9 -:009f607962c7c0df35971f045122a0a91ace4f -:009f7084a4172ce1626874388b57fe6a327194 -:009f80dfa7f5162e5927338f4152b3625759e8 -:009f90c2962cb13666ffc6a93a65698efba343 -:009fa00fdae1bbe065c54d5b609586b3fd5ee4 -:009fb0807177ddfb840c19a33977187b48fa0c -:009fc070992f7b5cdc1fe36cfb8a4069480cbb -:009fd08a9b8a178138ee61266c5cfed60c8093 -:009fe02877f18f85b66dd8fe6a60236f7d6446 -:009ff096352613617123bd7ab32d2629220b74 -:00a000f4abc1f37197219890d02d60e466e6fc -:00a0106a8963fb8d19a1200bda1c1ac07e30c8 -:00a0205889b397de2da2b36e79dfb0730cfdd5 -:00a0303e1b44f3dd55b6200b905e208df0941d -:00a040da9aef39c7c924bf59e3013d9781da73 -:00a0506d674665eeb66f9ee3f7191a2ed90fa4 -:00a0607f5169080e03dafc5f3545ae1cac70c9 -:00a0707bc69d671d8c5a6dc8a09342aeccdeee -:00a0803c6ed51c2f3f886eb48259390ee7a266 -:00a090c815a4bec2064df4dd535043b42143a9 -:00a0a013eeabf89a54798b505382ccd4e19778 -:00a0b089d906fedf0c24397807920177e428c7 -:00a0c0fb159a0a69abf4c8da718ddd38ddbc23 -:00a0d09f9e610f8c607a08e2d7afc35037e29e -:00a0e0b563b27b002b023131fbd31a16e8adf0 -:00a0f02776bd2016979f8edc55e048143c3b53 -:00a100f21dd8c9231ce14ad7876e72a5b9e9c0 -:00a110468694eb9f64f15a7cdc2df4578bc0d0 -:00a1203aae7e1eee2b8a1aef6a0da4b9dff9dc -:00a130dc87fd0be9b0f792ca3e01dfff4adaaf -:00a140e91941f3882b2f6cb550ecdbed4e5ef5 -:00a150b76f3724dc5b83a73b195c0dcc6577a2 -:00a1603845c02b028dedb79bb558ffce4ce8ba -:00a170574cd64887a1db3534c415820d53dab3 -:00a180acf6672efcf97701c573d35e0bc8d018 -:00a19047bfa05ba231068bcbd1d9025b39e8f4 -:00a1a02a3d12f23227f1c214a9de97cbc360fd -:00a1b0bc61105e47c3e796d7a3395ff9d7f105 -:00a1c0143d14f196bbee9f30179364e8c9a562 -:00a1d009331f4c02e90eebef835bc025abf30d -:00a1e0437a1fa4a105978277e06caacf755cc1 -:00a1f08281e49cf32adce601c8ecd78ffc6793 -:00a2007313c06a1c8e7b891b412a4d928d5cd0 -:00a210b9f0137ca018fac5ac8fc968db1ed892 -:00a2206ceed5a16e4032c7ffaf9e27edb3b8cc -:00a23099ad5088548d8c6334afcb8d9b2fa921 -:00a24071d0bc8ba6ec1c461be147b278ba77ac -:00a25057d4a1943012bb4b79b0277c6d462698 -:00a260dc87929fc60d3b8b17092c2544b76652 -:00a27027b78ac43f39a24b4ea29daaa66f18b7 -:00a2802084dfdac408c384c9b4e00444a7b770 -:00a2909e975ee14b8c41ec5e7fd1938a745fdf -:00a2a0b67d62baa045c287d8924357815819d0 -:00a2b05eec07617408ea7599409c3a89df12ba -:00a2c04fd17c9f2514c45ef277013da1efedeb -:00a2d0340072130ee50ed993f01f3c30bbd9a9 -:00a2e0f172bfe5691c832ac3cd09af8c3a73f3 -:00a2f08b9b5ec6fb38ff7e2067ccb28f484d29 -:00a3004dd3a921f10a328a3210820a73368483 -:00a310621aef3a1bbf008a61929c221a922fac -:00a32019bb716899b36090c6798f9dfa9a881c -:00a330b6d7c903be7ef2ffa48814cd23a115d8 -:00a3400cc7b4dd6f248992998fecda46ddecb4 -:00a35022c5515ac1186ba9aaee21a43ab350bf -:00a360c9298d456d1cedc6b322713435668006 -:00a370b64638bca44952c9f59514aac86fa8fc -:00a380e53674f218427ad3fc74cb04f829e061 -:00a390134e06df26bf0dfa0cff7d7ecb9e436c -:00a3a0fb16eb7cfd3b907209b8eab0e15021a2 -:00a3b096b1b3ae8aa549afd1e399bc1215fbb2 -:00a3c09fd82ca011e81dd84936d90fe3c1faf0 -:00a3d01a07a743f50a4722a0e8574180e8783d -:00a3e0d3e755123cc6d068a76f6e2e6877cbc1 -:00a3f03ab38a8388ebc33cbaa01df77f180e2b -:00a400aeab5f54ede4cf106817e8be55e2fc35 -:00a410f557933f2bad16db0231fd272eeb8c0e -:00a4206f68c0fda8171d1bc45455c917deb467 -:00a43091c0b7f893544708881df076d495f5f5 -:00a440776300c88ac862325abbeba3305c78c2 -:00a450d95a2523579cb08648a3e5c1a865e168 -:00a460a33e4d8ce03ad0b6d2fd4946a17b230f -:00a470d3e44354e029b950f4d3f7b462d27960 -:00a48016c7977741c620dbf0d73939508209b0 -:00a49022515b59c6afac31a71d5312e211b10a -:00a4a0a47ca5d7595bff6d14408c4d707a3765 -:00a4b0322b89a4fdd91d21007a289a5bdb8ebe -:00a4c0e99ecd887be720d7f4934b5925ca24fa -:00a4d0732f3055c14730979f1f799fed2cc113 -:00a4e0c618265fcb57c9a9024a5cdf4d98a0a0 -:00a4f0d7142814ec364d0cdb05b90254695e3e -:00a500a65cba1417bfa8c07451e7cf9722fd77 -:00a510d16e9f26a20ef8baabe12e5490211646 -:00a520739beb61df641c9bf245c6d06918531b -:00a530574caa9af3b205381a2a0530ccfba94e -:00a540bda6c4944d8b437e5f2cd2bc00cacdb4 -:00a55029ab453438eabcf185fe53f45c2c8629 -:00a560500cc88a27e616a33ff716f831a10b7c -:00a5700bb5f71ecce3b67334476c0ed419a2dd -:00a580f230392e60b59dbe3abe0f0fbf4d12d9 -:00a590e63c1ab4b517789f9a08b9e87b5673a7 -:00a5a098db24e9a01fe91c55eb785a6b04e511 -:00a5b0fafd4acc983e1b02c44a504bdb117dcc -:00a5c0a0ac510b1da6f781b134c0fc986c2270 -:00a5d0e6111c0c965fc1ab85cea5f19889a3e2 -:00a5e0f198d831054f186d301da8bc5ebbed6b -:00a5f0ff8746131c89092b8622cec5103954f5 -:00a600b7a893e3eaae0fc6a7c1c0023537d4ba -:00a610ca26e4bf8d74f0fefd9828ba5526778f -:00a620c59efd97fbda98a33cc1ff61a0bd9c1a -:00a630fe96667861daf72cb6df190c5769489b -:00a640f4e9f25d637da3ccfcdfda38c2d233d6 -:00a650e975450c392c42c25ecaa0bb1cfe4ba9 -:00a6602142a4c419153fa71864ef04ee51c37e -:00a6707e74f3fec1b8cc3224c8a0a52fce3492 -:00a680113c34c579470a6892b4dc4366c74aa5 -:00a69084a9fce722dd878e81278ff606b4b95d -:00a6a038a371bff35f232d27bc965246eae095 -:00a6b0205458e9d57b6a7cb5d896ef465826a6 -:00a6c05c212f13c496cdcfa9b6873d679cbc51 -:00a6d0bc12f1c54c3df0767f8a67be46779e19 -:00a6e0774d41c5867a853988c8ab868e1df2cf -:00a6f09ad5c0c71f9e329f1b6dfc08cf41429c -:00a7005830dc4f6065b2327f1915221bded253 -:00a710f5370446fe9114e3f8a05211e88a95cc -:00a720b1d40ae98c0dbada33ddbe5231aa3b89 -:00a73042f892dc7bea618d67974ecd7e95a788 -:00a7404ecbf991940f6a7bbf7fa3e337efa429 -:00a7504d72929098ba93627dd28cfafc407c0d -:00a760f718029fedc61e217714ed2cac6e2e80 -:00a770508019a8d3061a8672ed1161dd0d4f05 -:00a780a0f79b73585dc11af86ef5b2019cab9f -:00a790c85c3e581ad2c117db890b2082c8aa0c -:00a7a0599c0678e45623538f53ae897d7e8078 -:00a7b09c00dbe6db271093e17b094e5624e978 -:00a7c0c0df741b15fa4b1386548782a3b7e63f -:00a7d091900656b5fa453c988f3004c4f0d02a -:00a7e083db79de199ea43de5785327fcf786f2 -:00a7f0c94322d07273bd5730ea6f75b7c18dcc -:00a800b51ed70aa893977a5b5a53a9ac3cb4e7 -:00a810e2df396b5a8466e5e663b9851f39241f -:00a82008e64c1a3132ea98db51829654b31361 -:00a8309e41e6a44c5a15670dd86cc46310b2d0 -:00a840589111b1ad3bd37b3b3780f1a655b222 -:00a850b72f1961968240fec0e181347ccc0fc9 -:00a86037a15edfcbb533f3d0de01d02df07fc7 -:00a87012ec8cfe2256898cdcb32bf2ed5c2214 -:00a88053879168bb8e10fa7480419798b0a023 -:00a89006753be21f0719370ec6e2df52eb3249 -:00a8a05ae91c6e008a45b769adc30413edbc66 -:00a8b0b62246ced1bc45068c92741ee50b8621 -:00a8c04f8089ecd1938176aa19cb469308c715 -:00a8d0f0cf8a8cda0c6d82b013fc6cf150af25 -:00a8e0726cfd46777a89cc354167c364239071 -:00a8f0197896a7a2145a87ff4e3bfeb22d3735 -:00a9002f57d23f991af37d6f65b3b98e7eec1e -:00a9109749a17ab82e7b8afec3c8ecb588fec6 -:00a920395aaf7325f6b7e7c363daa4daeaad1b -:00a9304a16aaa249c1847cf2ad51831fcd3e82 -:00a940f8c81d2153e5553d2286f7f90281ad69 -:00a950c97e525a202bd7b17fb345f53f55cb62 -:00a9604a5b1b9b5e779bef3e1abd34a0cceba3 -:00a970af8b66142d33aa9013a2fdacfcc3cff9 -:00a980d2c7f27e20f39e248417e210a17e5cb4 -:00a9903cfdb9648544d2afeaf1cc031a439174 -:00a9a02b5e059492fb295b75cc782bc41a8239 -:00a9b017c0dfa3f2efa61f80896117a8f25c81 -:00a9c01f292dce7ed9b95ee7169ec0a24650e9 -:00a9d0febe073d1d43d1e343673cbe40c73c4b -:00a9e0731cdb450e8ffc0ce9c632ec624098db -:00a9f0e8f7f6d8c03b9b82ceaa2ff084b4dc78 -:00aa0014680e37b505501f779228c9ca9cc5e8 -:00aa10e5d2930588b5e472056d6e5822695a01 -:00aa20f93e9c71e97623e9da2d5a843063f6ce -:00aa3017f580daf54561ae05b3a74499934194 -:00aa40c903da4cb751d57260fec098d77d3b2e -:00aa50596d30f6e6f63c710d117406af9d0c2e -:00aa60e3fa57d3ea561cdb4259b1a509aee368 -:00aa70c8b1f9c3faaa040c91a12f04acffde09 -:00aa8036384a80ec465d6772604cfd5b69ac62 -:00aa90db7c279db73050dfb1d774d1b3c84f8a -:00aaa0626c662af82a8947d078849044621845 -:00aab092bb3cf74fad0b9a8afb51ff0176f917 -:00aac0208c844c525e2259a40d933e429aa507 -:00aad01099f8663adc2e454349085c5dc305a8 -:00aae0836d4103c58083adf8f1f84e864a75c8 -:00aaf027e55dac774bd82b16b80027585b51d4 -:00ab00a6c43f5ef6b097b9c1e0d291825a4e91 -:00ab10fb204f4772d1b618027809ac190951eb -:00ab20d2a8320cc2c8816756c03261c0e7a20e -:00ab3036d0536c6b4a95a1611bf72532ed20f0 -:00ab408d2891b4e22c00ee206bc1a77b78d048 -:00ab504438824a885a6f3160e24ae7e3b6c383 -:00ab6016cf391bd1afb6de189e6fe1fc2f6876 -:00ab7074c4ee6a5a891844302cddbfa521aefd -:00ab80bfc8cc8e31313e89cafd01f9e9327fb3 -:00ab90586f78d5bc06b7faec9fa6eadfba363e -:00aba057017532992a6ef9337cfdbe99e701c6 -:00abb08893f59aadcb226bcd2281035b27d507 -:00abc052901d039b75d33ea102cf246f452cb4 -:00abd0979822a173922a93a0a42483d99da8c8 -:00abe036f6612bd207180336b838982c8df756 -:00abf0cd6dbcd8bd440900c49129f41cb84abb -:00ac0051224da683556d65996aaf5846726ffc -:00ac10cf1c941bafb16a056706a8bdae466bb8 -:00ac205fdc40f7ac06aa66007adf4e8ab7848c -:00ac30efa35a43fdce1456ed8414f68499bb42 -:00ac408e88fd7eeec2f7ab5cc03f83ae60094b -:00ac50c7c73b5e35544747873022d7d81ff5be -:00ac60f6ab84b1ce738021c8b8806a1bb53fe4 -:00ac7065405425cb47b9ef3df62a461235693b -:00ac80fdd321bd7b5d9f5dd5e708aa122fed5d -:00ac90490766ed3eee0eebca2fb9c1bff7228d -:00aca096a03730375e65d530dd9f8cdb5978ba -:00acb0c7930fd5caf7942e650f2bac0cd4e0fb -:00acc037c941477b5e8271bc5c30f988d369c8 -:00acd0d5a6bff0d93e318ecfa34426cd9d3d3e -:00ace06ffc049009c0e45a5b9d7893599e8269 -:00acf0bca3ea0898e6d1f40de5f0558e1b68eb -:00ad00d160e5ab0240d896a6ea28962fcfdc3c -:00ad101d5deb6549c1cddfa177f7f701cc2c18 -:00ad20ac0749939691aaf5fcc2596daf07e21b -:00ad30a47f33c3b6b1748fce315f3e8758d6fc -:00ad40ca560ea0ab15d83cf492bce2abbbf498 -:00ad5087489d055c3e0f4d9381f8833fdfe4f4 -:00ad60dff2cdb1179954b71f82e985c76439fa -:00ad7099af0dcabff70026dec4456a60098b3a -:00ad80f286d862048938693cf654f1b654a4c0 -:00ad905f981630421519586078d12285711fb5 -:00ada078d66cab585b2fb247c85a05d82029e8 -:00adb0198adb844caa552ca7e0dae4e96c85bf -:00adc0a5e9b444533876bf43f0b468d17ae9c6 -:00add0e9859bbbbf4b05480d1f425da689860e -:00ade01289474d69472a3398b22d08ab89e925 -:00adf000d8b79d74fa64c2a1441cb6206c04dd -:00ae009ead0912ab818b01c1cb1ea25df6116c -:00ae10cc930d17be4b8c3ba6772212c3cc0ff4 -:00ae2052a3202a596b8fdd6abfb2cab09c5c54 -:00ae30d9b880661d3047a8c0c6d24483f2ea51 -:00ae4043cec93bc69529b2e283c125f9c3ce28 -:00ae507cf7f0433f88977cdf346475ee6ce3d3 -:00ae60a59ea17426afe16a04387a2672ac18f9 -:00ae7066330ea44e3fdcf5563b02786dd6de89 -:00ae80e3654048e8fbfba7df23c22a447e8ac3 -:00ae9091158bf4eac751106b16e21c775cb901 -:00aea0c4036c004f7db4f992a2c4ba25d69281 -:00aeb001de41dae9e6d054a8599510c752f351 -:00aec022c8f6d1b6299067e91840e748d54f0e -:00aed04026f25850a6536ebc45a0d3838afd69 -:00aee0e5e1089aad0ed26edf71c65c69aaacdd -:00aef0eb275a871bfc09eee228b29e3b8a6ec3 -:00af00318868024e2555c67d9cc6d682e1f216 -:00af10811293d4d6b9669c673a496a6235af81 -:00af20c82434c644d7c24385678458cd3847d7 -:00af30ba7b533079e72f5b6554e722b2203703 -:00af40147a99d3ea0863016daae336c8c23f85 -:00af501297b4217fe80070befa30ef850dde74 -:00af6013ff25507ba0bd48e4ad7b0c3135c30d -:00af7074fc3aa9331747a36fcce88dfe047915 -:00af809eac10e126c03a22629a2c4a158f2822 -:00af9057f4554808dfffb9347d8849ccbe0d5a -:00afa0ef9d2b49be4991633f4f2264af5e0e47 -:00afb06c262bd051969298e1c2b84723c1a4cd -:00afc0eb290cbbf9591c6b2ad84f0c6e32a262 -:00afd005f2ca209c5271248bbe740744241831 -:00afe0795974f6956c92f93a93ae0b6016093c -:00aff0e76e0a8e6274be650883cb8e0ae4eb15 -:00b000db9c9aa7cd74cc5dfe2ec87f4a713eee -:00b0107435ed1e9597bad5416e2ad729e3c728 -:00b020604e9dc47b8345cb884546e0cc3ad27e -:00b030f97a5b99dc6dd7f03e11d82a8b9066e6 -:00b040aeb2d5c6795ef555832b790fbce95c41 -:00b050f546faa6cd6b60810c30a4881ed1cc50 -:00b060b7253e4ac4d8d0c4697a24d5e0102bb4 -:00b070851d3b186f445dec747fa77ec1caeeff -:00b080ed4cf687c3b3475526b3ecb185dda853 -:00b0905f64909deaa8b9fac94f6b77fc4aec19 -:00b0a0e35f47cb3af35ba08c28f52356dd4726 -:00b0b003824bf628682fc500589fdb13ae661a -:00b0c04164ac9c297e317bd8862edce9813ff4 -:00b0d090d84aeffcf85430aeebbbc139a75fe9 -:00b0e081b7d04d0078dd169df0cf754d86ba91 -:00b0f0d9b89cf53a98a92590cd894de84a8557 -:00b10066a9aff507790099f4629c9b4089ea24 -:00b110fe10ea3f29dd30718e4c1b28e2642b96 -:00b120760e7f5897858e956a0e3c45f7d73af7 -:00b130f1f8b5478e4257ff9f4d1f79c741018b -:00b1404a58aeb636c4bc5659c75465786e79d2 -:00b150a184d4f85368b2235693a092640f6c36 -:00b160c86efbcacb540ae6cce58a1e0e5525df -:00b170c5221115ac0b8ed5c4806f691a60d8da -:00b180ef5cbe78f3056b4336f47ca41abe2e04 -:00b190863ac66a6ce6b3050cf274852d57f35c -:00b1a0899319e4f62ab723e29c9d912f6cf991 -:00b1b0e2d35b530b6c178ad38d3c838a57a990 -:00b1c0f3f0456d1094876371a7871302a7a0e9 -:00b1d01e0320de9a3d5ce2b485db9111eb9ca3 -:00b1e0ed1011d557aaf59b47fd8101e434ba7e -:00b1f0a2a1c98195e237c7ebf448d40458c372 -:00b200c63c4194c3b73e2c684487acc2fecf70 -:00b210980c02206cff627bf0084a3096c73774 -:00b22028c75399223c1d630bcd7ea44ea5b639 -:00b230e408e8d0fb77732ac16f782a3360a4fc -:00b24054e098f1504402d9fa22147941f4d776 -:00b25074e83e037f3669f5b2539d6bb4bc600a -:00b260cd72eb25522bdf291806a4e0e2bf938a -:00b27071a3c7732a439f86911945b63a8d1f84 -:00b2805a2168d28315d7da0c811da46fa3b19f -:00b2906471476f9a169e306e38be61eabaede0 -:00b2a0c73882026473a0f2889699c0bbd4b4fa -:00b2b0a444844262f5eb3377f71634a1139a50 -:00b2c0f814d16b51dcf42c0923b230fbe8b17e -:00b2d0c23848a77c09aa173b210572e7b45c48 -:00b2e00089e78978d3dfe7fc96a20897412a17 -:00b2f09036dcac1a34bfda5bc5a823140a9ca5 -:00b3004d667ddcb7f424269410e99700e6735a -:00b310488c9c97fc17e28e11e58fbd8ac31735 -:00b320339bbf59addd8b363b48dd354532c573 -:00b33065a64c98bed4e17fd7cce186ed64a936 -:00b34061f52d658ade02e2a786e1399b3b33df -:00b3503bfc1ddbab3afba97ae697dc6e5cc442 -:00b3601f7a5fec82241f3b834df829f454c618 -:00b37063da665dfe894983495ea2daecd41ec8 -:00b380cb4206f8a49d1b2a33e5697a11e82410 -:00b390d9c940b1b008a4755d41d673ab7830da -:00b3a0c1f51d21189ebccbb31560096a030802 -:00b3b0d46a4141a42ab1cf64d75e6cfa4f197a -:00b3c06efbbb253b790886053d7b7aa097d4df -:00b3d06fe0ce3e30ef4183d95b3d62d2e49b9a -:00b3e07f429661d9be75417ea699837ced1406 -:00b3f000f13e695161680b39e3e39ab99dc59a -:00b4007fed4e09511e3984052ffd84cebe590c -:00b410700557aa4b0db18f4d30b0aba1d58ef9 -:00b420625fc4a38d619b427a0e1c397006eb9d -:00b430389072f818f8138be9fa27a0ac8c5902 -:00b440df7fe1dc24eac3e718aa0c7ea3d75343 -:00b45099f5857e5345d39abd095d0a86bd0206 -:00b460e0219cf9daffe60d502c13f715e0f5c7 -:00b47016f0737c2455736958420ffbacef3873 -:00b48058aaa7376399f7dedc0e0b34dc559e3f -:00b49009a6d7e2a74583f69e7266ed09459d39 -:00b4a09c4be948d89f88916ade88f68aa5b3c0 -:00b4b0a28084aecf568077f396a90b8422beea -:00b4c0ddf6337ccb56c146cf264f057c9e8a35 -:00b4d0689c16a1846f97fe9bc0f5e7c8e6370b -:00b4e063ede387c694d550731e94d7f8d342f2 -:00b4f0541dc33ba57d0f79933c0b36a98d3e56 -:00b5006108332af6b5a9c5daff4b41e02cf21a -:00b5101d38aee3be962d18c21a8833981b83e8 -:00b520de14c786823861b406600078578fe054 -:00b53037a01268d54c74f47062a8572d3d0390 -:00b5403edea9e60ff23cc52b247f913cbf6ed4 -:00b550b6218b8d3e25760d1b7210a383b37da7 -:00b56091ccc423e65132abf6489ead3ef7af9e -:00b57038308ddcaa857422bc7b27025b9a920b -:00b58049bc237aa089f5891a75d35d274cb04c -:00b5909063819347afc9db7981095618f4d3de -:00b5a0ae2ce57a007ef5fc5048e1b2a28d12b4 -:00b5b0c34e1f65fe923bf56dc734bde89859ab -:00b5c0ab312a53639c5d33c01cbcdd55120e3b -:00b5d03355f8e26711640a8d3a858930880ad7 -:00b5e04476b72aed776c7014cbd87c62fc9d36 -:00b5f0287ede35ac9514bfc7bebc38ee3c7969 -:00b600d7fa9a468778a3d252f71acd08cca065 -:00b610fd66e1e7d68101813e2eb124ebf00486 -:00b62022e08580e38efa81fb3e2fce43f1d9d5 -:00b630c68631f2970c7e5dbfc62146d209fd6b -:00b640657330de0e8e4c414c39160fdfed4f6f -:00b650c125e96c775bfbe5da9f2eceb461d018 -:00b660c6930076a5726a1b46f846fcda769cc0 -:00b67048beb2220ae07fd413a2ce83a44c3756 -:00b6803a72e6c92744e27551595431ad4f3598 -:00b690a3993ca1b0f377b294953317390cfc28 -:00b6a053976e9097581b18a30146a4c132a75c -:00b6b0c0e2602bf9225b86f86de9b8df437c04 -:00b6c0a82f70425453864fcf2c62e055ee9ca6 -:00b6d05a54ac651fe09cb19ebd047c60c07b65 -:00b6e02c5758d4404c1eab789126d51de6cd05 -:00b6f043bacca1e6198637df6b1deaaf3ab2ca -:00b7008ab5830064d5e4db9e227f36546a10e2 -:00b710f1d66a20cd645ac7b1ca8b697983428a -:00b7205858f1cb36de497a739b89b521f1e6bc -:00b7300d5f2b9bbf00b60dd7354fc173e9494b -:00b74040b2f8b70c0717b11dd1ae4a346ce32a -:00b750af1e8adcf456f177ede6f7e7048a7307 -:00b7600d63000c6a3f1a17bae6d9ac6a95997b -:00b7705ccd66e50bc7c5b7df5ba7efd3afbde2 -:00b780a0d97871964270fa79b50073f266bc44 -:00b790e169b6479dc251cd0b10c0fa78bca044 -:00b7a074a597a99d847baea5e2f97cd84b9bce -:00b7b0ec2b3bb2b70792218bf55120922c0ad0 -:00b7c08ada6c2624e40c52a6f14ff0f60da17a -:00b7d0e6cb60a26162435f1c8bb9f1c3c879cd -:00b7e069942c4a42a0213ea5ab804e3b38654d -:00b7f05ba359bfbe290ba1617414a4699ad250 -:00b80014cc68feb9708d0ce5b1dfdd5498486c -:00b8104b73d7d9aceb68516d7ec7e0a75e994e -:00b8209b928f8da3df8c9700fde995f31cd8c7 -:00b830da3e8ae05f324480907e33a0cff9fe6a -:00b840c52095938452515e4550602746d5e5f2 -:00b850fb94a04be7b52669fb48ae1685a9cab6 -:00b8609029c017a23ad88d44ca994753a4a2ae -:00b870db47fb3bc50ffca36268059ec0307494 -:00b880fe73e6ee16e0f192fe68115c64497612 -:00b8902f7defe3d76514080f2df1dac0279d0b -:00b8a04ef7151621152c107cc893762258cde6 -:00b8b0ff93ac6ab9fd70168438d8b7fcdf870e -:00b8c030ce64fb38480fd0fd5c120dc2e596af -:00b8d006c8e07f6f3f92d1bbf1703d01acfe38 -:00b8e0006aa3b670516524a14be76de14f7bcf -:00b8f03c8311d78787637eed9597336a5a2428 -:00b900e2f263208daf6d145c7f18d366ce7eb5 -:00b910c1a84edb6e1bf3f91f806416ae9a19f2 -:00b920f9c0cc4b41f1e0ce226cdc0543c7bbab -:00b93005417a92360b8adbf0d4a120e1fdf623 -:00b94083f34aae8a863b39d2af95c92fb8ebf1 -:00b950f2d1a97b89e9eb4be3070e2d6ae5d774 -:00b960f5eaa4d296d80f576e4b7ea90c3526bb -:00b9704695ed25964f1cbb373b4f7948aa4e9e -:00b980006ae4945df4f2197eea3e283eaa4c7c -:00b99015f1577df69486ea00cfeeac9a2bff6b -:00b9a0381d6743dec439983e187b3523d1e9be -:00b9b0820d450fc5d68bee2bac1c7e3c551d22 -:00b9c041bb388604825cb81a8076ebb9e054c0 -:00b9d0b9e34672885835e3593341b8d50cca21 -:00b9e0dabcd37c0b1b5f8c0a8fce0999323b2a -:00b9f081c15cc94449b978e77025cfbffc2a79 -:00ba0019f76e36f257b9721d086990949d55c3 -:00ba1047d2ca90973b1cc723f0e7fb3d4557b8 -:00ba20f99054f70e7d36c8e9fdfbe383f99eac -:00ba305a064624b67d406f7ca2997e0aa134c5 -:00ba40220a5262224ce0a530588b52907b290f -:00ba50ad8de612a87235ba16c3e3184901aa68 -:00ba60e0aa43ee4d23aa3b6a36533a54d7483d -:00ba7079f7e0ddea4af23787fb07b3778a378d -:00ba802c40a98cb847d96dcf63094fe40ea04a -:00ba90158f237859a633a1ffb9712a80604228 -:00baa08140e7bc255b49ffe8c400044f346b64 -:00bab04ee743f8a53a05dd92c19ef21285e1f2 -:00bac01f1b294592d6e651dd33a1d96f246080 -:00bad06ee796efec6856811ef706ac48ccc8c1 -:00bae016b2677cebf2c8054643fd9846c9e779 -:00baf0deef99bd3a60b4e2912dfa4fc0648244 -:00bb006e9245c9de41ee536c558b959ccfb712 -:00bb103a81229bf31695bf6b99cfa7a503c3a9 -:00bb20425a83a580fc68c506b43c4da8e0165e -:00bb304efb65c92fbed3b0710c2bb9c0ed9bc8 -:00bb4081b9e51bce34464a2ce6dd3bc30337f5 -:00bb50628f7de65702697bf539cab622b8b57c -:00bb6016236745da953fe934f962af83ed3b9b -:00bb70b6962bb9b613836c67d92559d882b331 -:00bb80001d94c5468d7f5fc970a8bb94e3bb65 -:00bb905de76cf073d07ad425e9a497f4cfb538 -:00bba0b8f2f54a161f7c11ed94455e4ecffcc3 -:00bbb0f177145383b9a34ab706828cc2256d07 -:00bbc09839b8f9a7bfb4bfed9f3888424ffd9a -:00bbd0c713905d0fd58a087d1620e729a655ab -:00bbe0a0f32a407c4cb7e8ba73b7a53b742383 -:00bbf0981333e29b867f81ec036781a6069e3f -:00bc009bce96baecb47db4b0dd170ebbf43e15 -:00bc1038a7f54ba49812c030319784f299b949 -:00bc20a56efcdb8a7a681da200798fe403f000 -:00bc30b267fd9e871ec4306f522f4b7c2f141f -:00bc40e40dc20ba2d4ccf75e14440936041c33 -:00bc50232ccffc334c648cee19bafd86ee5e4b -:00bc6075d608f1a8b50f0c2d764d0e5baa6ae3 -:00bc7001f198b37809646552abf0060adf92f8 -:00bc809cdacae16fbf4df720cb66c563d3b78b -:00bc90dcafb7e828318a9a5b6aa7d9278de9bc -:00bca0d142607a5f71f36e463ae8f638b61ec7 -:00bcb002c43c980f7b725532823f3f2cba65b3 -:00bcc067824a97f39d4b546961de1efe6897f8 -:00bcd05b0419efb4125cb909744fa1037408aa -:00bce05417fb7ed4fa8411d2492d25869a6707 -:00bcf00591fb3cfb2f9b530ce43493a732422f -:00bd009548efc554e5d34c2f17cf232da969b9 -:00bd10a5a7abf5fb2a8420fc57a612cac7a13e -:00bd2094fc8648fc47449e178bbf154eb97113 -:00bd30ba089470decb40f322b033e4ef17384e -:00bd409f61b6368f0c00fe10e07a39148ce746 -:00bd501c3b599d5db3afbfefc1c00a3000dc1e -:00bd60912d158bd076f9ec843bd0470889cf3e -:00bd702cc74586b1d1f5bf810db671beff2b5a -:00bd80961ed9a510a434542681eacb317810b2 -:00bd90efbdb9a88ef41e73c3ecf80d8452bd67 -:00bda04e84ad5e0d9482813781ae518a84944b -:00bdb0671d8cddd44fcab1818d6fe337b9a882 -:00bdc0305cad6ff56ca4f0ec206edeae3a7e62 -:00bdd08dab5a777ee72222c770c225b17af14b -:00bde0fbe9afb9cf96ed3c43be1e9db6e2745c -:00bdf0f04aca4c5b3a689f6db323e179185d3d -:00be0048eff0ce2d98ccb3db9a948a8262934f -:00be10bf7dd6cea743c71bacb9844b2c825bce -:00be20b6ccbfbfee560a1e8f6be805effb8447 -:00be3020020c3c518ef6ba0a6a4b9ac386677f -:00be40d923626e0baf4310388cb818b6adc432 -:00be505d270cda0c11648213d7beff42dc0ff5 -:00be6033418f83bf60d8fdb70c34c21d34ef24 -:00be70780d7ec7028a2b6ca6cb77e7e5341d5b -:00be80a4d6c2e403b2ddaf3ee401aadffb486e -:00be900a8e6132c606660068d78fad5915db5d -:00bea0546d92ffc122100acc822c2895601ff4 -:00beb013200cca3f4e173f33b90b98ac705230 -:00bec05370bf18fb6e4e87388a407cab992199 -:00bed07fda359516085e1a5b80be53d7bf48b2 -:00bee035475a37a08202300a1e3ded7ae88dec -:00bef0d51126ea4ab724738f835903ca3b8f1d -:00bf00f6a18e1517e3f2c1009aba3ccc1b1b9a -:00bf10c123e2382011df61d12a62857213d343 -:00bf2050d66e1efea9e06136c15f0865f207df -:00bf30b85aa5f11fafdb3999dcdb51e0ba91fd -:00bf405ea3c2aa13477c433a64e02e7cc4bcce -:00bf50715ae990907799c319df975cf25850c3 -:00bf601dd6cb3d91ef3dbe3351a096359df230 -:00bf7024d62f2580e9b9384e77759db6bfa170 -:00bf806153db964cfd12746974cd4c28c91898 -:00bf904f4d2032efb12777f64476dfc3ff0968 -:00bfa0622d49c7e4757a8a7ea94369b25d39fb -:00bfb0b6be3d4efc1a1c0ea6259684ddd790eb -:00bfc0aff38004fc8c16f4c349584e9091d5e2 -:00bfd0fadb698b3c31547a75b5a7cf14804216 -:00bfe06689f94a7f77c277c848796fad5a60c8 -:00bff01d0a2f52fa290f9302edf03a18b68e49 -:00c000833e602d40d7d927934cd68f97d353c5 -:00c010777c01bbde3390648ad4282a1cef51b8 -:00c020b9040f91617d798e435b39129a65da19 -:00c03089161b2b96330bb6c5206c0509f0b2f8 -:00c0408a3d564d1cb76eb1fd3e2d52c54ebce1 -:00c0502c458d63f637d561ba235efd3998b426 -:00c06066357c1128ae70940f641018e5a659db -:00c0707e418b195772a25d43ad3126185f5083 -:00c08062012203456e1803118529f8e4190463 -:00c0909266bc6870757d91bc6ed22924b60016 -:00c0a065b7d3c0db066e486a724e976a1bb7f1 -:00c0b0696a4703fae2ff6fbe6d06eb7452807f -:00c0c04a31b62a0dd9173a747bd678b03eb663 -:00c0d055f064585322ac04e58b0f2d6b281127 -:00c0e037727e2fd0dc1c950e88878b0412432c -:00c0f00e9e5c4a187203ac174f5a787c8b6642 -:00c1001535905dd3411d46482a6c475aa634f2 -:00c1105694ec9d33252cb4a9945f146513dcea -:00c120e950541438d99318267a8012feac9e89 -:00c130b6ec823bb788cd4e6f29c6913ce3fb95 -:00c1408cfebc6d146bb25b981c9f46847ec76d -:00c15095226923ef9223bbf78ecc9407970ec2 -:00c16041219b5e68b1057280bf50b108f9ad78 -:00c17017e587a86ddb58f46103b503666be71f -:00c180edce93940b3c2f0b7f4c454b52878888 -:00c1900819cd7380c310347cf777a114dc1042 -:00c1a02cf69fb3994055a8638063fca90b95a8 -:00c1b0c4394c3070d30235f8e32c8d9c3de4a7 -:00c1c078ab1f77e6412d7e42538d4589018901 -:00c1d0db8b00aaf73ac40ee108f962947add54 -:00c1e06921fae458e500094064e8007f687bac -:00c1f008e63b64cd84be248ccb4ab5150d84a6 -:00c200470e103f9ff977ad0e63b2cfdeaba7cf -:00c21094deaf24ea5c8541d7a9a479e83628a3 -:00c2209c37b03460b40dde1d8ddb9c34bc567d -:00c230a1464bf2dc983b0794f7c7b2dc104c09 -:00c24026c8f33078997e5212745cff286c02ed -:00c25076afb4687057a4408c1f82eee0049f7c -:00c260ef267b657c7029f05be004c93e6ff098 -:00c27076709b3b5678f343d3b3618a5a4ab02b -:00c2805ec0c283da65684264a3f7cbab5ad890 -:00c2905ffb1a184a66e704912010eff0bc7719 -:00c2a08073a398dfe60c707eb8c025b74f0339 -:00c2b02c6a94d27fd9d628c3a5c1d6b843ac42 -:00c2c016fadfd06d2ed8066f7bb1c9526ad2f7 -:00c2d0bdb1fff0b5b9c7aabefbb1d2a944acf0 -:00c2e0c38fc3be01b64e2e138ac35173c4edb7 -:00c2f00607c86b93a1bd72eb266232860e73dc -:00c3004edf0febaf29c844e5de234fb0558a25 -:00c31010790fb0f0c698373d418708951c650d -:00c320451adbbcb63852bee749b5d3ee4d5a39 -:00c33004136e2e2d87a722934f9b4ebce3456d -:00c340c2d23b641fd865a0e3dfcb5cc9a66f79 -:00c35059ca50fd90d690bf258e394e8a50fa21 -:00c360d120a21d5827b7bcfc6a72b72408b80c -:00c37047d883f1a5ad89f79d0834648dd9c444 -:00c380f0f1c4a780ed2a2aae1c04c72b669b4a -:00c39078b5bdc82dc05dbd334daa35ed29a9d9 -:00c3a0cef679fd85f5b51928599f70578fb25e -:00c3b0b9c2cf4642c64a819c84f5af1340d890 -:00c3c0d4c54cba7c61caefaa3051ec995353fb -:00c3d08ac1933e5b41245ee1b954c6c5335660 -:00c3e01dbf1c4dda15fa19a2b693ff749a838b -:00c3f0fcbfebe130158a4cab0c71ac099f40b2 -:00c4006f542a6fdf49a9ed5dd113e4a7dd95d3 -:00c4102178831c1cdd4034754ca81ac43bf8cc -:00c420233fbc9476ef41134cff592034b611c5 -:00c430bc45402ed224c6a2c82b39748b9bfeab -:00c4407a1c14a89643c7a1010d79ef4c9c367c -:00c4507eb8fb50564becf3bc37f03e4824b894 -:00c4604e494b5c1978757da3f0523f68885dbb -:00c47025c9e5600163136df9c1fa5bfc0bb3d3 -:00c4801d58b2afda0e3f631fe03be45945bf6d -:00c490f128e3071b12b2d097d96d31cb7c60d8 -:00c4a074079d8b66f6e956dfc19a6f301dc745 -:00c4b0fde5236d88c315a53cb4aa5a736c4138 -:00c4c0315933c4e1331b22a4ce189edfc0a2df -:00c4d07dd649943dfefcaa5bdc0bb82f5dd4b4 -:00c4e0540b58ab62d9e784b07d0453250106f5 -:00c4f013550066dbb74f7befb3a923ca5536e8 -:00c50022c26a7abc3540a888ea4126403b9d78 -:00c5106142491a623767e3905d133b79c02c03 -:00c520d8e6a7991f7441fd6cbac1c7311f3e70 -:00c530f45c13300e2c6f3111fcda570e1be98f -:00c540d50ec5522c1bdb7be3f7f11d6cdf42aa -:00c5507ba4d5416425e4a4b36884be7c39eadc -:00c560c6bfce5832e00b8624d831fd6ec8442f -:00c57012eaa436bdd5e8307ee6080f59b027a8 -:00c5806773e327f226ff54625ef90445adedbd -:00c5905d1995333499859c550016f2d6cffbe4 -:00c5a08123efad9d14dbc74af0b5d65e1ef267 -:00c5b0e87de63793870c8ccc11bc488b388df0 -:00c5c012a104d3182b88b50b3645a64a424385 -:00c5d0447f6cf8f3dc152f5acec4f87025ec60 -:00c5e0df6d3891aa6c896104fd1aeb494dba12 -:00c5f0b36e81c6d8a3eacd5dd2177c91584cf3 -:00c6007e353ec26dba76d26ebb0b56f64fc02b -:00c610a31ebe22bdb7937cd2d4baf333548c6e -:00c620358dde05d89c2df5997d5714f77bf395 -:00c6305be7b861b7222baf932ee11d5f02ef70 -:00c640a54a0645f7eb4ea0eae2042d47164f43 -:00c6507eaceb7b2a4468cd69b5479c35c4400f -:00c6605c04ad72f0b15cf42078142f61ff845b -:00c670db7a14fd611e921a434538c882499039 -:00c6806f0b8532b63a1fe1a7abd21ddd994793 -:00c6902bae08382f09f9fe91c4cc0966b4fef9 -:00c6a016c2ab77b9e40a3ab5d66ccd769efa09 -:00c6b02f578c577a781d23db1087fa6f47406c -:00c6c0bb58f2fdb0fbd4c74dea1683f0c76060 -:00c6d0e80aad0fc3bc2ea40e1a6383db718bef -:00c6e081abe553463bfe334e9cea0170c3fce1 -:00c6f018cc1c54ac18778ac7682f414fe11bfe -:00c70021f6a7bfa60d38db28826c600fc8cd2a -:00c710fdfd8f72dc193ceaf4608aaec3f24946 -:00c720821d3213ceb6af182e5f8d3e990b6a29 -:00c730576b187aa818fd283453d8f9199f5051 -:00c740a8ad7fd52aff7761c7e623ae9bb26dac -:00c750fb844c568c22f427027227e524a6d8c6 -:00c760baa82a40af5add0051fd3b0ee6623d2a -:00c770820557dab4d82fb5dbbefbf00a94ac7a -:00c780c2e50eddf6892ee1cc9a85c3c05fdd2a -:00c7900ac29c48687984053b91b3791d3e90d5 -:00c7a063d0bb318ed722c68addc94d9570d7c2 -:00c7b03a4f2e225b003419e7e199c4f9b4ab3b -:00c7c05237949881f5c905a6b1c86475d7e349 -:00c7d05f1f92cbe2711b7b1ed293e7fc163be9 -:00c7e029ddc0588d406a61c6bd1fe162b367ec -:00c7f0900e6187f634896450b39f82fd944363 -:00c800a3c205a730bb061ddeb21cdd5a86dec2 -:00c8106b8de947f69ebd181c160d09ee7c9fbb -:00c820686778f63cb0ae69aa459ec6188c167a -:00c8309453856fa18347b3a0d4f4ada7e29eca -:00c840f6df0910ba87ffec49018993baecfab1 -:00c850a7c786e2ce444958577adffd71e166c5 -:00c860edc9965761461d027be84b04e5968abf -:00c870345eec1853412e74159cdf14f916240b -:00c880f3e6460d8669e8b7674dd191d63c18a1 -:00c890d57762177ba74542c6cbcee152a647c6 -:00c8a07132126c60a520095102c60e6247de74 -:00c8b03e1e807e6c3a7ca6af9a9a15cd10451a -:00c8c08125006ea3980504b3fef09a123aa06d -:00c8d0fd0314b898f5f403c2309daf4a0c2482 -:00c8e09008608614da25850f4e52866dd48ae9 -:00c8f008d695dcff574af2cfd53c42a7872d89 -:00c900aa4fbbffa4a97ceecab54f3d15e28216 -:00c9109d3adea3d3296433fbdfc1b2e4c6d063 -:00c9209427abd3510ad70391a0ea8009e3da06 -:00c93078d3e00ae919a35422eb87202f14950e -:00c9409576d8967f7bf1d2b2e4dbcf49b18030 -:00c9505d9d85ddaa8db08cca8516e9c57e752d -:00c960bb95f7a39068d13fb2344d6f3837cbf2 -:00c9700cbba3b85db3f3e4c4e69e522e16e27d -:00c98080ab21800d987dcf54ecce480917c11f -:00c99005fc4e11c58f00a019743c6fc553e6bc -:00c9a0973050737833a195e033748c1fb22329 -:00c9b0fe49a89f2eeccdba7c275303e72e7f36 -:00c9c0e1448b4811d53a05d9a702a4b1cccf6b -:00c9d0ef4842c1cababe599638a6c288088499 -:00c9e0bddae6bacdcc4b670228ab5320df9b7d -:00c9f0ba7f5d44722e454c3552ab0dd2d1ca2a -:00ca003e313b7bd408da5717b2f390a666a7ed -:00ca10d294c198cac73b5069b353f733befb4e -:00ca2057b9768b4e69bc1fbf53b89e11f5cfeb -:00ca30d6abf50686e7bd09c0ce3e0e67384793 -:00ca40266d400c205238904f2fec8541896666 -:00ca50bee0ca6394e1b88b24a23d37cb292739 -:00ca60ef416fdc9ca8844e5a957fbc06c0e21e -:00ca709f2f755565900186a52b7015d082b85f -:00ca808eaa43ee5f109447e0402a6e43d5fd8c -:00ca90a0b05bced5804a17e9885e2bf0ec15f6 -:00caa03f5649dd79e662fee955b9a06ec2a2a8 -:00cab03abaef5bfe3d205629e96c8be030baf8 -:00cac070920e558b332ca5c36fe809a7a87951 -:00cad0630e0d27a24df28640c840bce3555ce2 -:00cae05de68255e4348adbdd9644e6e27c6311 -:00caf0776a2a664a77ac975005b7d6521f66e1 -:00cb00a05dae6e189132e411d4872c0dce8715 -:00cb10b034b48a97aad4550c15cc386a190094 -:00cb20b18b193673063dd48804107146f29e05 -:00cb3045a6d52091d6846c11325eb251527fc4 -:00cb405d1f6f9542973bc777e44fb419d49480 -:00cb507b5cc9f1df8aa63146cb66dddbca6f80 -:00cb60f3fd64e6f2f4e664353868c61bc14738 -:00cb70a484d3f22d257c8c6ccfb42900c2783a -:00cb80621b0eac0041dbd9647eb295e9f5020d -:00cb90969ba1181cc239ffaf734d9a3f0cb129 -:00cba0df8ba0e9c3bb5052f6ad696305ebf49f -:00cbb03a4882e85bbb32379d8ca1e3629021c9 -:00cbc0fad8aa10b359d58c3864dc3dc2e28dcb -:00cbd0124f9e487a4e79db22edee0ecbb6a0db -:00cbe024b53902be06db9cb70d8a0c1ac42f9e -:00cbf09c929ce63a99864896cab32b988829f6 -:00cc00a0e14118ec02beb46bbb3fcc4932681c -:00cc100b96ccea18252af2edd5f41ce53a64f8 -:00cc202bb4955c3a6179f11bf1fe902e42349d -:00cc30928d592d02001e69890527d43a2739ca -:00cc405d740829550539119696c8a624d66a7d -:00cc50f472b07fae1455325a131efc13b4f46e -:00cc60e3185cc933a50fad110ec5045bc5009e -:00cc70d7180621a8a6c9c0388b3564b57c0612 -:00cc80c08118375ed88848a082b574807ae626 -:00cc90491fa2f0147f174eee73723a8b99646f -:00cca06c4726d4e962e86ea40215bcce77c8da -:00ccb010a94d17d4eac7f04e7a332d4726a087 -:00ccc06a1fb70dde2ed03ee0bbc35785a6a7a9 -:00ccd027dcf8bb782ad7d8495da01351743583 -:00cce0ee18c0b51fc7c54eeb3759b61cea4951 -:00ccf0c966bc3f2877e8f868218021e0426d14 -:00cd0057f177d0cf5448e79713a62d8f44fbf0 -:00cd1089aadfc1af714fc7c50472c024cd4c4f -:00cd205fe5f35345d3c07c8cadc10b67be00fa -:00cd309f62b38232dae977d908570860143f23 -:00cd4035f3a17885c02502185af32767627d4b -:00cd50d5c5738da10fb97b38582d23050665a6 -:00cd605f83fe8af27ab607c37853ef25e1719a -:00cd70346e44eddee0b2bb52156682f41bcb57 -:00cd80a61bc2dc6f7f98874bbacf9fadf8c463 -:00cd909fa66b01f3c8229bd399ca71fed9cc5a -:00cda0bc3c26b423659ac29af42120bd68844c -:00cdb0f42a543150944f05a91debd74a1a97fb -:00cdc0e290c3a546e7f783930557de26ab9f09 -:00cdd043d7a22da1f9fc187ca5452ee3a5150c -:00cde056e096db4e6715386210ae7bff0bfe25 -:00cdf0082b1e06b185bdb3ac0ed7fed07a8ea4 -:00ce00c4c65e1c5e8157e4b49dc8aa38c11117 -:00ce10b46e5463e9c1110006a43adcaf777c78 -:00ce20ca0c1c23e6dcaad3ecb81b5318d0b32e -:00ce30d676a7ca0806cd3c99cc78e1732e80bc -:00ce40ddc7b56576ccb49af768b3dc6c53e63c -:00ce50637cb16bacc0b7258b31752a86df4f34 -:00ce6011cf81e38d289e6daf2b6d7f3fe7e9df -:00ce70ba9fd923e424a4ac63848ce6e49b5be3 -:00ce808a726c81fd96918862cea8335bf12b8a -:00ce90988f42723612768b426225cc6769995e -:00cea0aa1fc08043253b39f3f2efb183a75549 -:00ceb0085bf6815beb19a0690047c035242ed8 -:00cec03978f6ac06db47b7a58c6537ad47a2c4 -:00ced03d1c023aab3fc0b99a28c25cd1d7bcbf -:00cee046774b537dc09b6dde31fcd0bc79cac4 -:00cef06d04b6cdef3546030e4519cefc48b626 -:00cf00b9aff2f9023ec68fce666f9768ca9b2c -:00cf10aecebe5dbc5e7ad11667ffeea521323e -:00cf2008dec1d05514a1f414d8ebd48f9dcd02 -:00cf30feb7cc4b3d0b02f104adc234d8267bff -:00cf402e723662f8b1bbdc5af4417a0697dc79 -:00cf5043c41dfda47733183c4abe6efb2ca3a6 -:00cf60a49fd5b13f6da517d7f80e15a362f9f8 -:00cf7035a4714c45fb1ad693c97e15d2873147 -:00cf80880553e0379cf5153a18b599a0fa3435 -:00cf90945bf789f9db40407cde61c2f0a6856c -:00cfa038c144f294f2edd7018a7ecd51685100 -:00cfb0ee98304378cf13dbc94ba70ae594f083 -:00cfc048cf9c6f6d029f2bc16d99d2560b1bb6 -:00cfd06844780def10034fbac311a3f2c7b592 -:00cfe0e611195a0e8d81520b0a06521b73d768 -:00cff043183c57722842f1c765db541217e022 -:00d0004ea8ad64f25112306f8f68ae644f73ef -:00d01048e77b2baee45c2d58f62d701175c464 -:00d0207d8ebaaaaab915b80ce59e5610144619 -:00d030cb84f6fa65df988e4b7c8cbf2b5b9866 -:00d0408b78751978d2a557e5209e8816c2ccb8 -:00d05093b0bdd0ac19e2454083bf879a67a04b -:00d060c84365fc68a32d75c736f7b3e4f04a02 -:00d0703ea451c7d687336a3631af2ab15649e3 -:00d080605013d52143c83a23196a0738759c52 -:00d090f2fa1b7c38fba0ef2253dcd77ad7c57c -:00d0a0c8eb143120aba38977f736fb438ed60d -:00d0b0ed5fde52250dfe5c8e80447da5dbd9e6 -:00d0c05462b22cee71d9a1c77260eade3922d1 -:00d0d0b7bbed31942509de5accb481a7ede7b1 -:00d0e0a419beb297f199817fae16ef63def824 -:00d0f024b30092c3c72dc43ec5903615a00b42 -:00d100ec50c679b44d42519c85dc866b845cc2 -:00d1100e47e8cceeacfe069986f81be69eaead -:00d120ff5f050d27d3ce54ef0f8d7eb955a3cc -:00d130de06d13c59ed81c563a9174702cd19d4 -:00d140885a0ef16aa97cd6472998dfeb0a86a0 -:00d1501554694e7648a49cd087fa8615d59bd4 -:00d16071b8a05918bfb04f39eedd21d722a697 -:00d17063571c46aa1a39b42c6d7fc63b833b1e -:00d1800c2dbae19abed90f1d525595ff197b61 -:00d1900d3b8655d065c04816c9cfb1594119ed -:00d1a08b5e3198dce3d300cbfbb0d4ccb5bf46 -:00d1b0ea8c9d9dba33aecf8f35fb009987de8f -:00d1c01636bf10fbf77a196e7b17879257b89b -:00d1d072f92c178b6efed11e2d8eb618f60f10 -:00d1e0f395bf18265dccf6bef6b583bfb31bfb -:00d1f0bef4856057b229239a4978b9ff9efa5e -:00d200d75e733a7ad73ce6ab3b7e47eb14e61f -:00d210abb56f9c78ef9a84f7290fbf3b41298f -:00d2201e6e400a50c6680102094ada4bf2fefc -:00d230ef6a0db03758e931ba5fac494e111d91 -:00d24051ee69efef6bdebc4d2702501e531a00 -:00d250c3ec3fd67eedc3cc9f0c3d8788d0897d -:00d2600c493bd949fa047271159f48818274be -:00d270eab767aaab23e1a2f853e6d89bcbc1de -:00d28076cb1127642745373460126e06312156 -:00d290cd5386c124de76de0788f3d4d9664750 -:00d2a011c254b4b2caf8f6c3ab4ce66a1b5a59 -:00d2b05fba3d8f681288e070200e767925d412 -:00d2c0dd8c6f360a348d05f17eee5f892c70d2 -:00d2d0dd967f7d542956d900221aebdea56a1d -:00d2e0c50488960f1250f1a890bf398ffb6bb3 -:00d2f068c397b9fac7d15127bdb928ff830136 -:00d3001a762be3448c7893f66a158209b40b05 -:00d310868be1151b052db8d74967c480902310 -:00d320829d96fbfa019a8c950c7090b40cfea0 -:00d33025ab0392e51855573a44443bb51f4872 -:00d34025bb4ed40220d141faedaa0fd8ba3203 -:00d350ac9f54f2627c30b204644abdcea3130b -:00d36032674855307a0acb4b65cbe621d6909e -:00d370289b581f4a475cbbb19f6efad0884f39 -:00d380e2d35a46a927f9e39bdae77c2cef6551 -:00d3905de27a5e997a5d851ff1242bf2a9f896 -:00d3a007d3c51db15823011b6c8cafcbed5a06 -:00d3b04cd73b8d0ca6faa562ebbf5c5d9838f1 -:00d3c0d17ac3ab94e8d68413f009b97dad4b11 -:00d3d0355df1e38af45324a96edf446774f416 -:00d3e033f7822a6d6df973323094ea4657fdf8 -:00d3f0632b5a27785e69fdf50b1ea43917da16 -:00d4001854aab6e9b0be5962ae20808dcb145a -:00d41031fda4bc4b40bb938d49ba21900a887e -:00d420f44f20e63ff56eba93f23de3f9b2b34e -:00d430a7517c2a8b8687cfa94eb955075d99c8 -:00d440c71168182ed569000e59a973c34a5a84 -:00d4506ddbede11d0bf327c95ce7100d01687b -:00d4604d6463389b4a6d87d449cbe7df1513cf -:00d470560d2646d0ec48ca12750fc6bf7f5f71 -:00d4809aac34e446ad035e2578d169c6b99c63 -:00d490f9a7d5b11731922b01b9791bf9840f39 -:00d4a057331f73868d33699dc238b7573568bc -:00d4b0afb4d1560443db2a78b169e2e2a78187 -:00d4c082812964c301f4f2d3ab32b24ca8ce4a -:00d4d0d26b3a1958abbaabf2484bd609a0bdb8 -:00d4e04fe3730a86e6f45211e0f0f1673d81d4 -:00d4f0eda696303428448ecfcee0fc40f140e3 -:00d5002bcc260028cb84920cb65bd036ce0cdf -:00d510677342232ba1fa056e96d75e3d51fb53 -:00d52024ea0dca2f2846d606c2fbe2fd50c546 -:00d530dfc65a97230223703ab5b96e591492f8 -:00d54055ff48c65476197f2dbcd34914d34f2b -:00d5501563f4e90356b25c9f65a33a35f1343f -:00d5606a41991c4b821e5274bee73f145416ab -:00d570db5907e59df2f891ac949e951f8ce475 -:00d5807f661ff00e75de0f4bf55420b62b42d9 -:00d59098afc96fd6bce67851200daa0cb830e6 -:00d5a0d9a3d55f2b79f7bced79c06c44231149 -:00d5b0405c02ee94055bb01280e12123a14650 -:00d5c055ebe50ace1036b4afbed0807e82f40e -:00d5d0f0bd12f2ec5b6a5867549d3ef841a273 -:00d5e0f5e0ae78945bbc6a8a2ed79142155d62 -:00d5f052f6e333c28ba9d65f2708ba925f9a8e -:00d600f6484a3d9f02b15f1849bcfd84ff8ad7 -:00d610ffe8459410c3429c114acbba6dea28c1 -:00d620a2ba88b2cea4986b3ba20077836566d9 -:00d6307c121f55c7dcc8e9dc3da04d74f16622 -:00d640a0c2087265a346e20bb53539ba73e7e1 -:00d650023c122e597d7397bdf01e35b5153908 -:00d6602561c9a9d6369e9ce578750b2be13c54 -:00d6708558ea8ff257936091ab82f92b66f65f -:00d680c824f3c3c0c04c20f6e6b4ba69412bc9 -:00d690c5fdac87ac4ccd7df848d520cf9a5554 -:00d6a08d7d991bef4c8d1813c8f04a637a76de -:00d6b0ee2c9162c15383b5d0829639a3f6be40 -:00d6c0d49aa7cedacb852c3eb39a227d372bb6 -:00d6d05e1efa72d850cdf81d1c1aa321e3a80a -:00d6e058b8f05755786496dfb335ab95f21637 -:00d6f0d07ace5e8470292a5e3a53dfdec04a01 -:00d700a5b9a4f0f05e07783a4b0b92dd86360d -:00d710668378951904a7cb70bafc5862ef9dc7 -:00d7201dea2babf931c44c1f88b64a7f92250b -:00d730162841aa4576b3bfb8fbe3aa33d56e9a -:00d74096614f59126d7d408f4dce6ea501b046 -:00d750597adc020663d9d227d2313344699152 -:00d760b6d46f839b4699a7cfec130f8078ace7 -:00d770571e9618b0dfd55b2d9373941c703eb4 -:00d780779252c1d616b6102c15e5074c468247 -:00d7903c6471171de65a9f5b2ac546419e58a6 -:00d7a041117bdd890da6c1300b137f7f46857c -:00d7b012e241ffe472082912af8b77e21c0caa -:00d7c04a999fcc989f3349c3ea2ee8b0d785b5 -:00d7d04dfbf0fcd29909c51a6e465eda6b9324 -:00d7e0fc324f02bb60b6077d79c6ca6f6c7960 -:00d7f0b9289bede33c92fa2b765029a84b6528 -:00d800f81e21b4b90148ad4518f43effb73252 -:00d810bcc7cfd921e8257f7b0208d21f245570 -:00d8209963f69f5874e3a141867418e7b65e9c -:00d83021d92d526d8e5fc1cfe77ac74a3d7605 -:00d840ad68a3df8f0259f8600ea1c2b910fcbd -:00d8503f674f2e0897d688c0032192fe6eb7e5 -:00d860a6d21736ddc443d54f2dcc66e0dffb2d -:00d870dcf25c1c6431c58a7f7694eacabb99e5 -:00d880e77a6d0f7ff36e15cf2fd1638f488837 -:00d890018c11c00edd2387ff1ec071605b456a -:00d8a00743eda7dc7c4b77b102412a3b814f75 -:00d8b03f10553f51535d5a0ed112d23974d872 -:00d8c06fff99994afaf997436a30cb5eba8961 -:00d8d0ae36ef342bab3c0ee3eea2fe6847db69 -:00d8e0b9bee6956d822fba4058dca68be80494 -:00d8f060d653469e6a0cc8b3c55cec9bc7a996 -:00d9001f3d2eef473d1fafa5dc5097813cfe08 -:00d9101352ce8cc5ed80f4609519b5747bfc05 -:00d92047ba9798d2376e863a401a52b09b8f7f -:00d93007491211861e25558328ca9a9eeb3bd1 -:00d9406796f770095bc3520a32bbba835e4c32 -:00d9505c9729e911690836f43dd474ac5a885f -:00d960ee9fee6cd4ca49cc9e488a9882375b18 -:00d970f6d0be77aba24078498837296f2d6994 -:00d9801bf86dd03c58e3d791f13110336058b7 -:00d9907a87379e013ef740f63da25f5c42391b -:00d9a046fb9eb714c79f2281387a1e72217360 -:00d9b0cf50980cd5fe8c3944f310c680d5f8a8 -:00d9c094be9fb75d94a0cf176ec19b86cbd149 -:00d9d0c5ff83e6a1331bb79fc6a4c85ef69c66 -:00d9e0d0ee6c81f01032293f3b838d372b83bd -:00d9f0cad75b405c0b44861eab2a850d406401 -:00da00e8b91a19daffe62b11ae08c5ddde85aa -:00da10918c384ac2a0bb2dc83557d4fa3bd2a9 -:00da20ac467ee5ace4ac5ca68556d12ffd63b5 -:00da30b002445c2e112a83a538dbcc7c1fe323 -:00da40b2c3cf98fbdcbf22c126b787f62f5554 -:00da501a01855f2e5daf07342a9b2a10a02d6f -:00da6075b930e171e8af477726a48bdaae57d7 -:00da7006ea10f8405f4b51b59b668bedfed839 -:00da8024b86f4ca81917161323acd009dfa30b -:00da90f414c3cc346fbb8365bd2899da35632f -:00daa07ea19f854efafb914371861d5ac527b0 -:00dab0c3f72e6bc6b755be5019caf832c0edae -:00dac0e0173346f47dd5ee8344ebe68329f53e -:00dad09702c0879d48de4d8b284de863f49b29 -:00dae020d9a434056527ec2ff4c46d9c6890c5 -:00daf0e69c9ea7e11424fc7e6c9bc80227377a -:00db00e1b1288e4da560113e54127afcea6e87 -:00db10ee17e9bc61292197957ef4e0ad0dab4b -:00db200a451b771d0b1294fefaa41f89d477f9 -:00db304e70f8e64c3beaf3be1f425d9fe24664 -:00db406fce45b9e968105e94479590aaaf50ec -:00db50663676d000f98fb1fadb588b1605e557 -:00db60dc0d2aaef7e38ab582894183a69cbcf8 -:00db70db32f7fc275bfec0f675bbf8cdfab6fe -:00db805506855f2ae1528fcbbbbc21c53c9a10 -:00db90cee3452f29a8bca2a083a7f6e2b58693 -:00dba0ac42fd6be76204dad05c376fcc8b41f5 -:00dbb01149cb17eaa5ccd3e3c1535b93609e8a -:00dbc099bb1a87fd9a1caa3c05685eaa256bcf -:00dbd08f9ac83586f108e5964827f1a35c2613 -:00dbe0b534bfe364ab8a8b28d4f68ca188e782 -:00dbf00a406ba0b311d919ad3199ec6b0241b0 -:00dc00a2658be02ee0d3a9eee2c688c7a674bc -:00dc10002a21089c6d641a2f858df75dc87ad9 -:00dc206bff30438cea43dbd8b2f2b019138809 -:00dc3091df4e8b847b8bb3187e382ebe8232aa -:00dc40c61a7d7cb6963ee52c2f14aa9aeea131 -:00dc50a6bfda9477040ce322170f42a07ebd12 -:00dc60ab895a22c08f2c0cc261454fcf0ec3b1 -:00dc70dd00f0ceffd9de8f4f4077e966e26510 -:00dc803a7d59d9635b649c94cf2c1325351b39 -:00dc9042de38d11e7ca75ccb1b6af858379186 -:00dca08981578d75a93fa9aeabb3760a71be5c -:00dcb0d279071c1c89997406a86f3ce49f1fa3 -:00dcc03eb9890ec40e80b2246d70b186c449f7 -:00dcd0420726f63e039f97803511e8d49f5269 -:00dce0a5f282894472f420bd318cdd66bcc074 -:00dcf08ebe8ba3540c19d9a62d80450943d867 -:00dd006eec126c9246776ced4b929c6cf8043e -:00dd1098e7bd415a35221e524ac75f031c0aa4 -:00dd20b52e814a735aff7c081b086d6057ebda -:00dd30d74e636b1ffb37fa464e5b192ffcbb6b -:00dd409cc68b7403cc33d1b14f298d60037221 -:00dd50d11e6d7d277e5f5bf7002ca7202661af -:00dd60fc45e9f566c94ff86db26ea831947739 -:00dd70f1974dd575dc86a465e098e7d1af3449 -:00dd800b33ac6538b79ec88c232fdafd283094 -:00dd90fda9fd9b92752830f4fafceee442307b -:00dda0abac3eccd084b6d7a44d3e0bc76e7bb7 -:00ddb04289a819c416bedbfb913df2600f2d7d -:00ddc070238744a68b1e2d2c75167e933e904b -:00ddd0ffffd4c4a0b7710fb0802d28f5fc2e01 -:00dde0b770d06827b1ceea87c901f53d24b5ce -:00ddf0e93688e8f433bc69f7c258127de0e273 -:00de00ba48865bc6327cd1f9f7f5ef7284bdbc -:00de10237e44cf3c9056185166e62a8af26c4a -:00de20b49bc71cdaa170406f78316935753d9f -:00de3033b6e9a467066d310ea802c9a8b1db7d -:00de40be51c8ce10d1e239a0150337c698ca63 -:00de505e006272475ad5037cca1966243595ea -:00de60ac1d247c0af721402bb58877e099e720 -:00de7041bea9ab1a2622bfc036dccc515609b5 -:00de80f4e7c4c093aff7709c205fe27194dddc -:00de908ab7c72dc0f9191d4599fa3d25f940a5 -:00dea03c16c01d1b0744af12402c2646bb1a73 -:00deb03046637cb65c24a33eea2d1dd83c8768 -:00dec0741b7869fd457b2bf3470a2d0575e74d -:00ded0547dbbf6c0c5f8e1b83759073eee7f04 -:00dee07b96a296a5c436d5a06410c24b2a6b1b -:00def06600a34f8be5255a564ad98dec08270d -:00df00902e906cfc33d2b9889f2e9572024aff -:00df10a2dfced18e4734d93734f87807920e1a -:00df2088e96f25ce3fe87e849eac46708c672d -:00df30922e4dfabd52df399269fed7f3d08775 -:00df40e689c639e10eaa2bdcdabd330dbf4e27 -:00df500264f198a9931dc185780db8bcbb877e -:00df604f9205e1153b5cb4bbda819f0a48967a -:00df7038c0200107413070d735c887dc5ae0c0 -:00df80097687e7832e0c56d80072756fe0efd1 -:00df90aa31fd328a21535b07467713ffb63972 -:00dfa0dd079e27b6f94b533e626134969635dc -:00dfb0a7886f58365b1afaa56894e5104fb7cb -:00dfc028318d6f7e064e9194f1de2ec1908cae -:00dfd0545d5abc29226292109c2f34941a5626 -:00dfe06b48f9277ff3e0ef6ba06252d81d1987 -:00dff06fdd854be8be0a584565270614ad2eec -:00e000de2cb425bb4e068432699fdd97604127 -:00e010ec1e86a597f2657aa289c0d069629e29 -:00e020a3ba93b129797d0d05e3554daeae193b -:00e030fd4bd17b998b5aee4c018f0d58c63a25 -:00e040bea3ad385819af4797e81a63044cfc2a -:00e050c49b7fa689764ac3af4c6ad5d221e262 -:00e060b323fd0139674c1ccb340d2d78d919c4 -:00e070bf2ed2569d33358f5d5f07ec96830999 -:00e080aa4b850da0c97adf3dad09b13955706e -:00e0905d75b30d0c9248b82d7269776d5ce247 -:00e0a0cb5a5b9bdfbf39b33fb2fc328e0571e8 -:00e0b07059da69357b99fe910b19bd1167c311 -:00e0c03e8005e1ccbaf0db01cfba870f9f5ba0 -:00e0d0a61f2f661c629ebd3fade5c4ae7aaca4 -:00e0e0d27960f04a8197655934772e6265e23d -:00e0f021fe4d14d989f81b1184c2ca4b67bc7d -:00e10075c0de37a88a0ed75138f85313cfd602 -:00e110c4a285488132d041de9fbb0647d368d0 -:00e120d9252604dab6fba5c59daa8f40c0bb92 -:00e13049b184716e622ca3274875e60f996d5d -:00e1405b0e159db8ca9aec21554408b6f619e3 -:00e1500744430ccf35320577ad3ccf2bdf355c -:00e160917b4d0e3ffef86f59b4ddedefa48e5c -:00e170f5e68f958a3fef714487dee4d5e9cdcd -:00e180bc3171edf05440b7d414a853f925e7fa -:00e190cf124639599c06cf481dc04524b1bf25 -:00e1a0b75c6d0c7d526790e656a920584557e3 -:00e1b0ee02fb1ff853ddd3bebca0619d663264 -:00e1c0e625b6a10f67f82c1da69c77523eae6e -:00e1d0beb1d30655b5b66893c9e478e6b8cbfc -:00e1e0aaa36e99b124c8b351d663dc5de4cb15 -:00e1f0e986a6b6fd7f7ca3207ae6d467685b4a -:00e20021e44a8e13f1cdb285a5cf48b7f19a93 -:00e2101233ce033631b9032555e3767368a5f8 -:00e22019fed623cd0ef362d3745e26572d200c -:00e230554d17547fca0b992ed77f7c9f8792c7 -:00e240970db8a43a43bca74b708235cc0d31cf -:00e250ed98b0d6acf8578bf1d1d83d4afc46a6 -:00e260257f59dfc2dfe2da95af904ed4be8e62 -:00e2706e963cabce9dcb139b3c134ebb6dd924 -:00e280d784ec23701292391fd9a07c37c75c18 -:00e290863969b9370c3fcf06cd1ab4cae9e919 -:00e2a0cd0597e396c4b58677a96d5553883e2f -:00e2b0eae423330a066905be4f5391cec9a49b -:00e2c03c9fc2b6388862cce22c2471ecbdeacb -:00e2d08625eaca3cc0e0eba05a1898d8a0d698 -:00e2e04bc407b9af12e4b6531ef0db24b40a28 -:00e2f0b0e383520494b4eb6c7fb1468b2ead19 -:00e300b0e2937839a2cb421eb1bc0757a77466 -:00e3100da47d07c8120fca3a912a29db7fea3f -:00e3201f297792debeb916688a79ce271d03bf -:00e330fd86e6a6ed35c38a69b082bb99b6786e -:00e340fa22feb2071f6288979e4348b647c078 -:00e35047c160e4347432d15b11253036dd0922 -:00e3603b6947b2e59d1d04f253312254c08c40 -:00e370f947086dddcbb242d1884bce9cee460c -:00e3802a9ab53af07e93d3507820b993b48529 -:00e39062ad97a86d5e5847e5769be983ad7770 -:00e3a08242121471a37f4c38c3d8008e079178 -:00e3b00b087dc14aac56b3491ca86a15d6ecd0 -:00e3c048f8bb326f6d7e1ce893a9fe42b8cdda -:00e3d005fb26f011b29d87916c5a860956d1e7 -:00e3e0ea355e29dad04944d5d318390d6e97cf -:00e3f0e51a18053c4f24feccccd0a2c5a5f294 -:00e4002bc4cba4a2f1b98375a91cdabcd1257a -:00e410313198ae209f99d409755c6a778ac533 -:00e420372d801f22bfd3f68df15bde060b3e28 -:00e4309ae594b34ba99deeb38db35e79a10fa5 -:00e44029db665219e336e9eca2b2bb70aad331 -:00e4500e9bc423fe814ebd2eb8a80bc7534edb -:00e4601ea8e0b2c48909e32f992c28a0a9e467 -:00e4704aa7ae6b72419d31e1bb2138af2cd062 -:00e48051e578182e32490e4a63e3885c97817c -:00e4905701afc12afee3c9593d512488792aec -:00e4a09ff066c1830473c0e6695332e9b70335 -:00e4b0e90dd13f99618f5bfd21b26a7d2dc763 -:00e4c0c472720ba6bfcda5814d7c079ec80e19 -:00e4d0ffe7675e9a4bb9aa011c45e2ec4b589a -:00e4e0c4f939ebe631b8609370aa404989e8b9 -:00e4f042175ecd95f2f183fedac528c7f77c63 -:00e50089c507ddd6d787f6716ba22c69fdf4c6 -:00e510abceb3e388e8d7f7f0bc6b44fd101055 -:00e520b07a41a4f204cad25931701ee0df5dd0 -:00e530dd0b940f60c3b8d12e4ced156570b8f4 -:00e540f95534f99447cd7ab3006e1056fd74a0 -:00e550fc4f4e7d08b9928ba728c2bd20850c2c -:00e56059634788ba8ea7c549e04a4742c242b9 -:00e570d974bf2e1215d703dee0331bdc66f591 -:00e5809b440342bd6a46b019a7212d9537fc5f -:00e5907f3ca1cc8633231898c0849bee668413 -:00e5a0f4b250b6eb05356a1f337681a7182c4d -:00e5b0c783e1284d6a8a1e49267b6debc752c5 -:00e5c0aa41ce9f01491c8f30234fdc802bd2f9 -:00e5d0e2515efccec5864c9cfb8202b79ce45e -:00e5e0f5dbcc7cb4eab98cfd04c1afe7fa126e -:00e5f07b3b5ca4b1b32d6b410929bb9c56ae19 -:00e600fc0e9aca47651e86d723cd21f789d680 -:00e6102e475710fd81cfc67d3fe5c3552c9aae -:00e62064e9a2a1a57187b86063034c30cfe6c7 -:00e630546dac50457d36f0a5fa7cde49ea07d4 -:00e6406d7f532fef135db809285dd21a61e26b -:00e650d07fd9e9523faa938bc32ca6ed6e3061 -:00e660d50573b7bda4d64d16892d3c00a6b0ca -:00e670111ce7c266bb2efc6031fd1a09b5054b -:00e680dbe4d575fa7b6982e8212d6887d01c83 -:00e6908664a585c4bb6dfcbce3c8cf58fe2f49 -:00e6a011369b28ba8c1192a0d476bbfcad6386 -:00e6b0c7b2888be0f93e23d6c74be3c8145b79 -:00e6c09cf9ee1a9b82ec5a8cefe32457500437 -:00e6d059683172e990c5f0d4c3977850001c36 -:00e6e07011cc08e77f9ccc01b928cfd828e06b -:00e6f064dfa021f153b032548f09f83eb03814 -:00e700376e5c2fc805a1545115659cb2049112 -:00e710821cd4bb961e4bfb7a4f0dafc7e04f7b -:00e720fda60b885b0e878df369905c5df217d7 -:00e7300b3901ce20ea40b3290af5ee3edfa27e -:00e7401ba6f82d5d81b0218f29777419056493 -:00e750fae03d5b8addc7d2e5843db62e2be001 -:00e7607bbd47804580114381462b82ae0c44f9 -:00e77054d1c1ce18b2b6207bab143afbe20809 -:00e780e0f75e3af1a36fda8bb32fc8184afdca -:00e7907b08f60ff7f16341f252067b44620094 -:00e7a0c2799e7afa651ddd79b8855c1f18c98e -:00e7b0847f005085d54bb706815b47e2f4f0aa -:00e7c0bf274a631e529f2aa25e2e9a3a6b4b41 -:00e7d06278436e6e7d1ca8491caf0dca6f1208 -:00e7e01ed4b2a4328ba23f45174067800999f6 -:00e7f0b4026bbdb01015f46e5575b4630fb6ab -:00e80017e7d7a9182b78b3ffc1f9541c67c7cd -:00e810f47bcd587a01531ac71d25111a988ec0 -:00e820d1ce235892b59dcf6e3193323261c13c -:00e8306e05c448d9655c8689ab9a1504a7f540 -:00e840faacb650879a45c12283cfca6bddd60e -:00e85034798ce32562fa0533fabbf233254113 -:00e860a4357ade48c890f2b18eda4f4a0f0a2d -:00e8705a71c6562d699ad7ba347ed9e8f4ebef -:00e880c266ca9bee2288d548486ae9d3738d44 -:00e8902bd60b4eccec50ddfa589e693fe547e8 -:00e8a06b1dcfad7f8dc0e266d3d847ff25f294 -:00e8b0505d6574947cefd968e8ca2d04f928d3 -:00e8c0760b152278392aff73feaebbf357d2bc -:00e8d070a0dc3a0eca8dd33a0d755ae43e1af0 -:00e8e0629c3f8fdab2b7b664d48690ce0f4e61 -:00e8f07e5910902eff3effea123ba8b458f896 -:00e900b5f8ead6aca3d523f08f670823deff2e -:00e9104b35c0ccbbeb11c5c68e6cf961ec586f -:00e920815c344291e2f83a9929c3b1b5161a61 -:00e9304d4c6a1bfb94c6832476a022b85dd3d7 -:00e940fe90b9f293338b573bda6d71a1a0b480 -:00e9502a7a31d2a0673f186a9a42cc72bdd17a -:00e960649db41334c4a0be5c06fda6cc82b29e -:00e970769c8a8608f3c530f0045f20c8f7fc2a -:00e9805f841467ce620f55d151ea7e3b0ce196 -:00e9906b6ded435a0d96c74bf4e9a7a25de576 -:00e9a06c1904565e8b0406f6d0c59200edd3fd -:00e9b07c60cf86b1079bad50a526e563d6c632 -:00e9c02e137178c7897635aa126c03f92c1f75 -:00e9d0d3653ab89d6e110bf8ccb2a5d613a132 -:00e9e0d1d3e385ed3a95bf6d70f8d75d7926f2 -:00e9f016ec931c870e62543e4b182ff16dd05c -:00ea00b160f1a5237b5cb2f064dff4da4a6d42 -:00ea109bfa45f548a48bf336b232b6cfba921f -:00ea20a4ae065d5ce6e0a0f12451542e5f89d9 -:00ea30ae32511d480c64222f66d53cc35e235f -:00ea400676e5307ca8eb2c183d453bf80940cd -:00ea50d105b349b79f6c6c7088b13b8d806543 -:00ea600efdc424565ba633055173ba5ca6f72b -:00ea704059fb2905b1044f401ed4d3c05b679d -:00ea809ddbd104d8389f6328128a9e84423693 -:00ea90c9041dabcdf8bb5e12d6c3a8bb2e5d0d -:00eaa097990279047102521fbba597d30d2219 -:00eab095a3fc4e064b4d57eb3f9fe22a63504f -:00eac0d9b4880a649d3ba00f0eb78f9a0a944d -:00ead00107018b942bc20db05805769f1f833c -:00eae0255bd7f7c5c574e2e4d8c56fe8e0f7f5 -:00eaf0c60a37c05bff5b7e55c4b237f914c119 -:00eb00ca55f42ffa73393838731e4cb3550e7f -:00eb10e801b0abb9fcb5e5a0175ad01ad68d9b -:00eb20bb021511b470e800f389a58276fedb1b -:00eb3001ab370d19ba92bdb9504f87102c9002 -:00eb40e8dae2c04b7d60c2aa3748722cf01cc8 -:00eb505980d99462f40a75a3094ab2c2187fe8 -:00eb60545822e35a02437975980ec09b059359 -:00eb7040aa20af5be93673c69f7168bc5e1cd5 -:00eb80c9f756f7c0782e115dfe24ba440f4657 -:00eb90283a82d46386c32bbbf684e987434284 -:00eba0df4bb768bef7372a8ffc1614e05bc107 -:00ebb0065a06cffb14a2e50b5d9cedcad7f4f6 -:00ebc0ea9980209d34b724ba07349b30bb1b3d -:00ebd03477939f0b8996dc18f204a359486b28 -:00ebe08980eaa0f79d11505cc698d44724ab6c -:00ebf0de481efa1f0889952f14f638729872ec -:00ec0014d9cbf56738b5c1c1640714471b30a9 -:00ec105ccd494bd69365ad0bf67e1095eaf161 -:00ec209bb422a0ec6a71b98f31b1cdc7cbdfd0 -:00ec304395ff1c89e87d84ac37605bf65d6d10 -:00ec4053cf14777abc8e74259132e77e5e5ea0 -:00ec508eb9b30a8feec771421b2cb18a204283 -:00ec60a3e1fff9b1277da46e796b36e1447162 -:00ec7029b3e67badcd02b54ee30f1bc2dadec3 -:00ec806abc160240be14995b8e0213b477206d -:00ec90ea7890d52fb133cfe22b0c63e6f3a3ff -:00eca0ce6b5ae23e2b11a1bb9872d31447a7e9 -:00ecb0aa293de5d7240ab8ea16048f12d340fa -:00ecc0a2e651e639dcd07e5fdf1e172092f52d -:00ecd0d3027f41d961b1179898886d0377c6c8 -:00ece0df08ffd774031394b031db3161913217 -:00ecf03555388bf2862faba9ebcd8bc8e942de -:00ed00ef6e9778dabc499fe5eb856cb2531d64 -:00ed100d935980d933a39c97c05f9af541800f -:00ed2021ba8aa958417218b4f333edd4fe3aa2 -:00ed30c84bdea07ba902986441f77223ba667d -:00ed4007dc7081846677a6279598fc1a97a2da -:00ed50f1d58e29611a7e1255549260469b6ff7 -:00ed603971af16142219b72a0fb0d1a49812e5 -:00ed70147e76742a368c91567d2ad545ceb18a -:00ed8085238b02105a7bbe573a555587064b99 -:00ed90aa8c63ecab80077c6b513c8b754393eb -:00eda0198308e7422c4f9f24dee2aaa18fda77 -:00edb0521a05e20172188d022965040fd95052 -:00edc06b2a4120105d2ca56712f8174e3c15d8 -:00edd007aa95850302708429e59c6d8cec18d7 -:00ede082a099e25541ed836e612816378df50a -:00edf0b2c6c014ac593bda7ccf8242c1673c77 -:00ee00d997747a1573df0e2e254f7638aa7da6 -:00ee1075cc63088194546790cc0fef5701af01 -:00ee20033adca25defa6cf2c46c5ef387f1036 -:00ee30190f1646d14aa3a4ef282246ad8a0c40 -:00ee40bfada944a778ae267692d88da543861a -:00ee503fdde50d122d2329426dacbe62068ea5 -:00ee6013c19237cecc8267cfc3ba8887656ae0 -:00ee705453d3cae6513c3c10d43b9a42814d9a -:00ee8054ea9963c686a519782a5534c7ba3704 -:00ee90f205439f73b1d22a85fc4cbb4743c8b1 -:00eea0e87d91a0789ea657f5d30b926d5f6429 -:00eeb0479775e6608c3302e94ef05ce337fb64 -:00eec06417a425d02f3969f73517972243e3fd -:00eed0d991d1bc3dc9dea9ff32274657114090 -:00eee0bf259541ae265cd8f962a88f463fd6cb -:00eef07128542470cd1f7beb566ebab8646644 -:00ef000e4ab79f698a04754eea1d4f4a8bf18f -:00ef1056db13327e6f535ed280ae094d21f91a -:00ef20b41490f38c29924ce81772f32bfe5e74 -:00ef30f09ee384e42520e85c269a7a96df6503 -:00ef40508cbd193edc0b193f55bf3972858bba -:00ef50263e4e1e86262466506b46818a16ac9c -:00ef60c9296783806ba102b77c0d2bdc3e48bf -:00ef709b4a8dce0ed1063069fbb92f1eca5463 -:00ef803ccf493a8010f3408ec73602a6beb9f4 -:00ef904a088d89db5f1c1a6144f018c78b8f1c -:00efa0e33dfeee621751d1736bf6b34b58ede4 -:00efb00e18b330920545bb4fba59d36b6b443f -:00efc01f6e28edbe65b7872c96d1a1d4dd9492 -:00efd0c05aff3801e74749910e2741f19bf7ff -:00efe0a32feb879a177865c2c2bf1b8189f8a6 -:00eff0f130f1d690e9d4714b4c5f093852d570 -:00f0007ae559cbaaba12694fb4be9d940a332f -:00f010246b415d9540b50f7051f2c6476086fa -:00f0203a7ef2b9fe77914bb3715f6aba2eaee9 -:00f030fe1282ca2f890c413addd4aa27901ae4 -:00f04044bae5b126d637508c912fc56159f25e -:00f05088cda78a609193e1ccae33892ea7bc40 -:00f06080bae2636bd046f3572ba0bc70076ae7 -:00f0708a755b4d069e84767ec1772323e5421c -:00f080fca23b46378840bf1c12a9b1dc1dedab -:00f09004d1d95815f7a6ec6fc099b90270799e -:00f0a034310a1ad4c23e5e297efc6e8c218aaa -:00f0b0aeb53444f3504719cf376f6c280730a7 -:00f0c0b1035238b38162a95d4afebfd077d247 -:00f0d097e70fb5ff39e3731a2aa5cdda2c63d8 -:00f0e0c57d58a39a1e25b2db8e1f94a7d75b64 -:00f0f0f87f634aa29c29b42d63bf1a03319ca3 -:00f1000f684bece057267f65a3c1ac8a3b9af1 -:00f1104e1227fe8087fcd70494b7f4f6328ca2 -:00f120bac5ad722a926487881cf9e70fef3e87 -:00f130a112a1118014e0117c750e3c8b59a304 -:00f140b84c04fb0e35d16d21450b7ba533dc43 -:00f150b6c9c15df3a483c1b12bdebcbe99edbb -:00f16019b562cf41582800bb64ffe8fd7f85e0 -:00f170aded78b7eacc65fdf2641e2282e89234 -:00f180d54b1bcba89ea71f82da783639b60e01 -:00f1901fb97105772bab953cee5b4284f152ca -:00f1a0bdd7f4f042be779642cd377661af7233 -:00f1b09f56de102299a50227d21daca271531e -:00f1c03d25dd96a35871e8170e3991413aa118 -:00f1d0cf556338dd7ee1578fd2193d98cbd4d6 -:00f1e025b3043aa06b86f4ca427db4ef7ab664 -:00f1f0807910c32056ff4bfbbbdc4c9fc783bd -:00f200b2c94670435b177824d5d8b80cd57d39 -:00f2106a581b0f94fbcfd172c96b1623041708 -:00f220b5acda2e9c6d476d625da3b52e841272 -:00f230b916b3e77e3af83dfb2f01f41a98681f -:00f240582056594d5d1ce6c9e4c6219bdbddaf -:00f250fe9ba1094b704d0d41584a78725125c2 -:00f260a2338069491bdd8ada0cb007510b7e32 -:00f2704ae3a1b34b15636490d5ed8305e76940 -:00f280b19c3b2b4e3c88845df6fc5da76800fb -:00f290e03a517b1f4ae5faf4445ad98b694b0a -:00f2a0584c539904abf23ae3d0a051ebe30ebc -:00f2b01b4c44f09052801df3e4179fd63aa029 -:00f2c03f0f510fed811959d76bbbfa5dddb268 -:00f2d0a0661e4a724007b8138189ffa5654347 -:00f2e0c30ffb60078b07725e91a3cfc16b1c48 -:00f2f00aebd01a18557bc46e550bfdcd33868c -:00f3002f73c087c19964e9d7528b92a3ae1666 -:00f310cdb40e09a0a85b505f328c81ac839e7d -:00f3206c99ffaff1b99520669490d23e6fa4bb -:00f330f75035498d751d099ced69c5d8b48d72 -:00f3409041eaca5ec2ee8b1fb14d71b48e574c -:00f350a60a266ce516bd7b136c5828b21b3491 -:00f360c983feb2825617aa29c599865e870ce5 -:00f370594c65f35b2b6eabb010ea1b9ab999cb -:00f38022758e68aee78b9742094bfb8b0b2d22 -:00f3903d8efe7869158ae596fe93990a086782 -:00f3a0e10504ad2f44688129d69001fab2a025 -:00f3b03021a1b1191c2797ce7b473bb4531da2 -:00f3c0092ab76f626717791ec3c8b1d91f7e62 -:00f3d012c84739d5f65bb1b2597725cdf2cd81 -:00f3e0f28770c4bc7b555136b8a309568fe4a2 -:00f3f0f9ce26f7d21ecc665ed65403c23ec6bc -:00f400f0ba1011c0fc74da9865ab9040267242 -:00f410da4cd7013a1f30a176312094afbf461e -:00f420802b4d0e6be12e903ee40e7a49a011ab -:00f430af18269a9c9ded657d624f554404314f -:00f44031dc01008476d71de69b905b76b6df4d -:00f4507af9f969547b730b0375f2d13341f3ac -:00f460841ae4fe4241b3c976d8cf1cddd22c2c -:00f47029e08b639bff62714b947850f167cd02 -:00f480befc4640049b7522a4953685df7f2fe7 -:00f490f8e318b3f9573c4d2e1687dde5a58afd -:00f4a015ac415868873fde04b465b33ef73266 -:00f4b0f7d4df93036e3935a9168e43b2aa21da -:00f4c07ee42a8a9e8309aea3c3008c032f7f3c -:00f4d0d5e569bd426a75ab9155821fd849b61f -:00f4e0181232a6aaf971519eed54b7b9206812 -:00f4f05c6083db0f0add9d91a5afaea0836aa3 -:00f500d65858038f2217e281e7e0d947d9ed6a -:00f510cbfeb25403fad539db8359b1fbd99e46 -:00f52068628f84a57ad2ad8f7aa7a27fb05fd3 -:00f530b67d737434ab5395e9f11c1facb0b956 -:00f5403cbbbbb8cbe553d5a4ebc0373effddd9 -:00f550f328bcb1c3133c2a3aab7fed526b6e44 -:00f560e438b774450da4bf9743c12e96108ca9 -:00f570b50466595e1b6568e432c9c7515d57a1 -:00f58013040d6b4bc3238d87a3c433886f83df -:00f590c47e78f8c5e79496a780ccbb588c14e2 -:00f5a089890a852f1d2c2d8c15eab92f191a32 -:00f5b096b91861bbf0958de479a30947d0b98e -:00f5c08523e7ee89c239443e6eb520fe949c86 -:00f5d008a0a884de915bed39557b37449d509b -:00f5e0dc2583d5f9f6de2a841ae095f8107d80 -:00f5f0fff3e296d9f12ba3708b7cdda36ebc7d -:00f600574d04a33d7f7166d5aa84a770f30d5f -:00f61052e13a5efd6284b4c430ad6938e552fc -:00f620758ba1154be8c5e23c408d29d3c36d89 -:00f630e72e38030a4c3f365769ceb32fbe14ba -:00f6406a7a89010ec8dd29a19d98f3868bb9b7 -:00f6500b937bedff5b5a00a7ed53b8e4040b25 -:00f660fe7ee056210b255d281f89dc513f6366 -:00f67017f4c1bc9d7313ea1980c8a1aa2878c2 -:00f680803ead52b69426cfe05cd293dda78650 -:00f690409437ca872021a97324982b5b35502f -:00f6a0ce9c2aebc649bd126d44490295587481 -:00f6b0d24422ab49366a5fcc231816dcdddc68 -:00f6c065a1ef1c05729e8a8c0d14454e606647 -:00f6d0d7f158bb8fc0c97fc47ef5e51a09d56a -:00f6e000be5ffdfb6761c0a9f8dd2315acbc2d -:00f6f0d70e626d5302d8c446f520e492a29272 -:00f70050769a9a940636bd4e4bbb59a8a1afb4 -:00f710bf7f72cf13a65c410408c439fa4f390f -:00f720d8f1e87e9bf5b1eff55347792faff141 -:00f730a9e1c1ce947f9f5e42d19bb6160130cb -:00f7402a73eedbe13325c0adf991b2804863b9 -:00f75064b95664d34afb67a11aa50fe41f2569 -:00f7607b2f91a092852ba016e161537af03e45 -:00f770242a801045f5717a8b4972c817e04da5 -:00f78057764ad65333700d1140c5fd625efafa -:00f790a2c9fa18b978c21abf3a2ec1d0d37edd -:00f7a069c899b1d27923e61413752ccf050ba4 -:00f7b0a94239a25f849921b35363617a21b941 -:00f7c076a8b62dda3216ab1c3ea70b1a8f0902 -:00f7d002d56e6a9df61f6de98ce5fca84d5a46 -:00f7e093da6a02e0c1a5ac4c2576932fd2c44d -:00f7f0dc7c70fb7e5b57233c2bede1ac7370b9 -:00f80099af50143b9eed57cbb058b0dddeda84 -:00f81037e9a44ff2e2ba354282123a3eb6c7de -:00f820383cc26c85cfff85beedeb0fefe1a777 -:00f830f6a6c1711b723157e8cede80417dab6c -:00f8406317712e5dc1d77f03ecbbf5c1704b16 -:00f850492b05c10d24dba7bfbb9c7ed5f83c3a -:00f860cd7e3789597de3ab3c3e21e05ccc4402 -:00f87002484e7833b02fbec6a9cb95865611e4 -:00f8807aa7aefc394c652403e89a8ed8bdc422 -:00f890ee6bcb232e47708a9c572ec664be924d -:00f8a073e6d5884887c34888a0e6e5283949ec -:00f8b01572ecbd65875b6a0f772c875d72b08d -:00f8c01c9201c27b35c061baf6b05d6d40288e -:00f8d01a1438cf609505bb64f5b396c849ddf1 -:00f8e0d10a2db8e29141d935fe629d13856898 -:00f8f04f751bdea9791eb674f0d9704040a274 -:00f90055ee97dd480cf625f6cb73466a8a9acd -:00f910d0da133ef951773d7a0e126ff532b115 -:00f920e7d4ed06923f8f01e9cb653174c55145 -:00f930307d8ef5c4f4986c1807260e0bc35a60 -:00f940c2171d8935c528573b5d20e6809c800f -:00f950b2f9ad6e7c114784e6b19d6ab34105bf -:00f96063acaf5097eae505e8c592f65fdd4734 -:00f97044500e30b578d1d601cc0a00c0a8feb0 -:00f980dd897c1f78c2077049b35c8022cb34b1 -:00f990f23bce27e838d127e402024ddc94a377 -:00f9a04347f8ebf7ca64ac817f1e4d36ef531c -:00f9b04f92572db75b1ca3c0ad32d7a14a2458 -:00f9c0d0150653920156988048b1eefb2b49c8 -:00f9d0f2cd6c1c7e16c129a1e19593f08c25c6 -:00f9e0c55b4df44be9b67e7d22dd3a6054c9bb -:00f9f0bdf3e503f2003930726c7b3050734aa8 -:00fa003194c2eda51d785f30eaa647d1956f6c -:00fa10d448ae77a2b1bb45ac0bb384aa790c87 -:00fa206900450df8d4f9e73f57519d952081d3 -:00fa307037e2bb7549862cd584e7b6851b55bf -:00fa4048be1b3de9e7a9b709c208efe5d01226 -:00fa50bfacbb916a31c2e80afb86a1224accb0 -:00fa60381e0da5c2f68facc41dd3c197b2e39f -:00fa70c0cec4efaf4c51aff5b45cc078a091c8 -:00fa800843c820b70a85b038024f36034c1660 -:00fa905492ac2d05918602359ef2db7c34f30d -:00faa0ed35f4c0803d0efa83afc192963db01b -:00fab084b217bdac0ac2be30081a9d5c63a4ed -:00fac0068d571f2fe49f3588ab430550fc16f5 -:00fad024b9d95f2bd2462900295bec81f580ea -:00fae03b19569df234e4294acec80c04f25b9d -:00faf0879f636c8bf55e6c43de1138945ab6a3 -:00fb000081cb8941915152dfcbf9b9a1b8187c -:00fb10e781921f06aa619e438d7d65a2f49783 -:00fb20edcec8159d01aa0aa83117aca313305b -:00fb30e0c41e672b5cbcf929cb9e883a6fe33a -:00fb40f11a9746b0bab1f926a661515187c200 -:00fb50dfb53419cb944043b5a1a985053c8d57 -:00fb60a6de645c1f0477e015d0e35ad8d9ec41 -:00fb704cdc1e905aca7714c8928ccd58b23e87 -:00fb80e9e57ab04f1d2f829028966b8c3b8d73 -:00fb9051cc9ad00c223d8135a8f37dad7d3ec7 -:00fba07b24961c238942fdef342aacd6d67862 -:00fbb021a1887ffc26e7c2d3204e9524e8cffc -:00fbc0dd60bccdabb8c7f64599b392e01d23fb -:00fbd0f1189afb8fee028497939a151043bded -:00fbe082bff910c53288d457137392358516b0 -:00fbf00974fb4d11496caf9451f0466243dd5d -:00fc00a6c281be437ea5772ae7c52c56bfd35b -:00fc1010d97fecab8b28099b4bbc56422046f9 -:00fc205a2427f979a721a653b3c52b0f079280 -:00fc30fa26a6aac06e012c3cfd505ca2c01e89 -:00fc40b3cc1ff66f748dc686a4af5a044f2129 -:00fc50237d37ad6739b3282cc1df27a0f7e009 -:00fc6060c226719d58772ec7be424627f45c67 -:00fc7037bf8cce921f6c1fd1fd76687f6bb01e -:00fc80f91b5068afa258fe8fa6ba14cfe07d51 -:00fc903aeb764a575163d2d2aec6005f82d565 -:00fca09282603187dc396228e8d17219c6b5a1 -:00fcb0350ebf0447bc35be7f45c56dcbee5232 -:00fcc04d93d27ee0a501c8127145b0486823cd -:00fcd07b3e85f7286d8dc28e9fad3e455cbffc -:00fce0f6a36c182ee6041e203b4de23767e4da -:00fcf00b7ec5639a2c01b2e183ebf5dec3dd07 -:00fd00bf3caf22f72c6706d23d16debe2d1a89 -:00fd10716afdc7e2575cf1ce6061a73c746cf0 -:00fd200ddf95c7b092cbc2b1bd32fd7a87de53 -:00fd3050e7cc584eae3fc3352184078faf9c27 -:00fd403763e2c58c75c4335bfa1315d41fcd67 -:00fd50e3ab60545b08f45cf8287005f8979594 -:00fd609a1b82e9aa9d88091b9a07b90d21ec54 -:00fd70f4756397a9e41acb913d2daffa8b7ad2 -:00fd80c679d3d4b0f7d03403cb3be86da4e8a4 -:00fd9020a347e014a658eb6a30103c0bb29a47 -:00fda0eaae2f77ea9cbe7b29dc1b86ee10a1a6 -:00fdb01e1fa9edc02bb145b690f893881ecddb -:00fdc03c7421c0fe73def6662e37264d13f04e -:00fdd0ce5b3c86d64e818c0ee67b093becbce3 -:00fde07add2afaa944b3db887448ea68a605b4 -:00fdf0cd7e4848e4fb547217e45df4e0b29054 -:00fe00eca4cb9799988cbf466befecaa5fbb03 -:00fe106658ba686781d05cc86807fc41365bbb -:00fe205d70c6ac43edd02c60fd35c94eb7209f -:00fe3093d41fb52736f98addd487ad9a4c56ad -:00fe4011a249824a5f96cb801e5d14db6d4528 -:00fe50cae22bcb0e794ed424f69514a0b07dbe -:00fe609af555705288229e82af30c6f7a19b95 -:00fe7084455ead931615782078188beb014b2f -:00fe809abb9bf768d5ed7c890283244d648d95 -:00fe90704cffda1314792c9fcf4c992b601283 -:00fea038983f51285b13607adc571bcd13bb92 -:00feb03c4acd2721f8964faf60b18717299ce1 -:00fec0d301056e99003a85a51260467039c784 -:00fed0430a7edd5c19f57d504b63207c4b7053 -:00fee0941302c68a6b5edb38a38a290e55cc83 -:00fef021441152bd5181970dfbdf69f59099d4 -:00ff003b2d204f8e65307d19446c37348d8693 -:00ff10e77a25b246e9791d9cf3e24d4c8b0c3f -:00ff206e79db24a34e16adfe8f8111d3441274 -:00ff30d1c65c4fb27d11d97444522e7eb89455 -:00ff408c03eb76372ccb71b2d102ad2330dc86 -:00ff50fa093620cc44399ad4cbddaf91714cb2 -:00ff608990c41ddf8c49d309f6b3d9350111c7 -:00ff70f96c1f31b7a2a876fa73dc6f66d7cc4c -:00ff800478ee015333e2320ee7d8c452bb2cd5 -:00ff90adf88ca76c91fd072a3fd09a4c71fa32 -:00ffa0c5cf662e95cd14a68795f5dbf2973d7e -:00ffb0f00d14b5265c9e5d610cbfe4d5cb8d8a -:00ffc0c745a8e6c1dbab4a5147687cbeaf5cf1 -:00ffd09d79988b71288797c0bb5166be306bf2 -:00ffe05a91917a94dbd3eb492babc1c3c5791c -:00fff0a89d3213de31aca15908f21a2730a4d5 -:0100009fead2a25ebbad20eab8b0300f97fa12 -:010010cca678bdabff85c097116caa936ac6ce -:010020a4b757a1ec5f3d149e161d33e10768ad -:01003002b67b83f4e2a13c04424f659f606008 -:01004011ae3a63bf50ab3977404644e7ef8636 -:010050fc84b42a64bd18bef388da20e825945a -:0100606571054f8fcf00e1b864d3f47727065f -:010070a1065f829113bc9be26a45e4d129ce7a -:010080227d5a87f432528d39f428887fc9f0ab -:010090b27200d90c1268cb95751f9ca392a2c5 -:0100a076f4d1f8062bec3f82fa0c8cae7148d7 -:0100b0ae68e529c12bc72b887d52cc4152f501 -:0100c073389d8d1fbfda54e97d36581712be9e -:0100d0461e297e8072cd3ecbfb8d42edfdf0d9 -:0100e063fbb2221f591353d221465c6625cc13 -:0100f0b5ca139334ee0439900646c5924b921a -:0101004a17e210d58f9a572cde0095703cab75 -:010110dad172e0e6311ae0a02df2d4dc0b516d -:010120cdcded5a4aea776fda46491f3cc96294 -:01013033b28d9b16754bcfa0522e72e742cc8b -:010140e28157ab76bc8be2beaa7cf4dd8f5cc6 -:010150efea84691ccfdf63597d906698ca221e -:0101604813ce4ede1efe6cbf50683da72b41cf -:0101703549064b5487a0cc3839128f387c13ac -:01018029637115713700b453988d676ba7558f -:010190791bde631ea38099aa1930432a1d78e0 -:0101a013202e5f8fbc0205a795b5517c825f25 -:0101b088a5b3bd31d0ce05b61bf389c3e81ac1 -:0101c0289469d1a8fcf9f1b21ce06b78357497 -:0101d090a5711fbf8838548d093e4d2d70c3aa -:0101e0b891746221b7ddbcf0e3547bb3150fb5 -:0101f0873de8e8b6dfa2b165a6e2dd2772b091 -:010200ebfe6b88c596a1db31b67ea583fe4778 -:010210d7642d442d65421b964f83180f1892bc -:0102209611ddbe18e5d87d690ac7bf36d368c2 -:010230c7501e2fad2ddb45aa43396172609341 -:0102402f5192ec6d1276e80e9206e1f71dc9c7 -:01025064d0982bf01dd75ddd51ddb99964c449 -:010260ee529923f0538ef0a6cfb7b7e6aa5431 -:01027028af45cfaefaa9855a6df3dce7ebd705 -:010280c7193307bc8b910e3c6a1e3e927e0b53 -:010290178f7d764619ec0b3c0ab5486cc4e8a4 -:0102a0526967e11f67ddfb8c4ae739593d8a98 -:0102b019e99ae6d3bcf7e4eaba7f1e8f18cff4 -:0102c0b6dff697ea7f9cb07e2d5cdec848b917 -:0102d034ed72fd34112e395af23989c0517127 -:0102e04d6a56613383d57d17ce5fa08be69467 -:0102f05947f6b014a3287982cac4a55bea5ea9 -:0103002ae89f20666109ed83dd8c70d826c43c -:010310aa3846222a4dba7dd624c5c64b2dfd6f -:01032013042fcc5b50fbee873707278f82a66b -:0103300327a512eef2357383e1396c6425c518 -:010340bcb5e79fb5c8057f5136fe154f90c90f -:010350f42a4a84a80160c939932da93e4a43a0 -:010360c8c57c609cb4a5fb511d98fda71f99a5 -:010370cd096de99f01c4fea1b67e12f66242ba -:0103804baf37217762e513a2e4511299f2c133 -:010390c4236a48bdb8d7e659e2df17eb896bda -:0103a091ee329f0dbf2217872262846dd818fc -:0103b098d8c41e4182b2fa830ac21b9240c241 -:0103c0de56ba33c0e74caedf328b2b809fe0ef -:0103d0b528f9e7e18de90d75829ff82734fc2a -:0103e08d0d7afa49ff4aa3ffc4d1b8481a1dc9 -:0103f0531317a2fb4226e8a6b699ae6f9917d1 -:0104006f5815a31302edc60de80319739d75c6 -:0104105c50afbf6a6340eff18a33ca1c1666df -:01042086635476113b7a8e0491b5e067c5932f -:010430bb0aec4c51a328b6c4ecc794cb76a2a8 -:010440727e6e50b6460be674d5845ce433a4d9 -:010450d146699fd4e55025e981f401eed2042f -:01046087cb083d94dadc8530a3bf34158e2349 -:01047034897bbeb1702ce07ce7831d9ada951b -:01048014b447e5201bea10fbb26f7cedb17fa1 -:01049024c3185edee704dcc5008aa8117f544c -:0104a0c2af2b05d87e3a1d98a39a206380977b -:0104b06bb7843b552e4387258c2a290da7942d -:0104c0607d0e46a589e67d868c9348f09d6c0c -:0104d087e18205af1e19d815a6bdfbf87f8af6 -:0104e02ac6aec321f34b2f9a0ed2b8435e2e1e -:0104f002fd92b4172a86a0e36ad167235b155a -:01050052d132f5dcd13ab7be78988dfd84da3a -:0105107790bd4411c6711a9ecc79deab040fd1 -:010520d3ed8ddcbfb80d1d87a942759a2facee -:0105303872a2446eb2611559bef2b046c76caa -:0105401a6bd0185a1e3ea396d392740c1b0210 -:010550207b09a79d88e7f26c8060bfd03e8289 -:010560f970a86350216f8ebf81894e8905f173 -:010570323ab7fee97723f47fe96cc72bb0e104 -:0105804b4876b7d4211d659c21ac27db3f12a7 -:010590bc4303b03b058ddfbd36d742b374bcb3 -:0105a0cd9ffecbac34098956eb8316685b47a8 -:0105b0c9c96b4e753c1098d16c88b0bd6f4bdb -:0105c0159f22d2ac047908f03d621880fd9d23 -:0105d05ce9040427e06ccf5784f17db4626b75 -:0105e0bacc9853542c1b77445f4e06939f9740 -:0105f08f1084b33843148d7ce1d643c23c0f2e -:0106005c435105faefa08ad189f4c734cd7f01 -:010610e9b869195fd84b249ff5fb3f37cf10ce -:010620d139ed72be8f37419ba364aa24fd90e5 -:0106302e4599161bc2890b2febf94b60cb6b94 -:0106402c48ac9e4396413c493710b238323ea0 -:01065069bd75835fb140bc7c246cfde4f1477f -:010660c9bc07d31173956d85f31dcf7fecd10a -:010670727dea2f202e843cc3f505b67bf0a8a7 -:01068036b27037578e98df673483207ba49e2b -:01069062995533ebd3232a7c82aec0febc7f30 -:0106a02d718c4449ff9970a1437297b8af735e -:0106b0343ccb4e54611ed40ac40f4facb5d22e -:0106c017e78b6b368cd5ed56ca359d95617785 -:0106d0f1e5d078e9dfdf3aa1dab1d591b1aa77 -:0106e01f3293273c85453eb82fd40053a366f6 -:0106f0ad66abfe5e16b0ad3527e671f80f8598 -:0107006ae1be4c9a59df834c630c1e3d9dc197 -:010710be694e2fc803f7d8634c0c8c50d1ba06 -:010720568f359dfa2388c8e165ec7499087230 -:010730fdd8091663fe5578fd4cbbca65f657f6 -:010740192c8437e34ea72c773bb078f702beed -:010750805e41fc604094ee2ba6b0d00219fc28 -:010760615ab58b8136120813e511339c63f4b9 -:0107707ff3fd91b63c8904ef7e5ba6ae7b1efc -:01078017ad0ed3e912480093226ce3c77dc0e0 -:010790a529c9d3c2a6eb2e248588fbe56fda2d -:0107a0784757f2f31d4e714068de84001305ab -:0107b0c296197b6ce45d39866da68f28d25670 -:0107c063b3e3dbf8526ea8cd5a2f4a6b2ad46a -:0107d088d4177364d9acac283b7b1bfe8d25a6 -:0107e050a3ad2bcfaa7baf4ed2e017d9656378 -:0107f0d308e500aa7354f64a47de58127712ce -:010800fb4c6def2f34b6ed416def7f755a35e6 -:010810741ec6c3239ddcac236480bb7463c1da -:0108206d39e1124aa1328c4b2e19e5bdb27447 -:010830c3ac847f4a3c582c3c19508f69617ea7 -:010840ec28c31e02fa80246d88c14334158ce7 -:01085083af8ffccda258c0486c8e808ebbe4bd -:010860069633fe38a5a05d366ed369ef9255f8 -:0108700e8ff06b3a5aaf6dcfaa0b214a2f8a6d -:0108801c256cbab78a1ea43483e6aeb98a16d8 -:0108904bd64154b38a262b5c9dfa02d115d3ee -:0108a05df9c69f1f9507715cd94629639619be -:0108b0687638d63fdf0165da5cce21bcf4511b -:0108c01df4cfe6cbe342c3a94aa96a6809caf2 -:0108d0989d74238e12afd928c37892c85f777a -:0108e04a257fe0bff8f9b96d08bf8ec2d865b2 -:0108f003f969667a2052d0abb1556781c79b31 -:010900d6768f215d2dff6665b746df39c97bdf -:010910bfdbf269cfb7f9c55d41665f0b685c73 -:01092099b8bcc695d065314c71aeb516a556b1 -:010930f27a7195cf4b7ba3113e0c79b6653d9a -:01094001e5c5ce9b4c4f9cdc52068a3ba2bf18 -:0109504bc0a376857891c6b3a9ed5ae084861e -:010960ae21c18b102aba23d746347c2016a4d0 -:01097098a7bd1f3687d81779d875c8cb4bd701 -:0109807ae7381529a0afc78308876f37a6f41f -:0109903fcbd8561df9785666475065aa65fcef -:0109a0062bad46ba35bf061b21216fbad7d641 -:0109b0a68d9a580c6ced9d067375d1f6a41416 -:0109c017130b3d7495ca05fa10bd9e23992cf7 -:0109d08b66a8e4e1ac6cba44300506ae1be676 -:0109e0e3c417726cfc2ce9314c7fa692cf8a80 -:0109f0100381fc317ed5f7dec2c409b4219f3b -:010a001e3d944c5c76d59fcde97d7a88d83437 -:010a100d676ff04d12ce17b6d5404a76845831 -:010a204925530c5cf52e5447765a417a45521d -:010a306fa1eeaf3c9c72ba105952d0c9201385 -:010a40225aea54d369394fa3e6d0c552808291 -:010a504556f1310869baac90878efffa74941f -:010a6048c7985e3cb2a96a60963b6b4dac8f02 -:010a70f0773675883c64702ae0c821d43b41e9 -:010a80084cd84b4a39b99d83ddfbf853e6e47b -:010a90f4069a8600f4b8a0c64261f9282c3413 -:010aa093ea67a67e76b21297239498efed0e1e -:010ab03a5f943c2227c8f72bf3b295ef0f1def -:010ac0a73df69c1d37f63366e48603bf0c839b -:010ad06c2e790d1b021f3ba87ea19166bde459 -:010ae018570b2cffdf1b8008406b0c27b60d7e -:010af0e1f184be74cd53d267f86d661e839d10 -:010b0033bbb674abe3a9c255bc250433cf992b -:010b10905780abdb0d695d5006c066d82c1414 -:010b20b821ff6c22b02aff4bab9efa5468b665 -:010b3017e8ac6fda86c106fdc743d753ece6ba -:010b406fe8e1750740a08fe86d47cd04692df6 -:010b506692c17d47978c13e230441d4528bf08 -:010b6000db327a2f6cd42ca5b800b4404a1bdc -:010b70b7c490ed681e9dcf69ce7fe5499a0656 -:010b801936afb5dc534e0c1e6d408a948917ff -:010b90bf775c8c5adc970ee61b33f656e42573 -:010ba0bb217fb767b9d03c86918c4a33e82560 -:010bb05a465a6e41b7a1d6831e81f8074289ed -:010bc06e673a59abf8a554edb98a2d24a5b5d8 -:010bd03d5ec69cd1981eb0e0eee165ede10865 -:010be075040f4fe10fc0e725575de81d0c085f -:010bf06cb48ab2dfb367ba94277861b0d8e1a7 -:010c002ee7670f671f1a895c406fd7cee2660c -:010c1013a4ab41c64faa486b81fe893ccb7c44 -:010c207a754b6b2ae602564b5d141655807f99 -:010c302a0616e3a65bc7e3d5211f703aecc6fb -:010c40864c611a37a089af41bdeeb6c9d45c0b -:010c505658d5994baf4f3357b1178dcc530796 -:010c601ef3d0864a7dbd87a0482f0af7869768 -:010c700e38b9b667b6144bbbb66aa7a44b2617 -:010c80906efb52c77adc18207964a2187c526b -:010c902676b4d6b3e426b711943c21533b5664 -:010ca00ff9ec3a1ff6492ccf2ac3d3b1926cfa -:010cb01d0eaafd91dd892736df07157f7c6792 -:010cc0cc48558aaacb202708abb1f154b0ac9b -:010cd0d5a74672b9ea0f1a88cca0533f528142 -:010ce003285c945982fc0dbc3d42122d0ab0a6 -:010cf0d6169a474f766287408fe32c4cac3728 -:010d008d8ef4845aa548fedfb3947b4718317a -:010d1069b1e9e666ec0f17dc3f9ab052d1bc18 -:010d20f3f5c4656d4a92b4896b461aaa17a63b -:010d309be083a89edae2dc6188fbea6b03dce5 -:010d40c7e5570b91c8619bcd9fe362010a3fc2 -:010d5085e5edaec458149af62d1a9116acc019 -:010d603687694c565fc6051b771f2aa10e9055 -:010d70442a4bcf5a97ef906e8393631295e910 -:010d801f226d215527ab17733b3245394637f5 -:010d90308a6c4fc7a9c79e2401a957e36aa595 -:010da042eb4b607f301d453f96ad70828baf00 -:010db0e3b2723ce6764edfdf5b10d5603a38f8 -:010dc05476b603aa1031811aede60a7ffc9161 -:010dd0680678d035ffba67d49929f7c7a056ad -:010de097dc9185127717e03cee92959da5e1b5 -:010df07ec9580fabac99e9592782b4735045f7 -:010e0048a125515014f371f46a85a850a82f95 -:010e105a430f37e03025c26181ec3e2294b36b -:010e20c191b1593fc80259514593d56c668f82 -:010e30dc2cc176a5ab6fff967e975c3f0a043d -:010e40fb5b1939b08b9d1b60c9d85e78a6476f -:010e50a0fd21fbcc0022e4e20131b3c1713104 -:010e6005b120f38613d86ee7d24f4029c6a75a -:010e70c2ab2aae1f38f621f8c7a2efe83b3253 -:010e80c6f316db0f569241d62de37d16564a1d -:010e908874d21675723bc481cc3909fcb6f9c3 -:010ea04ee7b6f753c06a6c0e8be843436aac8b -:010eb0008ddedc524a397cbe6f176696c885e4 -:010ec0a87eb4d722ce0c51b386d30ed13830c7 -:010ed0bf8575f6055cc067ed6d0d25e56161e3 -:010ee0e0788675a7f0339a8d3e8629b1f9a315 -:010ef09f9b365fbcaedbd8c83d95a619150720 -:010f00a4bb494590a149ff40a6f68dca0754a1 -:010f10e0e68d6db2868daee8f2dec16b5c7dfb -:010f206d9abc5fae7a9d496b5030f6c2cd59e9 -:010f30794fc3df95ef9229b28c603c124459ba -:010f40ed10c9bd89a8ffc440a84be4329a5b4b -:010f50ab96bb7e7dddc5fcb22ec712f4012df5 -:010f605ad763187736638e3ec995546a7ac81c -:010f703c4f619095f776b5f3f6e5c6af53b040 -:010f80435ac0b4f5d1938e69a3328005399447 -:010f904c03db6e36ee34e2f42944836493ac54 -:010fa004b23902876b7914ae1667349a7d7dd9 -:010fb089474108ba7b3e361b6290b4146a3897 -:010fc0dc99cea4481a8506b04b75ee0899cdbb -:010fd0afa2837ad7e5882675fd499591cf0be9 -:010fe0570acb65d92827ef06f0fcbcedd7403f -:010ff0702aa278d36b7b74f1b7541dd300af7c -:0110002e88ae0275e21ae03fd501e5d13b9c62 -:0110103fcc8fec528b608190f46164badbefba -:011020d9394e93436a2bc0bfc7903e4432041e -:01103059c19b5154007961382f4ab648d6e1ec -:011040af8c30a521660f90ba3741fc54cfd75f -:01105019b57c891602c4c7380bd0030b026dbb -:01106008755c4aa23b581bd2c4b175605f6da9 -:011070e433f7c8681bc4f018a85d62ad557099 -:0110800e3ce4c8cea9084cccc10f2aec4f3096 -:011090c4a7864c2849f7cfec7dda71b7a91083 -:0110a0fbce6085a3c848e6a6831f199108eca0 -:0110b0b3050e63500a27e8f21311e15c494d9c -:0110c0e54a3b207970d1df9316aeb3568f44fb -:0110d0788bd81e3fc7b92c5b360bf6b10a82d4 -:0110e01dc46aec7e98cb04a46f7350466ed0db -:0110f0add9de548ef858082db5e1220be36d0b -:011100313a012b0fb4e47f6bce402be92aea2f -:0111104a4d93b69db3ff92335a2a1d2f93f020 -:011120e99612ce17bee100f24f20cec07dbe39 -:0111308e0b861eb8f131989a0de35ddb5b0768 -:011140bea7a03bb47c4223ac52b950691a5c54 -:011150db6ca71d5f7afbcf071cd884a8379750 -:011160fb692eecd691aa6241154d1a0359f3a8 -:01117042cc3116930ffe22a62f84da421a1e99 -:01118005094b21d47d7349c5b85dd4aabacb87 -:0111901f7774352489116404b0aef5cbd39ab4 -:0111a02103051cf6e434f71c9406d052fb7757 -:0111b064e5ce45a5d62caf6c1ac1e3705eebf3 -:0111c0f06a024e09f5cb6df22959612f8234dd -:0111d06f2790039284d1f0eed15927a7b11ebb -:0111e052ee1fc4219000c34f6a7cf6f48aca3c -:0111f03b9291a59cad952dd3a76c0fcd05dae6 -:011200882afb538e912e3397f71c840c958ebf -:0112108b92f3213a2b432875f67a8dd4bca042 -:0112203e7311cc7780919301454b620736aa1e -:011230d44a9cad9b85b593212adc1b7c986b87 -:01124084c9d806a0cf0a8da3401a8456eaeb74 -:0112504d3c6ac5c82cd20effdeb40eb6cbc2af -:0112607f9a007680ddb9a74ebe634f66a73fab -:011270d65127b3f7a63545416d254dbe489f59 -:0112800f4181db7b98ad5bedd44088ee91ce59 -:011290e1da6aeeb52c6fee2f9b88f8114ec91d -:0112a0a5e96fbb36d9ac4d43d432fbe54e1e17 -:0112b0781784fdc37654968c9c8c695a55c558 -:0112c0f85c966af4a395945310bd13aa8dff81 -:0112d03ea7e4d1c3c1b2d2c6decc1fc2f31ac5 -:0112e0998a898e2e77c10fd0d53357dd8d6ccb -:0112f000ccb14de939dc0fcc8d8592fcec4fab -:01130081a4106325d416f29f00af999fe20227 -:011310147d575d111886c166acff6d144f9b1b -:011320bdab099ae945e668dcf2df0ed5e22d68 -:011330b38e7a7aebd2fbabdecc15cc2819f730 -:0113406a2a65a73d72d9a5f791a61d049dba23 -:0113502907409e40116e8ce393a7521cebb91f -:0113605db03b6ab951102e3062ca2243573527 -:011370fb05826820032d909d51261e35637ece -:0113806867955bceb8834223665cea395652b8 -:01139084fb2facac5804999bd3cec11a98ed6f -:0113a002b3c65d973ea979ffa1a7bb581edced -:0113b052c50bee127df8bd422840b578098ba0 -:0113c0d206d384576b756f32d0ffb9300c3884 -:0113d0ca8e7f77604cf9f3232be4648a1c983c -:0113e086d52d003aeb82706f1aa1e5df9ac17d -:0113f02e4f33a85ea2981f8ac8e761bbe5b9c1 -:0114009c217c1c2d572281187009c8ecd257d7 -:011410df493b5cc2b5ed80256141b68a6437bd -:01142073c09d6c313bc4cb4ff1b3ba059ba6b6 -:01143058a78ff33e1d5b90d4f7088e70c1512e -:011440d2e9aa07ae922d34e5f95fb5cf6996f5 -:011450fffa9890e0c1c9e7933a15da7e9dcb68 -:011460dd35b3b05602aaa7e9f107f97210a641 -:0114700d948ab97b6e0d494b2a0708282ce094 -:0114800390588f8c44de6dd94d3bc91ee07613 -:011490d50a3ed2810412f45d98588bef9c2104 -:0114a043b691745279b04b8d5b5ded5c6afa80 -:0114b05508eb6b37c12f4addbfbc8ca394eef7 -:0114c06ed637b6266c6c8c698eb1c96bb8503f -:0114d0398e773aac36557c394ef6394d59e887 -:0114e01e926bcb678b0534ab604e4502db3efc -:0114f0e2e7dc83a85e51077db87478c6411cc8 -:011500f28c7c699ac11225395dded72d9346f9 -:011510bd12bf4056eaf69d8cbe37b6a4bb554e -:011520569cfadf203b11b49a153037f3cd7a97 -:011530a448f56b527cb5751642b1429cfb6aba -:011540be41b4d806172f2b3ed3d22e884781bf -:011550f9bbfeaea1ff19097f88014abf7a530a -:011560295ca4c8574346b8f338fab7d851dbf2 -:0115709990472647b8ecbe9dfe391b6add46ba -:01158043e57c16daeabd7d420a577fa4e7fcb0 -:01159001938c6d76015df4dd1f320446fa4a3c -:0115a018f1349a932b542b30245bb27d405707 -:0115b00298b2a187e8f2f51629838852e4dfbb -:0115c0bb239c5fa10fccb537fc2e20377d4f76 -:0115d0499c25c67d9df7b16f364dd6d27bc424 -:0115e08bcc2f1a0c0af810144aa729b89df0c0 -:0115f0fe2454c37f3dfe1c89aa40adcbd8df34 -:0116002f3cd437e72af7899fcdec4900dc011d -:01161066b0a2802a819e25ce3122e06995eb4d -:011620984528ef85f6d5bccb5023250b6069bb -:011630225e15f3504be8178daf314f26e311b5 -:011640421a96b4b36ab2450685843b8fbab5aa -:0116501cbe89afbc93be8618e8cb69a5a2120f -:011660f1493649566ae90c90110a45d1c676d2 -:0116704f735a84924bfdce43a2e18954b3398d -:011680ecab1658feb20952012a4831b65ab12c -:0116908c57b2f5853274bf5d9f634d2b9d2aa0 -:0116a0e57cc1833f690e46a8bc44fe5a7a27d3 -:0116b00b0d5ef3fbbe3b260ee68680a93bfbed -:0116c038c2dd68eb2e80cb575f0ee0ae507519 -:0116d0e6a2370e060a4fe618bac244fbf98ff6 -:0116e0f6a1ef3920f53a5548577df887b183f5 -:0116f0a3fad5cdcec41d9def903564e7442745 -:011700284001fe7fab2880d64e851d8cd31e63 -:011710542272a70bffcbeac40b968d56b98591 -:011720b4d26a9b9a7d79d34a9e54948712a385 -:0117301287e467feeb95a358a1437d03443490 -:011740f7751fd2fb1e78d0dafaf95275335ef2 -:0117502025a44c260158af99ffd7c4391d1ef4 -:011760b3ea6c5ad231034dea0ffb353f94cb69 -:011770ba72236bc8405323d4ed0d51e1779a0a -:011780990c979fc6d1d3fad201ae843bc41f0a -:01179000b84795e414edcb816773fc4d173586 -:0117a0dc390aee75fb5d05e0475c4891ed1eb8 -:0117b055f46e8a814b267f8cb6241abfa1be29 -:0117c095f3e35e23e7f711939e6ec761b0259f -:0117d02725c76e7fbb762839233606a142b290 -:0117e0ff06f94e4e71577535260e7c33985795 -:0117f0178e5f9396d9dad6df76dc68ce7e01b5 -:011800d8a088cf6111094556c1f48856fdbb59 -:01181075b51e2e026557fcf80b5a59745c04ea -:0118201c1076f22d4929c7858d23c1dc5b4819 -:011830b8d54ce17f7025ff0d6d1f6dc1d74597 -:0118406c8febe329340bf9e684b8e5a1185ace -:011850a81889b07250edfb8bd5623d2fef05b9 -:011860b9d9f8c040c953d202184c1e27d949a0 -:011870ce94abaaf68492b7dd56fc10208b2105 -:011880b75cd97f899500c5e39b2af0a3e465d9 -:0118906acdfe40b273d28a3ccf1e940841c91d -:0118a0cc1b7502814c4b676fdfb348d2c8e636 -:0118b006529aebcf74ac6576998cb0f07b8b78 -:0118c0dfbf07f9cc9839366e796998d855d6fb -:0118d0deae11b88fabf641629218600071da46 -:0118e018a2458fbc0af9ce19f770e0c8b68f5e -:0118f0fc835213706a132a85391c49fd4176f8 -:011900f2557c506b0dfe8913b2eb788df769b5 -:011910a8986c57057b388461180e0acab35238 -:0119205217f731499504edd039b1871e974597 -:01193060d235140906887e8f603f6d3c9b9afd -:011940e3da88e0063883877ebe622a8940d446 -:0119500adf8f0d8f9cfc8c35203f7207914b04 -:011960c83f39c3a0de8930f0f37b74e4cbe9f7 -:011970ce5b2b71a2b56b7cf70637cbf12f607a -:0119801c87143fb7de46c6940d4ca03f389fb1 -:011990640ece724256aafff6689f1590ccf851 -:0119a0049c451fb950fbf264ef0b4ef913e4f5 -:0119b0bd2fcc5dc044d62c530607216412df27 -:0119c09b599b41e017a727753a7e5f3d359359 -:0119d0021ee17301a239a6ffd40163fd5e6aef -:0119e060bbceb12b9d9312cc41e2bf1579c903 -:0119f0c0b9134957af75b6844da1ab1d7995a4 -:011a00b664667720dd39a76c628b225730c53d -:011a1052e4f918c32b17d3f5ade1fda57825a2 -:011a2031b6d86da62437e6e49f52796fb992d1 -:011a30ee904a3d6802073f797e21a605757ea1 -:011a40a1aabc272a8cdc044243678ca4d7b326 -:011a505f0aea2cc8f71f919e1656b1d7ed408e -:011a60a9b816f295438a5f1be154c58f15942f -:011a70b02b5d961f36bb737f642ba7b76d176e -:011a803ae4b439edbf2369ac05fd16d114bedc -:011a9081b477e763a4e17f914e014733237d1f -:011aa0000a2d9d1464e7fc762d8c535b1716e9 -:011ab08424118b75ab662ee7de13bdfa1202cb -:011ac0b1a0faff393155832e13f8fb7e5807b6 -:011ad06fadb18e6658636f24b0af183b42b0ae -:011ae017037d766de91d0b85f527917fc78a17 -:011af099aedae79886b27c6626e2a4160b119d -:011b00dbb5410d5d432272709ae7f2fc4c7608 -:011b1075959416d030bd632ff3f8b0a3b66a8c -:011b20129e990c76bd811d66c5cc0b6ad4ffa2 -:011b30777ff7aaaa5caed97da81affc3e0ba14 -:011b402b36b7d05b44ae2fbffcb1ada1ac7268 -:011b5098ae84606919b083ce5062e6199b1b21 -:011b60bd89ebedc319c08f53c0b6c5790c9518 -:011b70da3a5e9dcf18012db5c157b9ce7667e5 -:011b802592b3a0173838b58ef0f220e7216934 -:011b90f5a16143ddae3fdc76d3a9a477ae0c73 -:011ba01ec3698b65aa7c02ba019dee4aec2206 -:011bb0bbc31d215a963bea1eee2ff9fec84b96 -:011bc062e060d33d1654cc0f5d5c1bb5b11c71 -:011bd0c6dece96389c2471353262aa3fcece82 -:011be03b2ba136271f62d17fea3167e104bd78 -:011bf01db5ed2c546d3ee334001ad86cea794b -:011c00505dbdbe06cb20ecea2f4507e4c26ee7 -:011c10e3c3f75c7485cc4433b0c5b4503c02b0 -:011c2075a9bc298d5812224dc7dfa8b1ba5302 -:011c30e17b2c51e1ae2dcf2a40daa05434ec80 -:011c402e1acbd9bcc1f01644c09333cb519fb8 -:011c5070d90de7655b37ec29decc445f212d60 -:011c605a478697926707148538b7b10556f66f -:011c704ea34cc66d72adead3fff0b2ddf9df4e -:011c8044b95b0ac384f4c4fa448ba4a09486f7 -:011c90d4ae761f5235e9a29af5c39475636e35 -:011ca04f8075108bb18aee3e1d56c776bb518d -:011cb0927da100f3d6676d6bead6000f345122 -:011cc08c2798c1915fe811431953956e721518 -:011cd0698a96971338196407963f6a7d1f6226 -:011ce0f8658e569a0b2848d35f0c2718fed718 -:011cf004448dd7922fbe5885bb6f0163bf877f -:011d00d182d292f8b406086cda11cb1ab2cf7c -:011d105bcafed58a242b61aef6a6afb5f7751a -:011d20dc2298c73f32c17fb66700ec767fdab3 -:011d309fa6fae5df83008b35ba4034aa29f983 -:011d40549ea005a5fd43714d0851e5807fc7e7 -:011d50e6a40ed0f602d39d67505ee23b2a08a1 -:011d60eaf9b8f5ea938c076d103a9ac454d9cf -:011d70b3cd5ad10867e015d7a93036e39a7bc8 -:011d80e822a0d8f45e62bd68d041114a806316 -:011d902a1ee3e077f57b832f71636800a4fc9b -:011da03197600a63deabe49c9fda09cb3e5a64 -:011db01efbf8928fdc02a277748a3f8f3dc0b8 -:011dc036b3e8fed8ead92a409ce7f1905a9675 -:011dd012dcb997d563e22a7789f2ce00f44075 -:011de02416ad1ae119136e7794026626a49645 -:011df0c9695192e2a4520626b1c43d2fb7a2e6 -:011e00fdf71bc7cd158bc19954c88377de3a97 -:011e1070ed0e63e4a3cbbc02139d5d680c214a -:011e209ab31296a2844491c400918f6df2ceb2 -:011e3017bdf9165be6edb2975577d3bd5e0d16 -:011e408061bb9e12a59cd4f7852fb04adbbab7 -:011e50332e59f0c44ad1adb38bd78659ffb1e2 -:011e601723dcfe1211a3c02b99bdf62fc68283 -:011e70398de65ad4c1b8cdaa2e9eb8a13e548d -:011e80080cb4bf8e0200dbf35d27074b0602ff -:011e901545974340c06205c713dc37054b8b49 -:011ea09e6e04649edb1e4b6f5ee2973cdce11b -:011eb0e59677c35a3824dda65d311cf54badf0 -:011ec0b4944d07e92f11c9e062d6b32fbee0d7 -:011ed0f6199f1c7c42b6f9d34c014004b5f36d -:011ee0e76e92fd0e5ba13038dae70596c522fc -:011ef04369342900dde52196a29f2a11b49915 -:011f00126494902465331e5904287ea90519ed -:011f1088121d2048ebc54bfa49907e10f8cd03 -:011f20c60851d469004acb1fbf32ca78dd02a1 -:011f300a91c660849fc678130d7d7a660afdf3 -:011f40342262d75dab1d3d329e0ee922381688 -:011f50359ebfc413e55a4c7cb1d1606ff9569b -:011f6032870bf0e45e999dbd2f15357eee3c73 -:011f709d109cb602081ffb3aed5af71f889b93 -:011f80ed208e7ca4e55f0f03ee9414c3c37fee -:011f90cceb326f3e1ba2cf77b95a84622b4499 -:011fa0ef1188d5b12e77c23fb12c765743bf6b -:011fb00143a025ac2ef63c902576383cda8c1d -:011fc004efab14e1f39cc9562e9249a7ab1dac -:011fd06e71394fc4979b350cc00cc7253c6927 -:011fe053cf25c0761d8063e8e330bf9d2fbb9b -:011ff09bc60ec63c4548eceae122634711685b -:01200092debfcfdb751ac0e20a67f5d72debaf -:012010b55568f59b426dc9d773d476806f4356 -:012020cc51fc99f5facf1abd0012ed85bdb2f3 -:012030b24055dee3e718db15eaebfa40924fdc -:012040435baba6d4f67783f457ed7f9fa30f3d -:0120507ecb4e4c29da08699e0d651d34d8dcd8 -:012060e9819186cee41b682b7ecf6a4400a5d9 -:0120702ed106b645d98e64607d0112d8362e00 -:012080daea71a44940498a962f73a3aecf7adb -:0120907d0dca1834f9fa950451c19fe09e783d -:0120a05641bc576a350a8aa4741c1dcfce22d1 -:0120b0efa19332d54697ec393e7198dd9b6e62 -:0120c010b38cb7ba80fa1badc92eb37f9a984b -:0120d0b22278dc522f88c6f8864f6a3ea8c156 -:0120e09370a275a4f354dc6454a223f5cf2bf2 -:0120f06120a46244ce2b84e958d20429fe90bb -:0121008ba99ffcf5c0c9992cf6774d27477356 -:0121101f08549691bf52949cc3994d318620b0 -:0121205d40741503aba8cee84472319dd392b3 -:0121306bb8dda1d141611041135e48941fed7e -:01214041153e8090422f5bf4d61b5c2f255af6 -:0121506a652a298542acd786469e47a62444d5 -:012160b5a4b2afd94e0322943712ff9cd5bfc4 -:012170fdb8851a91174951fc89f13f6a228723 -:012180600cc9dee2fd249042dfbe770f9808b4 -:012190ec6693c5de6673260411b33aebd5f329 -:0121a044d365e60cd15f71442930efa29387a4 -:0121b0eafa02438ec9b46d04a0f06b51922ba6 -:0121c048865192e80a006a127c7280416db775 -:0121d07911eabd8ecb5ba4dde16f436be8d863 -:0121e0c0565be6a08f41e817f3761096f85765 -:0121f001e1d25200d171b5ce1a4bc190d28dc7 -:012200354d7a467804db65c3417cbc6b0b2c61 -:0122108978f7ad1249ef60ea39500b10ee5bb8 -:0122200485c71cd32ba107a37c0e110fc0e6ad -:012230de3a5f60f1ebd9736f1a444299208658 -:0122405bda01eb6583dc548bcafc204a7bdba6 -:0122508b1479d591817702e46e2f977cc9aa80 -:012260d7d98ba026361b7f0709249e4122314b -:012270c26574a3dbf2fd3d061674326e4625ee -:012280dad66fe6e9afa08ec0a44247f7303b7b -:0122909b4cf42667955517b36cbc12a55fb7f5 -:0122a08098779ae4d5aadf517ee92084548714 -:0122b0a23a1906bd8f958148e92377e0f5048e -:0122c0b4296594605df47489886eed39046c27 -:0122d0fb224f027a87dbb6a62c3522c5ce8304 -:0122e03cbfb74e9bdfd5cb16fb78824ebfec9a -:0122f03ad25c7461da78230ffd83b15ee82deb -:012300ea1085fa8c449e6121a66bedb29c7eb7 -:0123109afe088f74e269d41630d9f77c61bc34 -:01232073055bcf740b8452ae77af4c947dff7e -:012330c797ec57e8da1338d4562fb267b8b3f5 -:01234087125ec408c26813542ab5dc836cbd7f -:012350b547fe4017318451cd253ff5069ff870 -:0123601b11594db143c627c7d4ee9864eafb73 -:01237016a8fa013a4e9ab11d011afd8e59e643 -:0123800749eeb46a3c6335dd9d135af7f3cb23 -:012390e635845e99406f0624a7424ecbdcf5c5 -:0123a0be833e8a2d2738190d1486d0974dd769 -:0123b047f90920c360dfa14ada80f8e19c6d85 -:0123c07a220f7ed661a4bcc24a42503c758c71 -:0123d0e9577aeb2eedea700cc67084d75bed17 -:0123e00695cb8dc227bf07e80ff258090e81dd -:0123f05bbd4583f3c18364eaf22185554c20fa -:01240061977a32579d12186db91aae9f3b2745 -:012410de28ebce5ee7487fdddf6d6ecbfeb738 -:012420fe81065d6905fb4f7b6dc94c40897497 -:01243075968b07765fa2c8ede0de749032013e -:012440c15fb1a7f7948a319a3d3b1f8012bfeb -:0124503e18baeedf39109f0a34fe81132c05ea -:012460756342de80fbd83f2b38b74cc47111ad -:01247030ad6c5d77840dee6cd4459e97baa5a1 -:01248039497ca5b10b89cbf9dd92cae72ffc0d -:012490ea95d514326580a7e928a39a2eb225bc -:0124a0208c27231bda2b650aaec9782f08460f -:0124b06658aea0c308d86901c64a559aafde50 -:0124c0312308589a6fc7a3062a7614f926cfad -:0124d071e4759c4416e634919fc9ce3f0e2afe -:0124e0dbf5e00c9a11abdf8d58c0df71a6bf22 -:0124f0a826e4b6d7ed6e8d9a61501d77e5867d -:012500ef4d4f597a2eb03c41273c3d6fba3612 -:0125104bcd98f4c5f7f08034f7e40c912e4c0c -:01252013adf2c5f56e01093dfd0e647466906e -:012530b396ce3b166ea0901089860c0d993419 -:012540d5eba0ca0470fcb2aaa2125d0b1a0d37 -:0125505f094eb667ecc70d038f2f12b0978315 -:012560c0fd61e4b6d0da3a9732bd9b46b8a012 -:012570a49a5838daf8e4bb2cb0b761b66a060e -:0125803dd3b26bf63ec7d481950a12baa7b6d7 -:012590c6afc6b3d98db74d21176f897f07a6fb -:0125a0cba6176bc39983f4b2de3203a89bc7a4 -:0125b0e5bc9ff2731773c2034d60915af2dd25 -:0125c099c6d8f305df425163ee4142aea72822 -:0125d06b4f02ff4519471ad62f355f8b193082 -:0125e0f0884d0178ed7a3afd9425e0cb84c0d6 -:0125f02fb2127ef626af7870f46516aac55bff -:012600391e1a08dfb5d5b89c72133e7310743c -:0126100e5040f899c9fc947ffec8117fed9996 -:012620ec3fae67fc5e1c493aa0fae6537588a9 -:012630c1a96a16ab50a12f76ecc76a7eb25c8a -:0126409eb1cdd117c32e36c9c493ad60781be7 -:012650fb00197bc555829113efaee640672542 -:01266094c648005b6a8fdea2e515d661e0dd10 -:012670b0fd81ffde1097d280df08dd47d82760 -:0126804e6dd808cec68997308690ecdd769b5f -:012690cdf2e54c1ab5b90c3c5db1cf1d7d88f2 -:0126a07263fa111b64af80592500dfb2217ecf -:0126b046214b671c5385a31dd677ff5334de26 -:0126c0bf2ee0582f18e94b36dfc9137b33a431 -:0126d02cc11875b505a13c2f5fb6368443cced -:0126e02a3b3dbbcee80fb72cdca2815b74f27a -:0126f0bb79a58249f3df2142bf9eee840c4dc2 -:0127002a3a7fb759e93fc70924adcc34ef609a -:0127101421d2ab917884b17803edaf15d76528 -:012720acf2a9c4d4c05810e6da4ecd92ba7c38 -:012730f2f3fac3ddde8ba6b3f9daab5916a79a -:012740729b906e021ff18423db2ccb4d9036b5 -:012750c4e0945adf73e649ab71d731771079c8 -:0127608524f25ef328454ae7636c4c92bc3c6b -:0127700f55b6d1b8ad366c390196e5fb0cc1ac -:01278037fddc286b08e0638ccef2b1836bc501 -:012790829dc25a42cffe171bc08c37b0d722ae -:0127a00ded89fab858850fa20684255866ecd5 -:0127b068f9663e6daf1aac9b550b91012d0c03 -:0127c0becc5d877002c080508b327f11dbed5a -:0127d025b2e3b6704b2d48be210f29415f79ae -:0127e093b58358131be1d4ef80b67a27b34cf8 -:0127f075f02c3f778ab6ff72bbf51550bc1007 -:012800a9ae03ce7580e65436497395861f62ed -:01281078b9fc94e5dc7fc062164358ea71f750 -:0128203edbed696f59930c1ebee3607428eafc -:012830ea130e3e01401d54af542ebbed558f58 -:01284000805979a0af419ca1488af8bcb47c7f -:0128506de698eac77654b5a95c1a152d46d386 -:012860244888d587e618d3eda06fb20e5273bc -:012870ff3e0af8e7d548a7751e628d0f17a76e -:012880c7942a823ffdb8ce3c07f90cff286257 -:0128905a1d54993307cc747753db8104289430 -:0128a070fb598479b0db5d2d867916cdfd696d -:0128b0a41f2f5253287b6eb6cba7d98edec888 -:0128c0142a85c6e8a231faa9265bb1f0941bb0 -:0128d0b106c438d78141c3c6094272f5d7f538 -:0128e0f099ed5f16b538896342c64a794d2d86 -:0128f02b8e27264660f60ca83475985b5c3523 -:012900e70749d558037914a9c78dd2c3f0a945 -:0129104b161599b86d87002eb446c9c3cfa588 -:012920463da693014d9e2f75342f8912382e6c -:0129304ebf8f481eb5a3635e4bd88e103d3e46 -:012940d4acd8ccf0ef402667790e4d45de810c -:012950a9eafd47839d6cb38a08e6011eff3741 -:01296033a8e65d251f538507573153a50d977e -:012970633813f89a752b384b0ccfd58f4ced83 -:012980a2814d2f60eba73ec60a0a0be1522947 -:0129905bfb83766ca33ec507eb3be6175e50c0 -:0129a0ad810991ba2354ff9a0b0ed490e8ae67 -:0129b0e011df87a1619095efe22e68810744d1 -:0129c0186773b51c4b2b6d39d2916d2b4bad17 -:0129d02fc679436ebf89f8684b1e90fdbacb21 -:0129e03e0f7ae65bcb767838ba52ea18753a1b -:0129f0883f22069b6431e0592ba8005b9d279b -:012a00dae75a98def6e6bba42665a40e8ea800 -:012a107b4b8863dad3f41f2bb8fa4084d88fe4 -:012a2088a3e014a8ce934404c8d7fa33407f5b -:012a3055f84ef9b460e2413736bda95e2b9aeb -:012a40d01101c7d60eecc47ee2def1702bf925 -:012a502e0b1ead04776a2555a35eafd2682697 -:012a605bfa1c22076ab5a49b41ce92db9c00f7 -:012a700f3dfa33d47781c4e932a623e8ae5453 -:012a80fe2377a622784eace9c1b133bd34c658 -:012a90fb0d9b713d80e1c3ea0bd952821ab3f7 -:012aa0a7ce82f4a63601f7461f28bca355e981 -:012ab04083f6d15f52f4ad4d34e8dfa759eee0 -:012ac0bb2e72e3834140dd921de8a8b37c04d0 -:012ad0c857f33318fc4768cca4620971b69c69 -:012ae0c6395e9649665f62bd40fecd308b097a -:012af0585268d3e61d19e77225b5e8b8ee087b -:012b0079c82664bd988231196b7120ecf08722 -:012b10aecc9b763ad1bea0cede6c91e64bac1b -:012b20877799ccb40332c128843e9ea76a3d18 -:012b30e9c177bac808203e5bc85c201f8127d9 -:012b40b00b3789c27f62681765827bd1898c82 -:012b5091255bccb6785bf438e1fbd4b24f0052 -:012b60f88368e1d69e8d646f6bc2dc5dab2e0e -:012b70a1a6eda7fbb46f05670127af94d40110 -:012b805eb802ef19364136714ae2f30c70f1f3 -:012b908509db69f68f1195e92a56e39a5772ae -:012ba05126dac682532f6cee1b772aadce1fb4 -:012bb06ad93e992398e7f4e8359f7cf787ae8f -:012bc007ec63b878e95c3b2e48a8cf2a81dfb3 -:012bd0c7467fd149a4693460dcb02d6bc1e5fd -:012be0c0ef96e19a825ac80a6cdb0237ff94f8 -:012bf0b0a5f8d9f2f549dfb8ac2e4853f4dfbe -:012c00755af3052fa057297e24230678e415c9 -:012c1088a365e24dd758fadf5606e3e1e70640 -:012c20148fe79cfab4a7b7c5bfc37301663a32 -:012c308b9e5ed12ae5b469e5b31a43e35fb550 -:012c4039b31face1e69bfa6a1509157192a26b -:012c50e1f0c6d5a75344b1a81c75146736eee2 -:012c60036036d3130fc9176deca88210f8010e -:012c70d87c906fc54220db1dd0f1200e3bf38e -:012c8096e282c03232b2c30a1993fde12b0b38 -:012c907a21ee1092a1449a9f97871fa88ebeec -:012ca0df4b8ec33c650a963809c5305aab238f -:012cb049cae0bfec4930b38204cb74db323a62 -:012cc08f2bc6f758e0564b204a2d5d580ab5c3 -:012cd0c0c801c071e4f4cd394c671157863bf0 -:012ce06576b9150477bb75ec4108f617cb4c85 -:012cf0af96d6c71a17d4edf85ba833bb83ee10 -:012d00a592be3fb8ea918fb16e7569f4715ef0 -:012d104c401e4a98dc5b12406f62cc07da3616 -:012d20545b5e57d3a08dbcda06123d3837d92d -:012d302a5e23a43766214209d0627adcab8eb5 -:012d400b39d39773b8e2e8afc81523580f9366 -:012d503e4d8fd47a6aa4c79793c3622cb55e52 -:012d600a5d4f4e5451150c47a9922937dba69e -:012d70900802c264791223aa1db88ff19c0aa6 -:012d805ad5565a89130bc596b945075a1a8951 -:012d9053417537c921395e97e5623ddd6349da -:012da08842ed862c8bcc2c35fedd9897d0d031 -:012db0a93cc05e0cb82c6f5fe9e701db90d57f -:012dc03d685462559c6d8b8db606553fe96145 -:012dd077f884d673e7565945a962f5201acd94 -:012de0bca22af57cf73160a6c3c49b70f7e48e -:012df001b531446edabcf3f13d7de7d216a69c -:012e00018bc946e674ba7f65294e0fbacd532a -:012e10e0172981ba91f66e2b2901205a8b82b1 -:012e20e238998912ec4e0ca103c3dd5b048331 -:012e30b9dd6752fefede28ddc4d7a420621a5c -:012e40a7494df3e56ff09223df34c21663480b -:012e500097ccab60ea68f7a551b3fdf24a9201 -:012e6044c09deebfdbbbac9d5c5a36a79363d8 -:012e70b552c44902484fa425916eb578768340 -:012e80488ff7f059c3dd5585df90f7a15b0c85 -:012e90e8fcf79c06b0bf0dfacd7d314239ea35 -:012ea026288bc3b6f3aea17b6d7bc66ed901df -:012eb073671b8ccb7723bdf9af25de4305ef07 -:012ec0e2bbbc87fcb6c7154445a8f1397f3ac5 -:012ed0faace8ba35f039c713fee2577385e4dd -:012ee04d528025c8037e225515f90046e5ba7f -:012ef0cf5b57079cc08ad29a4be7536f2dc3f9 -:012f001c0f3af669e15c3dc38494ae33b9080e -:012f108cd0747ba8e5497559ab56db55543c5b -:012f20e8f8155ae250e677b151a6031274e704 -:012f3030353c8c8191181a7358a772f7c015b2 -:012f4044c93e7b0c75f450e22dc0131bfcf939 -:012f50c1275fa82ca35437956d34ce377999e6 -:012f60f83d293e8e77668e20b4f3ef8d9e82d2 -:012f70060f6d98713e55a3a319c4551db92011 -:012f80979ad65469695fef118b301f4db764c6 -:012f902af1675c294a44804d2ca9b62af3832c -:012fa0891fbf82f4fdbc7a783a381e86822be5 -:012fb0c61968097189358a41d5080ab00539ae -:012fc08121ca61435a70cf625f64ce148c0f3d -:012fd0b8bf1eed992de16fce503d964e6dd9a2 -:012fe0e0cb04821f639bfc58a0e1c1d7dc08b3 -:012ff02b300c4b2f16c8deb530e2eff8436b24 -:013000c6ffd131316a97ceb051554acfaf606e -:013010f81e8fdbbe4a2b399d83460042d928ae -:01302064482abc0982c2d0acb8c383dbc28f3e -:013030b02862978ff818ece477ad9842b05a33 -:013040a8a0aadaed2886cebd3142a15eeac582 -:0130508624adc83e875ab9ad5ad9a57ec199fb -:0130601105b8b87c8e651f9159fb8172ed523f -:0130709a9739877a70ffaf57a91747a3c713bd -:01308026cf042d28869d5b3522333bda9ecd0f -:013090a804a0b4eddfcdc7e91d156dca1633a0 -:0130a0dec5f45c8f4c18d965ce19b9d93ca9c5 -:0130b0933352b794754fcae020262744c3afee -:0130c0ecf7c8c02f7fd192ed6cbccfe3ab27e1 -:0130d0dad470a9896a04e282963ebf68a92126 -:0130e0ecc79f389cf1e71f48ffb510a43b7f8f -:0130f0b870029931e610861dfb216612936587 -:0131001bd8b424166d96b4a887fb38fd8c7f9f -:01311025e542c38e26ee63dd14b1fe3e3df86b -:0131203d240cce1bc46de0220c5daa31d3bce5 -:0131304a1642a55b82409bcbb22cdcf52714dc -:01314079f9c73835bab67a21bd6150a7f20eab -:0131507316b9dbbdbf5e6f5fe2c6e69ed7b1a7 -:013160fa2839ca26fa7de54634233dcda8c904 -:013170ff3cb9a04814c2e4024e8e22f6c623f5 -:013180e35de6cb4371a9643e1eb385af2fb912 -:013190b60cccfbda823d07b3563c370beb4916 -:0131a0d8ed9459f9c5033b34141009ca44950c -:0131b08d029fdbe729017362f18a7875235ffd -:0131c0746dada6a4366006f1dd843a8c84a3bd -:0131d0aea158fd1310d072bad8053e8d41ae88 -:0131e0df8724b8a6ea505023da019e7e68cf68 -:0131f0154fc070eddd3b252183ef018ad40aa5 -:01320007eba2ddb121e88c0f68635fbeda7b9d -:013210bc0f7737682d41f82277b48de43fc819 -:013220737b5d2299fb54cd31ad36c6d0076a9f -:01323029c94591bb54fd5680bbf7c12deff464 -:013240b4b1160a1ad63b1d6ed04190cba78b09 -:0132508e0dd45220d4ce95016caa370d837eb5 -:013260f0239e0bc1686742607d36fc17d02dd4 -:01327077cebd77e1b44fad26a8b46d41184f23 -:013280400798ff961ffa7d8d36773563bdbd18 -:0132905139f63248aa59b50d97e46ecf82d3e8 -:0132a07b5b02b3d31f2a23837fb58ed7e9ed09 -:0132b054dc0b4897710ba5355ea719edc86d2a -:0132c074ffea7ff49e35f5e86fffa05dcfa038 -:0132d0df0b3553af772e3f5ca7761d9328a543 -:0132e059d59daba1bc22d299cb9412694c0849 -:0132f079f949e2cfb83cffc557891bd385eae4 -:013300263ae30d578061ad35ddafcca3693fc3 -:0133107e8f640a015b7465a027f59d630a37d8 -:013320f934d62f14208eb249c4301e9e12d0b5 -:013330b560b66601e870da36483ba13e6d417a -:013340d6bcd1de938b77043dcfa2d4b5bdbd92 -:013350aa8f92603346848a85bb6631e78ca34d -:013360d984fee8e75f95ba362a0d2e8a34cb8f -:0133708e7e827f6d4648bb5c58b27895c2a0fb -:013380b19cc4b993789b8746eb1d9c7b5ec358 -:0133908af5cf93ec5e7abe699d45ac21f477cb -:0133a09368abd4975a7e1b88a5a336afed489a -:0133b0f5b33fbcb5e3fbe304ae173777a9fcf8 -:0133c071f89577ee6f40550eef3c307de475e4 -:0133d07af41ba68bbb3dbc243aa94bf7c3f26b -:0133e0d4e4b7a6885f136af500bf16c14ec5eb -:0133f0ca8f0332d9395694417af2117b59e462 -:0134005d4db3e76c6ec32d68f3cbb85ccc6273 -:0134107a281a52eb924774f053477e7c48f7cd -:0134208ed197a5b062d3de71759122002c6fdb -:013430b73b2af392ab875715218c6fb2a784b9 -:013440283785849f19008063d0134ffa042511 -:0134502e5e9045f3404ff7048814c195218f1a -:013460e21bc2519ca1e88988594a1c9d8d9a68 -:013470105e007d8fdcc6da1c8ac98028b72cee -:013480803f7a14eeee24a9dfdf81e84c712010 -:01349077d5149f8cd0fa8a4fa025315a21a443 -:0134a0ef445de8505f4a329df0c7519043bd92 -:0134b0c1a01c9b39d6b5e231b3d96d9fcaba7c -:0134c0072643721d103ad8e69a1bd90c90d15e -:0134d04d3b1344679a7a95aded053936b62d33 -:0134e0a335854e095073d05c76c9a6708f35f7 -:0134f01cd0d3186b2f1b37f214d728115313a8 -:013500f771fce22237c79d071581c1be6f2823 -:013510a2e3c774ae1dede59c96a877e49e4faf -:013520f7cff401871459cb17e2b6165a5c7fd6 -:01353017b78bc734e213dbcadae5c72d3362e1 -:013540ac38f5d1eb443d2246f809d2887145a8 -:0135502d449a509ea7e68c1f3792e22518621f -:0135604980c80b93b48f87e8fe0457878f2cc6 -:01357036ecd2688ed75c32acc2524ea9381069 -:0135806c0fba6011a257030327b78d2937d09a -:013590820c14dac1aa189b17752571e9239ca7 -:0135a05e854a3192e27c1a5eb6b2dc80b4a919 -:0135b09e2e668d8b2b51b1698918b7082a7d2f -:0135c045e47fedfa44e9434223d0bdc45db0f0 -:0135d0a4144155ab60dc25f809fa368e7bfe19 -:0135e0e0529143d2be45a983acfadad750386d -:0135f0bbdddb618b8b35cdaed17950726ff267 -:0136001f222cfe9e9f87b45dd48264f4b16abd -:013610ef8252660b3a15b3f955055f37a1ef95 -:013620c0aed8f5507b371680fcf18a4b878b08 -:0136305384a4400d721b379659e1e00225d661 -:013640c0c7e33bd95f7d6956e3d66a8c143d0a -:013650691f7f6551fb87b2020f494ee60d9a8b -:013660d98fece8cc35d0ce8feb700a57b9ad16 -:013670c0bd719a4d2aab7f832230baf02a64e9 -:01368095904fcda785491e514e7df7389668e5 -:01369039805ca240d4adfd0f403da53bdb8ca9 -:0136a0d2a88d98e558fa09b51a81e60177cca3 -:0136b0b1e1bd4b33232a14cf5148138eb50c3a -:0136c0ea000578b97477fccc2a22f86010d5ef -:0136d045cf929fc2a16ad5132f1a037a3438bb -:0136e0335676f0bcb545fe0447e43faa65eb1d -:0136f043315a84cdfde6ea679f39bfd53beef5 -:0137002e3e6901d674e31b59982b42203301b7 -:01371024e076881b7a75d2cf2a29c2dee7cd49 -:01372092b40da19e20514fdd38ae551055d44b -:01373073dd5035006d64cd19ef83f9d4769f73 -:013740c293bcb4b7a6d7ed09ed41e2e55b3155 -:0137503469209fd9ae50e88b4606e9ce2e379c -:01376001c011fcb280cb4c1899adc917aa5091 -:013770f1bdd307d08f4b2cc0fd73122fc65da2 -:01378036ae202db69af9a9c90a1d2ce4c2c28b -:013790ab801715df0c337046a7852684d65542 -:0137a0ab4e0fd96cc26793be5f45a243e28394 -:0137b074eea86c769b2c76d0ab1425030e17ce -:0137c095c71ae829a94f70c3adc523a370abb6 -:0137d080f74eea6f4408c0b1705612733459e8 -:0137e048aae584e8b7f738916314dc292f23df -:0137f0c77f3602d8805fd46b6f2fa44d61d76d -:013800c4ef2a138bd10aa8a61293e0953f0dac -:013810f3d9f8140016f0683d1f207311aa8180 -:01382007a97af67c4a785e2cadf8242d986775 -:0138305ca4983f06fdc291dc3dbc8113a9a86a -:01384008fcd36e7f69be5fcc8f3a5962b8182d -:0138508664da469e90d2e21ca9f4479f6624d8 -:0138605cbbca68697e7429a82535b230bdace5 -:0138705486befe067c0125e0be1972878eb753 -:013880507f005c128d66e96354934f62a7b949 -:0138900ca4da48a779c1febead979eb942e93e -:0138a0c8378d9661ec6d3fefcd55dd4b5f0cb6 -:0138b018ca6b14b869712b9c5f977e6ea245ee -:0138c0a078640da190eda0b3d9eee981b4c8ef -:0138d0f02bd865213e2c9a3688ba87c36fd7a4 -:0138e04bdd80189ecb8843b9c5d1fbe6563010 -:0138f006af45c20ebfc03f9e3f37cdeefc3e55 -:0139007be7ae35fdaab5922f870946a1da83ad -:01391084aaa7f17830cfb7f56aebffcad44f1b -:013920dae92bc3c9f6f5a0b2c0deea2fcff8a1 -:01393088b961e96a490b2b7307a9dfac26cc22 -:013940fb4aa5d8e7078d4c06759c564528e34b -:013950dcd1ac02f3bb1dc5ef8c70ae5f9fe9e5 -:0139601ea18249014ad3183ecb885e0e3db1c3 -:013970885f9f39b99af3e181ba0b1b4d4fff34 -:0139808e5f79a8d29931d95308841b80690090 -:013990b5d1a4adc3c1ec90b07fd1d6cecb77a3 -:0139a08382ac6a71713fa4b2d6352f3f44bc99 -:0139b0a7f23202b3964bfa4f7c3c90b2f17d36 -:0139c057a383426339a0e87fdbca678f9ede27 -:0139d03888282c91a706f5783abbeb9cbd453c -:0139e0dfed7c7f48ed375bd7d8ec3022c4d3c8 -:0139f0f9c593f4360e8e193574684e0514f346 -:013a00c1d30c3a752b2c44c2af3cf7a30ea27c -:013a10caa4eb5de650ec6ceb4e9e45468e4797 -:013a20234f48b0b984b1a70c1006bf131b089b -:013a306d3999c46f7f85acfcbf23f47d198f87 -:013a404739061a5fc70eded827194c4cef52cc -:013a5084bf18de57cbbe1b763f12aeb1043315 -:013a605ebdc8d742aaca8cfda2978ee9fe84e5 -:013a70d669563580744a2602c7c794d79d4894 -:013a80ced757b98abecb0dacd3cd1fb7721336 -:013a900dab76fe36cade33e572233bbfbbda10 -:013aa0f0218cac0bbc4d0404424ea11ff559a0 -:013ab0765ecc4441932630e4ca354c776ee1e7 -:013ac0ceeab4d445da7d603ded5e95983873c4 -:013ad0c3a52692c779116e0f3c818e637dd2a0 -:013ae0bd44d6b5041a3dc523bb82fe4078731e -:013af0d55ea514492877aabeb61456e347c0fe -:013b00841001fe5785d3b0695362ff8dc54a75 -:013b100919a2f4dd5b12378ae98494232eda6b -:013b203f49d4f18d261f1be4e5352d03d903fe -:013b30b9ff95a769579365247b3dbe927167ad -:013b408e798da76aa1b687ca258067ed16eab8 -:013b507ea353815943f4069f6475ff6e06618b -:013b607ae3ddcdee198dcf776bd7d07228ec8c -:013b70ebc205140246c413c17cb32fadf16041 -:013b80f3718d1388e596db985c2b81b700ef3f -:013b90d77efe7fbbc7fca2f68443d0b12cdbf5 -:013ba0ac47c5115167d82cf6c864ae5a90f3a0 -:013bb03d9b6291e1f80d2910765d56801f29da -:013bc018056b03ed936d162e6cde8bc5fdafe3 -:013bd0e5fecbde5b9cd0d119d7518823eb4e1a -:013be0c0035c48951b3ffdaa986edc5875c081 -:013bf0f3214573f68c10c6e42a4c7b8b85513f -:013c001e32b358d033a632454b0c26e632001a -:013c107c2320771c8714460bb679ea2d72261c -:013c207162ce1a312fcd1c3972d06faab1c7ac -:013c305f61198a51d1444f479de710538ca361 -:013c401b3941edf3e4e8ee08f3f05467423094 -:013c50a0210ed68349875e2dad5b8b611165a9 -:013c60ff87b94960e9c8979806bae69b14364b -:013c70a6200b7aa31ba2321731a3d721d51b04 -:013c801b70f5e2a34775f1f97e5f262b39b9b8 -:013c9031ff0d3c035d15b71789702d403b0f59 -:013ca0ab00d327753d6b628c51937a51d78d21 -:013cb03985f719046320bcb73d7e3d309b2a44 -:013cc0323c290af51bef67dec29f1396300748 -:013cd044ee11b535404aa49163d0793eb7461f -:013ce062bee4106674090e761e6d119364a557 -:013cf08bc416bdc701b5bbe4bc9582acaf2ca2 -:013d00b64a6ad5e901be165cf5821d14e8a679 -:013d10c6ee1b2da74700162f1f76344cb7696b -:013d2067cbb8767614c8904762764c8e2c208a -:013d30dfecdb1f8d207f0d65fb1b89a1b14c46 -:013d40b15b3efc864afe456bc957a37047caa2 -:013d50cc4f3d89640a98a11bcf1f62164445ce -:013d60bfe3c75ae2b25e54b8cda32071c8770c -:013d70ed5d57771b10402543f55a76fc9816c1 -:013d80b5fb23eb66c871233c863f69f79557f9 -:013d902e8b3be9eb35bb0b74fd2be554a95abb -:013da0141ec86942019170dceca3f892d15307 -:013db0198efb2af434dc90a3d066e7ed00cc10 -:013dc021a9b823cf6fb79df51fc5e687da4e50 -:013dd0403cf70bffbf117f40e0d2a955467796 -:013de03860366282d9ed592d3e15292966665e -:013df0804bc9165096803d654c508759829c61 -:013e001db963e87663c826809a92151039e884 -:013e10f26854d087a270a919c98f965c4be89c -:013e20be706e31c690999b2e49b60b1d5f2d6b -:013e30492c7f23a1bae45caa8f1f3e60e4e4d2 -:013e4058a3f37400a28c315f0ec7f9129f8960 -:013e500990b36b8c38219ba231aa7721a8cb87 -:013e600bc8886d497193aac82db35751f42909 -:013e70f65cfb58b5c4e0b4a40cba78f8429f01 -:013e809ae5946de073000fc0f397de41a2e3f3 -:013e902178cb30747d8ee83a679a5b66ad5749 -:013ea0ac4772e5195b8e73f63f24b3b7453bb4 -:013eb07bb3049239e5701105871d01685fb531 -:013ec0eab85bd39421cdd7fe757c4f720a7dd3 -:013ed0a90be0bef7e82c619f1f5e71cf018207 -:013ee0a85e87b2c54373ab75352f112cb01a7e -:013ef0d76151468de5a03964fbefc17e01e710 -:013f007d4bfb0e453afe8f9b2a5361ab6437c5 -:013f1013c75e6dc6c9e29aef2e06d1afef4ded -:013f208c9e56671b62f3f06d4038f5f9a082ea -:013f30ec1e54ee5dd72c7898c8bc0f32a0484b -:013f40cb0e868b19e886699d80edafe706c305 -:013f5071a69974ccc28529c183dd2087a04f92 -:013f6097c95e3a188b68abaf047df7b7590dd2 -:013f709624a929d7d1e2ed0f5256a0260a257e -:013f809784b43e53fac26eca6f5ef58f941dc6 -:013f900399a92fa5d2cf50682f25f0976274f3 -:013fa0f381a0c860eb9af65dddebed9502049b -:013fb0f0badb39e84a4febe63da126b5e63710 -:013fc0c426a0ed074f73a8a349a440428161ca -:013fd084194668f248de780d8940f25fee3207 -:013fe008d3bc66bc005e1ce80186093ddda0e8 -:013ff023b1560db16cf8a23daab63b69ad2de2 -:014000d3b8ba70887f70241ab8d2607aaac79d -:014010a27541627ceafaf7a28fad292fe82181 -:014020dae4c5cf5e957a8ac0442b56f92f669e -:014030530d0230e2ebc9574bf9a2e8516ff2c7 -:0140406832dad12b52dd91ae555a28746639bd -:0140507c29ff5170745121aa20fcfe9b21a862 -:014060292541562fc875107a0317de291bc63a -:014070e54018131d6fa0b40a8612e6dc62b197 -:014080a8ca886f5674be0f627d28378d44d420 -:01409022bbffb778e90b0f01dd1a8bd5b4bab3 -:0140a0cd5e9f54adb0be35b147e74990129800 -:0140b05fb9eb26c5971497b32ddfbbf25c9c5a -:0140c0aad9a0b5f3e0edc6420eaaf8717ad2fc -:0140d06a3b7de0bf7431b88653ce3e49265bd4 -:0140e0ef2881a3ca24850f951208eef75bab9b -:0140f05401abcdb80b5279c7f83eef0dbecfe8 -:0141000bbe30a4a344a0fe79872875fde15d62 -:014110cbff3b68b22d2b7c5ed3b202267f2d2b -:01412085536525f4c476f3af3d42a5d6f21a93 -:0141306ad18675b0f86192acf47b3cd614a752 -:0141401567a5aaf8393613bae07afd1536c16b -:01415032072d2adb7e05c72f866908f99fb959 -:014160bfe1aca077a258309ed955f39d8fa56c -:0141708fb6b29198ecde949bb60b407181ca99 -:014180ce4c24d813d07ea820f9c8d4656bf3b0 -:0141903318185430f712ca9b2411d320976b4b -:0141a0145d5754ccafce88b2eeb4f6fffd7486 -:0141b07a383a5d74934e195eb6149edbcd0ba5 -:0141c0b074e307852f2eb56d043d329ac97381 -:0141d0e9910639c8622edbb8eade7dab39252f -:0141e02b2f7b4d245b25425470401997e0a6cb -:0141f01550e7f26f623bf25afeccf3108c315c -:014200621e23269eff0911155b7a699bd44832 -:014210879f78986e86b279a850b1360539c929 -:014220366ec1f615dec60e79466bc3d79d601d -:014230453a312c6b66355ef55f8e76b8826116 -:0142403ac212622b5e569b45cf474bb1ed5c9d -:0142505b87bb758664eb709df552111eb827d8 -:014260244fe3ec45ba843015a7246c5627b898 -:014270a826bb0f3624f87d2b6789b2d902c208 -:01428051ef5e7870ee8181ce3a87ae275b21b0 -:014290cd8c21acf01ef245bc7634892be221dd -:0142a09cbc09f9dbd281db1e356dba41ac782d -:0142b02e4e89697bb3372754156959ac6001ff -:0142c00ac0edbfc69a283834ffdb46dfe702ba -:0142d0e8f06c7d147e87fe740666e3aba6829d -:0142e0c406e95a20c5a895965dea12d1ab8c08 -:0142f0aa4fd06dcd63be6a5ed7eec567dc1f11 -:014300de13957323c5bed4feaa4af2728b0621 -:0143100012a82de9c279109a5114254e5bbd08 -:014320a008348939d67c6b4342870d4d0fa242 -:014330bdaae077508f875fc3bb01d6ad302a51 -:0143405c05d8514202f264dba507b32eb0e1db -:0143508d715d40cda0cb9f18415a5a72ca81dc -:0143609266c560f2d0a08899ce8acd21c23e17 -:014370c3af3a2433e01747ce79f36a7ff1339e -:014380c8f9fce37151f48e82cdb178619b35f7 -:0143900b09109a3f6f963f51d7003ff560dfcf -:0143a06ea1141bcbf6d8a1bac01e0b021e3cf7 -:0143b08fa8a95db8bda0c8ef3dc54e67eadbe4 -:0143c0b4f200cbab2ba72ae83324ca6264f925 -:0143d05a4c26257622bd5b0bb0b60c866f17ab -:0143e0dd017aa7f46ff2b81227171f94fecc67 -:0143f0a6aa350decee371c9b5be23d1c3bdccc -:014400b54da4b1c371aec13ab9ee5edf730119 -:0144109b281bc74a4ee48e170a3c90806c4a25 -:014420bf070193c12cb9456f6266db8f4ffd93 -:014430a9d66683ebadedb1da232de4257ac350 -:014440dc99722de41f3ebff7dcd642ae7ccbaa -:01445013c35dbaf0587f95472ccfa251968838 -:014460a1b7a86c9f2523bfa1f0d922fd8f3bb4 -:014470f2d0354f1a749a19507191c7cd0a3425 -:014480ee3873245f7bf97844af33cce1809f1c -:01449085b48042ac3d441ad540ee29dfdf0ccd -:0144a04fdf68e727e8236f2051b93fb199c33a -:0144b0f66c42bacdf767cadc26e5819b44fb4e -:0144c037189049b8243344aa3efae8cbd2f9ec -:0144d05dc77b5cd94753cd1e401ca1caf9fcbe -:0144e097e23dcd1d14978c35e5726c8fe41f20 -:0144f025c50ff69306245b5a933ad4327994d2 -:014500de53874aa7c9b26ddc6a42cef079d6ea -:0145107f2ca8eef995aad6b953b0c4886fdfdf -:014520f394cf598383c3cec346095909e36e83 -:014530d76055c7c6e05fea2e6cbc33b0e19fcb -:0145406a986956e92e8e40f21f27a6be2b0278 -:014550e3c3ad2c562008892c4d3f332cdbcefd -:014560c9d266585919d3ab000e6b79db9fbb49 -:0145707efc4411df5e3649b561e2e1f0af17ec -:0145802b637e0ea77e19ca7f31a99c75c6a725 -:01459066bb3d050bd635ca1e424a8e2be8da86 -:0145a0d4358caf78fcf4930b916fab81f0f553 -:0145b0451a8f78f11dcd003c65a1eb44bce8be -:0145c03642ae7fe94a92cb58167596c229fb1f -:0145d0577fb4dcced5d018dbdb35dd964b3380 -:0145e0f8debb77223e7421fa4746104fa8264a -:0145f0b84c4a0b06abadabee63dafcffd8498d -:014600a9971e663927980393e6cdf110f8095c -:0146107eb9e80fe5b8c29180b5c81cc7278c8f -:014620a84496261d92d2415021be733bf9defb -:014630409d3b10cdd14487f87a9d2e804fc240 -:0146407e33fe2d97943b6255489ddc8844b3b4 -:01465022e78d94ed34678788accec759edde8d -:014660fc2ba7da36321cbacfafe4b802b4b766 -:01467043b99ed1c43f33f4c8cb2c975384e4d8 -:0146804b480e3920a696c6cc65b4277051f934 -:0146907d53eaf0b85399b7e9653d9ef1eaa771 -:0146a0726b016dbe1aa85da9922288da1ca8c2 -:0146b0fbff56afc0344ca5523da79232ba5141 -:0146c04e6faefde9ac7e7f785c70c0d5776c5c -:0146d0c0980a0752ab14292b08fd82503e154c -:0146e011704e63f083bfbe4c9ebdedc2e1eb46 -:0146f0e6e8e7acb66dedf30ae807fbca2fb427 -:014700ec5a0a13bfbf9680baf9956034175c65 -:0147104d87b80773231843b5beafe98a011360 -:014720fe6f35bc4a04a4bf15a6c1956ba18d83 -:0147307f80674e81dcaf592d7bd055734de57c -:01474008c6da9a07b4dea7ba0fb3838a5636dc -:014750a40005878b1d4f8975e49f8fb4729107 -:014760ea81e24ff7b86b47a3d1b9153061bfbb -:0147709e993aaadcd6182e59ed86e440dc8ed4 -:01478062258dccd4ea8d4a3e6dfcd881802488 -:014790d90b9a2c2364f3e88fc31fe09e7bc1db -:0147a08454cb008523ae71019a4022170dbf58 -:0147b0043df9ade80e7089c22ed2e7a1e5cb9e -:0147c06a5d38c72868d8f4b2f0b9cf92000cf3 -:0147d029e8c451a7de904ac2477c1fa4ab6bff -:0147e0de4d0d1757fac43ffd51cb94fe34924f -:0147f05d2311808205ddb2607ac247fe9ee996 -:01480037652b455cc62eec268b07701bc3b971 -:0148100cc1daadbf1ee141bc8fc2b83fda3f53 -:0148205f564dd8e55a136f7dd50f7a61aa8b6b -:014830bdca368d918a473554b2ea62b4e8db58 -:014840887a37c009c3ce36f405796cc21eba07 -:014850af8ff2092d2e0f4ff77adeac35d8265e -:0148609e4dd6b90f4b87ab009c2d476337b444 -:0148706c6af4e959f65c37bc3203701d3343d7 -:014880955d791bf108202cdaa77511b7f8d743 -:0148901e0c793b383da4cdd2f00b1556817e06 -:0148a0f93082cbaf7ab02c6ca9aa7936af4ded -:0148b023efdfe5ec542e6a2ebaebb88173ee11 -:0148c0ad0929446d26ef4f5479bc033ba25e25 -:0148d0e721a2f69b2f327432bce60c80e28c38 -:0148e0c8528930682022dd2ae0ebff705ce512 -:0148f0af5467524317436e3bdac56cae0675fe -:0149008da1f9ea4b6f0bbcdb18619a9607ed5d -:0149108fc95d91ea53292d3c79671472e01588 -:014920618a0930c9ad939951fe2e4665d56a34 -:0149300612103531b2d4ba6cf72add7f22a8f6 -:014940ef4966085899c154d1d5156a9ea0d737 -:0149506d3d266af7f452ece1a3b1b03dfffaf7 -:014960bdeba4ca74b81d8ecff73a5e87a4e1c5 -:0149704481fe027d6a5c53c6fa997b8ea57dd6 -:01498094d039049ee58888a1c6d649a4d8e5f8 -:0149903b107a20ff30d3754589a1e7d952d18d -:0149a08723422a03c9a8876dada30546b351d0 -:0149b07ff2c2d12ac19d9a3496bc99f431fdf6 -:0149c0265e93f21fed960c39a66a5d8ca7eb54 -:0149d034b434dc0fb663d86bc61c884aaebbb9 -:0149e084e1a63bb53abf8655b9fc4b9f55d42c -:0149f08234da193c719fc57f49d5f7e8059ddf -:014a00f465343633914abf5618bb97e51702c9 -:014a10567495f309cc5cdcb9e7fe3c669aa574 -:014a2077c1c4fc3b4ea6bcf18ea93efc0a965c -:014a3045d934fe9388b5a06c37bb51d1d4ab63 -:014a40ceb9b5fbe6571da357ec735cd4591151 -:014a508c7e5cb856c73078afc3d2d8a0f2573f -:014a602bf97a2e01eb121bd0e400864c47a0ca -:014a70964f6a4512b8aefcc1b120738fb3972c -:014a80e74271d14296b77ee87d1351c2dd99d9 -:014a9080a7706c3cf91b3028a21cf5f3f7ba72 -:014aa089414af7c89a35ca546c65eec804480a -:014ab076b1ab9d16a7438f172c9becf289f30e -:014ac053b1b76799a4649582b748dadcfca365 -:014ad007c39c9d526e83a8614e826e3aebb23e -:014ae03b9febc8944df9ec52901e84bc004658 -:014af0c69169cbf53ab32af1df2c3860b3bf67 -:014b00e17635178dcd47812960da35b148f632 -:014b104f7270f19898b3e962e0d3142437474b -:014b20af5e5318eab8e0a759ccf2fc8687976c -:014b3020f3bcf6591fca9cf3b8ec5649ef3097 -:014b40d8c5a81828f91943f5e210cf20043aec -:014b50c3c9ae6c289e9010e6da929a23302300 -:014b605da9d01a5368565c66a7a02ee4c70294 -:014b70a9d234cce64c4811273cdda8401876a2 -:014b8025595f38ae894838b28cd15c5deb9edc -:014b901d8a35f7de924d898dc741823a33bf31 -:014ba0a3c5a340bf9bf9007771f07dea49b4f3 -:014bb0090b63073992dbd43c1e8559ad62f782 -:014bc0dd51dc13ba547dfd0275d93a411a9862 -:014bd062f26e7bcd7d1cf30a12d0e9583b9019 -:014be04b735b1d5c010af7600dc9d7f2d48e74 -:014bf01524035a4ad7bd42d0c2ea7119fa312b -:014c004fed6345857976dc194b94031581887f -:014c10587a38c9e3a8924584e21e715b621921 -:014c202e374e1ac53fcb7085cb3b8080909c76 -:014c30888b79b0c809a1a26ccb8971c3fd756a -:014c40edc6bee6b18b5429ffa077d2f178c8da -:014c505b847c680fc3974975c3f3e9ebf7b6db -:014c609b7b78a257c7cf526d676bd517ec6e92 -:014c70543519a2e301b9bca374113568fec3b2 -:014c8060f6f656fed2cdb6d681ee75b9a9ffcd -:014c90bbffbb30fa77ee44ebae1f7125da7377 -:014ca083a2114de6688b5fdd8ae0d27d14c1c4 -:014cb027fb2157da32c719b11b2178488c1572 -:014cc098c175ed462f39d37117973d8606e4e0 -:014cd0764f69e40019e5848ee7bf8963e462c9 -:014ce03804964e976cb2470281cce9cd0372a4 -:014cf05dc7b0db8bef28ed160516bca39e7b2d -:014d00b326f3cea3171ede27eb5634342aacbc -:014d10752b25081bf77f60f76f0584bdfc83fb -:014d201d37378e8f7f5583c18d9af552ed55cc -:014d30405e4182bc2634896f2d426ed861d642 -:014d401994c85c6495271bde03fd7b2097baeb -:014d504172763d28bcab9994477c4520cd95a9 -:014d60e8496fd6b5a15efb94cf4a28e61bfe7b -:014d7060e6a02751c514a8b4f1ad84b804bf3e -:014d802a07b5845011348f64dd32176033235a -:014d90dd109fddf6cf9547ac1649dab65b4334 -:014da015a185c39cccc426e00adc3318e144fe -:014db098c0ab7c4eec7a00d45992260364c433 -:014dc04c58ad505b6580a7fbf54ed64d370833 -:014dd05907597382623aa2e3496974fac557cf -:014de0a20b07aa77b04cb40b9da89bd1c1f8f2 -:014df078a07e3751ad09f91d9eae3f482cf8d9 -:014e00ad8a4146fa23dce8901b95b246bafa17 -:014e104b6151d73e9abab8ced631a50db4eac8 -:014e20a9816b79ac4f197f742918c7bcd8bdf1 -:014e302b5c7f86fd3745ce149ae19000ef7eb3 -:014e4043411662465613a9cf9b373a6c660085 -:014e50680bfe7a9d57e61fa10427e6a2f676b6 -:014e60b384e1ddfcb662ee23d864de45a3fceb -:014e70f47111508cb782ce9f5b9673866bd465 -:014e80b081efbc63e2e0537f7203c9d66e217a -:014e903ac5e4551e2f0d35eb929392d8ef932a -:014ea095c65af7ed1299fb0183169c5ee39b3b -:014eb0d28922054b484c7d9fda9720de94dc97 -:014ec0ddcde4433a546ac8528027a8b849b6ee -:014ed0154e34313f5498f93ed617e1bd30148d -:014ee0123c34bf8f8fdd07e6c075e899aac018 -:014ef018bd94487f8802ea549b0afd13c32be7 -:014f004b825e4a8dd68f03a075f4f3ef7e6afd -:014f10986abec652aed253b38a9120c38d0070 -:014f207c0e4c9f25bcd6b6e2b3e57aa3f369d0 -:014f30608153fc5dfba159f2ce85cdc53a1510 -:014f4067174912184b9c0f92f8ac90b1017abc -:014f50f9cc2bc9943e1a9990a80aca9d146daf -:014f60521e337e7bab5d84f12bb2e9b741af82 -:014f70279a57ce0ebf659f8bc056aea99c2924 -:014f8019791ec4f9f7ebe4762d88f654a8ecbc -:014f905bba61ac1ce2501b2ec7eb03b13c2e3b -:014fa0aa9b25241c00b676c84d24c108616240 -:014fb01551f7dcfb38ac9e8e34207831f795da -:014fc0338eee719cb9b19cffc584ed384de12f -:014fd02b9d9e112111cea413d34c818abfd931 -:014fe0a0049bb3e4e004eaa084dd358dc068a5 -:014ff09a62112466b9f56e926f0aac8ba85b52 -:015000d50efea5cdf98bb89d8f54ef36c5151a -:0150106f295f2fe8079d822b5d3e6669d0dc59 -:01502057899d719321a84b9f420f3c678befb2 -:015030e1bdc64d6743a0d03b2c1e333eb46184 -:01504072febea8bf75698d3994ff7126247858 -:01505051aa7cb2ff4dc2e8d1e734d8046090cc -:015060a8d28e730131f3a0f9a0d31b4ab664a8 -:0150701cdf93cd307bd9da85ffee06bfb0db9a -:015080f91a93201e0aa0f70a935acbe8cc6be8 -:0150908bb88e1dfcbbd55348c43afdf5d1b15f -:0150a033806dcc4e2b4ae6ea673366e4b7d7a9 -:0150b00077739d4dea10d92c36ba6c56cb09c1 -:0150c042cd3962d96d41d99e71bb81466d4017 -:0150d029f277589f134b0b06b433fef9b7173b -:0150e089a8e4801caace26f16f7d915c4e0fe0 -:0150f016b6729b66aaadd0c5963ce3ed850282 -:0151008a4e95b46671ee24b62ab2727cf740bf -:015110fa9bc1033b678258928048ef042d5689 -:015120de4cc5abd06522367f25c080e4ac4637 -:0151308978e8ef99c241aff709b358c8cbec2e -:01514032407b535e1d7a894526a384d0a85a8f -:015150dd05df3bf4e9f5d5d8d0248f293ab3ff -:015160fa6bbc2b9a4f17328c551758a847011d -:0151708f7208592610950655d72c82b031bf97 -:015180292d55ee57f595a4c8a1b98d732688d7 -:0151900278f476a33922df07aac5813be78524 -:0151a0dd272a6dd741e73c3846de426c424967 -:0151b0b735419f55c0ad29b8f9b1956f14f646 -:0151c065c487202cd66a4be4ec56c5a3199a17 -:0151d03813d6156507f7bcaab8e284e8207a14 -:0151e08b9ac98f57e6f793922a04b6c16a7c10 -:0151f0167cbae3e1f4b0848d51fe684b2a5b9a -:01520069ce9e418b14023fc5db1195536e9d03 -:01521032ac2a9e423607c8bfe7ddf47b03cbe2 -:015220153799871a6d179fcffa1aea2df23fe1 -:015230b0db8e13323f0abe727f198da72d498f -:0152400670a816bcf6e190dab7722a31c12294 -:015250fdc093abc1f4932171e9fbbb7a2aa0b2 -:0152606516ed227091cd2507223073b4e9972a -:01527028e14d19f530447441c658d1cc46d313 -:0152808a6258e75fb194489eb5007525efa429 -:015290ee0fdec6ded8b1fb29f1996a77c777aa -:0152a0d39e550390c36011c3b28d41a6af53d8 -:0152b0546b9391e09813e5752e4f6f7e9f7e9f -:0152c021db5c0517c5c8131ad542180a1eedd1 -:0152d01e2dd033ac5617069b1dc1e36e123698 -:0152e05e681b57a3a96107fe8f164fc6aa8549 -:0152f0111391d3d611061abef43f623ebce24c -:01530012c26bc91991317c5cb52078f8f38ef3 -:0153109c8121eb7bc91b5371189dde8fce6223 -:01532000401c70ecb301b9a1c672fe379ac556 -:0153301e34cab773f95c57b72df84b70de37e9 -:015340e6cc14d9104cc9317626e71f37cd0169 -:015350c009ef2afb6ae88f5e658a3cb3a2e630 -:015360577d6cf51bb8104c59b7dff5eb0af444 -:0153708d8cc7ae324c25af975247019f51ef69 -:0153802d870dbc066f927e11dcf2b6ea7df623 -:015390ad4d6adb9a8c0d4973afc7b4bf818198 -:0153a0cd7634497ef925a879e6d1dd179d1f34 -:0153b0fd4a55c502bad6bfc77c28b826c3bae7 -:0153c017daf29dfff0dab060d88a7eae06022c -:0153d08a58f310dcf0763bdc3a4bb72c82019d -:0153e0a2565e54887a955b682595ab55af2828 -:0153f0571f87bf1afc459ae8d8ea228b32314d -:0154000c9b1e6843628b75b97bf5657111be59 -:015410776f8ad8d05e456f0298ffb2c09c31c3 -:015420cd9b5d17d994e90ceeb3d4d43841c97a -:01543037fb38355a3694b2371f0c151de8f6b4 -:0154400076bb5a65a46ccc63f866aca94fa785 -:015450bfa0e0e498c41d0d99e7d410fd4346cb -:01546017c2646e30e6d44cf8ad10471b1d7e23 -:015470b8dbb802ce277a067bda6ebe380ff83a -:015480a9f69a71b06e6e97eaac3993b40a8ae2 -:0154909fb194490e80ac23c77a24a8f54d3f61 -:0154a0e8e22bbdf0387b39a5b3ee380355574a -:0154b0cfb2fa48c4e0bdc37e07cdd54d2b173b -:0154c01700f4ec4c59780bd8dd409ddf1b8446 -:0154d0f0fec44b8c32aa8031ce90cbbdaf8abb -:0154e0c619a220c0d99ec48cb7ce14bdcb2581 -:0154f05395ef06ed236f89ddb527b88186613c -:0155001c9e5298acb55105425214fd380d2bba -:01551049890e5821bd6a587995497dd74882fb -:0155207cf5e0bcda09c2cd1ffd8c41c700c9ba -:0155307a3e9079c4ea70857eb52c2e0defa918 -:0155400e11786a16271d82bebb14e6236d29b8 -:0155507ea53aee9e993b71f94e3846c210c3b9 -:015560e32e7383f506cb43b91ab1327e952239 -:01557030d56a6306e365143bb9df709293a746 -:015580d5bbd773ba29a44a07a2bcd4ad6f528d -:015590b5c54108b2508a762588b5592c1443e5 -:0155a00745c07fe1b03ca930076580dfb7f6e4 -:0155b03a6403c0249ea673e6af7d6621b851cd -:0155c088dcfed6e6a61f47f582320aa12c0a9a -:0155d08ca4336110bd80ff0ac83cd40c096a21 -:0155e0ed3516e4aa806a32430b6f315bfe9a5d -:0155f0b7843211725c5c4dc4c6e66b9371b9d4 -:015600b02a6dd5172ff329a0af6d137e09f1d1 -:015610db2d53918e3ec4aa1c82c4317bc1b253 -:01562098843a83a1018769d82b4668e86127d1 -:01563083becc730776d4026a93c3d2b96dd607 -:01564049caef9dff4f3cb7471d1f6c3782a364 -:0156506532055ae581a8c227d0493888af6641 -:015660e6c2f466068e33a8bebc9a610a9b7af4 -:015670ae1d92cac7e4438d35cc024f3a9d9843 -:015680235bbcdcbfde7042f93322c03d3028fd -:01569069cf2a161ae2327d652d89e9ecbb9dc6 -:0156a04866726f45c883edf53f24601e003e6c -:0156b0eece90fd3b87aac6a8d16bc999cce5c0 -:0156c02eabf870819f2cb72059e7ea75888505 -:0156d00a8e9eba0ef7235624d8831829e1dcab -:0156e09200ec7c80f9168dfe436f12480806ef -:0156f0f5712f235a9903a3cedc3602086e8f8f -:0157007a2da99322a7ee80db06e5762220a092 -:0157108b00b110cd111635a638d4a0599453a9 -:015720956ddb3564ee43097156e38a092dfbd3 -:0157304c39964ff0b7aae12655a87c2ca6d14d -:015740d2cce01b389ee339bb7bacfc629a8de8 -:0157506822ffa2a2e44e5f843fac1690ecc85e -:015760c76bb0490ce8804e47bd3872c3d02721 -:0157704c5e7b36f1080db66a63255e4468fc3b -:01578031dcde112377d0e0b8693d5180af5ce6 -:015790468841f0628a49e227639ac30c40b0cb -:0157a0b08b13f9f4ac9ecdd08067ccde359fb0 -:0157b0568072d6126805802bc2749053ab832e -:0157c09308a8f606e613520f881d3cf2c29195 -:0157d0cd4d8a644f18c9e1a93366320b84a7e1 -:0157e0c711d2f51c8103193910d2485db080db -:0157f0ec459bd94f34c70c59df02ab0f9a7f99 -:0158007360403b27f58a2dffc860813922599c -:0158101604bfc1dd56b6b7cd6314841ee26923 -:0158207eddbde9ec886f4a6c10a8cff02611ac -:015830de22355414b89400b24fefac86b4544f -:015840935feb8c39e35d32482260f8890be8cc -:015850bc72bb2791068f9b2dd91041059d57e8 -:015860ce21f9227a917153afaa9dbe2fea1652 -:015870df05529a1237cacaf5a5f967b1a8e35a -:01588079e2fa2ef455304857e1a7bbf52496e3 -:015890fbf6f37774863305515ae93d2e272fe6 -:0158a0274207d9822d4fae1169ca26860357e2 -:0158b0a74bd475762f8453207f2bfe6f31d1d9 -:0158c040ae43e1a7baac600f2f390696468998 -:0158d0f3590a74e9cb435eb3ba01b14a833dd4 -:0158e072c366bb3729821fbd90850f1472cec7 -:0158f015f6664d3d047d4b9fe0ccff86b344d8 -:0159001e920a29d4b5191cacf62bc3c936d3d1 -:015910bf18a3a134cfd8dca807c6627a78e47b -:015920ad2b508de98f56bfb6f3ced554e48d19 -:01593090c65dc7bfe316ffd7028b3b61d36a19 -:0159400509ed153c0764c8e2b69cc34e32d1d8 -:0159503afff856b8b33f62ba829634f8422f59 -:0159606e80a18d25bf8a8fe04c3527e1fe5972 -:01597078734b71ff54b41a1ba0427bf1fe9408 -:015980bbe4dbca96aac0065e2872cb1dca0ae6 -:015990283aaebbd47aab230f29d946a2e9a5b8 -:0159a03d23d73dc016be40fbff7850075ecda0 -:0159b03fdc8ecae2429e1df4018a06698dc579 -:0159c034fd1bcdc75b685616d1d767b4ae89fd -:0159d047321d5b57fe68cf5bab095497ddc28d -:0159e02d1fadfef704b35dc8b1ebee027c017d -:0159f04d46730c7974a83ac70eebfd714bd434 -:015a00164bc9c81862ae451a979ab22886eb8f -:015a101be04842f1a9aa2e0c78f804ca23ef2e -:015a20e1bf878c7833c8e71747a5d6489a6e86 -:015a30d5aa651325de6eba44fd9d98f3c60ed9 -:015a4048e34186dfd29c493c7cb3d0a41e34d0 -:015a503fb21a1230084cea23848a468c8d90f8 -:015a600ca60d16f3a70c96a852a5fce3d9c689 -:015a704da3a7a55ea1c57f9abcc6f2e312a74a -:015a8051c77a67981772299f696378b252493b -:015a9060d1cb2d3ab8f8b3a6a111ab075dd9d4 -:015aa038262d62021f817b87c9c5f4bd3f8c07 -:015ab02e9bb79455cd959306fb3dc5048922b3 -:015ac0b5b5b1c402b3f7fe9555351d47158a43 -:015ad039d4e1d50e469dc198fbc75f33152760 -:015ae05af9f8c2bc6b8b17060b6818df85de73 -:015af059fd50a19a0f6176fe053f6af5deeb29 -:015b00cb235b7ec4d19d30094f518fb713de41 -:015b1022d00f26cb53fd33cc28364c0b027717 -:015b2088b53a7f4213901398a529df020f649f -:015b30bcfec4f08991ceffa8560d7fae1fcb46 -:015b402e1886586f249a8f4e8b9c0ce6a4e9a2 -:015b50ec21cade8b2341c647698e7892891815 -:015b6049a7ab8406b55d840b26faac34cbd618 -:015b70f524de2c39ca6770435ab41e566d09c1 -:015b8015f328df61d3166ebac7f70a21f05acf -:015b903fd076ba11459b7723d086aadf7b7d22 -:015ba014515e79a1368b6088d23ddadcc503c8 -:015bb082833904227e7015b84364362d0880a1 -:015bc035332aa26af60edeedc260e10dedba66 -:015bd0dbb3a8ade450b455af3cc8edaa3e22f6 -:015be0b1c26548fa608700fffd74244288a9c2 -:015bf0c90577047f109e9b0bea185145c1c172 -:015c00ca62b352b81997ed1f332831c6394e85 -:015c10ec93bfa7017e50c01fc7c11e643a417b -:015c208a144f50857051a052cd719b027eff4d -:015c301832fa52b7c5e20b1ea3e1f6602e2568 -:015c400a507307a1d89877e7f6d98de7271ac2 -:015c501e8d83dbbd0b2222c07ea04192441410 -:015c60e6a9dd07bf9de2f2cfd6f797c11b8642 -:015c70030880f13773630d6101045e36561171 -:015c80d07249f8bb49c4afa54d28634f911122 -:015c90efa4015c0808ed5d5824082da8ad1975 -:015ca07c383ba02955a46264aef7d560917560 -:015cb0c12dc23e41416c13d8a16fe223f6574a -:015cc031b32c668a345c3c8f874c3acc3e130b -:015cd0a23735396e58efb7e6cd7cca8b35f754 -:015ce072f165cc8a2997cf4929a32acf3c271c -:015cf0f8d0a00bbfec57844370470d6dfb34f6 -:015d0021edbfa20d788f191db1432d14103607 -:015d101bb854de69ac88b0d2147d0db026cee8 -:015d20d4f79068e76e15d9df88c63369a2663d -:015d30a19dfe011d87552a847bfacbf98386c8 -:015d40a4e09fdce5d05e715e02ff7a1e047079 -:015d50ad4b55ffe19054ba4269fec5eaad4362 -:015d60f2b449e119a2bc05df7ac6521f8380eb -:015d7050534fda778642706232dbb2610662e4 -:015d80eab64c026204cede79babf33278ff58e -:015d901b6ca475c1a8c3f6455e14f99041ccf4 -:015da0df8381d520e68b64c1fee51d943943af -:015db051e27ac486f529719b11f342588e8b6e -:015dc0683a4a4c9e37e10add7e723040d8ab46 -:015dd006bb9702cae7ef94ac9894155bceac22 -:015de0ce286edf19a90dcb7af9ed831f248afe -:015df0d5c8402ce8ec951cefdfd29490f0f732 -:015e00c3ea06bd7e24dbabd45ec26b13351113 -:015e10e6ddae20c954c4a0f72ec61319b5e8d1 -:015e20dbb07ba53c416f5a6bfdc08eb9a87550 -:015e303b345637f0f612d2b723ea3a0a6bb929 -:015e400d9795bba64e61f546ea3437abdce0f7 -:015e5009c885a78fd261f521824c0e006dcdc0 -:015e60434810d1cc06cd52b406a7898170375c -:015e70209705595b8803ed378faf0d6d50a0b3 -:015e802bd1b3097459d55330b3e1fdaf57f7a3 -:015e909339ee317ec701ba3cfc236efc158a51 -:015ea04b2a9c86f0d35e8f03e637920d5d4b8d -:015eb008bddb74a7e550868399488bebfa0eed -:015ec0f4a5f9ebff604adc23354db00d300609 -:015ed06f13ee990177e43b6814a85bb9e93f44 -:015ee0a13aa01f2c2331504bda7a05977356d9 -:015ef0c770c7f752649f98144aa6157ed27fa3 -:015f00c9e969f685f4572c04a83ff9ae8f6502 -:015f10895020b5efa0c70d0ef6a47ea23a290d -:015f20f67aec7183455dfd4c4ffec16cc5c7eb -:015f30528ac053339a42519ebab6d63d69dbaf -:015f40acd7465b71c240d39c50fdef4fe317de -:015f50189343fdc16c9cb7e80d569dce9f30ee -:015f6042b93b85fbe77cf5a2a3a56395a4c0b0 -:015f70b10d60ac73b8b25da1fd6023acf6b3cc -:015f80fce8e43e6e8166585afdf75489da64a5 -:015f9088d2272cd8e280af2930a8518c590485 -:015fa029b2bf5d1f2dfc49bc92441ad75c5b9c -:015fb02e178404c0ab052b3b0bdd44bd110ffd -:015fc04dc6d2953d86679561c0150621092fdb -:015fd0bc2be7d9611b7a2312980cdfaf75b55d -:015fe0a9f1a0aac6c5b2c22ed353f54a9c9b04 -:015ff076335dc72a1bcc0125dbc0847b5afdd1 -:01600080d3686d7708664bfacf0e32b318d2e9 -:016010822c02725e85aaa624e2ccaab3bf487e -:016020a65e295bad353dcb5374117101c64e73 -:016030d5f9e12165973364f4d114e28d91fdc7 -:016040f4a63ed47af2c4410aa6861ac62cf0a7 -:016050e103035b1604ccaec6f0da560dc75829 -:01606068dd42c552e3707ebfa82e00f587e641 -:0160703d7d01fc0057beb64677c4ac61b1e768 -:01608069759bf6334e0b1cfaec0febc6830097 -:0160901a573511f4d7e1c210ddcf4273c34c26 -:0160a0d80600fe3d91e2340e8c4412248c9351 -:0160b01f734dad51414b728af9ab1271bcd268 -:0160c006dfee49218d3cb6fe8c6e98f4c14a9d -:0160d0345129632d20f40823b6d335bb59175f -:0160e0f5d6f84d3e5ae9400c0a64e5e2ec95fb -:0160f0a0c05ba61200df60464721c70a3082d7 -:0161000ad7fba79432085a8e7743c9425b42f4 -:01611040ba20197f67d59bf7eeb8adf9d30180 -:016120e8c8877c7494955000cfad08deefb530 -:016130375eb3b22dece6bdf78859b370157343 -:016140d60020d63175b1de08d6591a87ef6bd2 -:016150e79dfa3900fd05edd39b7241c5736a4c -:01616072c180a78b8d5ee697498ce419a2fc8e -:016170c1a8aeab573d3797137f10065df896fd -:016180a65ab947a6a69b0b279401362500d001 -:016190b7fe98511bcd4fdd3b7ed516ebfc6919 -:0161a09162ec7e586a22c3736e86f6fae11a00 -:0161b0d52949baebbce0146189815e45dd23e6 -:0161c0cc24cc73f911d76c99fc0845be5f49dc -:0161d02954b1552e67403352f2fd3ccdddc3ee -:0161e06b826706a666f01c79fd51478d44faf5 -:0161f0dbc054214a2b14571634469bbb50e5bd -:01620099a7ff5a535bf347c8b67637d99a13a7 -:0162106d2ef00c6a64a0d9c85c28f04d9bb589 -:01622051584f93fc0bb50a818dc97466625e2d -:0162308f72f9cd364d1ca38f6889c68c268f93 -:0162400addf0d289c60b0597f42d0964e65af2 -:016250c93578777c72ca278e33dad4b3bfdefd -:016260ecd51b123cc5e93c1efb442b0cbaece1 -:016270136eef453dcb354c4a6021eef91d97c0 -:016280ee6309245ea60cacacbefdc912ef7027 -:016290f9f3b1f1dfb454c4073d2c9933f520ed -:0162a05c4b7b1851927a672cbe04e12c6535b2 -:0162b008acdf3d5703b62983fe26216a6136dc -:0162c0c76c1df951312f74a9fa25dabe58220c -:0162d070912d7bf438b3811bb07b5fe461f538 -:0162e0c81a5e46113327c41cea19088466a817 -:0162f01f40bbea9568021e7bd0055ee4e1901d -:016300021aca704cccf1c902960f6efabb9969 -:0163106d9061b051fe85c413215c839bb5d6ce -:016320b8016c8cc07820df1cb2d7be0b5aee75 -:016330e244fce425070951da3798f02f3ea070 -:016340496c3f7dade1a70ec0e969e0bd3b6023 -:016350500cca8f107d6ff43c5379d225457c6b -:016360ae712f4cb64d8c02437ae3c2989c9350 -:016370c68656b635c3a1dbd51ced6c670339b9 -:0163806f08741d5d41ab76350b475253540dd4 -:0163900f2b225697556e552cf09d55d57c6f4b -:0163a03eb397ffe96afb996d6e98f7fe1e4511 -:0163b004a62366a4a6d658130ae7a556060701 -:0163c00faee543ee0242221a48a40b02a87b86 -:0163d073156285ba83aada66774e82aba0aa37 -:0163e025d429878bd22995a9ab1ee94f3539ee -:0163f03d7cc14fe2eabe15e0a458787319bd38 -:016400b3e02c3efe540fbe1169d643af6e75d2 -:016410714eb3e65f8a6d701d893d578ef0a525 -:016420bde49ed6aa1f10824ca19d3b28569db7 -:01643001da0195e37e54cd4d87bdcb5faee779 -:016440a3b0e9f4132403ce5afcdb389d4eb8b0 -:0164508329e15fe2a5309877817c8c811d39a8 -:016460266071c1f732b5e6c3173cca24991193 -:016470b728790e8728921f70b1d838ca3323d7 -:016480fd618f2b84419a01e12cb74b9e396dfa -:01649032c45ba04e17bd9da14c801d23ffe0c7 -:0164a0bb52b3564c4d4f4c9eceda725bc930aa -:0164b0fc3697f703f11e6900dd3607caca6538 -:0164c0b5414a9fb556f68e2e79df6640a3abe9 -:0164d0784e977c0b953cf79330955da2b19854 -:0164e07eeb2e8b94a43d94c92f615cd0aa1607 -:0164f0a15bbcd2fc7959247716bf4643cf28df -:016500fc2e7c8b5b03a7c2aaa56fb110ee830f -:016510adcc282a4c66f7e5869e20110e7a24be -:016520a2e9d355db07dbc3d4288949bbd30912 -:016530a26c415dc512cd53d26ba5bd1b708652 -:0165403f65e9f1815d9f838cb24b93763ebc71 -:0165509b1f96d28ff00e7e5542c76197e52e8c -:016560a999ce909068edcd33f52f44cf4f6b71 -:01657008e64a7966358c55ffcc9e9189a0e39e -:0165807a9e03daed6903226e60ae1da67c0d28 -:0165902c72950ad06a389ae7b846c35fd5c156 -:0165a0d25c742293e58568c7d1d1e588e1473b -:0165b06a952997979735ad9215a4fd4a567499 -:0165c006194f8ac266508b29271e2028bd5ecd -:0165d0faa1eadd8828e58b205e9ddd90d3d4a4 -:0165e0aa041eb77a7d5099c902dd63c921d3c6 -:0165f0ac13f18fe929ca09b2d40cb07c5cd2ca -:016600089390cd846b1d141c0606df041f15a9 -:0166107cabb8829ba2abceeacecc263d05cb13 -:01662001701bb99fc9f0ab5ea12e3f3a166a04 -:0166300ec73cc42b78d27d4c4a9bf929ae3b8e -:01664098b247ddb67ee6f85cb9428ebee358df -:01665099a4ff2a244d74db520d4329b5b1d6c1 -:0166606e4c2316ed508689dc337750f6618e1d -:016670ba354584c1e377c4b9df1026837c1b51 -:01668040a3323f1594cb93b75d10a6e82b61d2 -:0166903391e74e7d6582528ddfe50299d392f6 -:0166a0632b72137ef943d5770d7a9e95668893 -:0166b05275fb1431df6e5b0e3c41b87bdd5771 -:0166c019380b546314b907690b16fcdb123ef0 -:0166d041754cc90453aa1724100850877dfcaa -:0166e065bdcaa7194f122e8d8aabe202027ef1 -:0166f0efa738866ac45a849515ac14f692791d -:016700a9ab6e920e31f147ddac0dcd36db5144 -:0167107c69cd07456796b14a27f006b80c3855 -:016720e0dc5330ecb73885a2e0eb3a8d2d5d66 -:0167303477c9b645137d4d48314954e894aea7 -:016740c5278be118df2489fab9387375b3d4e4 -:016750f4622327cdf8262ce29e0526f0d0ec78 -:016760bd43fc61a13ce677c3888702d00d2eef -:016770ebcc652619be9c2328213f2fa62d2f51 -:016780f48989bc7a040f09a3b4aebfef0816fd -:016790d50c7b508300444692929296fe7de0d0 -:0167a07edd11a3caa1f74ec0077bfaa33a0087 -:0167b036ab9ebba34db21caf16874410474d93 -:0167c0e6b020347e6900a6ba7c3dddaa2c118b -:0167d06a0c6d184699dcd6fc9b293663e830a2 -:0167e0c6bb33c3eb087f313047d4c34a58395c -:0167f06d2582afa173147c4ca7dc6bb75450e7 -:016800b43ae6c220aaebb6f0a81afc1ce3ccd9 -:0168107572f0ff1bb96e111f2afb5fb57c6d49 -:016820b2eb51cd6e2b32e495465407197c2e9a -:016830eca20570efd681e244495417763a5453 -:016840120ee60fd619cbd510b249240fb11dd6 -:016850aa6cb55a1bf5c78cee90b5668baac944 -:016860c392d0bc5ea3d6c7e22395ef8988817d -:016870dcd6e03725ff0fe8c731ae7f2f440d33 -:01688073102194a2c54d97e7bd0c9749b1a17f -:0168904de839ae89c9bf4d411819c448472dfc -:0168a0bdc5904f51bcfef19c358c8450a60174 -:0168b022e40ac93d76ac8f668d3332feb17bfa -:0168c02bfa37078f2fbdccd900f8bd812cfc2e -:0168d0d2cbbdde15024a1083ba7023a5343b36 -:0168e01960d644c7fe166aa4534db86eabb2f9 -:0168f06636267fedd91ead45c4750bf6e2558a -:016900e052942983105f281d050c31db61a361 -:01691013598b376efff2b0fdb101d706a2c240 -:0169208ed29d53f3b3b4c0f576e935f2ee554e -:016930eb99ddd5d11ac85deb32714f502538ce -:016940495ead8233507546909f75e34e874968 -:016950cfc842f70ecc25fc721548448f55b24d -:016960a29f4a525d3ba2c9beabf1b442ada9c9 -:01697092678b5cf99ddc5f0eac7a5825d9f145 -:016980514824c732b9faf0064a354b47e543d1 -:016990f2a25f4aa5772726881f350cf10a9083 -:0169a075cd4cc75fc6f9f5e788a4bda6683a63 -:0169b07a3acef3266b88c0fc7a3eeedf8f6f08 -:0169c0e386e01221dd37733c8cdf4b02e5a8df -:0169d0f1813c8c5d1b5af61ddd8d45ecfb6502 -:0169e016b640f8b07ff9411135622b91946801 -:0169f028aa548ad9b8ad7f440135a65c3be389 -:016a00e351d5e41db21a285e46e955771c8e76 -:016a100f9cfda652523fb449f87c1ebc36439d -:016a20025ffc27837b2ef41498d3a8bf6c0c60 -:016a30f82be60e0ab1065f25d7caff93a9a214 -:016a409d0f9e89ed0fd491871691f79688b228 -:016a5049103bfee7208246a06eff42825ed97c -:016a60bb26298c9c3ff59b785233916b859571 -:016a709d16bfcef227d93756f6f2c3a315aa4b -:016a80a0be0da9c07a9e6b53b9415b87f06af3 -:016a9084a23bae7b566ec1810cd31941617fe7 -:016aa0e45c0b5c1c474bd53435a2654c2f2796 -:016ab0feb722d13038bbedcbfe718eccd4ece1 -:016ac094b9f785b0b5a6721c4ed23c2e191193 -:016ad0dda9081eb9d36ccc99a143686c8d4411 -:016ae001ecd8a4241511abd434fc74f1e40c4e -:016af05f4cb97da32d1f49c4d751ba18d58e0c -:016b00a47ec249972cef4fce421e62b9c3c2f4 -:016b1090ee42b92a18d49aaba3749916ad85c1 -:016b20f75f3085d72ddd9a51a12223fdc1708c -:016b30360329c637f4a90d517580c97ad8f133 -:016b40289a4d53991cc1dd8f29061f6829559c -:016b5060ad0bfc7ed220cb1aca6c337c767f01 -:016b60ab38bcf74b7c3032e107bf18d4ff6183 -:016b7078edce91d092c25ef14cf6a73431e608 -:016b80935768cae1bd9cd5719759af5fd85edf -:016b9093e69c7fc82b6270236b8877b83caa24 -:016ba0eab0edfe2ee5b6da05ed55a7278abe73 -:016bb0561786eaeb420f270612ebbf7bb953f8 -:016bc046e9382513508c2511873d82385950ea -:016bd07e15c616f6bdd57afc411ea1ecf5920b -:016be0771dc5e2b82286521db6e84b3850e8fb -:016bf014e7b3da6904e981ca3b615c088fa87f -:016c00abc689fdd23fe394b31b7f1291996274 -:016c10e171fad29ccab8fad53185d8ca914bb7 -:016c2081474bf8ff0e745d1d9639bd6dcbe744 -:016c30807dd50ec5d53842dab1286ee43ac7f1 -:016c40e1cff7103d5e86210f90fd6b7c48cfea -:016c5040be33e30166388e990551241063b643 -:016c603b3ced9b9c56a38ddba8fd3020a82b63 -:016c7054826aff71b8e9524021455b9e18b571 -:016c80ffd2c74c5a29bdd8f9c9500a7a23c83b -:016c90766f245ec5967e21a29c4d855de03a27 -:016ca06c3980d10052cf8eacaf5e5393c233e5 -:016cb054d70e3c49ca60e9f64a5611194c468c -:016cc073a92b634a8233c20ec5307ffa5ce3ca -:016cd0e0b579af81ee51f7feafb2ec7e7f7cfa -:016ce077997ae3f35643d96be9862f1a3e953b -:016cf053ceb91181f44a12475d4a95756385d3 -:016d00a190e27069004833955229b74a7873ce -:016d100eabc924fad1b94cdea467bcf387a5b0 -:016d200d5f51a64410a8c27975c86a5ed85b15 -:016d307635e0324b7521183d35687e63ea9aa0 -:016d4098cd840887434ea15d8df6d519f75a31 -:016d5092a60c7ffa9e6197c9d56fd0926503ae -:016d60ebbce3723dc24ca772f181ccd3687ecf -:016d70f07e1e698962460dffb6a08e4fafb14a -:016d80beefe67f6cfe7fb7cbd781afbbf518cc -:016d90d5d15c0cd01401ef9cf9dd202048009d -:016da01b5deadd3227550a7b623ea5ed514526 -:016db0254f5b799ea5d4e9b8834f2b37f15027 -:016dc00c41b340746cf714c6a33276d84fc373 -:016dd04eb65b1b0eed7b24f69544077084ab48 -:016de00274abe016ce83480c552ab08a4f1d08 -:016df0e202eb2e1217c7e652b0162c4c2a6ee2 -:016e009cf3a781a7d10eba86dccc529e003ffd -:016e108340650343746acbc16759822845f5d4 -:016e204631f37cf0ad9aec4217fddc8970e177 -:016e306e150c707b1ff447ff28a00da2e9efcf -:016e40cb897456e0daff84b8105e87c4747258 -:016e5016cb4c4bc5e5c7280ba344c33b95290e -:016e606d9832a833407254dbfb82b476256a93 -:016e70f994252e9913295181b48d283d2c7aa2 -:016e803552f174318ea41b6cdb84ab63cc663f -:016e904a59afc15c08d5449f2956a168c81945 -:016ea07d0b6e29a985da9b38ccade1e1994e2f -:016eb07ce8b0b531d2c9eeffd5a1c410c55b7c -:016ec0423de6a9ee38091143eb16bb1c1fccf2 -:016ed0604919905df3911f8efa3942299f016b -:016ee080a023c793aef91ddba5df56d959fb33 -:016ef0b653bf1faf53bb902676f562625f2cba -:016f00ce86a07be19386e9923b9d9b903be3dd -:016f10f6c33cf2173d1e29983c0458fd60d14e -:016f2033d5789888b1f0d4ff02fb6a146a3e6d -:016f304b4774805d23542b38887ee79cc4a542 -:016f4063c6cab738cda9ea36a060e10146e628 -:016f5097e94645712f2aaeba8655e81d66a6a4 -:016f6094f314b856f8e9d030bf2b8ae5390586 -:016f7037c0b278ecb7cb9c11daf2a0d1288dc2 -:016f80f30a26ca6eeed07d8a24daaa16a803c7 -:016f9088faa5e477c9122468acbefe352e59d7 -:016fa0f8fd87998185bcc9864b4a50fc5b76a9 -:016fb0703423291088d1a94a1f15a1a69a2b2f -:016fc00b01ff1e937862a182581510c9563df1 -:016fd04e3f664669b091dfdb1ec90ca834bd57 -:016fe04ba5679b20a11a4deae28e516e62db91 -:016ff07eee6a2a1ce749f41dce3d041af918b8 -:017000e30de86342bda79faa2c08ecef66a794 -:017010868ef76ab2de3adb128eed51ae687348 -:01702043f7094bbcb029b02f707c86fea7422a -:017030ab2de37e888e208849c27fece33ac0f1 -:017040f782c83e553f496c3f4fe0f8d808dae6 -:0170508df7dd99dc49102306245e3be63131ec -:0170606ff3751cc39ef414d27817f8885f28f6 -:0170708e5e94e4a3a0e5819a066974bb2573aa -:01708036ee122a45445f2c7ca4a55f19243f9c -:0170900fad64f89ec8d150126f61364efa826b -:0170a014778d48f6088c59420725801c14067d -:0170b0d71fe7b2787263c16e3aaa8cf01448d0 -:0170c063fa01c2305a69fe69121b7f1cfb2c79 -:0170d0f13d8fd74c5f9b39a3149229ad15c910 -:0170e00270e72829d1a83b7d8d1ebeba62062d -:0170f08830a2f8c381810f08dc0175d9416e98 -:01710089aad664516264be5a7f15bb1aac4219 -:017110d3f3e21d15412cdbf898cf73da97d929 -:0171206ec7308486c18ba52b9a2a82beb2e491 -:017130c53e343bd3fe992fc8864be36aaca002 -:017140ab0fc6729cb2f5d44f74e88aa4988fea -:0171509b7cb601af22d9e74e01da0e01036016 -:01716019d11421f82839675afde5fa7fa41512 -:017170ee55efae42935bf23919ee93842f2a8d -:01718067b853741ec02ec4c25308cbea6c0e9d -:01719050e61e1c714481b24530a4f0447e3dc5 -:0171a0a3a0da2ad578b33dcd75aad859490bc3 -:0171b08720165ff5df77aa1f3a91c8f1d069e7 -:0171c07f59bafd81efe9375434002defb61904 -:0171d07a3673c8007bf546ab068bff8741b2a6 -:0171e03d18195e23263d8b3b757a2d56b22063 -:0171f0ee742eec808e071ebbf124cc8c3fb6c4 -:0172003a16dc8f70a07817d74b5d5285df5c0a -:017210c0016395a0f8e3efd53f342443869e4c -:017220961bd76168b1724f7d846919bfcbc584 -:017230b6a21f5c699733a40faf441616d132b8 -:01724045c804a44cc8b49607bb86abf69058a3 -:017250a99f39dea0dc59613277113ffab80343 -:017260b85b24c02c42649203b639f43d85137e -:01727025410be4ecb32aedfa17ec9cd308da78 -:017280bb2e86d41077fd3e2ec3e730ee727272 -:017290bbd1386ded37a4a9299589f78f207998 -:0172a011596c96d611ba32032352745d70c8dd -:0172b05ec04889ae549c6c1e768d646728f460 -:0172c00d3999ec20aadba1db3c6eed78711472 -:0172d089ae2ae832324b1c6e06949da424f047 -:0172e0e3d6b346ad4cf5cab0119b10d9c3b135 -:0172f0922fb22a5a47366e3f91bc54eee16921 -:0173005b75cf9d180e447c5c0598cdc7a43c49 -:01731069dfc26b67d1ed263b23c73c7c704b14 -:01732032e49a06adf5aecd984f8b49bedc6d78 -:017330065cb99edb40a54e9a3a0c11c0b1e0fa -:017340e8df61e592731049ff665f024a8f6dde -:0173508e1a50f76214ab9c6513ae0e6cff62b5 -:017360347b35d2e20588039b4822807be22c6a -:017370ae00ffc2f87699eabff1309cb15acca9 -:01738034bff359a0f90fe86305ed0f8e1624ae -:017390fa788504a9fba07d3b21b3a14da90523 -:0173a0a8cd543eb9f3cc9449a01c953908766b -:0173b0b304462b7b930d74987b51b87e84e66e -:0173c0b0a3caa763c0a0b230fc54bbbc2a8a6b -:0173d0dd1adc52367a847279bbe20b0cb16f93 -:0173e0883501f4f13042f4956e1c24ddd701de -:0173f0cbe50447a2e29edaf9729ba241c3bb47 -:017400702da5a500f3c4fd07db0162c8619ebd -:01741018ef0ccd26578e9321740e3f6e54111e -:0174200e38ef2853a68d6f84990f70b828d194 -:017430893ab6224d7a7cca4fb667d92c07ba47 -:0174406853246b68417b556e2d8644aba86e00 -:017450dc060f2c0aef262f637ee5e3dc217efb -:017460bb3e09d2217c3376ed0922027d7bfe89 -:01747005218299788cd3f962d9e9f6d11cea86 -:017480b93973294bfe43ebfae408ccfceacf21 -:0174906d2b4b3dadf52c2eabe32a6b5fc6657c -:0174a057fef55a4ce7b36d43143e4806a21cc8 -:0174b098b3c2fa43e7e79cdd18d41ca6c332ef -:0174c02505d51f94979cde967256a08f049a21 -:0174d04b4d5695239fb310bc3b5db20808adc0 -:0174e0951681282cced861971c65c5dae350ad -:0174f0e0b3cf3c2d3b9a81e995af7cc938d0f9 -:017500e1283c2dcd7b95b25f9f27f6a61f8594 -:01751088458773c65f7eecef21fc782a650723 -:0175207f656d5cc1c19a37eabcdc0ac300ad55 -:01753014fc8e46f3368277977424310b95ba1f -:017540fa06bb43989f6ca09cf8ff565f618274 -:017550da9c179bcab2d5ef1466f2c89f1828e5 -:01756012a06fd3af3659760c4ceedcb7eddb74 -:0175705dcd73266e4bd116a9ea11d9babfcf61 -:0175804a939378a0d501643410a64eea3b39ed -:017590265013b002c1e3bfae3e4771a2620b62 -:0175a04afd2377da6e51adb2ed7b2cbb08b130 -:0175b0826a14c7972c268844ba962e8b1fe11d -:0175c099f306bd0c43874b6251c45927f18375 -:0175d04abca42a743e386915abd7ed68912cf8 -:0175e0548404eba4b27601957ab2a9a1b489f3 -:0175f0af54b99f3efde16e6e1b7365d6abbc3f -:01760047767639ed2eb965f60db7cbc584dd99 -:017610214b1be60ce68c3b7cbfc85e8388c56e -:017620e0121439ae493632f8692db8a153f70b -:01763031b2a760a36b8edff991c7aa893e9285 -:017640486ae932aa8cea25222b4ffdd3198cac -:01765083d1faf6fedb9f25e0ecdfef6c863ca9 -:0176605be5ffffb6898b72066b7908e5083401 -:017670fef08a419799276ca4794a2b9fa3f9fd -:0176809b4603842206be4ef420121b093f8491 -:0176907e53b3a52b222a0d1e53bc48c0a0da1a -:0176a0bc02a0c1ddc0fb4e19e87a1f785392a3 -:0176b0f8caab27b17a338f1c409f8e25a5d6e7 -:0176c022cffa3b281d900b4e17b176e9df4cce -:0176d0c6f49394ea232889f9aac7b7fef03870 -:0176e01530d46bc997b5f408cac12e127d9292 -:0176f08d25c8b59a50d16e1ea757dfbff055e9 -:017700f7f4e460939f300ffafc31b2f54e8542 -:0177103c6ef6db678218456b5268e2709a663f -:017720e4ddca597ede3880157d78df819b8594 -:017730d74f096f2cc108b9d0c0552b8538c430 -:017740d8e96f6489b1a22178b48026116672dd -:01775081e9e7185b55d9117f870012646eb882 -:0177608300a5ddf28bfa49a10eea7e99f86ca9 -:01777011ab5939c1f4ea09b3669307927f8497 -:0177801d6d1b2f99346503f63f0d4d6c859694 -:017790adba14f7d1fd0af7d14ce183d4e9ffe3 -:0177a0440506967c62444e7631c6261c7cc39c -:0177b0f525c2011c32cee0362ec143611fce1e -:0177c09aace5f64033044ca8641fe8e62fb8c9 -:0177d04aabc361601a0400911f5162b6576e4e -:0177e0d7b422669416cbec058114650b83f04b -:0177f05a031cb56f4f3b2bbc7e676eae25c76f -:0178009c21a0a94b24b871db2fae1f3bead81c -:017810b067d41c6d540790f262229660b0b7d1 -:0178201ca866d2896fd722aaf0bbc71db4e69c -:017830c0ff67028f34933316ffad0035081537 -:017840f8d91e18ee0d6a8a69f60fa3bd9a59b3 -:017850d51e5613bda8e13638ad321d99e05be0 -:017860c2dc0ffe1e01ff7a02cbcd350c09452e -:017870e2fdc5165897a2d2d2e6965159e82378 -:0178801d4c28bd21f4e4856dd1001ade536179 -:017890a80340c16a4615916d10e4acd5f70e14 -:0178a0d349c40ac730a01e5029fae30515f64b -:0178b0b1e58eb5ebffb659920016b1f3968eaa -:0178c0ade952a3c53829fe277addd8a866930f -:0178d0683ce9b56d222e1b31e856e8219906cc -:0178e0a8c15d181bd2722f8c4993bfd1de4c86 -:0178f0587743c068fc570b5b449838b6b38a85 -:017900eafe0d1cf4f7dc90cb640a95fa171c6b -:017910d555da5b2fdad2c50502d5849e165527 -:01792061334e2de8f3083574081905e769c50f -:01793088b80c5ce974f257abff9b5dbd48115b -:017940a6ba3d13ac39bfa340fc20e699f56086 -:0179506fca719a677a8130d99c72eb19d44ce3 -:017960bedc53ad5d756f8ba27b925621526842 -:0179706c2f854f6f828416afd6c5073af19ea5 -:017980cb153002dd09ecc2812303ff1c2316a6 -:017990a9adf960f95d2c63dd923847c20894f5 -:0179a041caf7197e8e3fbba9363d67fba6dba4 -:0179b0a9c18ef5bbb4d25027b3af5c4880d3f1 -:0179c0fbea3b97d62aa4550d8080a2f0ae66d1 -:0179d00898f441e95c96d4aa305b7eeded984b -:0179e04c05a87ad1216f0fc1c0128dcabe8d9f -:0179f05df223fbf86ab2cbfb070497dde26c34 -:017a00e4dea594fd1f6d26554635e01eb15666 -:017a104b38cca2286d4a4534ef155d7a88efa9 -:017a206c806d802732f55f191ae12f437a5e2a -:017a30d8a6106691eabd65e84867c09198117e -:017a40c6c737107b7c335a6af318d9dae6e567 -:017a501d4c6444b8e5566f0f548904e01fc023 -:017a600b8cc1f64681b64f1d40f5727fd42375 -:017a704a9decb5e7c912cd5bfb670cf9665f0c -:017a809d9ffd03f83e622d509bd6adc91d8456 -:017a90e1ce01318a79742a75043f2caec3e270 -:017aa0b8acaf2dc48c456fd4368b2d8814ff08 -:017ab0cdf8fe1ce29610a0caacf821f774e219 -:017ac0b256fd3c02893499c8553ffb99850c80 -:017ad03d715d0bdc35a16c14ae0e70c465b46e -:017ae097808d294af2233e431fb08c220142c5 -:017af06d4dea6c90d980124b256cc83abb6df2 -:017b001e07a19eba75c8abd1c2eab82e32eba2 -:017b1086bb2ee6bebb1421cac9df0033f96c89 -:017b20727c9b428ed6df31694f06996a4bb6af -:017b301958bc64041713d015f6275e66cdec45 -:017b4075ad4fb142c2a677503d370284b0f09f -:017b50dec57af3a2cdf49c24ee44b32a26e0bf -:017b60e28c9ce4a89a008dc7e40eb8cfaf5c19 -:017b708b4a2d14d48d6d00bfe58aeb62d15a77 -:017b80fe5ad1449f5d29ab317b75c0d450e8e1 -:017b9005e811bd3e02ccddc0a088e3987f2189 -:017ba05ce7a79a41d680198d06565862e5dfb1 -:017bb01658448126cd8bcbede93e306f33c25f -:017bc0560cc40b410275a73485e2471660ecb5 -:017bd071121b05df2ff358082b7dbb4551f331 -:017be0f9c049dc81f450d7b1793a1276eba442 -:017bf0c2d8c30a2c619efb5b6c75b79b796968 -:017c00099d2d002add388bb684c0e773090187 -:017c1027051cb7a8ae01e345ed384c6d40e6a0 -:017c202f36d80676b468fcdf72cd4cb03e2826 -:017c3054374a6296aa6b1517822b9ed30e278a -:017c40c52b553a71de02bbfbccdb0b06f0b8eb -:017c50eed578c25d15fb4faa87f1d1e79b4e7e -:017c602081104ae6858632d5ee6710d8e26b4b -:017c70a2723cd2a1f0556f359bf19d5e15bdcf -:017c80763cf6a180bdfc2c806af839a1f46519 -:017c90b6aa34d84911a6ff6155512e22ef8418 -:017ca096dd9d11839fbeb1b81e3fc3946fa5ac -:017cb0d67c53ce844f35519feeaefb5d08e6ce -:017cc0ddc0d57779817eceefd60f7656835de6 -:017cd04d085a61601ccfedb3e0f77a5b07b8d9 -:017ce056ca10f297d5957d67f210c78a8d89b2 -:017cf09b5340b7e280e7fc13383e47360b315c -:017d00b93b0657fd3205e96bdc70e07b8fb060 -:017d10452d75ab16bf608128a7e960c5025a9d -:017d20d3d27e25617d1a5102cabea6b44b4fb8 -:017d301f988beba3b489cf9cc6c5656339f9fc -:017d400ad3b2f7cadf35d910fd40e4040f2cbe -:017d5089a5408852a6e6df3ba00ede2eb96ccb -:017d6034f41721a80fe7cc822e8da832965d3a -:017d70bf80f419cb9aeb3e5dddc4b09e06220c -:017d80857d901554645fd00255623697ee0124 -:017d90507880ca2bcfb7f487205f2592152638 -:017da07e01b3ae5c657e583b7623f9b99c1b3f -:017db08acc877c6cb7b65b15027b2513d127c7 -:017dc0d244081975891178d31d022cb012c689 -:017dd0beec7698ddf053c11eb3786910ada694 -:017de0f6d920f8cacdaab2f81fea5fa7c0a822 -:017df0e8be2be17dbbf13cd9261d8ca1e02e68 -:017e001cc14fd9c816c3a7f9ae5c617e464e98 -:017e10cb593ae6fcabfafbfaaa30f9b48fc549 -:017e201220ddac82e9e72f1708dc468dbcf017 -:017e3088a31031561e9f121a125d2edba8575e -:017e40e3ae32080192210c37d193a8460ed3cc -:017e503bfa4fcfed423c6d160cae81ec63ac0d -:017e60f3629254010ecbda88c1293a3fdb858a -:017e709b240816a73073476ed167e28005268d -:017e80fdccde51c3a9d721437b84ad3d6567d8 -:017e909851e6f2c1383be82d794bdb8a9ffa93 -:017ea08553c8048df7fc0a8e632e590d10604d -:017eb0bf0cfc30603efb091f329703cdeacfbc -:017ec08d2e246fb1a14e90d27087927a4e9102 -:017ed0f70857af73a53e396b30327b71f353f8 -:017ee0dbdb77e2a358e38ff27ec7647b779e89 -:017ef01382b99f76c8089901be43d3d7390793 -:017f0002bfec0b089ac344c9c737ed7f1d40a8 -:017f10a2e3dd24a57eab6ef0728f8000a36549 -:017f2016eece0ca1f8024f2c4a6c9d76bb50b8 -:017f30b951e7a6cb7c4497379b2ff9f5baea0a -:017f40a864df25732d5a8c5ad26113dd6248e9 -:017f50ca395351fd7218afbfd48b40ddf87e58 -:017f6072673f3645e103b3650aa05b3a1cec6a -:017f70a22519c59624f18cfdbbe59c57ea9a7a -:017f8049c955ac30d41a259fe16292c1e609b9 -:017f9029f3c34caeea658ea29d5d70a2113901 -:017fa0eb3214fdab04b5c891f76979ab88aa56 -:017fb0ea762bc24e49b44c3afa85c67f29524e -:017fc0b6e7e3a83bdbf41263c4d22c958d5140 -:017fd0c8a71fe51630831f7be07df478eafc6d -:017fe094461b75665a0d90869f2d6754ba20a8 -:017ff0e9cc40f8d3c0fc9ede030528f8520d31 -:0180009c75e59e90c98b0b874b62ebc68f5f50 -:018010a4554c7e0c01cf2cc1c139b956cb14f0 -:01802021b2b4ac7f66c99d11ea40ab359321e9 -:018030fff48d60395fe88733c1411ef0d0021b -:0180401ce114e138a263348d46b543704af8bf -:0180501b002176d6dff13e932c02fa10710f00 -:0180606c4531428cbc70c749da11b47311b9fd -:018070cbee79fffc7dc9e598fffcacf149c9e8 -:01808062a3e0d7ca3636281d4a9845387c69b3 -:018090a0d8ab2e5a7bcc37a7bb95dfbf5e6782 -:0180a04a0acf005569d4d83554851e45b3214c -:0180b000d1418822212317f214d444d7e93d15 -:0180c0c413b5cc3bc3189936d71b0ce1b99e23 -:0180d0384801dedfe152c137c36474476d91b4 -:0180e0289ed771adfc180a0b8d7dbe69dbab1e -:0180f0adefa4dfe81a284fd27151f58d2656e3 -:01810083ddeee8265c930a537db70ca1ba8e8b -:0181105669d364365c15f1e6cf41cc285eb7d0 -:018120ba101834436a721ff4a1755d2c02adc4 -:01813053b61a3524ce726129b011a3084fb9cc -:018140086286db57b33c79c622ea739aef6c5d -:01815013b475a97b98ed61848de886c9a6a0bd -:0181605dce37a9e45ddf489395ed40171224ea -:0181703305114dc8a4fa9b7ce41a2d946f9298 -:018180dc557d370848dea7b3ec1aa060a902cd -:018190b5c4c733d4cce84378b12c6e2e525485 -:0181a020b6ff0cf60c7ea19e63119fa05975a6 -:0181b0b8d7f8841de64da5c6875c243ea17ef5 -:0181c0a93d0776f4b9d0a8c89749f2d0034709 -:0181d0fc8659e2cd8157c89e09ed80d8382a49 -:0181e024ba6e713606f05b15fed104d7c8d9c4 -:0181f023355f825db1a8c6dd97b88b91594cc4 -:018200b352df4e1e30642018f567c92ceabafc -:018210f5e8bd9a6888ad7ed4433125ea21943a -:018220febe58d1f11b09ae8a9e9062d5146bd9 -:0182300d8fd23f9a1973f0ba9ea66a0ef08f47 -:018240dbf074a4b52bb01f9fad9e7ad2c420ad -:01825097d5260e7b264ee0ee61c01bd11a67f0 -:0182600a9bba14b6e11d6a20f8b479a5371e39 -:0182704f6774a881157921f8ecf3ca737eccea -:0182804f23ec3e9a1333b5c3eb9cc17a9c5b69 -:018290ecf2825965c80818478aad708c5b559a -:0182a0a3db8a8dbbfcb66e8d364d6b841c632d -:0182b08aeee9d902439a2ee97b6db056739469 -:0182c0ed6ea64ced880045a1a967f6c7bd72bd -:0182d04e1d90560f5cab383a32f38351cf1d0f -:0182e0fff1d5ea7812087c4fa59e4648fdeeda -:0182f03cc2854dc0faffc9a29f13f35a106685 -:01830000a498b9c288a947b206739b13b58429 -:01831096d1d09799f1896161e04adaffadf808 -:0183203c8ca8cfa481d6c9b0d8703671a16237 -:0183309b2229fe692b41f6b27418f41225c4ab -:018340bb538a523f5a80af3ad1a0b3beaf2ed5 -:018350746382ca6c759be8a65b7db99bb9cb1e -:01836057334b28469dcb128abb413ccf6047ea -:0183707866c3ff88c5da9242b9df45bf9441e1 -:018380caa2d60cef3af0116c5052347fdcc0dd -:0183909e5068f6b39dfafef97973ecf3ae3c07 -:0183a055e626c8bebfdd503cbff10e9c114666 -:0183b0d8583354d80f17671dc3736050a50f28 -:0183c00019ca734fcf06ffda581bdfa4894f93 -:0183d086b73fdd3f3a7ea9302ffe4a79ae215d -:0183e02c85d10add4ed914d16d340b9d7db5a8 -:0183f0648a6acc423ce5b25cd194c895196d12 -:018400b9b1e4d88b955ac40b981ba06ddef862 -:018410f8e3e0db842e22f4484267ee4a161ed2 -:018420603c621a95b9f1f59cbd429f464196ff -:018430733762360ca738bbf51b473f200e386c -:018440926a84aec1c3686f77048727fc2e3689 -:018450a1b73faa86c85eb9c4c2c559ae31b8b9 -:01846084795edbbef57367610761bfd0eda2d3 -:018470bdc393573bd55a618b1410d96f9fd962 -:0184805297a02304dea855bbc296c6a1e7df04 -:018490d820aa7215446817ef38211cba79d80e -:0184a09a486cc1c488f1b72609c411487a4d51 -:0184b07007166e3293d6bcd6b881fa568c362b -:0184c036a113dc484d4d5b8a5a52bd00615cac -:0184d0d65af71fb5df832a0bbbd3cb02fa8a74 -:0184e0e5c39a7a410b88ef14e906ec4525505d -:0184f02dfb795c3c511566bbcf496971bcbcea -:01850058c9a9fc59e3ce9c883d0429cfcbce94 -:01851096f9a85203629d1e699f9a439c2c90fa -:018520ba86c4a10da2b13a02e318e2452162ce -:018530dbf50a55a9a3fba531c3f4138d800a3d -:018540981627e1036213514e96302249a3f41b -:01855012f3a37f18e742f22c6c617da39553cb -:018560316f522cc9cec1f264fe1ad927446512 -:018570dbaebb63adebeba43439896414e7b77b -:018580a2c3721a3d593972c229a74b983ca212 -:0185905c5a688b8552c6823fd8afe96873b277 -:0185a01a6fd2a3ee7d36198009be9fc765ec0d -:0185b09c30a903b9ed437a45772243fb4fff44 -:0185c09609d23c34a08d2aa28a5e6c03e7e2e3 -:0185d09c2079daecdc9a5a64310e5e54788fcc -:0185e0b0f298dad36d9c4b2e4ad225e49db8fe -:0185f0564a5363b0b04298667e1fe4518771e4 -:018600b7fd6919fbb5a30209df20bc6dd8c20f -:01861015fa3b961deeb2c216de65fc34a3b2fd -:0186203907b364390e3769a50d0ce556f66fa3 -:018630a74e835da4b078a7b7045635b3cb0af4 -:018640e00a15e79be5a9a3408d2bc1f1fc7fb9 -:018650df53d3ace62f6ddae4823aaaf9ddb7e5 -:018660a4e5ad353d6c3bdda4e7a2173f0b6c33 -:018670004e9f545feef28ac042a08327b2df0f -:0186803458fdecaece8a3d5213c37fcd02da7f -:018690039786fe52c7b954b4fccd4ef871ec32 -:0186a0dd07b7102b03c3b7d0f63b4d2629f3bd -:0186b0a953601f706d6eac04c895efcb350a24 -:0186c09bd3bcab66e307d5a4802c52352430bd -:0186d06a8ad5e88104f57c4d459e39b2e83fc6 -:0186e007864e3feb534c1ad5a9789f8ab8ea2b -:0186f0ecffe8320ae66c397621d306200e5ac2 -:018700d3d8cd41921878c756774c69cb9d05b9 -:0187108efc10720ed45c87cf7147da2d72489d -:018720ed97798c1e69ef99eab5055a10e84897 -:01873057b63ddb868ba1be929d2b2596aa04c7 -:01874015da0f6f6996113f8b654cae126c0f3a -:018750a00517fdef3f621bd07862ae8f169325 -:0187602c606544cbad0d32895767c6f3d0a042 -:0187708ec2cec606d59662cd9822f6b1db307a -:018780cde873c56bec969a3ac6a5ed08f2f682 -:0187909f64e521b454dd7bb3e2ac85cb0bdffb -:0187a0f5218d275d65336775530452c79314c8 -:0187b0760426a720bc038495309f6d80f24786 -:0187c068ee5dcfbecc0cbe0c6b9ccba4c5cfa3 -:0187d0580ba80d469fb6292c6820e0671b65e5 -:0187e01b3811da39a74034cd4c907a0aabd525 -:0187f0e0e3868132681d6073af9c2bb6d0cd63 -:018800d28403a9a4086de447929ef15940a94f -:018810d97691042d93f075c057eb35abe3da8f -:01882053232ab13dffbd6ac67a57dce04d8275 -:0188305a7f3c2018bdc4475c82fe17a6b5e2c0 -:018840f179067bde17ea5f4b674e03da796e51 -:0188504caa376db4b5afee5a18fedbb7465231 -:0188603cbe2c5c25d2fe430d9c68b6d8910bbf -:018870c64f79b435155fda0575c65209aa7c82 -:0188805ecf92f40fef20186cd211c06b07eb14 -:0188901c54aa39ed2a85a61c4fd0cef6b35bb4 -:0188a09874ed46ad3febc4fb9bc5c1c816ba46 -:0188b0d8c6c0d47628a0d7e3461f3eee4e66f2 -:0188c05134d18eb08af5aa4971fd1d8654501b -:0188d05aee93330f40b5744937f5177fed9bd8 -:0188e0d13b1494d1554e2df61c3ba847c42a33 -:0188f03ee763dab7e7ce68749e4edd7e23826d -:01890091b823b5c5d3fdd0533875c3efd10dd8 -:018910e2e3d985f4e59f5ffdc0133c6a5c5b8d -:018920dd87ae8614cfaf4a990ee2e95933316c -:0189309333d4fae75b585de87d527fbe0e5e1d -:018940186f5e50fded8ca5e5ffdf87c50715ca -:0189507b885b10363c93e1e42ffa5af5b7a265 -:0189600e25134e4fd2deb0fb3a260b2de2d458 -:018970824fcfcfb64a76f7cdf8d23e57f47fa0 -:018980266e2777b1432ccbb3713c113ebc22c4 -:018990910a5998e1aff03acf279cbb9f00ef77 -:0189a06f3a4841c179daa81d38566a61ea4ccf -:0189b03789fbce48fdcc5561aa805568a1eb5b -:0189c06e2ca1dedf0e1a8dedb35ea1a6c552be -:0189d0e3523df0f34f6fa65a258d0b50d929d9 -:0189e04b2b6da1d13009e58e7e51e89ed06a6a -:0189f0ccaeaaa24b656c2fbc600e9a11198cfa -:018a000f574b04c1e72cd14ee1ff11afc364fc -:018a10ff540060d5d47fca91c5eec1dc5b2f33 -:018a2020151f70148db523b4758b25f76ead2b -:018a308f2a5785c1a2bf4a86a0fdc0f0a0fcb2 -:018a40ced79c054cde925a3194f89b1bcf0993 -:018a5051bdac25a5034b6a002e3ec9d1812b06 -:018a60f0647c0cf1d317960f5c72449c8e8307 -:018a70457f98f9b8fd3f30c6f5b8abf84547f3 -:018a80b2d2a353932e0cec104ab4d784e82654 -:018a90597017f9418bf6fa5d15e0b4376b062d -:018aa000ed2cf113cd0fa50c5daf016d0c2f6a -:018ab015e35aac8660455b7a68c485c006ccc9 -:018ac01b5468208559bf7234bbaabc8991871b -:018ad0f7e28a0bf10eee724d4a7f602ffdaf95 -:018ae0fb33c5faae82ae1f9c0278999c8dabac -:018af06ad83eb9d18b7b48e6f91c84b8aa270c -:018b00c4fb7c24d7895004132e6317a7eec1ab -:018b10bdde93108098ecfe9e022da007ea091f -:018b20864392b0be6b0fd4c9cfc611da8bfa67 -:018b30f83e52119924dccb2a16ce7398bfd77a -:018b40fcce79b67c38777e368bf224accc7d2c -:018b50ef57fbbd40ea39f5e48a806c53c5f589 -:018b601a5ce2d934892ba1b6e5cc972d7a6384 -:018b702d3774e07ed389f9a2af2509d472de7d -:018b80086544bce9e415a995ec56a22cb1be1e -:018b90d3260cf8bec5b22a73705aabda680c81 -:018ba03059cdb7844c83af7a6badadc6062c96 -:018bb0a5088800ef8429219b818ae0934b12f5 -:018bc0bc68c79a75563ea6591dcc89cf165a48 -:018bd0fc6ff50b6c5fc656897d20de987e9fb8 -:018be0d9e16d729a48ba5face637f7307840e7 -:018bf067a2e96c345cb147e8f1dbe0a0216a94 -:018c00a1dc02c5733d3fc489347d18145091ff -:018c10af950a7b96c6aef7c45469343fc47d1d -:018c20f9d365df15d5e397e76c45ac80562515 -:018c30d1f5a6d7291e509cdc5e212098d40c11 -:018c40355f3af250bc31e2e1679cc31852ce69 -:018c50ce077845f7633ffefc57407ee0d29339 -:018c60012782dff21613c9126c2893ae75500b -:018c7089f2e01eb28a06d92dcaa3d7b13ca885 -:018c80732aeee7e83670854c747dc3f0baacf6 -:018c90e314b5b760254ff30df8481dfadd31c0 -:018ca06c0a8bb9e0d80e2b1844e2eac1b8eb5c -:018cb0ca92deb9b6c88e5d00c8ce20a1b2e4aa -:018cc0bec86639cf9b58e290ae883e44366054 -:018cd067d935bc9ed0ca1457fc3cdaa2e03ae1 -:018ce09b29829fb1728391e74d506794d20141 -:018cf01f1425b8eae86caf906d81b84e779503 -:018d007b9f7e6b0a4dda87cb8d82c4d1032f1c -:018d107732e927e2d9bfc0c3699951d3ebd177 -:018d20ec723cd738ca8aafa9827dfd154bb5a7 -:018d301b72955ce2b6a2e55c989bc3e62635bc -:018d40d82b8dea45637b4573c674d6499ad5bf -:018d500594b378b820de71081ea38fdc9b0021 -:018d601558ce8e824efa1b29160d9c013ccd56 -:018d705ab3f7007d2c2fcd071c1b75e4072bee -:018d80cda1c0bdae5e35d93679316e3b332d90 -:018d90184d75098423f70b58083f4c12f1720b -:018da0c7cd9a8791658a1d04f6783014a87805 -:018db0cf5e1acda3d58a1b654ca49846617029 -:018dc0ab73bc91e06db5d37fcc159391c60a52 -:018dd01d786e5018ac7218599afceb6d9cc34a -:018de0018a721bb9a3492f774db7c721710421 -:018df07c0246513ae8ab836324beca72d73fef -:018e00e53641d5158adce731ef5875f4c68184 -:018e1022532bcad8678fdf18b39332cf32b4a1 -:018e20ca0ae01e4ed2f4ae53e33133f781fa34 -:018e3063f6e37527059a501678119cf8679dc9 -:018e4018d2da1ef4527181a5b454464eb87045 -:018e50cfe6ab7107fbdb59ba66379437d07dc6 -:018e6012e0949471447eaac1da0351cca19b50 -:018e70ec79c504360fa8adefd65e646634d279 -:018e806c18d66144e89d5d2c41b4554265d11b -:018e909d9649e6f64bfa4db46a85edebcc9ebe -:018ea0ec762ecd021553fb0ef4e216bae835c4 -:018eb00246c22f29bf5c00fe6fc111c6ff12c5 -:018ec02d9ea541222d79c9f5d2c5b1cef0ef37 -:018ed012fa421822daef85bc86e2faa5883570 -:018ee0e70dc931ee2bebdb076e142db515ecb1 -:018ef0d5383d9d32bbbce299cf48dc89659a2f -:018f002c83217dac12e86b38e785ce964e418d -:018f100d3da5773acd4aaa604e2c27d914ef10 -:018f209753698e59564235a05cafe3155608ef -:018f30150caadda4f52e27e29425d922f292e1 -:018f408fd4a51c7dab361f31715d7e28cc9190 -:018f50afae7cfeb3680083cf158de7015508d4 -:018f60874b0f850eb529ae5a6d72072cbb6b0e -:018f700874c10370f9f13a7217fa802acfe590 -:018f808ce8f50e42aa10d9c41b74a8e84037c3 -:018f90d27dcce927922a0693d95a078b541f82 -:018fa031fb9aa602083d9640818c9b47c73678 -:018fb0d3d9c085762ce5ef7aaf7ac47d6f29a3 -:018fc02aaf3930f3ac65676fa5d10a84b7d508 -:018fd0b049840c8382a0ab92cf5a1754d9a658 -:018fe0e183d19ba47c9b3af9db6534de10aec6 -:018ff0cfa95479692cb076a8aac36fb356f823 -:019000d9e45695625b79cc222344d078249197 -:019010620075cd73e1357e7381e386a7945819 -:0190206a76faec6ca5647863ab44f0357f28f7 -:01903066664565b9d9f71b7f2daf25c345fa28 -:019040dc19d571c36e0746d9395fa7c0fd060b -:019050bef547e63198e27afcc778367262e712 -:019060c294ff6fedae919da0d227fd2e6937f4 -:019070072d51b13850e5929a625af1922c403d -:019080671355272b28a3b1f95bed4271217ac2 -:01909032cde7c588872727c272adca6a9e1823 -:0190a06eb8ee9afb3a2a0ef47e0aadb4c0c4a8 -:0190b0e3814d8e723809b9516354c9885523ba -:0190c0df68fb00eae9d481e3e4881c45614ba3 -:0190d02862dae63ceb299ca4267cbb34d5d96a -:0190e07e756e8a9608d7fcc5d56b36f67d3f39 -:0190f0db02db87b531e9029246883a79c9aae9 -:0191000d932b8e80ecce49cc6153f836440d04 -:019110389c29d083b3fe5a1aafac2d6d31d4f5 -:01912098ed3fa823255c87de40a046a4276c8c -:0191301d9599dc65ff9c247b9f094980a180f7 -:019140a666fc9c4ec878590a170b273ec892f1 -:01915031ace97d55298b41c7c559685f1512d0 -:0191604fb5f8bf5e610c483dccade7fe5636a4 -:019170d64b833b464e678108a36ccce2de6187 -:019180c394b12aafcc5609210e6fe3cfcbce84 -:019190c9ff74d98f2f1ff5f1244e5a57171d6b -:0191a058882b59b0b0d05635b147c3aa56c8d8 -:0191b0da9cbf262ede0e2348b06e0a9e0a5f24 -:0191c07249c58be04290da58998e5d77a6eb5c -:0191d074e7e24c8ad6df9f9a2e99560b0bf452 -:0191e037604f89da7ab1199f216c3c3f470694 -:0191f069e9734bdf7516b38e1686f5878dfb19 -:019200adb862baef3173763ade8342a1175490 -:019210558f2b347d63875616536bf1b4cc73f5 -:019220bf71b434093e82c16fa8a820f8ec6557 -:019230e78086fb5b30b031b9eb9c9137e985cc -:019240fd0ca6cea3345fcd2ef5c69be59bb7ee -:019250bf6565c6d558703be33451ed362b33a8 -:019260086146708ed6ac63f5d1fad8888ebd81 -:0192709b68a347ff9f4ac3a6c9b7d6cecdfdd4 -:0192806a313239395dd76114662c5e8850139c -:019290b98e001bd08f057a9bd02fdec80b060e -:0192a058cad57abcb97374195e36fe6ee228a4 -:0192b08582917f879a675c94894daf0de95407 -:0192c0cf539968260de683317662c11b1d68c7 -:0192d0c8c9a4ee367d6d42c0d0a960ff232592 -:0192e0a3bf8d585b01c95aa0b1d8c8f62ed653 -:0192f0c40c9e874cb20af5cae0264b35d4e49c -:01930079cacff67146831f3ace7dcf2e11285a -:01931023a9247ac000c455533d582ee1828122 -:019320b4f9d6112156b922f2528462df06f75d -:019330caec53fbee9403b3fb2841cc32a0a325 -:0193404577f102542d36b3c14e9b7e304679ee -:0193500ca1e59a568f24be8ec7500acd17bcb6 -:0193600126e93d1c2af87aee7b951a211fcc9e -:019370cb904e1a99c68a70b14ece67853c4e32 -:019380601ae24ed74f2ccc6f81f24b9985cf8c -:019390360202cfd099d1f7c364eaefd5df6e11 -:0193a0e242b6dca26908b75ad484fdcef9a2db -:0193b06d962f2730d0ddb939e84f2ce7975658 -:0193c0ab91d7a239cb0fbedbe217b95a526ab7 -:0193d0ae62d8600e1f37e39841b79c6fc9a7f5 -:0193e0d97b8f6a98c66c527e3c9ed4297f52fc -:0193f0d4d478eb9609674502593b133ddfffc1 -:019400c0afc58340260a5fa55ebfda4eaea7a1 -:0194105eb43722a1d9eceb1db4221e2fb1ced1 -:019420c91d56f3ffba5f882de7b1d6b4c66ac4 -:019430d7145755955d723fc8344d027d80ea79 -:01944049fd842c4eedbd858b71412714b6319f -:01945045d719c8185d5ee33b089532f3e483da -:019460d998b5b9711e8ebec46f89cdb789ec0a -:0194709104f03de678d8760e8a08ddb9238b40 -:01948038e89f1ce5907c18f6ba4fb0a7139fb9 -:019490349a8bd4885ff42514fe8908b561026b -:0194a0516a3f98d05053c84a89e8cf1ecbf27d -:0194b0a522d10785a6a849385f9db7b6a46354 -:0194c081a5d598279ed6196f1e5ec8fe74c8a3 -:0194d058cd633f505757a3d1c4172fee5bb4ba -:0194e00d47ceb50f9943f7b3d80a3b2c32cc68 -:0194f07ee86a665f490f0fe0aa071f78ab9308 -:019500e4aaae10e23179a8fbad8845bc195be6 -:0195100ad6136bb7dfd3a439f793de612c475c -:01952076637091c1499518cb37063475f4228d -:019530b656aacbe8691c50bc6137a9e776fa81 -:0195407b675c0dbb41128d415cf61514d05420 -:019550cb9ff35aaad52784ac2995bda013a170 -:019560e742b02bf5998ba934c88e74396902d4 -:019570d77762455d1c624eac092bb1bc1af2a6 -:019580230a16cbec059a69778eba42af259b3d -:0195906f1f7959850052df8e78e8f7f56c2a54 -:0195a009f86c4e6c235fa1ba23fd26b79acc6b -:0195b057f941492566f75309454ed9c19e1aa0 -:0195c09427eec7f3fe531173b1d23c5cc23a80 -:0195d05e1842d4ffe479109fd6f7b58668398f -:0195e06baecac24b14b9bb5c697d45614df3ae -:0195f0c44eb713fcaf371d3a7da9ce7e144b61 -:019600c00d71e15dea3e0dbcfc11e1261c895d -:019610bc997b1043f701d59838f2b4dca643a6 -:019620e03923f19264da5fb94194cffe747ce4 -:01963061d4c0c48d005ec8c7bd17cfbb7ddc58 -:0196408129c793cadfc17b5704e12bd0e4528d -:0196504086096f9855768b82caaae4d396c936 -:019660977384e179982e5ed5ef7ac2c50ef275 -:01967070985e4d762c96a07326ef5153dacd65 -:0196806e0c4546fe8dc071a7145a500a6e2564 -:019690edb55d07071925dc4c284ff5d94ab357 -:0196a0b5275f722827fd1ec4670600e9aa08cf -:0196b08777a72ac2489acb12937add1a63be90 -:0196c011aeade42296a6399c79db6eb6872644 -:0196d031064536f0d60f456741dbd8a93b575b -:0196e0c18310a326c38c4e21b4d37bc595279b -:0196f04cb6781afad3c5a01cc982c712d6dc2e -:019700daa1b8baa779ba029366f670851c476c -:0197101875ea057c28eb585aa31b89cd1ac9f7 -:01972077837df429999b705f55f5e3f33c4921 -:019730710ad0aa10c2e4cc7837f2dd616a7029 -:019740a5dc5f5e708059619b9bcbfed519b9d3 -:0197503303dfcdedc11feac851288b511188c3 -:019760a230ab83d68cfcb069e912328ac884db -:019770cc7651ed2aa80d52ebfa2342d981fde5 -:0197808e65b0233f5824263cb59105721410ce -:01979086735a98bc06e596c3bef54db38ae61f -:0197a08e06c9e7098d189d53630240f5dd01bd -:0197b0821b685482886f43de9ba334a6bdfb95 -:0197c0d662555a91c0ffc98733669a03f5391a -:0197d0330b2f2b7d9a54fbd617e2e0e12eefc3 -:0197e0ce9132fc5aa0667dbfce3b72fb29d7c3 -:0197f00944462cb493cd6b74f784e6fd45d4bd -:019800523aacb078d4b72da65263b07417a4ad -:0198109d319b772f21748a7831288ee4192910 -:0198209238967dc5eaefb4d3e83db282cc8e31 -:019830275336002d72d15c46e8139c2322c6d9 -:019840de739742b0204003b756611c9097f8ae -:0198507b99cc84c9fcbc75c44955b7c1d6b0ea -:0198606b3ec363e42e374a090f019c59ac7fb4 -:019870473713adecc1e297e18c92ed120295fa -:0198807f5aea5424ddf3e31f0c72ca61515e17 -:0198909e2fb9d1c4553affe0571a5505d66842 -:0198a008dd63dbda4644d66d0598343777d7fd -:0198b06aefabd1271ac10d0314d88fa8eb8c0e -:0198c0a064d5298f745ef9c3e21a03d42a2dde -:0198d0c998b78fabad46acb2acfadf838e571c -:0198e0626996652a4da78d691e9709f0a26e5c -:0198f0d5fab3c7419e4d6c00142b18d22af792 -:019900e088ee93bbfea951a66f6def0f70c2d9 -:019910337ab3c6576bf97d5cc2e4a06d1b70d6 -:01992044cfe9b38b8ee55a1079b2090036f963 -:0199308523055b2bcc68fb5258bff45cf90ce6 -:01994047ef611eb520f1d904343bc11769c967 -:0199506a5edab6cfcb39a140ad2c7efcc3a19a -:019960999f529f5d2363eb2b205c21e9519e9c -:0199705e19ca23eb37be567ebb8d03f7149537 -:01998094bd566203c1f8a54d35cf4d4d8b0caf -:019990d9041a99331fe79cb2b87d3864beaa6e -:0199a051cb75a8bc6dafca9dc26eccd263cb81 -:0199b05e3a1036f54a76e8e4e71f3d602c37af -:0199c00d3a7d1cab0b1d9193080303ced21952 -:0199d0cedca4c48f588bbfffbd1b07e112ba88 -:0199e0e14bc0cad1cf77965343b658654c522a -:0199f0650ae90f0fae0b5e69adc6dbf12c9f51 -:019a008f04ba22cf2d8b366ce895d6a7c628ed -:019a107187e6d4badee3bcf6aac0b6f08724f4 -:019a2092595ceb334297e1e79e493c76e2c616 -:019a30dc8628c34cfdca61ef91dac9a2df4fd5 -:019a40731d99b1a1dac23669f5502d365bdbdd -:019a50795fbc5b1fc0912ddb2593ca12dec82a -:019a608f4b2c15d281fe83d9c6bb8f84f5df24 -:019a70306c6d77b79d4f8000ad70d9e0f5cecf -:019a8043eed8257ac0f969dbd44d3c4179cd69 -:019a906b00c15f992ebcc6974bc83aeef31469 -:019aa0c9202b6ed1f1b2da89c0fc6bbc087c4e -:019ab0fed206bd9a1cf01e9fde527887c3e74a -:019ac037194ffbba28270f498fc038581b6d41 -:019ad09b4af7700f1e3b7552b66f1305db818c -:019ae0a50cac90bedf2192b80a97cf4ed32801 -:019af08b22d8fc45c66ebe116dc8d0ef94690b -:019b002cb15a9f4bb856e509b0b3cb055a7742 -:019b10b59a8a5af14b2d9fdb4d1f5030e32e1e -:019b20654305f60e4dc8bf357a4efd3b83002c -:019b3037012b367166b5be3b24084f58d4c3fd -:019b40599468012d3328bdae938417da012379 -:019b508935dadfb7fcfa1f876021497bd45159 -:019b60a508e2937dc03fb8a649d2975c118e6a -:019b706196ab22b605a768e921c466a9b6641b -:019b80d90b6ea40209387e15657bc4171db358 -:019b9026cc8806427621b5f2674e0ea2340aa3 -:019ba0adf2fccb18e5f2c694445ad68f8c7bdb -:019bb0b80f38fd584761e477a4bec9949af88f -:019bc08cb442f12e6ec3d91a44f9c4123e6ae0 -:019bd01e5cf05d19ff0d87b0b3088fee00c232 -:019be0eb90a894763d138da26e767e523a2928 -:019bf0b9df7ed3d7c76dbd5c92f67fcbf2d72a -:019c00eadabaedd4cb9eb3b044dd7d3ee6ac4e -:019c10e48978c565a4a891c8ad605663827442 -:019c20c548f8523da5b5d82b1a12c33662d3a2 -:019c30c4c46070822b3cb8e303eadc3dcf44ee -:019c408c068172bfbe4993111137332ec1d46c -:019c5033166d1128a3ab5dd8b5ebe4103c2d76 -:019c6091ad691058fefde663d8571a0b875e23 -:019c70a47768f8564a7c2508aa12238030db26 -:019c80f198166ac39be06fafffc8fd541af3fe -:019c9056f7ea58dafe02a34f493ab28b08e40e -:019ca02ef389211d028aec72de23ec07767559 -:019cb0e21ac2f6800d4bd9be027d4dc1f8a1a7 -:019cc06aa53b264c4bbf1786be2ce80874dfef -:019cd087da62eb175b9c574cd023f0e55bbb28 -:019ce0c8b4bf131b961195e65a3e4d28fadca2 -:019cf0cc03ef12e22a93913f8404e26ff9ee8e -:019d00e1bc74ba9cd4c159e84456e520395347 -:019d106b41d57e72c4cff5cea5c900151ace29 -:019d2032f796b9d893a136f877a556b2da979d -:019d308558b917a140c038382bc5ca1448dc0b -:019d40b6352b10c9d38b53b70087b04193b2a4 -:019d50118c2a60ccb4548cb65b1dda4cf02a5c -:019d60e1bc8dc4942a47ea10e75bd1da030622 -:019d703e378d3e123c46c21dcea2803cf6a1c3 -:019d80b05db2c51b9caceea742bf9089793a8d -:019d90cc680bf9e64f4385c18059cc326a1925 -:019da05d72b94143c2d95916560e163d52454d -:019db0da41bf3558491ad554091ddb26e59d94 -:019dc0f54f57e61f870611a700dceb93c8743a -:019dd0c2c1ed41bf109055423c5443246815c7 -:019de00f7c4716d4732b0f6be38fe0709d2894 -:019df0f813f8ec4aa2b7be5ee6b60701739234 -:019e00d2292ced69ef2cb2090d9a5092ceceda -:019e104d66b2131018ccca3524a9aa363b01d7 -:019e2059f49a49610f74e9e2abdb84e648eaa4 -:019e30066c30a59a2c049812e659a992518f4c -:019e403d3e6b58afb1afe53af4ea812b3de387 -:019e5049ded70485a107fe6cd33658ab5fcb60 -:019e60984ffac846ede1721869d8b70e839388 -:019e703179f03b82f070e6447849aabf3a450b -:019e8083f40ccd249484a0268534e2f747103b -:019e904f170e2d2d3b10b8595fe321ff7e8822 -:019ea0bf0739ccb1149cfdd55866234f829d41 -:019eb0d4f70171c80030512659b1fb876a7ee5 -:019ec0ec9283d4b1138e87dfb8cd02b42b0df7 -:019ed042271a5a54e31fa12396d40270d90e49 -:019ee0a6ed4fc5e1e20a6eb06b7cd580f8b9da -:019ef0bbaec13e2514ae4f901bbbfe71628925 -:019f00b5f86a34c34675c6f28bb6611e04c0bf -:019f10d932e9f22cf780dc3b4e004c974e2be2 -:019f20cbb0ce3f6a44b401cda3ccbc353be10a -:019f30a7d627c3b018048769d86a01b9466578 -:019f40bd54813b03ea4e5009f5761a9912978f -:019f507df7d48f6074b6c8e91b9050eb5f3950 -:019f60ed806d102075f85dfd7052054b73086a -:019f70811e1eed6d0bdf81b4db064a43952526 -:019f80b6bf6374c59f62a7476dc51c4812c145 -:019f9080a0756c810f4c1398c9cca57983294e -:019fa05ea05925582f1a8ef245539b95b59fce -:019fb0e82067f61e6dbe6e1c4f813c8d2e17f0 -:019fc0ba3249bde5eff571de13105ac2f2a81e -:019fd0e0384859668c22f4e9a0837576f4440d -:019fe000a87f4fa831b41c11de0d73272a15de -:019ff0ad5a30f23462aed4a2d53e15ab454744 -:01a0009b4d9c84dc1d50d90cf803dae52b4580 -:01a0108674288728729fc5f267944297cc2834 -:01a020148750f6b6203c40c0d4f38edf138423 -:01a0300c838cb7b2fe26b5ca52a4551908177c -:01a0407d073f13b80d4157c3cab7af22e1475a -:01a0509bf5983f728ab14a2070b736f1a12e56 -:01a0606addae5991c1b119ca29236656c79e7e -:01a0704ed273abf87080a26b17d7072ae1bba9 -:01a080ff0b0855493f11fe0d5ec48486767684 -:01a0906479f2cbe379c46c2d5b52197f77acda -:01a0a08b1d9fb2b3d8d1cf6c64118d61313d0a -:01a0b05a55acb95dd2c3da94ecac4f29c23125 -:01a0c0967132cbbfc5c4f81bfdd3367f2b65e0 -:01a0d0b94c1d0290244033e9d99e1df3771f9f -:01a0e00be01b8ee726401dba2478656d9ae771 -:01a0f01df80b95b766793b0b43f09fe539fdff -:01a100d1b0e22eb47f238ee7afc2037c34a947 -:01a110ece3fc5ad57e0f71a8d8fe3b14bba571 -:01a120647851125cd7035567fb48fb6e1a0bbb -:01a13035e2fed9b7c39b190ab6458ff22176e0 -:01a140a88967c42c08ad95a59ee3506ff7c987 -:01a15039d1effa62cdc3f827a59d4bd7ca9229 -:01a1601c0421f2475c61c9c9f597c040f19100 -:01a1701d6b760fd75ecce5607c6ae67a7d3338 -:01a180a54d84bb14cfda0135b36b200ac52c9c -:01a190ba4baea4f9b1da0f0158021bd8b7087f -:01a1a05bcb5d2ecf22c4f3bca2824941d47235 -:01a1b0b3375137b3991568472df88ad2080b5b -:01a1c0d6d69506cb3a29f0dfcc1d3d799f0646 -:01a1d0f647f51f9acf459575b1d6f5fa75e507 -:01a1e0a4aa6d625a557ff1be73fe4affa1759d -:01a1f0cfb14994c9a7e587aa9f2baacf5abec4 -:01a2003dae4bd897732ac2b7499693a37bb500 -:01a210a323ed5d1cd726a900734fe7c5e23923 -:01a2203187f5314c998f95032e6cede24ed3dd -:01a230cbf7de9bf67787bca42c509b8a53f977 -:01a240d73113ae3f4af45c42a30baad87e4311 -:01a250bff260407c40097e520969c0afc42088 -:01a260f5c72f86827010c48fcab2733abae003 -:01a270ef31acc4932bab7175bdddb4d914c3b5 -:01a2803e71c75e5cb20faeff606ee30577bec5 -:01a290f87115d27de8480150b7f4107e35600e -:01a2a0881f8d030fa171320eda071449bfa370 -:01a2b0a0f123bafaaba27c2ec1c3a5abf4b4e2 -:01a2c0c37a2972bfef686e6ce16e53d0c563af -:01a2d00fb01c6052eb6aabdd582e52a3054d57 -:01a2e02021983f09170dbc0f6304820f5f4112 -:01a2f0dcd6d6602c4be911ca10b3a59fb55b94 -:01a300d97a03087be83cc573dbbd8f76900305 -:01a310395c2fcad7340a86aad519942aee1fb9 -:01a320b13ae887ea591ba1de9a38a4955fd30d -:01a33005a556750469f23b0f6b13f86b0eaa83 -:01a340b6a20becfc318a909ea4de048b1c3cf1 -:01a350c8aaa57aacd364f2604722d08e204e9e -:01a36045ea53cd1d4aaaf65c136011082a7491 -:01a370b36b01e5fb21783ae6b602884cba156f -:01a380c4833840698f252b57e019f1284e0fc7 -:01a390bc411099a55da7ef5e7dff2c018e578a -:01a3a0870e3b36966b13eb1795b37bc2b2ecf1 -:01a3b03ba126ae548b2371aa35182e20d7a0ef -:01a3c06e9a27de4eed101d30339f71aa3bd7c1 -:01a3d0604f9389afcd52881f39cf4dfe764e32 -:01a3e0299245639fd92bf332ed9b1052cdf517 -:01a3f07cd886ff975af6c9ebf1fc4312349961 -:01a40035d48130e0de66d93ae62585d52241aa -:01a410721a0beda84e49d6d577d530853e94a4 -:01a420f4a6b4d952a1b653d9928a23f15bc1ff -:01a430811dc9a20f09e6b6ce9e1609cbb1b94f -:01a44062a1bc829fd03c5668a61b2415f9530f -:01a450794d8d2473ded26fabc1f1c94315f505 -:01a460230fd7478e757ed853cf4768de378cd7 -:01a47047392420a8aa54751dfd48de10e2626e -:01a480552b68f131c5de7b3ad0eb58b09969a3 -:01a490bda25de7b4f403ce3e260aa5444fbfee -:01a4a006651a438e70d0218e40ab421c2908fa -:01a4b09a78ddb2ae91a65e1e193c90dc5e316b -:01a4c01546093ebb6bc9f79cf3d56d2b82a698 -:01a4d048fc9e4de3d8f4d552c293843ec47eb5 -:01a4e0de553ff7a292b74549370d5a8e24fcb5 -:01a4f0a5dac2d4b3d26d34900b11030980d57c -:01a50036985ba233571138fe7769077aa48f93 -:01a5109f4192f8dc1fe8f9d65925ae00cb1498 -:01a52063332e4aa4f45fdf549e750790e2907e -:01a530a7968e4f8b544235a6b17f0a72f26350 -:01a540f0d79e1cce54d26e3bf084a119f40497 -:01a5508fc2a3e9b172a723271be429aff966be -:01a5603e55fa70fda192f8ff868bc087fb82bb -:01a5708a49d2a9972a180dc80487162121cff4 -:01a58005dd88544d17a5a7ea779fd78248f488 -:01a5900c28755c1dbd9f46de6e0007ee5d62ba -:01a5a0b30c44045dc15362dca7ac3fa6d34ffc -:01a5b08120115e9ecaa557d47e8b54e7f95c68 -:01a5c0fab66d73228a0c61325d8746a19b0384 -:01a5d05174596c9c10cd9b625b22c227dab892 -:01a5e029c48afe177f6e973c47d25a61748071 -:01a5f00e1c5885fd54b7cbb77159ea63df1c6b -:01a6001e02042743a43b2b367f5bf4373839eb -:01a61029ca84c5bd5801ff1ff311b4fcce0499 -:01a62053e2067391d1e27cac8186331f2472cc -:01a630c01f9e4781533e7f217b4afa464dc3f6 -:01a640e0071bbdc548b843cfa9692995343bdc -:01a6508c62ff3ddac8b2d1315777e79c23352d -:01a6601ec89842a9d560b94c2e848ea5fd8f70 -:01a670bc6a2978b9c5a4be852c914ba6a75007 -:01a6803c2b17a7fc8b0ab4562a9ace553cc8dc -:01a690e04f7909db26b9b30d2fbe27390fe5ed -:01a6a0c5e656c3dd567058063853e638b9b683 -:01a6b0f241f3c3a19dd7d9f24edc7040c34503 -:01a6c0f28de50a9b4a6af741609a2c82cfd66e -:01a6d0dc451ed063d71fafa102d72543a953a3 -:01a6e0c5eec78d999694d467564213af2815df -:01a6f0853bee2d2ed5b4b064ff7161ecf8787d -:01a700eb0728da0cea9932d0d529219e0d01d3 -:01a710e3de7e599b43f3041b57484835953681 -:01a720edac459c38af0484d2052ebabd7f93ec -:01a7305207938a7747fef28eddd863f296c4ed -:01a7402be067b9418b92d6fe07e4d3709ec6c3 -:01a7503d4b938363556467b1eeb5507ac142a5 -:01a7607ed0f3a101040ca15ada745a1bf78719 -:01a770b1e45066e9e9e883db892a2b22976993 -:01a780df5da134ae31013085e88657849ab549 -:01a7906d5a8e532c753134da2b4bc4e2468d50 -:01a7a0d699edaa852a3658276a6c1786027d90 -:01a7b01c9a6aca42885f8b193ebe09a619e142 -:01a7c0dbb4b90381e9549481df0d0640f25030 -:01a7d0cb0609bd14e1b118894b8e43943f41ca -:01a7e0c4ec606949c67374197c6216f6a11c69 -:01a7f08fc3486b3d5120730144d3afc95b8693 -:01a800392ccc4064c0d798b0dd765d51efb7a9 -:01a810bba1eb34d1a510e26b5565574621caed -:01a820f00e3b418854e1c8039503c6f2d5f796 -:01a830fdb4a2329a0953b50c3518816148d5c7 -:01a84006c3a890b81433785644f7b16a13e18f -:01a850683b9a150cc135ff35d4c1b84902018a -:01a86090cd7ef30ca4044ba9e6b6d34b15fd76 -:01a870bfb5ae5322e76e4af4ad707bb5e89b3b -:01a8801f45252844384ca54c78195a50b2ac16 -:01a8900c2344b7487a4cb0868adc62d05f0f72 -:01a8a0e20a1a79f4fa5739122e097e9dfbe138 -:01a8b07d118761f5c1b8ef7ce89568f3d84837 -:01a8c07c25c8b9b9c52cdda35e5196093776f6 -:01a8d042df6ebf317c3bd1011a85a5a432c72f -:01a8e04439663b60e2d0b750b8e80783363e52 -:01a8f0c106601e1b9e018b0848604fcf40afca -:01a900380953d4304eae6b71ed001cd4c594cd -:01a910738a89998afc1b8890e9a4ee4864de62 -:01a92035f30f9961489e9a1895160d72831fda -:01a930faa02b123537a732f49d370a3c8ec3ea -:01a940b455bbf5097b169f78c88df204a49e41 -:01a9508e1a5e1a64821859e6b808e7f8e4ca92 -:01a9601ac2ad3614df5278a0400a32f0015b00 -:01a970fc91466fbfb9f5510b883d2d0228086e -:01a9802c8d8ff9fff4d7d03838deca8fde433f -:01a99083ab8981a733f3f9ce9328582f69f000 -:01a9a0d50da9c95f537507cb5bfc22e36461fc -:01a9b0f707a6b362357568bdba1a22391b0cd2 -:01a9c032f9db64fcc7074f65a174a966c9e0fb -:01a9d03fd49bb1e1462c9c89f62dc2a0ca61c3 -:01a9e0a5f103ca820d623b2d7973b4312af2e0 -:01a9f0d787d8053ae606b5e566f4a9a70a9160 -:01aa0000ccdfd129ecbadd9bc5da5bd5aa1e5c -:01aa104fd78853579fd3c15dd225d66d60bc62 -:01aa209b29470ea3acae4dade33f858a2594f7 -:01aa3020018b726589f510f0109600959ae93a -:01aa402f17529020f71964a28184beedb8e7a4 -:01aa501df63e6aab4a0e80e76dd87908961585 -:01aa608675295be6a2092e7654697a5d8b946d -:01aa705b50ffd336703740aa58fc2ce33e4012 -:01aa807719778b6c01d512fb16b1b04467d267 -:01aa904bb346f9c50ed36ea982b8cb11784d59 -:01aaa01a92896f68d56bd66a4c46ed7a2dd193 -:01aab0238c9e6716fd2c5b3bfc3d5fb1f3d0a4 -:01aac0f9d315455fb619ff1ad28be7f82f52e1 -:01aad09b95cba50bce1eec101c6982bdeaebf6 -:01aae0f89bdb6c91de449312514d51d5f0ad7c -:01aaf0fbbc83ab5aebcc52f1b78b4c74a17c37 -:01ab0096398c686d923303004767cab678b718 -:01ab109ac352fb883156dbbe4337b179c4bc6a -:01ab20b08fb659740af8cb33ef07e6fa4913ea -:01ab309b13c7468cc0a44deeb04a097524a541 -:01ab4045b28759300cb5696f02c82b91f4c9e5 -:01ab50c58776744ce910b326712a3fe51a38f1 -:01ab60ab8300539e15ff731b72410778818592 -:01ab70bc2dbb988742cfffb16f5c634f2b1cad -:01ab80c4096f5868125986eb0fe2125473af39 -:01ab90ef2af73ea354b5aebba9a09e5e42d646 -:01aba039ac78ad705c090b7f53e91caba1ce77 -:01abb09117ac188d1242d1f258bb13590b8f11 -:01abc0e3163122655812f46fc094486abe6869 -:01abd0e3671cd50294f3bf6f19e0773177f557 -:01abe0df7e7538d785feabbdb2e9b6abb5528e -:01abf0dde460fdb999bb183f7c5a6c714e0740 -:01ac002a308e24c47103b115e051e910a10c26 -:01ac103610f7e4a144424e8c66ca34ea4868d0 -:01ac2034ec450ce6e41f205fcd9f57f73cee2e -:01ac30a12b5812c875469a217a8e2bce3cc030 -:01ac40e7fdabd0c15ec63c6bdaa7436d63e645 -:01ac50471c86a5573aff2868005b936bbc0f5a -:01ac60e106a4c1448f5332225ee9a1e4813297 -:01ac70c854c25af2d9beea874265501c7ad42f -:01ac802da4c42d28897df44a3179527b9168f3 -:01ac906778f52e9c385a6b23e0b6dac8ecc384 -:01aca011d88106fc13190306a892d1f058e1c7 -:01acb088c2c49c1afe4f8ead595f95072300b9 -:01acc083898a583535c383daec7627a122386f -:01acd03980303c3c0d19556efd1a7d44079d0c -:01ace0b9aba162376e46f3c5420642c922d21f -:01acf047f3331f522326b7d0d14807e1e2c403 -:01ad00be697749911ed8dae9964347a5e51416 -:01ad104498a00feb6090c2a62dd74c7e484818 -:01ad20ef0820f98e3083da804b873af259f3a4 -:01ad301982473302b8e2789f251b1f67a6ec57 -:01ad40f3ece06a9f365fa9cb44f516064b7e20 -:01ad5070b5f1a5cc40169baaa598b8d82e6adf -:01ad60b7d5ab309a7f6e8adf5e6b7036a6199a -:01ad706a965e93625d25ec7e4f638cd0328ca4 -:01ad80c5fb5f6b2cb72086f88d388e5dfb215c -:01ad901e389f9aaaea1f7b1dc34eee7d7d41bf -:01ada0ab26dc2b12e7cd44eb0bc12581082069 -:01adb099d77e29340050285661932cdcc6e1b1 -:01adc0f30fde041c28c5faaf742bfc92c30e7e -:01add044fa644925d3c35768da4c10141c04b3 -:01ade0fdc0eb1679d29b8569743e556f2dcba7 -:01adf0143eba027b0ef106e8ed07957167c093 -:01ae00df39b28bdca7715cb02667c86a8ef5e5 -:01ae10686c4cbf47c35611889a591eb41c0f53 -:01ae206bfeb51612683c2f2d582f10dedb5b2a -:01ae3098035da1b35265986a5cf2e2d803ce1b -:01ae4042d911f07cb3cc15119ad66ac69d2c46 -:01ae501615fdb06acf67ff223204172e15bd07 -:01ae60b30e96eb5db5abe94671da6952c8fb22 -:01ae70aaac3ea1c644fd1402ae99a56a7a7588 -:01ae80b95088ee9cb1f764357981671f4c716b -:01ae9086a70e69ee1d2a80e0ddf18d4ad62908 -:01aea0f0d6ef4e9747f5528c07f64d9375212a -:01aeb0984a6bdfd192fe91943f9fa1e9d72b07 -:01aec0c351e4a65198012caf0a63cf817929bc -:01aed067ebf16fa0208f5b154e064ae5190d49 -:01aee0364b4a5959e243e458eda43fb11bb8f3 -:01aef070f2563e83296a45ae861363a643369b -:01af00a997c8ebd5f7672f44fd4d4d9bbb68c7 -:01af1090776bfd211e94242e1f76a37506bf90 -:01af2064ec2d9f4a184597a7828cebadb98a2b -:01af3001ceed03cdb6d83808796492d47a84e8 -:01af40ac9bdfca1713037efd5d7374158315f0 -:01af5037d97f2d0a00f39b05ef2ac4a13b1c18 -:01af60dcb2f68912204e720ac80066442d130a -:01af709601481d4c39d71dd88ed4a766007289 -:01af80d9ea1a59fc4f44e75d99b7854ff27ce9 -:01af90464e9356242f1f235c71461cccf1c267 -:01afa082a9070142aaabcf30f872c89613f3ba -:01afb0490c545dc90683328f3f5217418ee964 -:01afc039ca55ef03b53c14cccf83de6935ae02 -:01afd02bba2fe8df04ab48900a551d1eb91ec7 -:01afe0de25630fc45be434767193d77edf4698 -:01aff0344545f9928c9035c136dd715db64ae8 -:01b000846a2e38ff941abd695713130941244f -:01b010fe4c5eb2de636b2010441292dbc4cc53 -:01b020d518d7e6003e13ea2daef5899b5970f3 -:01b0301e4b162e6ce125617b45e19570359732 -:01b0408fac3c031d6be8639522aef8ed8bb464 -:01b050e58dcf4e95f2580684f73230b32892cc -:01b060814c556d4335fcdf95c6fe8954baae0e -:01b070fc69479351be0e3bf4b5dae293fc2cbd -:01b080291ae54807929f5217b13e045e423a4e -:01b090f3fb8609b525ce40319a281a9934e7bd -:01b0a0bf7c1da8ad8ff448050e4c54b95c8cdf -:01b0b06c9970df2a1f0efa28afbc0be99d4cbd -:01b0c09872ae65b345a0091ab44dd560475693 -:01b0d0610d90dc221b150efa2a9cacb4335592 -:01b0e081531ebb16f7bef160e43dfdb07e88a0 -:01b0f0090be9f4e17f11b5761c68ed1dc5cfa7 -:01b1005c980bdfe1f5aad3b2039f8397e7358c -:01b110879fb7ba3331abf9504caedaaacedc3d -:01b12020cab1ed7d0b32ffe7931a1dee0c7e1d -:01b130f80b1e594c58d6fdc5067a361d711669 -:01b1405b3519f0af1fa80ad77a2f29a5cac403 -:01b150f7e84dbe828c648ee6f1a24fc4abf9fa -:01b1609d2070fd39217370300757be30d2ccfd -:01b17005aac1a91feb96b3d18a31585f267214 -:01b180bd3673a92c52cb84d4c325612a663f03 -:01b19078a897e92866966cb31da6e031faf248 -:01b1a075e582cf3d83303b0f27eeaaba38cfbf -:01b1b0f2286a6dfa379cddf396d956859456eb -:01b1c03f19227bcac2640fe5824844f413ccdf -:01b1d02dd6e3aa545cc619e444f27bade135da -:01b1e08101d016a2f5685a45221b32b30bdd5b -:01b1f0cc287a416829568713fa6b7bc3ff1a1f -:01b200d26d8a9e60697596ec1b477d77ae1eba -:01b21028eb7bd7e53669d120cfea2f8aebab6e -:01b22024f4be829a127e2c2ad34337ec7b1f41 -:01b23035c75c29a00576355b24b4ca9eef5cdf -:01b24055a264f26a4b2d2b2c414c11e8ec251e -:01b25014a66658da08b53cee2f9a606e9ee99f -:01b26038619dcdbf36e2114fb2bcd2441c7f2d -:01b2704d470cd759345a2254fb5b5c37994935 -:01b280160b1cc8d203a9a0b675972ddb80d75f -:01b29035631f5f554dee0afb5c0e43970059d0 -:01b2a0ada5194742c4de0c8f1045a52b7a29f2 -:01b2b0427b90d496afe002fcbffb55577690c6 -:01b2c041c55f5d4a65b297c22ae0e4817e762e -:01b2d094904782b62e42e1728c48232a5057f7 -:01b2e08714cc86f645fb7e61ad647930436430 -:01b2f03c0e8f974e254e6fb894af6fb0d4af4f -:01b30068f479a624dff5851f84abecb79cda06 -:01b310f5bef3c9668478c9d265550a0d1f5c90 -:01b320f6ebd3d760f4b7f72145eab3619543ac -:01b330230c8595f4670c94bee5e8089f42a14d -:01b34031a8bf0e389822da498d802bb0ef3cd9 -:01b3503b4f2fffad3681e070a0f3afb2ae9153 -:01b3603547d783c3e4bb044be1e30230c8a074 -:01b370536fc66d0671322b55a63f9a964efa66 -:01b3806ce793ab8a8dcf774418a77f197481c5 -:01b390a5a0769d6360fcbd2f140736c22dc279 -:01b3a043a089b1ef8a058a5a6c8256b5ef2bbf -:01b3b0a90723ec7bb624e8d6603ce9b0aa3065 -:01b3c071f5356a44fb89918f1e098ff0ee7d55 -:01b3d0a224efa52a724994f488ca529e2eb4f1 -:01b3e085dffcd6115d240c97f103a73e40be65 -:01b3f0a339b98046d0bfb73db0c1d7607eb7e4 -:01b400bb3d2b677c96963da4f07633927daac0 -:01b4108435e68169d0079848578ee4c9fe0c61 -:01b4208995df621291d25bd64aac4cab00f3fe -:01b430d82e6a78399a8d6d007a8e4aba256583 -:01b4401744494f37f9f5148546a7a9fe20693e -:01b450640154b8af85cd4fe903e508e6124835 -:01b460cf7776a4105c93e8ec32403220901876 -:01b470db6a30d866631cd07795937e368b0ef9 -:01b4802eac6c2ae92adf3ad6309a23b59ad21f -:01b490890987203c4d40abd615219694a363f6 -:01b4a067225e79572052b7b98083389001c417 -:01b4b0829b089d9a4f5b19aeefcfeb20c4648f -:01b4c0fdbf33aeb26de1d20a47a8b7811c2ab6 -:01b4d057f583e247fe267b9f4f49c8ccbc047a -:01b4e08aef2059ece3d7c23ce0a029cd68045c -:01b4f0124bb78b576ac1af41fd7b9d95c57486 -:01b5005c01290ea128480535075af625cf9a13 -:01b5107f7c3f2a521c4885b570c427a84d2884 -:01b520f1b89d8a2d9d971159b0c5d54bbaac14 -:01b53035885dad17d40aa8891c9eeccccac92a -:01b540c075cea7a84c1b12b182ff613ebee9e3 -:01b550fbad383eb0e6839b10bc99329f5fdcc5 -:01b56044099e1d1deea26563fe28f0a88d593e -:01b5704bb6620033cd7362d4cd065c85cf37ce -:01b5805b150946c7093b081d3be034584b4f33 -:01b5906c16550352447f970e61e3ab16f69ea4 -:01b5a0e99dce818a07b61e9b0c54b7dcfeee6e -:01b5b02536d6e98054d51913862374717f83ec -:01b5c011b9b5b20fc541313a0a5379d1c134c6 -:01b5d07a0b95af1bf9e016e630bc1af241e79a -:01b5e01b63b1074b0c628096b87eb0596d93b0 -:01b5f0f9a436878b6e99ee50444656ed85fde9 -:01b600e652d34f2cc87c95f04ebab8975ab15d -:01b610cfdb03647c1d458665e70183317f5959 -:01b620e9d7eb95c1fe9fbc37674b30086dc93c -:01b6306f05e4ee9bf914a293ea382c58b73e8b -:01b640799fcce558aaddf096c6c5977831c24d -:01b650ab0c02970b1114283fee2721aee5df56 -:01b6604a421e1d0f07495b7f6ef0df7c515500 -:01b67045137e33b9546b495d7eace69624b494 -:01b680076f2e27999130eda6bd6f071761810f -:01b6909f052945c6f4891335d37d89c94d1def -:01b6a07972d5e8a057a2fa77deecb846aa3572 -:01b6b0df0f2610f1ca8e61c1cfa139f7be28c0 -:01b6c0676d1e57e0e03007dc7d52350dfc62c5 -:01b6d03ee24bfb00886a8bce5ecf72eaea3e4a -:01b6e0a0d175406dde1ac358733845ed6bc516 -:01b6f068e74e0d77325538750d337ebc3cd737 -:01b7001fb53a3ed28d8a16db535bb502285b9f -:01b710102f10cff19593904c3114903bfbffbc -:01b7208bc810c663ffebae71f26c7e6d306b1d -:01b730baa568bfd6efb708cc15315413550558 -:01b740e00ad700a8b67f25369642a6ff5b3d4b -:01b75003e124a098264c4ef010dac11114c00d -:01b7607d649dc0e03af6679171f11e0d0d709f -:01b770a4e5caadd6ebc846fc5155a30df3863e -:01b780fffd9aaeec28e1b14fbd85a73d9dc23e -:01b7908dd4dae35ad24ca22df9687a4d2d07f7 -:01b7a0dbbb15fa817b5422786fb98de74a5f06 -:01b7b0351319f54b2fbb1b9f51d77ff24d988e -:01b7c0f7aa0dd97bfd81d15f440009e707e57e -:01b7d05d02cca5cb795d544e5e01de565acb1c -:01b7e03a3852d3aafa78631af48a474f2e1297 -:01b7f01bf19aff7d285ca67d79900797031b06 -:01b800852028c0fb966a5c3668e67860b2f778 -:01b810ff326d7896db40ba19013f039670a05d -:01b820032dfbaae52e77bf3c13c5814319f093 -:01b8307ece04fef0cd68f410bfe8d43c8a09ab -:01b8406f553998b23c34645d9b4b33ca60195a -:01b85076afdb4ec5425fbc79e72ef21a10378d -:01b86023e431b6c1496909fd5081e8087cdab8 -:01b8706b150d88e74715b40b8bbac0f1defd77 -:01b8807c5e8d5f4df9fa6342db14f463f6a091 -:01b8900280144d13b36a2e32a8b53948226fb0 -:01b8a08d3715e61fcf6f526b22cccf306bcb0a -:01b8b01d9d6e6cb0bad88f9ed1eb4e2b4b4260 -:01b8c0fd75d0b2818bf9ac26fba5fefc3dfb8b -:01b8d09a42f90ea5c56ca324d3243dcaa37c73 -:01b8e09870690a11c32c5f10fe94c978b324b9 -:01b8f03bac808cbf2ff61a354188e13cbc84d8 -:01b900e47d63b7b88a892d665ba05e20252da8 -:01b910f0a90bc5cc3583522f87c9f46feec8f4 -:01b920fe36d09e3e8335d3d255dd9d7f08237b -:01b930090ec0d07a97fb404ca97712c2ad3f43 -:01b940cd078aafd48be93b5b4635bb415cb378 -:01b9508b8f01097b2d0c6279701dc467ae8431 -:01b960a63f0606890e2d32555bbebfe99fc857 -:01b970e8fa9a01fc8935cdc24f56377c33f256 -:01b980945961229cd09c0d0b5d04715ba2e1d9 -:01b990c949cfe6fc19e0b0f0148fa681327652 -:01b9a082288709cf2939dbbfd939ef17b511bf -:01b9b0dca0ca87d615031a4bd1c921a37eb8c7 -:01b9c0d522ba0cf2954ecab3effc101549ce7d -:01b9d04056c4b8395ceb92bef51557500370fa -:01b9e06704ead0873a230b399eba6b2489efba -:01b9f04df81e5544e5947bf5704a7303662e73 -:01ba0050055af2d920eb2b939b05fb0215b0bd -:01ba1025513a7c25a1cf243971526f2e1f98db -:01ba20732dfd5871a7ce1070406d8b16bb1b0c -:01ba30136d6327647ec573cdf2ab655d4a837c -:01ba405746ffebb494d1d2b3bb19a216094c9b -:01ba50c7d0ac501b011f79ca74499d86cb0614 -:01ba60ba082eb248e98e3adb89f7e63124d84a -:01ba70f7c7272a0b5c50c6f6fcd15fd2292b43 -:01ba80d852eb19e83e22d60f156a3981200f01 -:01ba9025adf1695d521acb213d860c79eb88cc -:01baa079ddbfe86a64aa13226beb6874c36397 -:01bab011b33ba51757f564687e62eef0272a44 -:01bac0ff55633a72720b538307fd11ea161c15 -:01bad030adfde7cbd3fbea9a6b25d77f0ff2be -:01bae0723447f2e43130638fced1298d5b5636 -:01baf0dad6f595edbf76ccb9b11a8819382f00 -:01bb00fb3040a2880de523aa5cb5b403761052 -:01bb10afa03b6df334884def2cfcfd70039099 -:01bb20420ad492877350f0bd3e97405c126f74 -:01bb3087058f120af8d2a0a78f77ba0d1a9194 -:01bb40e55599ace4c2c19e43e8beaa0da33277 -:01bb503f0dad9c4b5e4cff5d20ab3b8a532bd3 -:01bb60572bae306c69c9e890ee62aebd85bdd6 -:01bb702aa5a2d5a667f92ef1d7039e1bb0c202 -:01bb80a89dc072aceaab84d5fda6930b8e82ee -:01bb904b418a57fcf838cd6713765f26d855a1 -:01bba0367eb6e75242c597b3982cac39f0383b -:01bbb0d10adda306ae2ced025cb24c63807218 -:01bbc034c953c7b6298326cad63c058b7fe562 -:01bbd06c3012dbbb1ff8bcbd305d6cd8c5ca10 -:01bbe043ee7d1b7ca193e3b9b0b120bc591658 -:01bbf0395edd155eb7426887edd31d1a6b5ca9 -:01bc0042e46cdaddeb65c3058ca5c0f3e60393 -:01bc10f33b84448e1cd9a91565ec11c04e4b67 -:01bc20eadeff5d453e03d28b2ee121fadd4bfd -:01bc302635f9f5154dc0fbb9cb072547a5f345 -:01bc408d5ca9ed171ea9b427e56e30dcfe86f7 -:01bc500c7ee68188a996a82d5c870f57b81b53 -:01bc604997a6ec10ea4ffa662ce2bd10bc0c73 -:01bc7068ad117948507548410b0c7fc27bcc17 -:01bc8048f593a6c43a0f6296ce010de56192e0 -:01bc903d8220ce2bdd1d884ae076eefe876f78 -:01bca01a86dbd02c944275121846c8d7150b41 -:01bcb07b392acf94a310303542061ab0727e54 -:01bcc053f036b4bc2545f4359b7241d3fa650f -:01bcd0fc3f1cd0632786ffda1f5f4c0bf22756 -:01bce0d37b41acf9a8a603dfca3e87eae78f7a -:01bcf099046153d1e4e2dcd0a119088d3c106c -:01bd0009cfbe5f550cb81dc9659c47042f4655 -:01bd10597e6bc7d7354fd96fb17db17d12936a -:01bd20f0ac50afca5682a90ba233e46260bd2a -:01bd304a02632c968d69fa3e05b56298fa4026 -:01bd4032f15f09f5beb48c8062b8bd465c08c2 -:01bd5074906f86956ab88552c613c96a07a6cc -:01bd60ea1d891f72adfff4fc3575f9ddd3a62f -:01bd70df03161697992cfe4a75ec6ec093442d -:01bd80624ee8e73312e9dbdb703f1a427c0160 -:01bd9030e9f89bc1c70c0c8c18cde3cfa566f3 -:01bda00be9bfe36fd338c214441d7866cf4bda -:01bdb01b2897d0b1c488290d785520a54fb0cb -:01bdc064001e8ea1ee50ea1fd3507abf35e64f -:01bdd0cd6bff916b057371b4620e7f7cc5d21d -:01bde0b24ec985c254a53a5e79c7aef60ed222 -:01bdf055863de7c05ffc6aeacb70eac0aeae8a -:01be00987a384a9dc258533748491e02abd16e -:01be1091be2e4cd2365f99b26ded26b750f424 -:01be209a26d4e71ee038d59a240b8db0619ddb -:01be30cee197d57cfe5b2de3f303701a92df94 -:01be404f03fce5b373373f60e47dfa2102df92 -:01be5048f6b1134301106d19047f27b4ec076f -:01be6054c1739e860b40a7fff304afda21f29d -:01be70052986ccebde73f5c2ad9cbab8fa1d83 -:01be80358e595dc6383317a216234acd3dd672 -:01be90b11d323581a93c5ba292feb3231253a5 -:01bea08a07106a87578f5c01323c7dc031aaf5 -:01beb0c9f0b7610074da563355b44ea85a29ee -:01bec0ad5c4d9374364060833ee4c415ba6a87 -:01bed0cc1c3d31a6f7ecc9a1f8a8f963dcb459 -:01bee08cfd6a8b9b4047d8e87a1f441ae40725 -:01bef01b5592f836eb6a4a6073b84cf96c7e88 -:01bf008aae9e9514739784bf4f551b0c258b3e -:01bf10ef2eea5a32956985ce83f9bdaee06a42 -:01bf20cef35131de66dff8d84177d6f961c661 -:01bf300cd9cd6d2cc6a0e77fde7c76696e2f58 -:01bf40f49cb9f8d6ebd0100498d2dc156fe36f -:01bf50471db7b8a1d608f88cf44ba5439c27ee -:01bf604c1c59661b99329e88a99f32efc52d2d -:01bf708fa3ff9e43f43336db71ae3c6b2db07d -:01bf807d4c5dd078d0392d766ac8ca0a58a0b3 -:01bf90b50f1239b3ab26075e661374b5f173fb -:01bfa068a16879168c3d280c01e77ed87026ee -:01bfb0897a0d4e0e4c6901ff0d63bd15f660ab -:01bfc081877f3df29a5ff3fc483463652f7e47 -:01bfd043bc8bbee67eed2fdcb7f3954e144de0 -:01bfe09aedaae1a00287cbb43e207f013519a5 -:01bff0442f9846f8c70f392778260097a7c683 -:01c0008ebe1896cb262c239011f43845e2f2d2 -:01c010067655f819388d4f7f215afbb5742e5c -:01c020d8861f2981c91a39ab7037b27b040963 -:01c0301831b8cac460c978b9bd5a17084d77f0 -:01c0401e88ec137d157ad1e64b7c48659a322b -:01c050ba6a37599d564d4dfb169c0bbd052f16 -:01c060ad7fb9855bed786185fe44c74b48b23d -:01c07029e2472b0439917db41f66b60f16f289 -:01c080415c727430b4b0df8403f80eb6841257 -:01c0905ff8d43370c0a97c6d562d85a263b9e0 -:01c0a05f436e24d3bdd84feee1c8ddeda58fda -:01c0b03329bc52a6626b95278f912ca1a96605 -:01c0c08b172e84462959f577555b89892c7263 -:01c0d01ca55933d66c6d37fb23a32edf1ec36d -:01c0e088199f1103cb5b5169060f44dd655e94 -:01c0f05dafda4158eeabdc0f6507bc25870438 -:01c100d2e01c332b234fb079aab6ba0fec5158 -:01c110e863ef6785964ac1687c52595c9730cf -:01c120035d1fed6101028911f20683c6d93346 -:01c1303491ed93fc649bf5093088fe066d424f -:01c140ebbb76987416ae8b770197766bbf1fff -:01c15030817ff26ebddde24be46d196c943da9 -:01c1600a71ae306f30a0d5bd5cc0f1f2e332af -:01c17022ab62b5ceaeb20ba68b9c2b55a30acc -:01c1805335df24c8cba4a981efdbf944a4ebb8 -:01c19073bf7b8d8ad9886ac613462b678df9ac -:01c1a0ac0f7a6667faa0a9974c38efb208d81f -:01c1b0d1f1d383bc93df1a0b60249ca16376d9 -:01c1c05b4f1aeb8046b0721ed4b29299e65aa4 -:01c1d0cf7040581e6d729c4e3fa03fafc9cee2 -:01c1e08e1ee937539b68d493992afe5e930b50 -:01c1f0457dd1fea0207560333e070f8de004ab -:01c200817eca0577748e3ad94c13017bfc24d7 -:01c21050d927055cc14e97d5ae0400f3e77b82 -:01c220d71abacde7f625b600dde29d0a5112bf -:01c230d88b10f629cd84313f5f43c13639d725 -:01c24056abb2152edb70badbec70076ec7a6b3 -:01c2509874cb6ed3c4b541fbf6f7162f49eae8 -:01c260e85adb4388471427590ffca0f76e5bdc -:01c27032fb25911b1bfb1427848bcf4ea6b3c2 -:01c280a355f3551484ba508208f7febbd2a690 -:01c2902cca694c9cb5d9280bc3e373c1d9422b -:01c2a0779816fca523b94a297ca42513d2eca7 -:01c2b04e61f1cee0118cc0440898dc4ff90274 -:01c2c00a0eb9d411b13632c7e616eac9098a29 -:01c2d03c021487329b20f4e3707d663641a66c -:01c2e025bb66c76278f807d4b1abec40e1d893 -:01c2f0be375d21ac901315a2826042c23214ff -:01c300e1a188d4d8cc0a96799d71b932d24a39 -:01c310278bf9f94eeaaee2c2b20ae5a559a4b9 -:01c32093ed4cbd63ce460ad254144ea27fd240 -:01c330dae7bce94238dd4eaead8e65541469cd -:01c340460e431ed3cae80594135b05073b6437 -:01c350e762836c623fe25cfb3e27812813d52c -:01c3604e8d97b6be3ffd4b61d20f2def059fb3 -:01c370aa151ba30896e6f93c2220fd3bd9bf4a -:01c380576afa873de4687b2bb4007ffe548338 -:01c3906122ef0ed8b47e36f72f4463f7cfb971 -:01c3a0fb8cb090ad901fef0463291ef0d1b98e -:01c3b099564f20d13bee24390c3fcd1b22a9e9 -:01c3c0962f165ac0055b07e5bb14656a867da5 -:01c3d057a7fb6ddb75be7c584535346d3346b4 -:01c3e064cd8125a407261060245781dbda8a55 -:01c3f044ef8c49cbe7a014a1f543d7c818e5e3 -:01c400ec97356ca7c16dd273ff463236271be1 -:01c4109ee717202bf5419a8c29955d8a89a712 -:01c42046eaba58d1c6e8688a14646373c9b532 -:01c4304b4b68c1cc3f8df7be4c962854773616 -:01c44083dd1cb5228eab850a0a7ac4c140f1af -:01c4503a360b34790fcd668751ad07cf22cc99 -:01c4601e748e8d55e4749e8a2770f3639f8728 -:01c4702723e6b074717e49f71b4b199c0fdc8f -:01c4807eb5edb941e4d702753da935f05b0373 -:01c4904926ac444e593352d150ab412c217c1c -:01c4a09eff53abda12e0c18f9ef7bad8c497c0 -:01c4b0868f9d92354ff184681b2ff9efbb3076 -:01c4c078edd62340ab3ea2f3c63899b84ea911 -:01c4d0ee3a16ca4d990de93c182733066e0a71 -:01c4e08728a65a198528a1985f4ca797a705ff -:01c4f010abbbcc4a0ff09dd32c8e121e81a743 -:01c50084a1f44ff12b793759963dbf8a785352 -:01c51029b129c08a9c65cfea4cb1040b341088 -:01c52037f13d7aa5123a974fb80789770fdd28 -:01c5304dec7f449cdbcdb25ae472ee9a263f37 -:01c5401ff1052ba2995f3144ec5bf20309db87 -:01c55012a17d59bd39e62b1af3649a1f6b56e1 -:01c560bc18079ca9085b7381e112b6b3114e1c -:01c57027793d0b141f0835bb9883e4690f40f8 -:01c580b438b20c5ac50c36b0bc62bf835f74da -:01c5902350efd939e2a22cfe0391054d4757b4 -:01c5a0e84f552d2914187a014d7b60c3da9a3f -:01c5b0a78676a29d17690511722f20a5c6ea1b -:01c5c001b8741837288dd73a95ba75c9b1f1f0 -:01c5d02879e890603e3966c60ddcd8fb87ecc2 -:01c5e04af9c2f3a9741ade6f4b979359c51041 -:01c5f0e95c8aebedd28e4234c0ab29dbd8f9a2 -:01c600122034b1fc576fcf54a70d6117db0fbc -:01c610ee1f76aea17e44fe27e90ad654f121b9 -:01c62027e7f628cfb40ca3c165417a169fc2b3 -:01c630591378ab9791bd76dd076a5c8f86192b -:01c640a42fda39a752796af95d295119c8bef1 -:01c650077dc20dbd6ae0facd2f2605e7eb295c -:01c660b01e6960418a9a21dbd0de462f079ca8 -:01c6702d7674589d18f03e7e0bee8c75cfafa7 -:01c680b99ca2bb4d4fbef74892a6f965029624 -:01c69054af953f7f4a3c969b71d7c5b90789ff -:01c6a06ee8209a021ee7cb0c4fa2daa38156fc -:01c6b0577d167da95d790653abcb07d2d76361 -:01c6c0d6783f4e5be6855a13629943fd95e8c0 -:01c6d02ea7e78b037f35e37d738ee2ac0b1051 -:01c6e0bd356a257a2f01b3edfd05d893b121e4 -:01c6f0df460145de979485f4c7728f6d4e18d3 -:01c700e4ac9743a287e1906b4c2c9bd62f6d5d -:01c7107ebb95fa37a46cc65fb1445d364b1494 -:01c7206e7998bc0bedc93e9148cbf45ab59f86 -:01c730e1629baf4251fefec08532f89eb593fb -:01c7403989936b649c19a6b4eb9087f15bca68 -:01c7503ec29805c9409701a73db87a6b9e8fd6 -:01c760c2df13849425e652a71493e859902932 -:01c7707ec86ca216637492f61b4872a3b10fe4 -:01c78010e86f17b6a0d5e3f3cbce03c4957d03 -:01c79087205b13a77651e81d10e1be793a7e92 -:01c7a04127e6b28d936e6ba859b864c5c619d1 -:01c7b0a562c31bd7b49a430cf701d04490866f -:01c7c0b79a236b41296185efb264ba7504168b -:01c7d025eee9e4f6063b2555f578d7a2ea423d -:01c7e04ae544f7fb792d95d7d3dda38055731c -:01c7f07caf9c1137d8940285089ac53a8b2d78 -:01c800123087079f26d45af7abe2a0deab79dc -:01c810d70f05146d29ca893e5b7952e3c1e805 -:01c8207f3a31caf894684a5cd727407e629474 -:01c830c7ddd2ed8be275c1cdbc94b9f11e01cc -:01c84093e26e7f99131fa628a052590603cc64 -:01c85073ac2137e075e74ac2b95cca7431c09f -:01c860966084d21d76b4bf38d8ba1c8740641d -:01c870b770273b668c167815feec9c8ecfe2db -:01c8804a06e0901ece864eec84f88ef3487446 -:01c890eb50021c1196ed8c9894998ab5631dd9 -:01c8a0c50e508606b79e20d982ef2774e42447 -:01c8b07e16b0d9b4b119072813ab33006883f8 -:01c8c095dd02bce025b1cac8300ec153ba8289 -:01c8d09952cdc7117c4a61754aa6d99da33474 -:01c8e069859b8077d1c782e11276cb7a7bd55f -:01c8f046337c2629b2615b320fe4917f1b022c -:01c90090d8e05afc9c6454674a70777b256740 -:01c91098a0ca269849fe8df042aca5fd281bc0 -:01c9208dd1451876ab7b394bd711615462a708 -:01c930e616ffb30fa26dd2a9713b0ee6b7bea2 -:01c9406628d598b971cdb6566e66913f3fa0b6 -:01c950b0b5dd3bcab1f427d64c3dfe0de1c4cd -:01c96096a80d6048992f752f1e26fb6a36c7d7 -:01c970a66f1c4bdca4d86c3c8d1013e36a0c94 -:01c98086b858326a81b372cbaffebfea8412c6 -:01c990652a155ab5a9bbea1c9cd74dc5973139 -:01c9a04ffc0d73ea87ef1c77ac40f9b0fbd4db -:01c9b08dae8cad0002acc470013271ae000439 -:01c9c0e40ec5a3a70cad10c2efea555f35bb8d -:01c9d0cc8f725209916901b9a42610c276871a -:01c9e0258bafba61ec4d2452c112d8991ab9ac -:01c9f0eda29bf3b30b9823751a4220e9d6b5f7 -:01ca00df4eb287310830ecd715a59807edfadb -:01ca1041df2ed389f6890577e5d72185d1379e -:01ca209aa2e7b062dfdc31dc9724be680d8ff5 -:01ca30283a198f94795c8820030812d213d9b7 -:01ca4082566de1c1be213b3efeec21a7dd9c56 -:01ca5083a27839f9c79d094bd284839021f076 -:01ca60569ab2b511c1460ba20ced7e2314577a -:01ca70f1745798173ea015778155a1b9f068d6 -:01ca802f7e58abb5161e974d022f13ee75f913 -:01ca90ee188be99ee7985a06a82c7e020cc03d -:01caa045b3e12467fe620a5a07eae61dfa7b06 -:01cab04d8c98517eabea1f28571e50891a32a9 -:01cac0756a618cbfa0e335002fb4e0d26775d0 -:01cad03e45f032f91dc5c85dd78a19cedf3f55 -:01cae0ff37631e3180d1663e54f101e18b2de9 -:01caf0d941eec55977f7d641be9e9d4ca9475f -:01cb00d39031ccabcc060a565c24d583311453 -:01cb109c0bc015fae3eafe16d68b3d5d0ebe5e -:01cb201be28fee372b0a32d535afc1bc474192 -:01cb30a732289e3dee783985ba356ee10fbd47 -:01cb40a86382b21439a8e286cf10a22573ea38 -:01cb503e7970083e8c6850a95502ba57a22e47 -:01cb602f811c7b3127eedcca46e63b1978dbdd -:01cb7081f5e45313e19e2316e0d81d1a75e185 -:01cb802193d6a27a9638bea821bb76509a73b0 -:01cb90b383311fa1c13f6a5deb9207ef104206 -:01cba024c597e9281210009a0dc15e6112ad13 -:01cbb0469eacc98318fce7008a0b1c5c3e424e -:01cbc0977caafcac9e991f08921aee3bd538e4 -:01cbd07d5a3e3821300c33ccd617895206374f -:01cbe0e40fe6bcaf8d68682c7aaec42a99453f -:01cbf0060394d83f9f42a219d5aafe295dd69a -:01cc00e6ee14d1d76857a35aed738348ce35d8 -:01cc10b496acd73cece309c9a4d7da1fa4e02e -:01cc20ac463bc65c0804a2cc5e1351c7647add -:01cc30f771196092f93c00972a49ebabeab691 -:01cc406ce7cadac817e790ea6943b8413bd417 -:01cc505fb316cf52c2449190356154ec745461 -:01cc600cb76c40ec954cf18de84b765959b511 -:01cc702ef7148a7346ec97dabd01d8526fcf76 -:01cc805411f4df66adfacd7859ba89c0065ff0 -:01cc90cf400f22ab102c82e34575dfd5b6e1b2 -:01cca0532436d823de683d7c76174ae9272c0b -:01ccb071cf86ecb60e89b2152a5cae37492691 -:01ccc085956cfdfcc0c3581715e992a5aedc9c -:01ccd0e5433573793ca89d0f84405677681e52 -:01cce0e19038514130a421b23a3cbe722a1837 -:01ccf06ed2e2682d80b8288d3ed3ba935fd09d -:01cd00e9aad6d27dfc7b38daac21c010e50952 -:01cd1076b65f36e6faa7af31a4bd8ca4ef7b16 -:01cd20a1c8f6fc8de3e7cbce871ff8c08db2aa -:01cd30307caaf0dc1b9b480c6624efb70c609e -:01cd40499f87bf0bd4bf4248aa31e45c496e52 -:01cd50d88c43cef7139ee44ac1c858bb525c55 -:01cd601b2800e2af0a059e5895de8e3136beb2 -:01cd70a70a604988111b67bba90e19807fccd8 -:01cd800bc9087a3975640b2d618464d55f95a8 -:01cd90779985d4b33e0abbe1b238272dba0ddd -:01cda0d2c321f8b1695d7a04b7a57b211866d0 -:01cdb088a2ee45bdf0fedf89c98ffc2ce6fb19 -:01cdc0bb31a0322b361bd79218092fd5a3f769 -:01cdd0bf46638a4175ec35c49c403ce6ace77c -:01cde06c17e1290a28f01e526ac40e1cd19bde -:01cdf001e8f9bf4833d7c82297646e8bfe0ed5 -:01ce0063345bea3a41c61a8e011083e994cbc6 -:01ce10862686b0fb17521e3c3a782efb66cba6 -:01ce20dd031e5bcd1ead4c207ce8468e23ade7 -:01ce301e3c9fc07fde536f1a2d5d1515f62744 -:01ce4003a3ad9b9c34824ea1c145b4c2ed3433 -:01ce502de8e6026face129ba97d280bb26f67d -:01ce608612212169b6f43161235ea083da9b52 -:01ce70a5985acd199e3996e3e45c7dcbc05c65 -:01ce80214d080b53cda48f77c07384c8e7ad82 -:01ce90b1f84c4d1a089f5b4d82405845cd47c8 -:01cea00044264e0ffa196df962e751390d7e3b -:01ceb05ab2bdcec1601c8538fa212e5f4175a6 -:01cec0030c74b64440717819994b4b3dcee151 -:01ced0239acec1071bf81141a4c3298b0fae03 -:01cee09ae26cc2b80cd927380949adf4490a27 -:01cef0c62cc2366faad8090d243074a9decfdc -:01cf00113526e93121ed0183fc04a25c4adc25 -:01cf104c2098ccf4a3501205b8e7a18785647d -:01cf20388eec0aa0f39db262970b518128d644 -:01cf30126467ac47435ebe0365f79153caa6a2 -:01cf406a259047451ebb254512945eb38a0c67 -:01cf50a52044c1345aac581ef17b965f1e807d -:01cf601b021847c33055822a749b4cbbb265cc -:01cf70c85514b91906305295eac38d53ecff8a -:01cf80568643e0cdea25a6993185f30ee600cf -:01cf904ac7efadc7ac3d0a4a4cb0cdc17233e0 -:01cfa0b9ac79a3cc2f87e829e4389d0fd4a3c3 -:01cfb02e9c283ee2db352d9593723381cc67fb -:01cfc0f1c248e2a3050b2b3d0d6e99ee28fe08 -:01cfd0fab694540285dff2404d28fe14e761e1 -:01cfe0c5d15fdeb96c5f01f1bc243c57b3c2ef -:01cff04f1b40ddf47cb69692f3b0284af812c5 -:01d000d6a291e06147183a832301c3670c13fb -:01d010cd9052d6f561964286bc9e77a496f279 -:01d02056d9b0e52ffa477904c6774399e5d8cb -:01d0308b18caf01591225d179c94403ce07dd5 -:01d040fa68b909d1eba627d60c5ba645020447 -:01d050efb974efe9babb2115838ff791f58d19 -:01d060edae49078a274efbdd97a8d329c61856 -:01d07079dcfef681b918c42be27a4e9585e14b -:01d08076b714be30e383d7c28af4cbbeb94814 -:01d090a8de28f222fe834dfe2e6d463052f265 -:01d0a0e73d1b101bc8d61e501fedcd54840a14 -:01d0b04ace82bb5274bf35cc6f0669aaea87c6 -:01d0c070467ceed02e29f0f78b23211bc4b329 -:01d0d0c964c063b6f2e511180062bb228cd0bb -:01d0e0cffa8a349a994c2abc342e1c711ac761 -:01d0f0ab4468ce2dc90f12982c376acc438e11 -:01d1002ce775aa4c08caf5bb74eebc82bb0149 -:01d1100d4d3564ef889245d161cb231e7ce041 -:01d12060a0ae361cf132e7864bbf03b7ae3e41 -:01d1304f2c68b63ac40ca52821ddbf46f3fef7 -:01d1407be9929539ef7932f54fc199d9f6da40 -:01d150512bdbc0ad06f12f78ce54d68e0a83d7 -:01d1604b10ec364145e3030cf263622abd8dc0 -:01d1703b531c725821780095cb045b385e5196 -:01d180cd466f0bc19ae81c89b37e762bdb5ffa -:01d190a93f76413b87567e1816ce4088e00cc9 -:01d1a0a370952a23066c391128285d1b782c86 -:01d1b0dcce78e59c0bd09b003fd0e7bb65687f -:01d1c0bcec0c080cc3714f40504c900534c135 -:01d1d0ce5ae5dd72029c002db69d7712869a32 -:01d1e05abdf40caf4fb91fde9d2974b7f9234c -:01d1f0ba8a0e0cbb71a8094089ea5351bca00a -:01d2006860238e7a307fa80a3f27d8110ad4ea -:01d2100e8239a8e17f0b6b5d98191f2c3c1ad5 -:01d220bff1f63055603f8589c44ea0f334e1e9 -:01d230456e5003839ec2134fc97855f555b169 -:01d2407377bde79140cd88db3806690585bda9 -:01d25013f0df98c398dfd6d4f8629cffe1c8a7 -:01d260bbc3c158950e40d9a01ab30d689982cd -:01d2707ffca20e1f5dbd371e7eeff02f1320c6 -:01d280931a7b6e045102336980a645cac87d8f -:01d29021b30629945d0c4632aad6b04671a117 -:01d2a08e350ed464b03fe505d680c360d978ef -:01d2b08e874865d9ae1b0c4325ccab03abb849 -:01d2c0bbb761de95f7ddda32f70577727d4aa3 -:01d2d03eb03dd31d27bd6e9a0730deac203d16 -:01d2e0edb555311af31365389c3bd2788902a6 -:01d2f09450c4c4e7341785ec40d6b4ab4ec094 -:01d300d5c2d00090fea9e8ad3c3af7c25acf3a -:01d31005ca96c657691663833b99befcc5bfad -:01d320d040af6ec46523f63d5bc8d04e6e8684 -:01d330fd5abc1a7a247780e4ff106d1e221926 -:01d3401c23947db488bdf1f5b6a0a091d2917e -:01d35074346abfa8e060e14e062cbacea00bae -:01d360bee3ad0cabd335a8772d5d833dfae587 -:01d3706f11a4f46ac507d174ae709259c1f420 -:01d3808f4f254d30ffe937bf5d80a9aabc6e75 -:01d390ecdb84c18495a3bc179acfd2d5de4451 -:01d3a01ac0569be53a6f892081681b0550c71b -:01d3b05fe539f94e4ddc59d5ff65e1f612b7a6 -:01d3c00204a736a0affe5d7ed418284d5bca24 -:01d3d0c737dffd74215947b849258d7b15a812 -:01d3e03022c028f0936ddd64a1038c2f69516f -:01d3f02759345173f468130444b5749062d474 -:01d4003b262064119d92cca028b9fcdef60648 -:01d41005098a5ade639ca7bfb9616a688429e3 -:01d42049d36d4a4e28934eaeb47ccdd3934042 -:01d430c1534bde86487dc2bd9b57bbd7c739df -:01d44077fe9424a30ef2398efd2b91f94fdc61 -:01d450c5c50dd95b274d91662cf8c1530cf241 -:01d4607e8f5baaf975c7fbacf83d529b7d8247 -:01d47090aefb17eb7036b666a03bc45e6d8444 -:01d480527e6763050bf750333ee8726cc32974 -:01d490b34491160578934178d4999bb6825b7b -:01d4a0f719f8046e654ea248003ade2b6a4f2e -:01d4b0b33af7d5975e40490dbe6d84086ed752 -:01d4c036914effe91e7b04b6fe298284c0ab7b -:01d4d0d15b3ea4dcb456b83a551d0e50451c10 -:01d4e089261e75235e82675cf95b6c2524169a -:01d4f08badfc4bc0a2aa1372dee414fc0013ef -:01d500e8ee876d7fa4d0befbb3d7082a016156 -:01d510667c9cc97892dbfd99c6bcb39b3f1f29 -:01d5204b8fb091ae9453b3ca004223b44c5f87 -:01d530bec1fdcd8bbfb1c3ff0f417c22c58b70 -:01d540f36b8215fe2666dee2d83e55febaf10f -:01d550a79f15c4405187d523c149aef97eb24c -:01d5601bfd730ac1f0b3546a9893a021b50481 -:01d57069e57bb386f772ffd81c7334ed8b3d43 -:01d580223fb6b2920f7ce7ab67c2e8bd4fa428 -:01d590fb503934f9f495fef023430e0858e9c1 -:01d5a00258b6d542f041de52cdb58bc29b574c -:01d5b052c7a5ea37857001d8df25101e574c84 -:01d5c0ced03c4775ca170ff9c79910e032687d -:01d5d0eb5d195743e85592dbb6531fa0f23d18 -:01d5e0ddd9a130820163358af222a7c1e580ea -:01d5f0f3fdd51ebb6bc563e3528ea75b8b6a8a -:01d60049af55e82abb11de35d343c81e5d36f2 -:01d610143634666ff0c3407770c4ed777db6cb -:01d62006d44c3a75bbc02dbd115b14e4c3af6c -:01d63041099ff16f721b266f6549039492215a -:01d640ac00cc7b961a234ac22e4329434e34b3 -:01d6507a3570cf244759659b34d0e6bfac0f2b -:01d6605e2a5c706de5598f4140d6d1b6cb2a8d -:01d6702acd849c783d5b5088fc719d7cf783b0 -:01d6805059dc2b3aeec19e89803c8160f97d2c -:01d690f0644785ea5e9c792c252aecf7a1e1bf -:01d6a01d872fa9b40bc2b01eece1e6015c9f7b -:01d6b0cf2146a39973ffcbaaa225b2fe6441fc -:01d6c0a1a0484fa18e0b19ba5bc80e521fd603 -:01d6d0b39bdfd407b19d94f33b05f89fdd65ef -:01d6e099e0b99e478bae0dda2f58867f2abc4c -:01d6f01c20fb447438b57d8c338077c150447f -:01d70027edc0574f5f37e5045d552d6b72eb3b -:01d7105c4ea21141ae1debfbfd696ac6f20d70 -:01d720e0fa095a8c14d34aa3638bb90249cd17 -:01d73016fcbfdcb55f5a91c9f9a61bbcb7e1b5 -:01d740bc843507e19b36af3e9040e407b9f0fb -:01d7500d22d4461384c3a6c7e20fec7e353712 -:01d760d06b4e36b344496b1241f79746e28ffa -:01d7704c166433dfe684b280176663a5b77b50 -:01d780134d2b54c66801c6919449901092f2f6 -:01d7902b40ee145623ea0477dedc55a5c00f97 -:01d7a01f6de1f71bf1c257fd7b28f3cb30a2fb -:01d7b055dac5483e31ac5c648954308bf1fb64 -:01d7c0e08b570a55ba8b3479075340adeff13b -:01d7d03ac663a6af58ed85b7be16f101948362 -:01d7e040fc001460523f0c1886928f3208d769 -:01d7f0464505fb33f0bf607e8043418e418132 -:01d8007b9533860e2bd7e7d94988a01c09ef61 -:01d8103dc2d24ef6271f8c077d5aee0eafabb8 -:01d820a205ca8bdcfc29b5b47183e188502067 -:01d8304559442d08fc36fd19e31bdab0018778 -:01d8402191c9830b1ece7c6cd41f72335bc421 -:01d8504af6c0d6f4110c6f00903db2fbd8f905 -:01d8608898c29bdf136887f765dfc2ea04c766 -:01d870abdc5cc32f105d016c54db71d7a0d96e -:01d880679376aa99f3ee74d4da0ed910a7eb93 -:01d890e62fa5664d74ded513be8531efef6bbf -:01d8a0ef33e59621262b55cf4af239b4dad535 -:01d8b0d85ede8d7164079bfe6b2762ddf7680c -:01d8c037bf830efb4e04a66efa6481ccfe27e9 -:01d8d0931fd57bdd2e662d469a35f9e08c8f71 -:01d8e051af4fd4baacd41fdaf6d7430583dfb6 -:01d8f07b14c20f175e049c8579dd6c049f8712 -:01d900f648570d270bdd3649454bbcb7c5f1ac -:01d9108bf8d1dbcde18e64054cf2f4f8961e5a -:01d920320695b2180e7906a879163792a81f00 -:01d930c21c48ca7d1780656d24c0e5b2940d1a -:01d9405f40e75588284fffc63540752a94316a -:01d950575efaf4089e8ea07076665989f35c1d -:01d960583691b37569b58e96438db6397a6972 -:01d970a817e8e66659a5893307abe7cc348ee0 -:01d9805e5066d5abe3abb27517e00b69895cc1 -:01d99004741c224410c63305d4c6a3f8daf94a -:01d9a01083e72b84c2d8962a677b12c2a018e3 -:01d9b0234d43a985aa3704d1e700cc21c8895e -:01d9c0a3ab0276b6df1e0b82afec803101d553 -:01d9d039dd137286a58f484f2016de5d6c9eaf -:01d9e088d1b6c9e00f9fedf8088286759e3cce -:01d9f05f343ad390c37bb49fbabd6d49a1d652 -:01da007dab2f58d4490369cdf302c7349ebf2a -:01da10166cd264c8e14380faf0e277268e0476 -:01da2009b131258069a50df000cf74a96023c8 -:01da30fa4dbd28e932f09be4601137b6174f33 -:01da40c302defbec72080fe4de997f1a6e88c0 -:01da50abafc9a2db70e2d3411ec01bf9ae9f11 -:01da6039374e7c058fc027902f05da17d5db29 -:01da70e43e9acdcc274f6f6f7160bf8ffa5ef0 -:01da808f062be8647fa3e2170b784f4c011c21 -:01da90145d0d77c9d63a3ffe0851c389edd968 -:01daa0247e71d0a41efd69cfb3f6d842796174 -:01dab0c57c55939b69e995bde283bdbc9ffa05 -:01dac0ee2d2c8d187dc0fab3ca5ccfc0f63458 -:01dad0d3be57a1b77075c9911958855dd445da -:01dae03249cab77e7f0e510f75b28c43a7c8ea -:01daf0d2f162159d548f01cee0e6eeb93248c2 -:01db00e72862647d84ed7e24f66824868c3d4e -:01db1037820d6674581189e8d8276ea0ded0ae -:01db2069ead1ef7fbf53cb87ab74195225cfb4 -:01db307b37d1c0b86ce117269da6ce9430a04c -:01db4048148f3cc3b334d8dcbd8a3df427cdf4 -:01db506fe4a46028cb6998095b014164246ae0 -:01db609edf15ba779d313d2f0faf9fc0d2a641 -:01db70dabdecce206fada23c5aaf00aa4b3aa7 -:01db80c4e1f246d34b84190c383e0eaeb986d5 -:01db903a6ce864fe12af0a968441b6f157b9a5 -:01dba042a29e08cf0c98e3ebf34f75da702671 -:01dbb02e000f30037ea44434f17cbc2f81bff5 -:01dbc09252fde039da3ca05c147812a1b823f8 -:01dbd02234cfc6c474d7bf64908ca03a4141bd -:01dbe0df24f1eda580a754741715bdefb85211 -:01dbf08b0337e431db68697f71b4841751e453 -:01dc0061d968d86bddc166e9e8029350da6eba -:01dc107646e9991829e0e2919de3eb28a765d0 -:01dc206610aeb627eedcea6adbf22cf5d570db -:01dc304e350621d9a9064c03cbbe083157d8a5 -:01dc400c554682a407803a755cf6a56a060b89 -:01dc50648a0e1f732454c667ade2a196a36fd0 -:01dc60b1ae772adcde155ad0c9f4229e74be12 -:01dc7046b33a9a0f17924a0f8f09bc5dc7b657 -:01dc80267aaa41b50be68f7bc5bc59ac8dc6bf -:01dc90bf19c44062395b5f40187a432dfbab83 -:01dca0cad63fd03309950a76adf981b9ce5657 -:01dcb0fb8ad1b1f87087864654b2460c575d70 -:01dcc0c7c7041ba05002f7ac40053aa710e457 -:01dcd001bda394a7ab9d5a035ec64241027289 -:01dce0315a88eb8ca9f1646962e23dbf26ecb6 -:01dcf0204ce4db598ce505b2a6047ece44b621 -:01dd009ee48970fc8c21ecfa6e7be509d274b0 -:01dd10adcff50f42e61e63f9a6eac860de087d -:01dd2092036196907dfad076b36ea2d0313efa -:01dd309816b1525ea46ea3950083f2cb4b4276 -:01dd4036c1ac1c473b23dfeba828dc5465e03e -:01dd5045a19bb6adf158019ef1fe8f1525bce2 -:01dd60604c763dbc06f83d02fde3cd72a2e8a3 -:01dd70e263569c06160ce5a657d8c8f831c052 -:01dd80935b726138e3351671eaea8ec025b3ad -:01dd906128b8876664a8b22b538610c6b09614 -:01dda09e98decfb638a9df42963b539461c8f0 -:01ddb0cddfb3c229ac334a29e7915801f834eb -:01ddc026a149a8314230da9bd6cf8cae2e70b4 -:01ddd010d2f62f8647eaacbbdcd7d03201ea39 -:01dde0be9a10029f8678f63fa5aaac83045478 -:01ddf0ccfb36ac24091d41db2b1ee6d9fdbb53 -:01de0080e484e029e225c3fc0577ee0f7fbff5 -:01de1063a449aaa35101c65523b8d6ca07e929 -:01de201962dd9203647691b0c49479781f9894 -:01de3036135d2a3e978017838fd5bdb4da94b5 -:01de40a61ceb015298f08d0e27d8fd29eb4b3b -:01de50d2178953942301b825f139e9efec9a80 -:01de6008a549500fb768f04847aaa131198a13 -:01de709c26d8038b7ae1d1f2f655353d056580 -:01de80417c6fac8f3153523fed797f02611364 -:01de90b2dd801e78de02536a5068a6a7ed9b73 -:01dea0613bedbf3a09f5d75ff3b89d9449f48b -:01deb08145dcb85043368533daf511846496b9 -:01dec0ad13fc49790aa96ac007ebf5e1daf080 -:01ded0a79d22b0723b07e660d27ee613d08630 -:01dee069862a4076a907aec47769fe1a6c0409 -:01def00686dece1d10546f6c15b3ac5a0308b4 -:01df000e4fc0c5af4b05d13270227fdc4571bb -:01df10ea6387bed03450502dee018b33237557 -:01df20975b8c1306b5257360cfc3db2af1b6b6 -:01df30fc2c1ecc7ca0a430978b1eba265b6fdc -:01df40ded6b91a882c449b63c27c3d3b1a00cb -:01df50e4c4ed6104b68651570dfbe690a641d5 -:01df608cec68ff0098f317e377ba7591963956 -:01df708100301b4d034f389f48df6ec477143e -:01df80200c9402b4c931a912375a50cf737b8b -:01df9015b424dbba34e74e04398d955f6c53d6 -:01dfa0e172ca7ccf3108e599f89ac0bd573ce2 -:01dfb00155e8612f47d8fa7f90877187e7b169 -:01dfc0c50c068f251f5473676dfbe50f0cbfea -:01dfd07ad03ef67738bd42ad8675bae4f20069 -:01dfe0aa8d0114e26f26774d54e53ecec75ebd -:01dff083890666e8a83e6a5a2a5db01aee654b -:01e0006989d5d539ece1850df656da0765efc5 -:01e010d7258b8a +:0000003bf3d7ee45e5173bd2ba70dc9167c22d +:00001059a541a042cba2510e498a01d336d487 +:0000201f2e706284e71bf0c738254c2bd59b29 +:000030549479a06e58210ae9e09e40dbf58680 +:000040411cc069ebf222fb7ba0d6f636aefd36 +:0000506eb8b962ef63dc61e32014b82ec5635a +:000060befeca57c2af11e4a9117394623a6321 +:0000708e019704bc1ec8d6ee678db8e7ac6585 +:000080f8028ed021ce947641f6b10e9da0c119 +:00009018d34a657da63b8f4a91c56526589818 +:0000a0f6b300676a3e0f0831cc289ab74b6de1 +:0000b07c23c084e196b93a7bdde553765877ec +:0000c0b8e478223c6ad968c4db795cdb32a661 +:0000d021e6a67db35c2ab57021916b00bcae2e +:0000e02bc5630ed47d9c7a780ea5cdff5b1772 +:0000f0024fed5094cc0b9a40d86244f8934dc3 +:000100d70c619687309f33f37497b83ea23d2d +:00011055a96174c73db276b702678ceca19753 +:000120c7a718a907bae46a29da4b8194ba039d +:00013016d45fcedd369d8d65be297d697d7b04 +:00014088a42e1e4124cb5659a2b5fec3f03ddb +:00015087a6abee2fe7cc682e0a85d40f08e776 +:000160be38c33b1dc31caa20a99b650b4ad181 +:0001708c32db06ea755db4cc40085ba4fe5e2d +:00018092ec3b6d172e7d241bff8db54c348357 +:00019028b705bd350bbe9bcb117801594540f5 +:0001a0bb13e3cca1d8492d061d63dbf57bc403 +:0001b06eb2941743e425aaa90c4d5f0721dbf5 +:0001c0a9fd8b84072b575ca7142b2ada5aba1c +:0001d019a825fb220be13991ba4354fa4d0f77 +:0001e07d6c618274e5a198104052b597c2722d +:0001f09dd68627019b8ee2f920c19dfd1c46f8 +:000200c84f2cc46ea33042de94d748b803fb09 +:000210ad026093f03a5b90632de7a6cffb87a9 +:0002208473e1dad0df9a3ff5a25e2e4d00f538 +:000230466a5fd7535d0fcce1b12904de2ca564 +:000240b1d283e028d9d2576403e6a3be8d9aa7 +:00025002557fbb17181594c8a324f49d91ba22 +:000260102d1bb88568f1cdf5c0890243611a2f +:000270b476d4097e37478ab14d64dd4143298b +:0002806165aedd686377b4a5493662998bb682 +:000290f8aa36d55162e3e67c7f448322ef5cf0 +:0002a0e8589d998a765133f9631666c9e45947 +:0002b0ee3187e209869df46361327378a98411 +:0002c0899b98a4e440b597782d5478d99f3bb0 +:0002d0755b8b32bfa59c234b8fc8c6646592cc +:0002e064aaa93d8706ec0a01e0d520578bdc38 +:0002f09a5644614b2fb1224d62b43b2200757b +:000300b4cff0d61b32ceb3872306ebb3c2202e +:00031074fc3a94849e269d801f96d727828e06 +:0003204cc9e9c970b71cb543198cd8da7360fc +:00033087e25ba09bd38e05e89c95a210c675b4 +:000340ac078982b40ad8f5e17ed363753f6b91 +:0003506397225d1b01a2930284e135fd78157e +:0003605bb93b6824aedb044f2c1af48cc79192 +:000370d209c8eb1b88b52761514916364500ce +:0003807a2fb187f992f5668a084de6e16d9e44 +:000390036962ad375a3bbad56e3d7912f62f75 +:0003a069b035a14960030857f7320804fbbaf9 +:0003b03682413b40345d8bfac6988f2c982957 +:0003c058221bc2af0f2eaf23497d866a987f41 +:0003d0fa52432709fef2717e694ca3ed93963c +:0003e078f82f9467bcf6f2318000bbad0da6f8 +:0003f0e6c854569e0201fbe356b7464737bc56 +:000400ebde34f0d2d309fbc682b3c8a0c3b22a +:000410f4a500c3970133e11be633cffbd27013 +:000420bde031a69603059b6d0a2a2e4d04626a +:000430a79dca60d6943d5f38dc2adea0cdc178 +:000440cdcf134682a5aeb3e394c7e5f04139b1 +:00045012a4a9ff077397bb06ae454e4927bc75 +:0004607bfe1329fd0b16ffc071580021d04341 +:000470517c8383e9075912a92738045a4ea464 +:000480bd110f65dabdc777513bf904f7821566 +:000490654b37c3b5e4866cca92c93a1ff8bbc2 +:0004a0650d6f0eaf7db350b489e34b8f202643 +:0004b06e1c780b9f899ec56f56c786fd26bb9d +:0004c06082a3717bf989943d257a91462b67ba +:0004d0c3976a53af20be50a414750ef6a33b7b +:0004e02563ecae3eec8c667d8bed62b9a2dbd8 +:0004f06013e0d966418240f6759f9e9727cb42 +:000500c6303dd68a3ecc13777e55be85c183de +:00051029620f22b1523184e646caa67b6b5d95 +:0005202f9477ae19f10af1a30ef7beda712c13 +:000530a747ff49bb09e6b5212895b9b7c66d2b +:00054028d3d3ba6217eb64e91be2e60d912aa4 +:000550f9c304705fc3868985b75fc6835e1ec3 +:0005607928c1efc6da14c771544f7cbddd5b58 +:0005700852999902760d60827f6ceaae9491d7 +:0005805190525d9dfb743e4c4488910d1f438a +:0005902af29dbb75fc22e132d16119658b08d3 +:0005a0c590712d31e8ba5d2456ad6b0b0305eb +:0005b077890d5e849a7e8fa465f88fa89a2af8 +:0005c018bf3654139fe2bc18b560d8fbc70bbc +:0005d0b7a8678202b8fc32d52da2e380d2bfd6 +:0005e0ebc1409109dbe37ca63e9b59f2c39442 +:0005f0b67876e099e4d4d4912a3da0bc588d14 +:0006003138e44c5053c39d6a5c4092680329dd +:00061009571575518400955970d9466fef0672 +:000620df728968e12b44dd7e621eb2b10beeba +:000630bb47649f0dba0354b118d76d75d13a76 +:0006402ab57e26c039810a35242dbe8a633b89 +:0006508743c8890b494534c46463670ae0a1a4 +:00066071ddb3e723b68713105e4b90d2965620 +:00067008b208d0f23bbe969903912b4079a44b +:000680e1ebd35b2f2fd2d2606248d42b40d56d +:00069037686f65f1d80118b39386ceea77f64c +:0006a0e07e793d275a01f200c408b8a0d6915d +:0006b0b883aaf3dfb6df00ebd5bb69e5bd68a3 +:0006c0ab2dae165cf6bb0f4f44d2b6d7498768 +:0006d029d16e95ef46eb93bebd8cd096e0257a +:0006e080a1977ebe76d1e09a804cf58bf7ce73 +:0006f03499b157cde18299004f1126867aacde +:000700dd35acd7a89624e5ec6bbff90d9dc47b +:0007109789d2db4326d6cd37445fad19157528 +:000720fee2b651186c02c865521fb30a2561dd +:00073019d1022ad6483579d5518477ab1e2a2a +:000740b803e0765217294dfc4bb9b573df511c +:000750873b01cc6df1cd7ade61b73cb6a0aa52 +:0007608e7ec717412de101af67d6dc40d60cdb +:000770dfbd0638caedf2f6bee83489302bc05f +:000780b70ed0bf89d27bc8d810e52841d61d7e +:0007909e751199f51b7bf6ca815f58167595e4 +:0007a0ef257c841fbb2e0add9a3e0513fc9ce1 +:0007b0a70cbbd06cf654fb14759ca8c91141c2 +:0007c01821da87f16f4dcd1b160c4eaebce4bc +:0007d04833183ae68fd9bac80f58066979551e +:0007e02e70310e6f926394e1283038d7d79e84 +:0007f07245307733c666f793805eb6aaa1fffe +:0008008cdba6c346f5a893b12da32a2d3817c6 +:000810001fc3a2d1312584c4b5def6503c2a4c +:0008206bf22a7daa9ca21a419fa7eec0b16993 +:0008300c4c0fb47bbc7605f20d00f514e8fc39 +:0008403d5265dae2df4a0d54cca4e469ee2f5b +:0008500f5032b9a94cbe8bf61946184b6c8ace +:0008600a7bda66f3c28a1a7220ddff7ddadb8f +:000870df3d4c5d62181fb95292ebd8c2275e3d +:0008801f1781876fd489d899d9dfcf9b951467 +:000890f5fe51917c73586490baf6943e65ee9d +:0008a0b8e0b18a52c1d102e4867ae56d3f876a +:0008b065a3482c9e5fe49915d428bfa92a4fb0 +:0008c0db7a01a5b910549c457d8f3d3d57ed42 +:0008d01336a58ced569f8055f3104b4e2d4d66 +:0008e0e23441e6740bd3c9e215b0bedee49300 +:0008f034e2fbbd6bc991728b43310d939a488e +:000900a4e9691510ce0dd7bd252dcb09949dd4 +:00091099f73698fa5d73702515989bdad6e237 +:00092055c8881e41bf4b86c57509761ff3eff2 +:00093038ba20c6ea5186cde1a0dd6ee88e8ed9 +:000940c8ead1bf4cf81a040ddd356b3bad66b4 +:000950b98bf2865c5b47acbb529a6e1d0fe8ca +:00096087de75fbcb80dfbfb94ef67387d7d069 +:0009709efe6c3eee55c54cadb8942a0aa8f8d3 +:000980982e7aa3d66f3e3833ec34b81f8efadb +:0009907f9d15a1ced69845c6fdb356a0a1e318 +:0009a0049fea74f68fabf50b8ec5dafe42e85d +:0009b0d1f34cc3de0c9095574c1c1daf83d6ac +:0009c0b6d02f6bdfc52a7c1d131dc05ab915d5 +:0009d046d1855d50f9197282bbb45a78b81b1a +:0009e05e4e2996806c54ed86ec21368376509c +:0009f09c8f33bdfaf1000b37507b2605870bfb +:000a0071f50a5ba452febec743dcfd47c91724 +:000a10d8e4a477caf6d743502fd7c77403c19a +:000a20a8fb226701e59f7e976dbd0a3247ae16 +:000a30e2546447ef69b7ab890aa0757730f564 +:000a40faf993fd126e416d313421104d65bfbb +:000a509b7ca4d168f1444b5f31f5b829ee67d0 +:000a60186cbc0aea0f2b84d863dacfa768e2a0 +:000a703d464b4e24e7a70bf1c8bbdeef4b8f96 +:000a80ee540ae3057777e7c7e4eac9ab5e21b3 +:000a90c09f7f4f93f2e135b3e9889283e5007a +:000aa026d2eb79fe3082b9ab156c2621f49ecd +:000ab0cbb8034dcdc0e9ef47a4ba4e12d4ab54 +:000ac0dde6d80a19eb20fb18233f03152d9857 +:000ad0bb4e2c3404351c3bb890938211d1e91a +:000ae051aed91b7b1f555cbfecd8f2000e8fe3 +:000af0c18f7eb852df4451b476ea1dfca44885 +:000b0015d4a69d5ce7db961878cb2287100372 +:000b107b79ce03fcd9e0d39832990a58af96eb +:000b20288ae315191d916e74dcfde1690701fd +:000b30171b16f81578ef412d92bb6d0933b3f4 +:000b40769ddfbbbf790f7559401d283e1b894e +:000b50577b0e2866f924e13f1d2412d4542fed +:000b6019529c671df9c37cc016ef66e69c22e0 +:000b7019603c20d4f69b11942c4e36c8408fba +:000b8048769e39a447507b9b5e6f7aebf97690 +:000b90fc580247cdfc87b26ddbec5f6331f966 +:000ba0082bd4978fa04ba37f731cb53700f785 +:000bb0bb0a17d9efdca24aeba542ff11c7378c +:000bc05a9d82934bf16614cfadd2ba01b619a5 +:000bd0acbe5e0df9808e7a5379705482d73987 +:000be0ad9ca5346841f6edd0eeff2f109e811c +:000bf0633a9a8bdf3e884626ef6dea33e3d431 +:000c001fafa83d5850ca636c55fd1d4065a926 +:000c10a3a7ef0383f383359d347316942067d1 +:000c208e57eb3078cf64dd2059af4da6f09a87 +:000c300583a0a57e3bf47d61ed7d7e07bf7a69 +:000c40debf86c4959252b5d43c7fa8c608c173 +:000c502a0b83ab5dc6cefbfbc7afbadd64c30c +:000c6066710421b3dfe21448764b1a79cc5e66 +:000c707dab6af927e4b747b324c8acb606ff18 +:000c8077139e571a079612bfc8bc0a5c71009d +:000c9064efc4b539d37b46b7f82480d6afe242 +:000ca0f94dd8bb998efd8872cc7c89198b53fd +:000cb0650d131cd6c597f7e5fb11c9ae95b1ab +:000cc0822d7b080d439bddad439ff1b6514ac0 +:000cd081eaa8cd4e32e459ca31ffb16779ac05 +:000ce0f1524aeee8be9e3c57bbf4f2d6507c99 +:000cf04a96d98562eb64ff6e44250af41bf72b +:000d0079f418b38fc5083a06c54a93c2e3bfba +:000d10c75326405d1b4dae6e0c1473334f841f +:000d2079bb22f3e794db4cd1ac0fc6b815ac73 +:000d30c4ba591b37d72fb706292200c7205d90 +:000d40754ef5d78ae0c97fc08962bcefccd256 +:000d5069a5af893dcf22eb043a5772d44f6def +:000d60b571de73e9ed25d0fd7a9c499420b816 +:000d70ba49ca34551bc64d7d426989294dc0a6 +:000d806d242582e3c3ef38886a546101e9f8c9 +:000d904e5253a73fdc4e9a37f26810d3b103f8 +:000da0778e05e6591b737d806af810ae0ea22d +:000db0e31b342ebac78dc6d5e39cc21c6b1419 +:000dc046764e8226e99697d6335bff7875e313 +:000dd033c33a1c6563cd23e94f30a0eb80ee3a +:000de055151809ff01f17aaecacf86f5492222 +:000df07a1278b183f3c9846fb9ad4bdd5bbe7c +:000e003dba18d5991beedf824b25769d366955 +:000e1038cd67d5941874f9f9f6e8476423a396 +:000e2018f7687b2353c34a66f5c2f8e644faf0 +:000e30cde55f5ce51ca1d10b2c4a4442601741 +:000e4010cabae6ed8d81fba9d13f8d0c1e4e40 +:000e503743756d63f30f3b3d861839df49021d +:000e60ece84576b375e12322ff1336bcf6b39b +:000e70dc53d77321616ab4fa3ded1750571554 +:000e80d300eb38bcfa7c92fb5e1c2d94906d5e +:000e9064ba0f00356efba42f5cb6a53cbe2264 +:000ea0598e4a4b769e371199cd4d67cee8bf32 +:000eb0848ae093e156301594430026daf84706 +:000ec03c1b05aeaf994fa2d1f732ace0840c81 +:000ed02cbeeee15c4bdfae70dba2a92d57bded +:000ee0ca1368474eef0da270d45cf1a20696e8 +:000ef06e1eca2acb5f2662cc9a6d852adf2ce6 +:000f00767c6133921abde018b2b57c451eddc2 +:000f1062527d462c40b999172c8e16d32da252 +:000f20fbb408d2bc9ef68c8d27167b0e9a5f5f +:000f30a0a0955a7f3427679f4f7c750729332c +:000f40e4b6ba0722a70099f10572be1bb9d372 +:000f500e5ac2f1def523638753c552d1948694 +:000f601367cf5380c81b6b1e1dcd25efc8114b +:000f70fe2154c9c2644819536d8506750be81f +:000f80fc31ce4305b079a218dd5cd295b72d1b +:000f90aba3d6710a4b11f031085837b9282029 +:000fa0d4058ca4cc72475f4542aa027892fff6 +:000fb0a7a0daad5ad7bb4439cb7302655cfb69 +:000fc04d012b664312db75e21cc5f2d59b756f +:000fd0ded72e90d0ee4b12c3647a07be7f9f4e +:000fe0d77674595b39285f8485eaebc8a4c3d6 +:000ff0031524c92eab06f658f14c0b86376aba +:001000c2ffdca873381cfb3d53a33704a0500d +:001010b0fb5979a56d81efa8ed3233248afb57 +:00102037c99a9c4da20bf0bd65c38ba735623b +:001030cc44ad5651128b9439794121c4264a06 +:001040e68b3fb64890c69975617023e9c4c2ac +:00105095fad9248b8aa895208ce5cb87fe959a +:001060494d4a87324540441b616cb52751b732 +:0010706383f7871d61b87923b6bf56ce94442e +:0010807ac921898b53534db6d95f8e2180292f +:0010907a081896cfb2d47d7cda6d6719494bb4 +:0010a0eb561c9fe2463259a5de92f9e3b26d23 +:0010b0659a8bddaac2540f9aff74d28aa9d55b +:0010c0c04bb2ebcc6a3e9c3bace030572dc668 +:0010d0264c5ea2c0196be4e304bc55bb4f8ad5 +:0010e0c0cfce0d842011fb432aecd4a92e8cb7 +:0010f088e9390c957cd3e209fd36182ef58850 +:001100476d8a20614d58613dd81004e94bd555 +:001110b45cbc0964fbd7cec24aeda8b6a3a2c3 +:001120cdf0e06f854c9e801872dc705f8ae114 +:00113029dc7514754fc991499912448837847a +:0011403abdbf9fc1328bc71a1aa716ef1d6148 +:001150d2ab95f0a6bc3a12a01376137f625f13 +:001160dc6f6691c9a2a2370c256b2d2251de6c +:001170345fb59e85c4e7ab38898f4f290a143d +:0011803159fce41b4cc8910f9756e87f760402 +:00119061345aa7a158a017421d280641fef403 +:0011a070a8877f29246a90f6626145adaef14f +:0011b0f8664fe2d45020cbc85b6ca1c9252e2f +:0011c059b1cccf7489c086b7e56b892e6f7ccb +:0011d020063f29369ecf69ea9dfdb32635af26 +:0011e0c7755bae403018e5bb9565e953ee1e07 +:0011f0d35d7f29d79c8915f446aa9f161a7fb1 +:00120038f698789c9b26de35ef46bafcc4efec +:00121060e53fd5f61a8b2e747715f0a5a8d919 +:00122025171aeb97fafee00d6c0e7cb7a17053 +:0012303775830687ab7821f83359a90d6e07a9 +:001240e3c41c4926bdadd3391acfd604539b86 +:001250fefa0cfb4929d28574d0be848fc99fb8 +:001260a08c904d744bd776028e98b4819ce402 +:001270f94c8d5536600268690abc2280899f26 +:001280b5dc92fce2fdd9b1efe8fe3554d02c66 +:00129050b92d88775535048d5f5910e3f03ef5 +:0012a082d7ceffebb60bac9c4026fc3bedd1e7 +:0012b06bd242030d15f4e7e1df8fbc25f08f68 +:0012c0b2cd06b77949225758ca46a55518e661 +:0012d0a5d04b84d165f31e4f6c0cbdff547607 +:0012e0203211bbe8980da4be48c1868efc90d5 +:0012f05a1eb4a0f945cf896024eafaab6b26ae +:001300035babdd9f5f9eca50fc4ee33d8202d6 +:001310a9058af1c3910dcb915268e25ecc459b +:001320701662f3a5be9ea1fccf52820791b4d4 +:0013305872132408a199238e98f7f2002715ba +:001340c437f859c0bf59a99f114cd69dd67b8d +:001350e539ffa75ae4c7af425ed62a322548ee +:001360ef1b374dac875081f8abd7955b3e8ea8 +:0013706e6e063dbf22fb761fe975a7bc7c6e63 +:001380e1731e10334a7f23be8460ff94f93d27 +:0013904f751e586ae8ac4f5ef108d79d2c8ae8 +:0013a0b3d4758454a93105ea52e67076d2a435 +:0013b05666e3838fbc4313ca6bb69c326142e9 +:0013c06706a382da4fa2cef5b368ca1f0b363e +:0013d03cf1e06481c1452ce5de5e2ea9450f01 +:0013e003ba45f5b711eb8b538463d5fa19dbce +:0013f0d215a7ed81d9bec1a9d2b5fc3779c282 +:00140067cb8d81719ce8255ef96cfcf02467b1 +:00141063b1dd9ffe378918addf9421f78d2fff +:0014205d54060fd1775c0bf05d799d527dd122 +:001430b70619d3d3f8473b8926a1b25e3515a9 +:001440d9dc9e87316a5138ce1b5ca58a58fa07 +:001450c5aefb20640b069ac48a1a40af477ab1 +:00146033392aec38198d70c608e409b2af5c01 +:001470d9572d5451c7e9c5fcc039c1fdeac34c +:0014802cfd255945927c817ee18cfd9ab86ed9 +:00149023c1a7742a3b024610f18fcd8dd86dd3 +:0014a0fd27d87368773b94a04fbac0d33c5d43 +:0014b029fb858be1bf1cb16a74d337646240a3 +:0014c0a22c80d8aa9219aea8c1c57b2620df4d +:0014d0e8775d01c7c00a8e41856442bd06a754 +:0014e090196896ca70c48f118d9f0a542fa2fe +:0014f0e54e7e49523ba9b8bd7fdfcc47a8a987 +:001500ad27818c09f61500642c17ee1dbe7c6b +:0015101148b1e280332af044658084ef03a8c1 +:00152084028d1b92f0ac54a228c9e267a7e2b8 +:001530b30bd4d8f364ad6e606fce3cade9e72f +:00154009f100da648041a43e58c5ce302c52ec +:0015503bdf7a1c99b58970c09e979aaeef700a +:0015601e8455cbffe986af750ca15d3f478c5f +:00157044b8c32bf2c3b59ba2da6757ea0f7b92 +:00158055180ea22ef5d49f45d0923a5fd24c27 +:001590090d555ca35576d292d21413fe42d5f7 +:0015a09f3a406c69631b330062800e157763ee +:0015b0c377b9aa19c47ab2576381f516fdbaf5 +:0015c0140effee54452a1b3175e1afe866474d +:0015d0661390b4e01b0ceef82b1763146cab23 +:0015e05a469b091f86bdd4c960f61c590defdf +:0015f0992b1e54b3602a48c3c8b8d67aae5849 +:001600821f5b8142c4dca45ee974a31d61aae8 +:00161049f58391ee8e4a9cb5cceb949265b3fc +:00162063ef5f43ef27e5a93fb3a5f3f762ee07 +:001630b83e5bcd098042ad23185e784c20b73b +:00164083ed61a252cf34a43539ee8b263d63c4 +:001650a32ba562b0dedb78eebdb71e7c7f82e4 +:0016606afd70bb99ae2f1834d497908d305de7 +:001670898d50f52cb5773a66cf934c6cffae65 +:001680be32a288d5131f8cc7653a1b0a7447ab +:0016905a85ef4d6e29de64e3c65b7e46849478 +:0016a0c59fd679221c3249e8362130574372c4 +:0016b0bf3c117b0937f112168043158af4f536 +:0016c06a535e79f8a7111c9bacaca3e95ce5f5 +:0016d06cb26938668d04aa9e0895f4021c99e5 +:0016e00f3d5916fbfe47d645d1dc57a569589f +:0016f040052a72c5311cda3d6c85aea2d20c1a +:0017001c1d881b23b46e40a842ee6d1c89ecb0 +:0017107c29e8670a4cade269923700cc6640f1 +:001720f868c1f0037af02f3713fe3b665460d2 +:0017300c0bc3eb93c6ff750b4728ee9ce8f2b4 +:001740ee68c4fff253f5ec442aae998bf51f49 +:001750328d5fb83fbc3949ade1148485858819 +:0017600b05189db8443ae99d10b0519e4cda0b +:001770dd56aa7f39e63a300154a42d063acc37 +:00178094bb9c22587eff726c7ec51a17724fb6 +:0017900284f6237683353da6309533bb257644 +:0017a09a1b223aae9a22ea81677c52b1e322c5 +:0017b000635e69be1c964aefc71e33d3b9ec21 +:0017c091f673288ed20b72e96c3293b31812a4 +:0017d038008aad0f6f612b2b0db03211fbdd7e +:0017e09ca2d2e46077bb9c374a12b81e4cc398 +:0017f01c06d7f42351237f00cb3b972d1e5ff1 +:0018006ddffe8a0ff3f774293d6dbaf5024140 +:0018105bb7f5d9e835b9c24968ef851dc389cd +:001820a455b8bd7eb9890570ab06d49e2355a5 +:00183029e1f056eeb9b236287bf86e21242e73 +:0018405f565135b12d945bab01eeda74dd1d5c +:0018503927eecd4f7d22ce0792687b5b436094 +:001860178253f2bb09b802f2bf317d86564c10 +:0018708ac38a0c5e315e569d3b8b6ad2e66f8c +:001880cf97d39d8742fb15cf53bffd7a986160 +:001890d29570614dbff5503dd36857af100df0 +:0018a0b410df3bcf484a5d30a24eda67916d52 +:0018b0f532210d967c197673f3aafe774c03c8 +:0018c0b597941e80bfe71dd71c390cb0c66aee +:0018d086ac8496f4fb52e4a7fa1a2a8bc2e471 +:0018e0dd98c38cc23a18100775fb1fd9e97d7a +:0018f03cc5b34858a96edad489380a067a89cf +:001900831f669bd10933ac567c695923618cac +:00191034982cebd26b2bfa5eda6bc278a47189 +:001920c9bbe05710a81a644a930af8ad1c10cb +:0019302e226846873de650e624400bb0eb52f2 +:0019402b5189e0aa6befad6cb554edaa50703f +:001950003c14d84ea2642a7aa135c3654980a0 +:001960052f04fd68088f6eac28ad9ea55f6b37 +:00197068b6e14ef7ea175d8f1e3eb3607f104b +:0019804446a410396cf470c94a61b9a90196d8 +:00199008adbf99be2760034d4ff4c87105960c +:0019a0b63d502a03982c57c7446b0b6e716237 +:0019b034653db1a68fc02b8a049e293a334daf +:0019c0a61ae990879c60a7844a02ddc24f84cb +:0019d0106991e165ea963f34c0f658b1cc0e80 +:0019e069838f9e0d1c5d3b3969bdecb753f379 +:0019f0a0b0a8b877d5a8ad372c4a5637376ee6 +:001a00aedf841695e1a522b4c6a88964b0b388 +:001a10e8881c2e6476aefc1a62b60094006b4f +:001a20c37409c2bedcc689d1608df8b310fe77 +:001a30ff285af5f3599f9ab4dcbb1fa3415f18 +:001a40851498215936138a6684d1d53c7602eb +:001a509d267b39c471397de883b5c3c6ffc347 +:001a6020ef918241b8ea2b02134e69a88b53be +:001a70b73e5155c07f2d216a9f092eef293564 +:001a80e02fd8a881c2e896e5dbc9626ff9c1ec +:001a9011c2755c2c01acc05d3c5a67725aaa56 +:001aa0c0aa7833c44e6776e2f1f9a1cdb71138 +:001ab0327d5ea1db17097f08546527c399f8c9 +:001ac0138214550a722b655afd15ce34537226 +:001ad0b18c9817501be1c0c2db994c2759c330 +:001ae05aa2e76d24b7fd847bb7b9071c3f75d2 +:001af0bc976a21ec930f31ea004ff291a38688 +:001b0050fa00d0831fe3c1306483e61984fb6a +:001b109fcbc606fef4c423ea3ea8330a636330 +:001b200c476d701fa6077fc5e80f36e1418632 +:001b305d9d980883116bc08a86d6baf72bc616 +:001b4082e277b3c7bfec7b8afc53d0eba43076 +:001b5063380377b71888de6b51895a76c29955 +:001b605f95d41f8b49b2035886e802f45df782 +:001b70a252226fa9a67609b23d851c2cc09bc9 +:001b80112db4ac1ef3eac7d0e424697a3f3b94 +:001b902c342d146a910dc4150289d60c9ab97c +:001ba0cdaf3bb5ef8f4b1e27564f435585699a +:001bb0727a41d8535eca686d5d943a63301567 +:001bc07610d75003ad52d88331abf07231f81c +:001bd00bb520b2d4dad341d3fe7b390a52d41e +:001be01d1eee7abebfaaa498b4cc83d2aea2f4 +:001bf00710d4016a158fbb0d30f3234c4c4ddc +:001c008cb2d7e40be144a17ea827f7b41f48eb +:001c106f8c222fd703db0e784ec79ed98251b7 +:001c20bf4def9f91a164cf73c6dbc1603b6001 +:001c300b5d3c5f01c003815a86464b62382e00 +:001c4038264183e59ffe829d2eb59f992c62c5 +:001c505b64053c352a5c34773de9c44a777ec7 +:001c6054226226622450687b2a57f1a20ba5c6 +:001c708369d0076a7a0b77481f1dbc79366013 +:001c80e8c04cce021e8dcc35112a3749e19f12 +:001c90ce4ba6ec22f4f18a9fc0a1b4d57d529e +:001ca0abba213ca6e18260779e79e7cb27bb75 +:001cb02ac3ac4e611bfff95c9489d9d259186f +:001cc065604bac2e1f8fc4261f7306c45170ba +:001cd0d50c4297646be52c051a708c968041f2 +:001ce044bb6911e5c81b212ee049d3fb3f32f2 +:001cf082028635b961d55f4b1cc2e674fd43bb +:001d0057749311ab59e103c6290fa562ece3e1 +:001d103e317c349f4130245a433b5a65e10d24 +:001d2081ef394adf2376e0fa7d74711241b5b2 +:001d302b8d544941787da09f48223b857fd013 +:001d408279beb1dadbd7defb7785a0507c2eb2 +:001d5046cf0063451bd43c172d817df1ccb68a +:001d60e664bdb4fba463dd1bb718305b7c1528 +:001d702934269e524f41ed38c650cbbdbaa0ad +:001d80affb6e73020a551dc200821176c96527 +:001d90216f8a3c414e67e63a653a05bbf55aaf +:001da01a4b89395a2a73f63e7f95bf5006654a +:001db0bae58889389c80fa11735ef4fec6497e +:001dc09a061ed5661a8f3f9d42eb8c4ff05334 +:001dd0d9e1ff1881ed0c26001387c50185bdb2 +:001de03a99153b462b53029824a7f781781f99 +:001df02dfa8941db7362a0d27a2b15a878321a +:001e005fa11336f8f1214905302062ae151a45 +:001e10edecfa59d93c2ce06e36852be5716b45 +:001e20569a61a8b7b54379bb030558b05c8f0e +:001e30f8ff69020e23144b2b4e5e48073f8502 +:001e400d0bc6baa94bd9aa3359a3179fd2ba29 +:001e50fcf628934a5b261ab2cc67cfc51f521b +:001e6055be8cdd3b2c933121b38a4a92710a64 +:001e706941100a4ae3f1c3f1e6874d104cca85 +:001e80df975cc3f1048846f4667b8886efbeae +:001e90dadf4dd65e8a9d84de78123addd41210 +:001ea031cd86fbd9163e0905d22ff0e128788b +:001eb0a5cd620703072211773fcebbece50d8a +:001ec06860105422f54d51c2b0e8572861d002 +:001ed00970e8180744f1a5844425b29b9e14bd +:001ee01ac091c95845aac0619b020c33283903 +:001ef0e785a82ece9a8368b277cf8cb22be3aa +:001f00881a00da4582892bce76abd76cbde88b +:001f106c44b494f78bed820bea52cf6c616a3d +:001f20a176a10b20e46aaf1272a5a0bad1be58 +:001f30107c17273fbcde8d421eeca92cfb6d16 +:001f400ddf01e5490ae27640a471841f881e4b +:001f502c4b3ec7e936dc52bd3996fb7a730dbd +:001f600a0b29bd77d1e1167ba5cfca83a517b9 +:001f70eb31c76f45374c7dc494eaae64c7c88e +:001f80f5f9727f885d73b5949774980eed0ef6 +:001f903644a6436baffd4fc123e0c9ccd25862 +:001fa00b3c787d45ece4eec9ec7d5b9e31b4f3 +:001fb04fd9cd4363414765c9b44687e63f7fcd +:001fc06edabc9a9825048a2cc4e2f5c0e94db1 +:001fd09f374284a9835a8badb904e4d7fe082f +:001fe0a739ff8a1bf2b049370c1b87dcbf073e +:001ff09521e73ad6085c4a1847e5640aa8d2e5 +:0020008b542eaa32b78929c00db8ebcadf2d89 +:002010713c00dc90426eae556fd779a26d5235 +:002020abd6dea02cd4b916c1562c2baf0f6d6f +:002030ec1d90dba438c7c1910c9da4aca28f4d +:0020406d01b7dffe3936fb4f3bcef496faec83 +:0020504b1eec068e31e75a5feb572a2e7e637e +:002060b1bb1d605ec19294ff0586c9e4cd8bd3 +:0020705d281c0bbab02d58260befebb31d4b57 +:002080b8582c5f9d62f26c9170a9ee8cb6ce42 +:002090fced5394bd33ac0a5a86c25938e18c83 +:0020a057ec24f9b8abd35b45f340c871dd0bfe +:0020b06427dc808f3ef0c511696d10bf766173 +:0020c083b91f88f7a053732b6a0585d35c6190 +:0020d0efac950c1bab2e34ccf46a54ed5676a8 +:0020e07249d45343193e7b89f6f6de781fb73c +:0020f0efe1107eb6a2ad6d31386cb1897ea68a +:002100e8882920f1cdeb2b9775c094ae0c0a1e +:002110f7f57c48f8b4592379e80e29cb1ec748 +:00212030b67b3e1323b635425eb44e91a3c68d +:0021301a353633ef5e528c33ce710b956e30a8 +:0021405ee2c1f8b743f1d6468715aa04689c9b +:002150a41ad7edf525e97da15e1d315666f06a +:0021605dcfa5fcb9f603d65312f5abbc9fc204 +:0021705768f66a2f71871d7a21d8e98d986cbd +:002180c8c35679eeb2d885f87385f3f6de1e2e +:002190145dc17aaf2938ee581182724530ab2f +:0021a0a7436dadb90832b4fadf4e49cfd1d82b +:0021b07f348657a81e9b05d1fc949aaf360d73 +:0021c06e743ee7a129fc573ee888bedb35b08d +:0021d06198b165b545db617fec11156aa8d5bf +:0021e0eebe2464426fa8bbf74549ce9ab1763b +:0021f0c99fa0508ccbdb55f4393b92e2d89fa9 +:00220077427527a8513f5b28581cd92a8985f2 +:002210271412133a96dade42c9bf44afe7a9bf +:002220177a270780144b5969c4bfc97c3312d8 +:0022307995996a48ff8de54fcb281d24cf726e +:0022407d7389bdb375274a256e307ddae19f2c +:002250171bd553d9b01ea6d28adafcad958824 +:0022608ac4f5c63d8e8aaf1208c6b003b141ab +:002270f015bb43f7e1c80cb6e45883c8f17c97 +:002280619930e146757e6c4657f6f54a9289bb +:00229096bdadb64f2f495c716bea3ed0b1fba9 +:0022a0fed7231772c1c1db2c6c066900ae1701 +:0022b0719a0f617fd4b63debb0f22f77d6d234 +:0022c01c4f42ede9d7385cf465475d06da27e2 +:0022d0e71750792e72c070c190214bc0771242 +:0022e07a8df7cb25f10599fc94117fc38c893c +:0022f08e638ab854b96d89314fc2e8a0d3daf3 +:0023007fd4a0361dafccbd78767cebcc5fe27d +:00231044f711b2d3d14a4bd6e77103f815cfe8 +:002320bc27947f79fea6775323033c1e9b8aee +:002330a110b6a3652662275166fb25041b4ea5 +:002340831ebfcbf5eea9ad9593b35474c24146 +:00235099115d7de5e9ea7d3e2e2f33b11b1cff +:00236059ab29e7a9777350879e30a52f307ca1 +:0023708852c57d4278997e741447b863658ce4 +:002380db811aa0b51a5cce432f7d64c1eec1b7 +:002390a8f6467225aabcd5ae7445c70b7ba1a3 +:0023a0bd73b28b7f5da524db4f06ae6bfece33 +:0023b080acdd62b71e7cdc13a1b9be3464d88e +:0023c095e9d5bbd558800bff17269770011140 +:0023d08befc93256526ba53b3e0440494a7be4 +:0023e0bfcfcd9101c828d3c85898c5c67541fb +:0023f055739151eb39564b26186c5454b1a479 +:002400e4ba4876333ee73499f66fe31725d57b +:002410e13d06b2027de673a2729dd10fb822d7 +:0024202d24fdc2e73de176780374c9e1d0ec79 +:002430bd4648ef4dbe861b289dd5df486691fc +:002440dae03b43d2edc757dafbdd3d5d1ba84b +:002450489c2aa9b5bc882cc5682207fb502d9f +:00246019ce1ff6c02b84234857c7ccd40364dc +:0024709f14a66378c69631b14fa5e46e244e93 +:002480c4d6b35bae44b82716e3874db3874913 +:002490f494075c8b3e8f4791fc098679aa09a2 +:0024a084692845492080e9b42a258937a07ff8 +:0024b00d12bbe610391f545cad328268f6fe66 +:0024c0a9138d817827d43d31523ba567a2eca9 +:0024d01e9a2a1ff0c7617b882deb0b41824c32 +:0024e0174cc5213970132431a0a9d73a1af6e5 +:0024f060043bf4a418ea20f45f68ff5aa4db83 +:002500cda887e39ac8bf4779106b50fc6f2cb5 +:002510de8f272f1c0a86ce638b5f9151dabf59 +:00252021ad13df5032882a26c640bc8f7e2207 +:002530ba45f1c9d531ad3ca6b8e5043abf7d66 +:002540f515f700e9f39b72a04014914a3fc101 +:002550168e0666ea3a223895dd02c71e63bd06 +:00256048711fa0f91765df02c564ccd5b9406b +:002570fe128ccd890981490a3ab914f4cda0a3 +:00258013b45859caee8a02a72a40fcdff9e705 +:002590560abe3c7ac25c2fb4dec2930383f613 +:0025a0376ad44f0a8e933dc6baee95a575ab60 +:0025b088a8be0c1aad8dc900ddb94e2efd6309 +:0025c0af954eda603c51203c473174ad0d8e69 +:0025d09cf22a1e08f343e49b035f0aebda8a3f +:0025e00af2f112d7f13bf130de6018685f3ee9 +:0025f0254e5a52982391f1355461b319929058 +:002600b0208bbcdfdc465b9a958de0483c3ee1 +:00261086eb41005af2aba53d0be909b408fda3 +:002620f940c24fa4fcc42be1661105cc387501 +:0026304529cd58906061878cd0b08f1ed51b46 +:002640c2e01af5552cc99c0accd253871d2420 +:00265014958a341b8c2c74d7900b25a935d961 +:002660b5aeab59c38a663556af245d34066dca +:0026704e51a453eeb9bb06417d571dcac73fd8 +:00268054ae558fdf899efeb4051c54ec939eb2 +:0026901cc6a3809ffb615a88a596fb0504ef45 +:0026a001ec0b7af4e764dfd167e91bcd26ae8a +:0026b0b599d5c0ca280c220de9299c7d6405ec +:0026c0c50e9b9501b9c6f97a03e8d2f47928e8 +:0026d0822ce12a82be1a485b9bbc4b56009e19 +:0026e0aa14bc39259d298fdbc17478db251db1 +:0026f0f5c4a987ad156b99f6420a3a8e85ee18 +:002700c83ca126cef34ee5fcfe9b00398c5324 +:002710573ed8b80c47b34e52d80790806fe440 +:002720a1dd4fdba86cc7860848fb86673bc896 +:002730f83eeb211e7f25a5c077eacfec41f90d +:0027406e3bb42dd853409433c8a66b63cd8b56 +:002750dea6d5754cef3bcd323d7e743519098d +:00276046577fee1df223f925f4068d2acedce8 +:00277070b556d2b3d613527c7d6e0e096c694a +:0027804d82169e9ca5b2964c777cd1323cfd8d +:002790a452c7761906aad4647c45bda0eac263 +:0027a0d3b766eced4b37675c5d1a94a416d016 +:0027b0f4e006b3d175a3ec8889c697a8f7efbc +:0027c0040e435ce3853b82eb814d58857b8ee4 +:0027d0cadf80f34d6741f4b3b3a6b77b23acb2 +:0027e0922cedb3dca48eb523e45de989711b81 +:0027f024a36fd31e9511330aec5482f122f942 +:002800f8c14d0d20a5292f49ef1f0c260b3618 +:0028109e08a282f341a46549a9dddd777bc563 +:0028206a570f599ae99065b86dcfaae1968548 +:002830941a64e090337b9ce44f2333ecebc5ea +:002840a4dde17f6228e8291bd0aca3ce7167d1 +:002850701eda4dad798508fd6f69e104a966ba +:002860ed40d8e252565b0e119f9a15d717530b +:0028703eb88c369744da24baf82c88e16905e9 +:0028800b3b4a7df3a3c2d78c87aa1e6dfd78db +:002890e1ae2f249cd07c678c6f1e19d3a9c49c +:0028a0c224c2be8d0c3d99b0228f72a28faea1 +:0028b0bca8b57c7f1caa3eac5a0f8024897dde +:0028c0037aced1da47f51a25eea51bf1950e9c +:0028d07a159ab03833ab6e66f2dbc17c74382c +:0028e05cf5bfe1233e78d908105ffcd52795bf +:0028f0dc772f772e518403299d673380d222ff +:002900b9c78030330396594ad7c0bee73fcca2 +:0029103a4da575de0208b6ecc956accbf1166f +:0029200e397fae5961a757df2f6dcbd267afec +:0029301af9472629844cf29ffb20455764f60e +:002940097e37684a7df77ed818c1647873bf08 +:002950f9183a98b58cf51f26111abb76942b6c +:002960a17bf60627641bd60c774475036a6f60 +:002970238c7d6432ef9d27931b5294806fcd45 +:002980ef37be474964e7701558b20a0c6ff6be +:0029906e7f8dd8599e47add7676979293f54c5 +:0029a000b0881d4d55aa877de198ca8b0e223e +:0029b00951dfbb40540996db5f93a779cd4d4b +:0029c033465c86d1f043b6ea99f18a9a7d2747 +:0029d0a298a462be4d25063fb1c3bfb61fafc0 +:0029e0b4aa8c6f6040c3dbafa002475b2162c1 +:0029f050f10090cfacd5601ef0d086c1be51fb +:002a004a2ebe2677cbc15dfaebf61ad5b7ec5e +:002a10a9b7cc7c7e38547a3f355c0c1de1eb0b +:002a20515321d6503e5f91100d4b633743a2b6 +:002a30dd8dbf81bcf84dcae3ef2fcbe3c22996 +:002a4061dcd1857b1667a575946e2c2a433126 +:002a50259987c4a77b01ff156ad879cff0aae7 +:002a6090d8163884a5e7766bc706f7cae565e6 +:002a7053894f3c0ae72f0349076ed3598fb6c9 +:002a805062910ad17875ee297b4186f4078a55 +:002a90ad7982cc022bcc3f167f644783c50621 +:002aa0cfbe486be28d2140ac4bd91785c474e8 +:002ab06ed6510d97c19f2baa10b68f5ec7784a +:002ac0e8c7fb72af332e248c15da09d4bcb092 +:002ad054b326dfc4e08e6f3a5c78259495b761 +:002ae0bc8aa7398c2ddca71754ed9c39d1d696 +:002af0333d57de8a1da23e4f1122e7d4d183d8 +:002b0025c22b3c6f1cd047b882e8bb390e0461 +:002b1050fb5fec6a8c789dc6b8cd919cb166e0 +:002b204b88eb070582854999c041625360f553 +:002b30a51ae0a14e25b0c18939b6d030c0d18d +:002b4043dd95e6d975223f8cb334b86cdfc7e5 +:002b50750284f365b992cc7c9b6e83c4317ab9 +:002b60664a24f5edd36ba71520a105a8340fb8 +:002b70621d392dd29cedbf63ca81a0b8440255 +:002b80fc9648473253bdd2557cadb03d2c7074 +:002b90d21317a69c8ace813589f806a8f3317a +:002ba0212b1e893e716f01bf46c21cbd60b442 +:002bb0abe3fc843baea885732cb864ed6bcbb4 +:002bc0b693275e7876e2b2f5f176e31e8ffaae +:002bd09c7ff274f9b6304e33fd37f4beebfb47 +:002be0d040b7a9fff680efc84e1a7869ff32ea +:002bf0e840465303b75c11ba2d2900420454e8 +:002c00b53f701e2a7416a9d7fccd529aa27931 +:002c10f6e76f3f743c29461a5b3e9398f760c5 +:002c20eca1d115a09885400dbd4be090a40f37 +:002c30d222f9d5906e31c8830fe8b559743c31 +:002c40e4f78605660b55c0baca59a0c555a7ab +:002c505d418dee67d977fcda8d42cf95521f8d +:002c6076a909fdd5c50d265a309214a8ed9dae +:002c7095264c77a04d6f5e018b74acf0a0430b +:002c80552c53066859303299df41960af5df79 +:002c907a53034c6532eef4be17de8161a38491 +:002ca0ae53351650a4678a93bf6c0aa13bff70 +:002cb0a01fd2ec49293217bef3a88d0d135f7b +:002cc0253aa0c3d3bd92cd0d2108eef42e38de +:002cd096a19d72d8809f27bb67c65380c93bc1 +:002ce095f0ad0291145c1677325e91d14987e4 +:002cf05eb1cc2da212636d362f843eaf3c0187 +:002d006079932e8238d06d5b354f80afe492bb +:002d10366bdcefe4af7510d2bb1072e87dfabf +:002d20ef33d334be4054227239aaed8e700bb2 +:002d3091b2a1d94513d69eb59bfa332eee9088 +:002d4036884dec4d9808d269bec6e494048a68 +:002d50ebc5e4239520b14331defa599534b9a9 +:002d602a7394c0d4ed955a8ca7a5bb9f6c1efa +:002d704deb678f9f08e1b2d79fc8a28dd6b73f +:002d80257d9e40430b48d40f6390189cc09afe +:002d90edcaa9374e0a84d66ad940c564594739 +:002da0b66ae27e82832f52e0c8f7198e46c394 +:002db02471397713aec85fb5056c157c127f18 +:002dc0e76c1a488b546755fc3e5115c098167b +:002dd01d8d26b2de3ca197598ed9e58c0fed14 +:002de0c3b96a21957235e9fa9568997057be3c +:002df0d3980c45591cb79f9816dec69258d77b +:002e00cff7d12ce68475bfc54fb79de1a13af6 +:002e10b6e82ce0e8447b44ca27a6e60ddc0571 +:002e2097c5a609c6ebf4d20661db8721daf636 +:002e304a784174cd4eec5ca8dcdbe3cb62aef2 +:002e40ef7c172fd7ce50f83bd34e582d61f9bf +:002e50b2adf268f80dfc42a03ad64f5e4801fb +:002e60689eea5b33f4d463744df6d2e86776e7 +:002e70fd9c2be8d57bc589681c45d2d8b7b0d7 +:002e80a22921d1861b372bbc1d679a28615780 +:002e90581c4b4e66ca43b19cf3de6ebcf48940 +:002ea04a5147aa3b07e780a1253bbcb1be669c +:002eb000a64eb968dcac8c0178a956347db066 +:002ec03802847074916a2b94e881e4612a96fb +:002ed074c87fb3a88e5d1f2cb00bbf01908cb5 +:002ee0a3f6cb586c8a858123b7fca84cc62b8c +:002ef0f029cc997334315e79893cf91a14daaa +:002f0077eec05c479c15137a0a1886f44dfd78 +:002f102bafb87871a5d20bf9988d2dbabeba5d +:002f20f8959028d268424e877442a2547e32c3 +:002f30d5888e3c5eac531c6c34d6ad671ce5aa +:002f4009c9336124908918064a7d8df872e48e +:002f50b83a993dbaa97a319771ff30978f780c +:002f6019df6b730c0ff624dffc7ff4938fd7a4 +:002f706ef3327f49d92a6f20faa6f02259dcc6 +:002f80f39a90e93dc9d7b34b51543d5601404f +:002f90ca054c52e841416c35e30682c16aecca +:002fa0552b66eb3f182de6c14bb8ca9cf7238d +:002fb005395028c23aa627327eeb8b3632d423 +:002fc01094a3498eeea24adb4d852b92404711 +:002fd0b143e17ae5ad8d91153d24e17f2ef403 +:002fe0e3a056d527c9262569cb3f1f6097ff5d +:002ff08df018c9601ede735b6905c818738cdb +:0030009515565c7765d2b62a083d648b97e085 +:003010dd03eac5f206eade090c594cfa4a8ab2 +:0030203e4b3d2a121c88fae7f6455d684598c3 +:00303012b4928bea91d7650ddc27801877ab4c +:003040e1eb94a822acd35e49285d6da296f3f9 +:00305013b16612108d0a0acc3b0563b7e2e974 +:0030605ad74321c8f4cff9a2afe8eef87ce7e1 +:003070bd1f2439917effcf6f98364babdfd699 +:003080d5c0b0c95e63fcea552e130dc8655b10 +:0030900bef0919a818a889892f1791fd9da70a +:0030a0677587c9dc45ba75c0bba8ae791c902d +:0030b0be665a0c2fb5cfbde3ed5540e1f641b1 +:0030c07bb124da6ef4510f1a7ceb5662581472 +:0030d0a3ce2b0853401907a3ae034f5779fd8a +:0030e0f0f9d8741be488909defffd77aec1692 +:0030f02ae169ec04030411297a75ec391a7ed8 +:0031006816fd0a036f61cb2052743f49470c98 +:003110b5484f49af39215ee52da307a2935c88 +:00312080814eec5d20bece5faff84d90353cfd +:00313048bb4014f44f3bdfa71a9a540bc62c28 +:0031408dbc9d733cb40af95ec4d9efa1ded53b +:003150b467963d6d6a762c3a0229ee474499bc +:0031601106da1c6c505826ee53799c431e892c +:0031708df0ad7fed30b63dc404c2ae6a630f2f +:003180c673a97d3ee2eee28a61e8a1de5d0f9c +:00319011c2f1b0cacba97e5b65785378a595da +:0031a05d3b45258f1b77ec284a0926cc335d53 +:0031b0fe7bea8a2bc21847b8fa5eafc0aea63e +:0031c00e67e4f8f96bb95b035779a00afa3be5 +:0031d038aef8369ac14cf3475a566b96d2ea05 +:0031e092cc587e8e256d680022a8516f132cb5 +:0031f0dded002d62102acb5c2df5e85f102f24 +:003200ebd22875f645e0ed71dbee75b0d7744c +:0032106c7e53a68c5d0d448e15befbb91778d0 +:0032207d1356ed2019843fb09577d17c1c88de +:0032300e27528c9bfc85e1c013706232fc5829 +:003240216dc7569ff6d352c01f417ed2e47c46 +:003250817f6b0bc6b5081fd77463893dbac72b +:0032603ed18bc1dc015beec799be470328f1fb +:0032708af14e77a1f7c81c877bbe279c0d4183 +:003280481e79b7044010c2a2bd3a1827fd5977 +:00329034eefc0f7654428b48fd2fff85b596b7 +:0032a0d4f35d4020491ec3ae660bdebfa96c90 +:0032b0033db73386da9648673396786b0ae0dd +:0032c032ab0dc093c78f5da949f4b5d51ca2fe +:0032d0b09ffd5dbc2c0723c1d994a3615014ad +:0032e0f7dc8fb0de6d69df1f8c665f2abc4259 +:0032f04bdcc3f8650a42c83aeea2d714566f26 +:003300f3e48a585bc4d077ffc8d81461e81c65 +:0033109f18b03446302f78cb0110e3e85012cc +:00332072ec0e3e455f20af4acf42702785a3af +:003330abe310523ceb142ee09e630d3bf22cfb +:0033408d8a49b65ad193ff587b6c0c2e1b601d +:00335089e9af4da2db505f0ea7702e20fc487e +:003360a290b0ce8efdfdc1e67573ff1dfd55e0 +:003370676825406c38b8f5dfa415db4e752346 +:0033809ba884975156599e33de0a35bc320a68 +:003390ea49bc6a9deb4b4940ab124a5dbe8f0f +:0033a014d7d6070947295c9d85c6c945135591 +:0033b013a96da8124bd2e94feef7df0984d4ef +:0033c01855b24ace733d45bac2a8240b9fd67f +:0033d0053f878f1f12056c91cc09a219bb917e +:0033e0898fbca37341375f77f6ef379efba1f9 +:0033f00811d13b9656ff71006c176d7451305e +:003400186f936d71db968a8795633605b742b1 +:003410b9db8334517b0d0afffd2a09b6c37331 +:003420b3eff197978ce3e3e6041af558172b8d +:0034305ca7079d52992c8517ccf71c2b0ef47f +:003440324184fe7fe7deed6dcfb577a614d8e6 +:003450629555fe11ed13f8e279eee60828e35f +:00346001bb967429fa79418473473fb8d318a8 +:0034701f86ea076bef1f24a22b3bf079523882 +:003480700d97ef1a2d69fabed0fd0211910ab4 +:003490b633d7409ab4b9f4953cef712067450b +:0034a0ee01cd96653e8bbc6c1398ecf496f9f4 +:0034b01cd62b648cbe5a6adbcb249b5491fa1c +:0034c0b8373392d892fcbbde68f55f899119d2 +:0034d0f1643d736851eb6324aad75fc9eaa6d7 +:0034e035e41b3cd4b7072bc59e5c65f0996ab4 +:0034f082a90cb57e789d83833cfb998cbba32f +:003500804fa441d7844a05e9b18e43a1e66fbc +:003510381242c7d83c8f572fcdb98b40adc0ea +:00352059a38c83233e333a55812a045b966bad +:00353055c8b10b026a6a1ca9f3576e2f726132 +:003540b9f9e42fc4020df556fffe3ef75655cb +:0035505d8072c6eec57feb14c1a4e81ac7fb8c +:00356091ae78ed3cda5999d3881190d6723043 +:003570157edbd1c287fd8bbca19c882e1cb7ec +:003580dcd3f6df06179be329e286fbdf3204ee +:003590f968fe15f00c1e37526943e2da939a68 +:0035a0d1fb2b27627d9d0c03755dd7b1481f7e +:0035b0976df617f2135e9788a3c450704bd08f +:0035c0ce6cda1359b6afa80eaf11a3eadf790f +:0035d034607fb4346153a703c54e74cd289185 +:0035e00151c228870a16d9138e26af97119699 +:0035f0f20602d65a88c6f965d6ca9c536bd185 +:0036005ff35557bfad6b3adcfc92cbaa3161e4 +:0036101933fdd5409edfa24363c0d9afcdce70 +:003620fb1898cd1383318a9d4eaae126b9171f +:003630ab02e9f8ed7ed98e5d3d54a896c6c479 +:003640f1ee05fdcdcc52b6a529ce8a0c813d2a +:0036503a8a950fed29bb0b462271e9860a774b +:003660ddeea31a58586418046aa77ae33c645b +:00367091912188e1c7c866aee3ede89f24888a +:003680b0983d04275f880775c3f9c1e7675914 +:00369019b62b8e79ca0b2b748593a3eec0e29a +:0036a070f3d197e39105f8d2a381e14105049d +:0036b0561f8e678b9e9c9d3110f278e3c692b5 +:0036c09a094e370b7294590b88e08e308b4d12 +:0036d093d1a4b87c4461207436eec78b045eb4 +:0036e04e740299f9b43136ff84cbe9edbef8d6 +:0036f070ebeafdad257766d705861d205141ed +:003700decf3b5252150bc35800731783b9378e +:0037104c00b25002589028b44ba4d3a872670c +:003720dcf554c1a599632b1eb347fd7240e7e6 +:003730e2d2cf6090f0e8093ded379dec5703d5 +:003740d9555991c7d45d4dcb180b29f0a1c27e +:003750a643a4422b89720bf6430ae85bdf4fa6 +:0037608d803642dd5a09894f1e31c2c64dea26 +:003770bdd2de1bc339aff36c810c59342a6f32 +:003780b4adc42dd8f711f1846aec8472a35fa2 +:003790fe0fcaae878f74fcbb67b66c398d451f +:0037a0f0af456986c71b73396508c0d27489a7 +:0037b00f7893cc0c582136eb27b1adae1a3f2c +:0037c09a7e7f67795431c46021a3fca1c9127e +:0037d02e6420f6fa6d2db8da531f43db213760 +:0037e07a8ba30fddf8c180fc0d5ff983beef26 +:0037f0ec10789e171a6468e3e8d9fcbed43011 +:0038008b2386e441e45fa8b2d87a8e77da01cc +:00381014171505e54365290f780c0de8c50cef +:00382099916464318aeba61c0d3ae723074933 +:00383072bdc0aab094eb14767d33d1291468d6 +:0038409e7c5d8526f6f580d4fbf6fdaff5b566 +:003850b24bb8e530b95b27ed659a3fdf39cadd +:0038600e1cfd0284da97c374ae66e0727e00ce +:00387013120b7a14416cf9bf074286b1429b62 +:0038808333afb1f9a782a47ec9dd8853cffac9 +:00389015d4f4e8a4ac7064a46e022926416661 +:0038a0c4a8d861e3073006c4f35d11d591a0bf +:0038b0eb058723ea246b99d5daf34a6a07c67a +:0038c0df7efe3682d083194828dfeb61e87f38 +:0038d091285f69f8130f894a12438bd6100658 +:0038e04e2ef64ed9e862358b39e2f4d61766c8 +:0038f035a2b38c3ba70356da0a704e20b03a45 +:0039004afd2bce2218c42ebe747f6af10a83f4 +:003910eee032fce90635a3f7abfaa60d051176 +:003920da589e353ee95264734d10449e9d206e +:003930a161f1fd13806a2a932ee4c18c9b9812 +:00394068bb4a814386eb02387fd31602c6b5e5 +:0039507ae211360f771ecbd1c8b067584b57c1 +:00396072bba2fc9ecc2436c68f37b271368732 +:003970dcd8ec5150b0355e13582ba139bebe35 +:0039800216b3bf8a12eba252a2d6df0b10c905 +:00399055b5fa4c774b1dd23f38bd68a218a751 +:0039a02132e7834f67f2acf6079b1102db199a +:0039b0754d86d7f1eff1f287dc2d6dcfe6cfd6 +:0039c01cd63cf3fc161646c56204029c773e91 +:0039d04002151950a07c51df73361b30afc9fd +:0039e091137b75824b74093c9ae77abdde25f9 +:0039f0c81368b6d0c715b33ccb6194e30dd8d9 +:003a0068b86ea932cb8ba5e2f965867f2496e0 +:003a1007a00ab6e0e5baa92f764d41a2a49400 +:003a20177c30d9e074acadc410dc395613a05e +:003a3054ce5e4eca8f22e2ffa432126be5fa48 +:003a40ce6e18818a3671bcf9cf13d952a641bd +:003a50f8e204d81f4a2354db13a91f8c23caae +:003a60b243b38f56fadd87972606e6c627dd0b +:003a70e7f8004e9bcfe5146eb2ad80d02bf65c +:003a80920e4fdec0af56921cb3254a71883011 +:003a906c2d66bdc07069aad6688fd91655691c +:003aa0707019f8d53cc0502d4ad308549c9105 +:003ab0884e956ab12eec2e82a0d5342e4dcca5 +:003ac0e040b8662c3e7ce7edaec5ccfc4d071a +:003ad024309509a3fb11efc118053287ea7a65 +:003ae082f5867d3c99dca9073356979454c0a7 +:003af01e4e5b1253741a7b62b37b1736024a02 +:003b000c9eb9044b17a4956df34d0c4875560c +:003b10fbd87312b559be7053669569061dc799 +:003b20cc14eb3d5f9656919f74a349aa45d84c +:003b308e8f3be20e8cdd766a2973bcdb9ed263 +:003b4051330e48fed3b8383df94dd2c7c3d12e +:003b506dab720725ad5b158ff05e7662acd3a1 +:003b602df478d01edf799fd851fd1becb2a595 +:003b70dd142483130dd93532c057f01a832e0e +:003b80448c7da9b44b430a37fb67a85bdc8225 +:003b903b38318329a6c9feda548c900aa79f1a +:003ba0db46049405325c45b8dedd3e96bc3f2e +:003bb0b5e61aa34893892297fc589ffb84cd57 +:003bc07e3bc047f51be57cba9a09b4bd203297 +:003bd0c05ecb20919066c5ef8671ae0a266b65 +:003be0af783013384970fd8168fad314fcd6a0 +:003bf04819c76211ca36fa7eeaa1c98b0b9588 +:003c00d64e7a4a39c890e3ca7b3edf09b3577e +:003c108ebe349e57d5f6e6e67be3ead8033fa7 +:003c20a674b9ee22c7e7e0f10cdcf383b406c5 +:003c306bf8a21113eea0a48c169348238018d6 +:003c40c6f936cb838dd141227538ea769fc459 +:003c504ab1721e4de820f27c741dbff5b92f12 +:003c607246ec3185672cfe1c7a76ec67fd9d39 +:003c70a2fb0f1c380ea7024cb6e72600ac08f7 +:003c80f535f84d74883dc893d621336d24bfe1 +:003c909260419e24e8b7d1c0f3ee10c90c9374 +:003ca080d4cbe375ad1bcc050bc065a46eba54 +:003cb0d93f3022406c9dba4b16784982879513 +:003cc0acb801ea2ca9a019eba4e6870162c1e4 +:003cd07697a9aee66102a3289385477cda0a69 +:003ce00de02cea1425f2f35ea10bdb81a9dc8d +:003cf098c73f1f53eb9c5809bc1818479ea428 +:003d00ea668db3eef5f0ca45caadfecc9a2796 +:003d10424f64858c3c97481dd1def38ad2b071 +:003d205d07638fc011c8471ad2754fc53c2eda +:003d3061129bfdab5977c963d8c1fe241b3b22 +:003d4069ff4eac30c43df10f730e2665624b7d +:003d508019168f263848c9ccfb0e6ca9f7e31d +:003d60b0746c456d31798a95c925af61c8ba26 +:003d70fc74c7607eaf8805d0bef412eac4da2f +:003d80b990997e74d60108b171375861c4f63d +:003d903e69cf6a1ba5b1c4906dde88cd9ad112 +:003da0d65fc5952912c3bd48bb70133783f174 +:003db0f71f9d2d85be88a89b81f8525d897559 +:003dc086b48d8031643c0b7c8755ce67979fd6 +:003dd00f0c0d375394474a8b34649bf404a5d7 +:003de0a692a1dddc049483e4436128c16c0e97 +:003df0902931d389135b0b3fe0fcae576c5ddb +:003e00c172d9099b71ebe7533599affb5f3616 +:003e102f50a647697af27971502a502543a7ac +:003e20a5df8761695dec6a943b2d6e4142cf23 +:003e308dcd4b59901caeb69d08b4c07fde587c +:003e400871814a858860f2b06252679387e3c8 +:003e50c878d30a2ac3e8fcbb3b28fb210e4554 +:003e605748515dba779c5e4c4a72312dad32e6 +:003e70b0e08b7c5b36a7af371b79b4dac559ce +:003e809811e9166dd5eb6583a0b7362165dece +:003e90ec83ba01c2f3a4cb16d431eb56cc3158 +:003ea0b31170a3e9c5daf7f77d8c42d6563d98 +:003eb0a671d630b721487885b42974b73d57c5 +:003ec0ff58b7688ca3e04b9643ea940eea0440 +:003ed0df6f3235103c8ecd0031e236b3ceb90e +:003ee036430878b227bd78abc33903dd135c08 +:003ef0fa76ee3444b8ecbac58f354516b038f6 +:003f00e1a722a71b49b09b5a62aa4e4c228a80 +:003f10e15ade5a92e95a2cf25efbd1d943d116 +:003f20b475e15caca2215a7defc8a16e41da0e +:003f30f0018c8c0ca8efd110f0fe993cd99046 +:003f4095d13c5135d2cbcfe834fc87a566f744 +:003f502317c44c75cb67031d12bc35fd5c2dd1 +:003f60c828bfbc4169d94d5ebf20e14832b665 +:003f70eac84f102ba8af9b4c9d1a651dbb8eb5 +:003f80e8f0ff34f7c2af8de015d86bb8175129 +:003f902e1aedf987ab6c2e0c3eca1fd5d15aec +:003fa03821e13c9e0703269b34329b55377096 +:003fb072aa2d92ed131856a81d8e35b936d4cb +:003fc064760e9283dfc3c0dd90e93ecbfb30fc +:003fd034c3568698991cb331958e7f61e589b2 +:003fe064e29ab8b22d675f32de6b0dd197f187 +:003ff0689c4055c6e4930e22a94f7ce4f63139 +:0040000902c324ee5a5aad54ec25bb2747b0e4 +:00401052764752cc96d8e83cf42be9de2ba1d8 +:0040206452cb235388c9596ef717675653f433 +:0040309db4655509aafb03cb49bb504d61ef86 +:0040403bc36eb77b9f9458a783463871885a2b +:00405088a74b5d1118965dfb4262a22cef2cbc +:004060a33900ebbaac5166eedab5fab25880bc +:004070d6717c2f88216e8a53cb3ecedefcbadb +:004080515d2c2f50e47693b33844271c1e2da8 +:004090aada6ee207aad4ea6923fac6a3c4e5fc +:0040a03bc115c23a52832e413e5ba9fdb5e508 +:0040b07d24c09c852953f5497362c2edadc149 +:0040c081e21caa55a4665ec6a974af93f64446 +:0040d0b719b1e0ca7fd437dd09d6817a47b431 +:0040e0d4aeb4a972bc7f986ed2eaaf2d891e6b +:0040f075d751d113e873af0c9aa17776c680a0 +:0041009a7a9c9f21dbfd367da2d74ca2452c80 +:00411024763c9c7a67329f7afcc434820b1786 +:004120b71d8ed6fa784c0e26166b14ab3756c2 +:00413084db82d1c73cfe7a35525ec18af93908 +:00414088337507cdc579e79f8dc9b21b69778c +:004150581514e141eacdaa17217ac1392ad82f +:004160f653bf3f85d3498c6051e7461a505758 +:004170bae81627273df5c4ee7a265912524dee +:004180585920dd374d03696465fc8eacfb5488 +:0041905cf409bc17c1d31d03ff355f220aceb0 +:0041a0c5e2f92123c18b312011c069cf60d9a8 +:0041b097efd21d33464e7785f7bb855f2ab0be +:0041c08d999aca181db27302522274055de286 +:0041d0a484a36f1d3ff35e72b346f9957968ba +:0041e063e8a430f1553c5a903ac72af9d7cb83 +:0041f0f3f814aaad080b42a4618a68d320afab +:004200d1cd4d37a7f4823ccc40afde70be6c42 +:0042109643ce908ef19de36c0798563fb814dd +:0042205821b0425ba2822b1da9da8eb8c21214 +:0042300778a00486ead746561c97c112c079a5 +:004240518941555e114301ca36f91c8b5fcd92 +:004250e5f9502f2f35808b87144864db890050 +:004260fc6c1656e5890c27e720d5bbef9d1201 +:00427068c98d684141d5a6e89dc8f04892aa0b +:004280d293194e98ae27dc51fa83846449cb96 +:004290bc45cf9732917b9647e7d740d2165755 +:0042a0e49003e809dde3176b3020de2022ed92 +:0042b09fddb05e5d38a2bf40614a0441acd26c +:0042c0586fa95e7f54e896a0de004d103e782c +:0042d0b658933b4b29351ec4d12cd57251999f +:0042e09918e0bb703c7557de4abde00e298f0c +:0042f099ccebaa06efd0fa5d570ba9c6066e64 +:004300b4490c2343614973a17a23edbcf9880b +:004310d4702e4b76b0f711de756049d214afb9 +:004320e7b98ad026ee7c706e89e6c6d8edd5a4 +:004330073b5f33250f36fcc9116ab259844eac +:00434078d8c45d05f6414ca48886b9a120e59b +:004350aade59749b9a9e504c11b8f6217e1da4 +:0043604686a4afee52296efc91bb81a1a647d7 +:004370f43f905fbb5e501ee8d743ceb8b554d2 +:0043801fac4588abfc126fad5e7737568588c1 +:004390c6a8abe8f9f84bea86a28a2b9cc5ac1c +:0043a07b8661adf80fd76acdce9d885a4d5945 +:0043b0233641b2a8f079e7d034cf07bfba9b51 +:0043c09570edb6260dca6ac2f5343b0aa930dd +:0043d0a948747900cba5530144f5fe4d0035d0 +:0043e05f478c7f3fb4f23f6901f50f4dcfe431 +:0043f0883d9ab88c114bc53656e6eda009fca5 +:004400d6bca100329ef6c6cd3ce90ecd4108bc +:004410f220d1110c6aaffb4486179178fcac8f +:0044203b66e2a03ce1416ca66fe8903775aa56 +:0044300b27f870e07c0dc5bd64c0013e33b81d +:0044403b5088a22d67b77025855e8f9ee463fa +:004450da78dd69765ab02da7de12a40687f7b7 +:00446001431b620be3fa8ad75d05e94c621eb1 +:00447038e188f6044c3f111a3dd5c955784ca2 +:004480f5f75d80c051d867d891c56e783ed930 +:0044902dd96e59dc2a8e33fdd267ffe698dd4c +:0044a0e96e186e63318fa14e12061117b880bb +:0044b09a283be1f907684acff7826e4e9ec823 +:0044c098fc3529eac293737ca9f9915f8f7b1d +:0044d041224b973ebc492ec43b7c847be08cbc +:0044e0ee400e5f9e4fc2b7a01ae80d855cac6b +:0044f04ac7472a75f8ab780edc8d9328d257d7 +:004500c8081c3ed6d9325a0095f82e4ebedeea +:0045104c415e09dea10c8835e49a14e966f33e +:004520e3d88481a21b25e17f8d27e5428b2c9b +:004530cecfd2fcb3887c9c953cb84458813400 +:004540350ec205d594ddb04bf303e1a59427f8 +:00455071c5bf493e6ab84e30100fbf1e63b3b8 +:0045601bf51a83cc1a9aedd2aef47e2e926252 +:004570c711c3ffb22c564f808f088e72b4e2ef +:0045805990b124bf98b6021eb38569d9e0e691 +:004590160e78b5c2c031ab53690c8e3bc6c730 +:0045a0e4286a74a439d5190a9ae76c12f74506 +:0045b00cad4081a765b6499d3541c1f2add7fb +:0045c00911575a8d5f9edc0cc460dc87498ae1 +:0045d0b81bc282f17e43d7746e713524002f83 +:0045e08b84468783972645bf0c5650493806ba +:0045f084289ff0e322cc07d12ba95c779d0e04 +:00460027110dfeb126055e4975c5101a53b340 +:0046105285410f3cb7fc97eb33b860414388ad +:00462036b2e303674dda9836843dcfc64511c5 +:004630906f9e6860a941551f5b3562832c8875 +:0046402439ec6c8c6ed14eee575077105d4662 +:004650c6e21d04cbd3a1e1efecbaf717bd7041 +:004660311a0e30baa59e007fdeb738294a037a +:00467024d6f30e87e63e6a003f2f416ff61f3e +:004680f9a875bc9f4aa312e5a0c76bb337b25f +:004690952096955c7886ab63bed18987b72687 +:0046a0fac38d07c60f1f7fef2e46f07a39378f +:0046b0ee76c15ce25f94c49614458f5d9bad66 +:0046c0b96e5369314bdfeed9b79a7a677030fb +:0046d0e9e257831cd2ea3ed7f28b09407e07ed +:0046e009a97cb65da05e880e63db910a864ff7 +:0046f02ae2cd855967c6b0ce12e79c094fdc45 +:004700a17d3978e0c6adf44750803b20b74523 +:004710dfb3a64e30fb7d18485020ed040da53a +:004720cc5d9e869a70a0641e0b7e8b8327f58c +:004730245b3406117854a2a066e5cd39dc2664 +:004740fd7a1454acbed7892fc12672764ac23a +:004750e28df6198904c9ed2092e7dbfcbe4793 +:004760806c04c12637e40993f9253f8b5753a8 +:0047704d142768780aa65863c16521ef6c4fa9 +:0047802afb355918581418f0e32956c753389a +:004790c71c68f4210b897d8fcd27d4c2cca05c +:0047a04629e05513a240cdc68fa54773e1fe08 +:0047b0980e6cb6543841c0f8d5120b0d1aecc2 +:0047c030b37ccbcbbca159522a57b1f9a96caf +:0047d0ba846aac3fa809772516fed17b97d308 +:0047e07ee95d8bceb01951d8a69123fced94be +:0047f0403b6090fedf965eaed15c4da0cf5c1a +:004800728d6aab4b1a2a5dc64bf7c3d74eebb2 +:0048103854e2d66b3c220e23b95b9559684251 +:00482013cbccb7d782ce110b71d74fee01e4a5 +:004830bc78288742a895a9f9b1abc78fb80b81 +:0048402aa0c5739f3209fefa4b4ff7dc0be62a +:004850e7cabc72203fb739d38bbe40de4c8548 +:0048600cd160516edbbed208c7a657c87394f0 +:00487031346854398fcb6df3fa72bd8f225eb4 +:00488049e434e18c1ef7bbe4ec45e9d0da0d6e +:004890431ac40d91ff07fb6300991a8bb420f3 +:0048a04b864bb6eb8daefed7b360cf4697bd79 +:0048b0f6f4492e729134bb4a681f21849bfc81 +:0048c0c78b86aa87f80abdfe3fac6fbef9890f +:0048d0101179bc25f1712745958a7568b9cb49 +:0048e06ec430325dbf77ba73b863920f8f397b +:0048f02543ae8b1e808b081f289b5a747ff17b +:004900f7ee1c1edea1bf4a39dd9b4e8146ec2d +:0049105db2f6e3561825865724751fa8d73ba1 +:004920cebc09be2aa9daf43a2e85abbc40986b +:00493074f21d0622d76bfa857e7d5d58fcfd1f +:004940fe373582c2885fcb073b84908047d9b2 +:004950c24b5f2b735228e80f6d7241d5edb13d +:00496098caf9a2cc0e8a8201d0e2f2e99731cb +:0049709868dcaaa12169c63f532433d021b85a +:004980eb845a3ad62c0fa73d4305d31bb94918 +:004990a827a2e91557971718330653b109b069 +:0049a08ffaddb4d320278e66822ca447a59995 +:0049b081571ded4e850f52a7f8a875b50428b9 +:0049c019c3c5602118b8a24b71099c5f956ee8 +:0049d0a8c3a607b098c288b4e142971361a066 +:0049e0f7f582442ff341614b88948f02d1c05e +:0049f0efa52b20eacae6a11f45e7e0befdc1af +:004a0093da36913200763222b0e127b734e49e +:004a10b02d8473ddea23d3bd9b4fde169dc6f7 +:004a202d2d31ca510e4c7dd57e03b7a641c977 +:004a30a52d82b02775db234651643f5b687631 +:004a4028b5bcf04a2496f7d4d34eb1eed82696 +:004a50893592ad80ca01a3d1b05cdac595b49e +:004a6051595c0eef70aa1cefa020fa5b4c4775 +:004a70a15adc78c6a194d2aa54652e0ce4f8e7 +:004a80e6b1d4440c2d7624435c8244f37c9cf7 +:004a90acea3a0fe5b596a9baba3c0980d7c2d9 +:004aa0d19dad6d2f221582d8d84bf32ec57399 +:004ab071f1367b994b18b004ad23a92c00646f +:004ac0e5bd72477150379fc18291364b66e930 +:004ad0d3b3757f0eb119f122bdc9f58d91b5f0 +:004ae0adde9f594fc5b93729fca4b9ecc5e52c +:004af0115617d3b6c2bc72d15c7d717c8569d8 +:004b00fa8f442baa85dcf82d129293b5f0626d +:004b10ed49bbba7d472acb04e2a65926ea3baa +:004b20b3c9604ce9c97dd3c173ad3385fd8836 +:004b30ca38388536f9794d6e67212d35cd55cb +:004b4005a65943c5dbcc2ec13939ba08537ff2 +:004b50b607dfb882e6fe7bd7df0432b8ff1898 +:004b60480b8d48652a5a963f6841943bc6cb1d +:004b704789423659279a6d8b3560d8aa80d87f +:004b800e4740fd550d8be42b954a6815608a21 +:004b90128037622548c677ca727c48ecec68d2 +:004ba0adc73224d13371d2818a492403448341 +:004bb09c798f9920f6b879bbde1baf6f62dd50 +:004bc0cbd81c2924a9f9e2c6c123ea88e10d43 +:004bd04e37644d0b3a9114392cc8bd51bf4be3 +:004be033b060a332891df69ad1a6aabf395f88 +:004bf0d4fc40cfd8c45b15585a5256368693d3 +:004c00492351fab8866abb2de9b9c107953efd +:004c10d30636a16da2ff034af585376d83be51 +:004c2060f426735d2461e463afc67e5b7bcfc8 +:004c303a233a69b54f78238fe65d0986c93524 +:004c40622f0cb83f393393457e6bf2da35ad9b +:004c501a2ee43577fd30d89313e7263e92d148 +:004c60d2ddf487eff892fbc78a16d5dd46f0d4 +:004c70c505143ee5cb25e68618a95fdc3e9f0f +:004c80cf4e3d1205df8a04d5897c7bf4c7c64b +:004c9064f2c3c60597bce1475b9cf20c03b1aa +:004ca0a71012a0e9e62867e764ec7025e49ebd +:004cb0a8e2d6ffd9d7321c72bf6ad9706624ba +:004cc0ca99724c0104171d1742690bd2e7b44c +:004cd01608caaf56912e297558611bd248d1cb +:004ce0e1cf342c40f5596b49a5abb0d1827fa1 +:004cf09588e8fd7b25830e09c438cd39afd5e7 +:004d0039d864048668a1efe35ec886c648fee9 +:004d1076e6123bacb37d75530696f54bf9ba48 +:004d20c4f8edd9e04e448aa58ca13187594d9c +:004d30652b90e53f146874916d5c55c09f2325 +:004d40553d4ba57e228f908be97c1daee3bb68 +:004d50f2bc23a65da86b81c2219da670d80349 +:004d60b01a60c704e33ca3281b70d81440b63e +:004d705769416f1c3b7c68c128d846bcd6990d +:004d802d79c65af4951a5554570e62ae589dbf +:004d9042eccdf5cb6397b6b44745c55a37edc6 +:004da010fcc0879b8568237335220182f8b8c7 +:004db026498498c1d15866a2f086eeeab57bab +:004dc05b3140a2c5fd9545566fabe3d459c3a2 +:004dd0f39e1cc575ddfe2cd16f85453d3d1c87 +:004de0c1b664928b40d584ab2e3788d86f9f01 +:004df0b0fccc26b8d986aad3cc6846887c513e +:004e00756e649b912c8ab6f3f243eff64852b9 +:004e104e8fd64ee7869682b1b3675294e5a27d +:004e2003dbdaa0f0c74cf7d4a3807166e2fa37 +:004e30df9c19d69fc8e2fe3a7476acdde029e2 +:004e40f3dff7c2cd2ae069db0caf131cabfa55 +:004e50180149476e871260a0ed090ac971a2ae +:004e60a3bff99ae4dbcb244041486b983d52fb +:004e707783f2c7e839e35bb07d93afb7fdfcdf +:004e804b0e1f05711eddf6e39f185012783046 +:004e90908e182f5f4111d2e43fbcb0288d7bec +:004ea0c18d8ee7f11e6578dbb64b6056868a91 +:004eb0e86be049f589e9a91f31a53fef3f8601 +:004ec09be5b163628c3419a24f9295dd85c888 +:004ed0bac2bcdf58c4f1f934b996edcec8cfa7 +:004ee07f8083d69e0816672407b38afd535826 +:004ef08e2996449835eac4b1d9158a824870d2 +:004f00c1f40923c6128f74f42e136694c6a7bf +:004f100f43235c401304ab4242a3dbe4ab34a1 +:004f20a9a3393ec174b8ed2b0443484691b98d +:004f30b890f19a13ce5669c3f789192dda4e1a +:004f403f5aa09aebc1ce17787bb72fd9b48aa2 +:004f50852110742f268713e2cab594baf295fa +:004f60918b184f29a7b999e59e817d686e57e5 +:004f7020f9e63b6163476ece227ae19eeab356 +:004f80c8ed543c6107d768a6b9c8ec8f05bd4d +:004f907231214d34e88ba3736040f2432bb11b +:004fa0c00f4c6989abe2bcaefd0ca0139600cf +:004fb02a68126607f8f19793cf49e34622a95f +:004fc0dcfd57490e7a8490f9f160f372590c92 +:004fd0e669bd61e97c4dec632d75bfe275b971 +:004fe0cd2dfc268f3410e1cbe7935a6b38d5a3 +:004ff056816bff824151e9a7baa83694efdd30 +:0050003d3513e9cd31c2cdea7d74ae8ba0f2e8 +:005010bce322636eb0fd7b0cee37ec1343bfce +:005020bc72c1dcef554bd6a04dc0cbf7e3bc33 +:005030ff9453f3e198244377baad8fd4773eb0 +:005040db774378cdec5e3dac6b5aa1507cfc72 +:0050500b40ef7db51eb51230c90e7cc87f9d0b +:005060d0664449dee66a7ba038c32e61f5c522 +:005070a4f2ffc1374f0d3cec23f456044a2d4a +:00508018ea8479d2e26528be454c241a18e00c +:0050902bc25f779d95f75c50744b113e720219 +:0050a0ff19849782da921dd6dfdc721c7147be +:0050b09ef4485d24148f43026917e0a9a7d44d +:0050c0f4341f8043e8ef468faa3c173656838f +:0050d061be15311b52669d8e6722969f00cc24 +:0050e0229715de01f4b5493306c6f3fbfb53c5 +:0050f0cb4fb46caf6174a79c940d76d13cdc78 +:0051000972c326ac2a79ebde7df3cfd60672c7 +:0051106939d0a4ba90f4f14ce1eb9d6bbce549 +:0051200338fc6ab6412f1e4d7d5407d7bba2f4 +:0051303a5226a6c9474ab10a1a3941ddc9ff60 +:0051402aebf3c1591dc8253895191e6ae7cf90 +:0051508cf4768965f2206af5b0a7f43bcb6dea +:005160e3865f11825011e855ab245be5b9eeea +:005170d1de0b26664461c3af6c74a631589d21 +:005180a0b45963fd9cb1f1b8c4a30aeca88726 +:005190de7ca94e00a611c8af01d90dc671c882 +:0051a01a4027ad27836fb5324966d867dee79a +:0051b0489473d6e210362e5d9609b11b1977cc +:0051c00cb49da369f46684c1328b397bc4ff5f +:0051d0d972c5f98b26e500b367292eea532641 +:0051e0aff88035a8cef7fc5788b7ea8fa223f7 +:0051f0410d8cad287bcc6a77e35adead4f98c5 +:0052007bd201b611526fe1abe692b6f27ac9a6 +:005210c9b5db8f5cf133ef28fa7d90cf50e976 +:005220089251cfb2a350130334975c7aa7cc2e +:0052306f3987b038a488d8acf0ab64f227ede0 +:005240dcbf67c1f026c667172b46337cd35fbe +:00525077c57c824decc604485a762c355d1b7b +:0052608644097d574d27a51cc24fc27522fc01 +:005270496243b44540697b19d5690c08ead279 +:00528029a0f727ef79484ec06c1645a3dd6c70 +:005290d01b77c27a9218a4a8198a3822e2eb41 +:0052a0fd84d03b28e0dfbe2e50beb3aacfb3fa +:0052b093726b2478720674c5f4dfbff14946cd +:0052c091904623741b783faaaa969a1877fd27 +:0052d0a747cedfa1392d934b7186717685cea1 +:0052e0818669e6c71bc5a9d1effa2f4277880f +:0052f03cbd8ad62808ec54d89733461d4f571f +:0053000bb9bc9cba47805ab8143c0b056183eb +:005310bfacaa963924b256f2b2140c658c8253 +:005320b95dd544ec850a7a5437d25cba2e36f4 +:0053305d3d8e56029dbb31171793fe7e9199d5 +:005340274951f03feff56b91ddfc1baa08f150 +:005350c0d9b021326a5591588792faac3783af +:0053601ea3d37b57da32f369be8aef93d16f03 +:005370bb84c8d1370b98e8a480bf4c0a8fa9b7 +:0053804a716aad2e4868075b2c666c10d475db +:0053905e6596632e0b699e46c01be0807fbeea +:0053a01823204eff2f67009ab38ac84e833a99 +:0053b0955328e9c42b9d1588936f3bd58eb649 +:0053c047f7d5547a834118c3cbb23f203ff374 +:0053d0fd1b3402623c3e49de92d210e82df311 +:0053e02cd9740d6dd004acfb2592ec7f03960a +:0053f04de52a0d32a18dc44f10e94827bae02a +:0054006eba2327a586544eb1ca81922538a463 +:0054105e7b313a58702e3df8f551180289b016 +:0054201af297b67c4c6cfbb1086706155484f3 +:005430a058ee4c2833a7b719e29374cf70fd06 +:0054409b1045c91cc7e19757f8896310c76345 +:00545059f4b91b18d2c746eaf29fa2b15e4593 +:00546057d21b0bc4836d8f2e476f1805b462da +:005470348775ed4cf5e73759058ea0c2439406 +:0054808d5ec687fc959dc3af4f2f2fe0dab5c5 +:005490f50276b5d1f73c1af05dc016ec9eefe9 +:0054a0b95d79e198a1039b8eec5c64f05b3561 +:0054b00400ff1d0fb072021a979919c62b3cd8 +:0054c015e6f4a775399aa500b6dd4e1117fbb5 +:0054d004078b5b1a3e6e2846e2f1d5e3dcfbc6 +:0054e02c0afae9a968c1eac56f90e3d67ea3e1 +:0054f09a291cc1666a0b07da0016e2bbd20387 +:005500f19cf6de715e487fd0ba33e766dd0f25 +:005510fdf8770474e0c46c1e34e6b64faf775d +:005520a82073f61cb2f5bd7f6870f7fafc8480 +:005530fcea8a65c6df20da9ab74ede5c12f57b +:005540d1650d65ed8e21bd662dbff5b11a43fa +:0055508ea8c3df4d96a7a0e96ea01f54605c30 +:005560c7d3eb8a8a9e3c4cb4a6375bae13dcaa +:0055708669658080340e4661f2ea9fd6459abe +:00558038f68ef7d342d9da4dcec96fe98575b3 +:005590b74d1a215c9ffd5461a6d596f4504547 +:0055a08e75544a5ead10c85d412687e1f62199 +:0055b09fa652b97acd40cd8585e05cf4f6ab72 +:0055c04d544378c2e4f82cc44932cffb04d99f +:0055d083d32b7d9b08515a0ce091a0f398d320 +:0055e0994e951b4780404f783b982657c84fb2 +:0055f0a70a9ece40c2ba2d8978148b27926b45 +:005600bcffce1aacda1e31f9d3002d1f573d48 +:005610d14c4e3ee8d89706b0b1b441716f3907 +:005620e1acf1a873edb74f6f9f2785cd88a2b0 +:0056305645d3bd49ab7dbfd105ed72173e8378 +:005640df6d996879bad535ff4d876ca577b7ca +:0056506ed216b3d1af4915147512a0e0bcf1e4 +:00566008d8d4bb13613e296f2f4e6c2a317570 +:005670bc46152de63ed8ddbc9f34ad070b5fe7 +:005680df0c8f9d2c2d64492bcdd982e67602db +:005690a018c3eb261063c925998e51590c7eeb +:0056a08223924e1473399ffb455cefa978d379 +:0056b0cd9cdee9b923237cc21fed4feece83ba +:0056c0952cfe033b814b81347992aedf578a14 +:0056d01704f6d7e8f7b26caa23fd14884b635b +:0056e03e6eef7f3a413ebea3910c339bba3945 +:0056f0147dfed371d0c82bbd87390cc732b496 +:005700e51436d142f171e59c014522a1df2652 +:00571017e782cce2f62ae59b3cd83d2f095ab4 +:0057201cb927aaf916c814e5a5fafce7030cee +:00573089983e7d71949d95e27e0ab6e5763359 +:005740f65b4630a00cee647032746291b348a1 +:005750d98f60d174871b129e8f4472129b9d84 +:0057604522b987dd19012c42e03f2f22cc5bad +:0057705769e1672d7f611b76155517403f06bd +:00578079cd82dce71578e62e4eac2ba5967457 +:005790320cc46986952104b945bc817dde35a4 +:0057a0bfe553ff91e42ad30a9f7672376f9d8a +:0057b07b49e9ee7a7dd5b9a95c07f91ca24aab +:0057c07a62ca71633c888bdc3bd6e413c296be +:0057d0f3e11d63ce71a4f4db9d36c584ad5230 +:0057e0d027a4d473cc90b2b6dedf2eb8de213b +:0057f07837ba702a22b750f40a9ad933226455 +:005800e6f38e56a390c1ce75cf11914d0f78e3 +:0058106233f60702165b3bb74a0d6d73cbcb21 +:00582053d2d7f1ea0b994dc5d99d3400d1f974 +:00583006caa218b62f3416f22ec58e5fe6740f +:0058402acda38aa83aed4cce2b00c0f0c9df3e +:0058507b83fbaac9e5290b2f02f5b52f83cfbc +:0058606073f38bebed3eb585fc22428508065f +:005870842d631ddae29d388f423f5d7015b585 +:0058800342c3ea7f3d31282e2fceafd6812b27 +:005890547bf9ecdf8b9ec754301115d7ded5b6 +:0058a03b73f391aa09957efc3ea3617583b27e +:0058b0c8afef5a805b294167f32f0f0c3c0313 +:0058c0022fe30604f8f77d6e68d2d1ee5f5864 +:0058d0226f3f7f327a0c9a9eef5fbd7517ddd1 +:0058e0b8e265262b714a7e14d414921452addb +:0058f049ec8d272b20b006315a920ab7c4dfa9 +:00590080b83bf292d33d206b3623a9a4eea608 +:005910d130457cb7ca2d672de263ab3e6f3e49 +:0059209a80b1781fa76e6e5e6dade50bc75a79 +:005930dd0b1e3b1242330cf061938d24242243 +:0059406ef8da962838c0e02af48d73f2e40f0c +:005950ad26e8cbe7dcaa8b2c09e6e71da8c7c8 +:0059608e4a445083c4550318933147cffd7c7c +:005970e24a2e6c62d6459ea2e2e0f268784ae6 +:0059808256a1bd8bf9740e77851b7e4a72b03d +:00599050dd734e2765870d8f95fb41f020f699 +:0059a005394e3d661230b0afc954aa54d075a8 +:0059b046b88346ada68a408dc966042fa6839f +:0059c0232a5b3d1d3f6de4f7367f144da930d6 +:0059d09778114ace1338f7a25970afeadf7ad0 +:0059e032cbb17a92fbbc5d074f7da75ced1983 +:0059f0b1c0ee325a713d2197f086b058fac340 +:005a00ad230c514982045de1981fda32b92780 +:005a100e435dd66149312dfc030d844b701308 +:005a20f2159d8fbc472f4d983d5e36cc7ef244 +:005a3005d644b8dcbe309acfc896506191e692 +:005a40de8436c26c7b7d38acf18198004888fb +:005a5037fd020daf2485af2934f9468ed59f2c +:005a6075dd77888ac2408eefa4be1c7d978360 +:005a70eb79ccf40323cdf9d7784457e3cf8534 +:005a80158f52bf6658fb645a947ef1d1b7c52a +:005a9036040e7ce539e801710f0dc8ef9e9db5 +:005aa01efa774c459d076fd0201734d3951550 +:005ab0b03db1134754cc37c20a7136e2050661 +:005ac0d27f2c434f34c45ff547151a79a1100a +:005ad08f44fa04ca9898c8d3a4998d956f2bc4 +:005ae08b2ff778b75bdb93b16cdb4b11381114 +:005af07ddb5f6327e498e661a4b61eb1aa6f91 +:005b0078caea2bf22282316ec2efef4113e8aa +:005b10df596978b1246a8e66b46ed39124e2bb +:005b201a51600d6dfac997b19464aa14bdf760 +:005b302d6c1e6d0f42c687391e90bf9571bdef +:005b40fd9da8b3e630bcc8d97f0a4ae0ce9bab +:005b50e6df3d68ea402e1ba89820762d242be1 +:005b600fa6265f96ac4800ee056aaec4192c6f +:005b70102a7e224597a334bd5f6265049477ed +:005b80522d1ee5470a39f2fa2a5216351a6ae8 +:005b903d4d4ce39796a4f6041e404160128bad +:005ba0ea15eb38d3dc89a56531bafd1666e25e +:005bb03fc9364bc1d77ef171a431c4cdaebddf +:005bc0b338a33a5279778c781cdcfbcfcdc7b1 +:005bd0f03f34811114f8467cee5f36e48929d9 +:005be008e3de5d9d1c701d7bb590b062041994 +:005bf09c6059d1bbd872488714e141c430c042 +:005c00dfbd34e0262fc35b65e485bd03e965fe +:005c10f2dcd922967f0c37b8fd24323a2fbf74 +:005c20bdf9eb844138cfa02ef75ece80c09d94 +:005c304b6677b3265f1f9a38c5019cd254008d +:005c4096b2549781fccd46c5845c67ec3c9713 +:005c50900ef7902c16b85babd23474085df522 +:005c60ac8d984b26be6d202362071a8423094c +:005c70d09ef4117ce94c1fadc9ddb5831385d4 +:005c8023765289712df6bdabffb1751fd38968 +:005c90b0c8dd063791540bec5aaff1f71aca67 +:005ca077620168a166795fc90c55b79bc5bbb0 +:005cb0f7021f0ef6c667ba86cc4ae1dd52efd0 +:005cc01f78df6a759f2b4f2656529ccbd27f60 +:005cd015dc9c909d0af1a8b53da9bbd451e299 +:005ce0a9f0fbf5863975ec5e588fe7c2b43dd4 +:005cf0575dca30adfc7188ee25542c57d8e4d8 +:005d00d8331368b95ed75130f114415e8ba966 +:005d10c0a13c4b56f976a3ab519340ae304f8c +:005d2011c06a592ef667a683c6ecbc60e6f599 +:005d30c60423562378faf23e688f5e041258ea +:005d40870970b31b4986b0cfbfc5e5169a1d8b +:005d500a76fee2a30f5df864db5faf578c0ecf +:005d608eaadcaeda22b386a422f2518eee7ba3 +:005d70a7126dc694fc4a95839f40357007cccc +:005d80b3375521a8cc0caa8f111d74b5f4bd97 +:005d909c34196c730220f6fb84bdea7ff64f84 +:005da0b624959d7e16cffc0d9381a2ac1de288 +:005db0c5933c8c85157c6d62c64af7236a2cf5 +:005dc022439fad7aa16d2155315bf745c7cfec +:005dd02f7acf25dc9124b1833f9abd5c94d26b +:005de06d6d25aefe809c6718949794b33350e4 +:005df02df4784d7e22519a200f41a19a6c3737 +:005e00ae387ffa875dd46772f26afa7f8be9d1 +:005e106b8aae20c20033bc2c6a73a545fe6934 +:005e20fa8dd6cbb9f2f3a1d33fd25889067dd7 +:005e30de3fd915ec2beb7193f65165129e0e64 +:005e40e02ae8b436903fb06fef2d4c8ba1e25d +:005e50c1c8a25798daab198f830a1d24771ef5 +:005e603966c35cb719b22630e4395301444945 +:005e70edcaa78be934715adcf4dce8dbcf9557 +:005e803fd6c6855767f09e59ea0abb602b991a +:005e90a1224c1b9b1c0fb2927698e0f5d9bda7 +:005ea017e44f48eb365f2047272425dda80320 +:005eb01f7bc70e02183172e05417ac0c3cdb13 +:005ec06ea7bf27d0cc58a3496bbce0616b56d5 +:005ed03a2da60aa3144bfa3c9e2475a1786ed3 +:005ee082d1ed04e8697099611fb30f85b2df0e +:005ef0f4ca18efd16b853723956a9e69444d56 +:005f0017d351111b3f7f283858795e610b553a +:005f10aae249fc5cbae23f31a8e7d1cd6b1b71 +:005f202eba9a66c08090f6ff0e33e1014bc1df +:005f308b00ed323c6481bc267b6b97f34f0ce6 +:005f407eac243189224c5cb4d292f2bcc06dd6 +:005f502b5964b1d7a9006f3d79ae845eb31613 +:005f60d45930fd6803ccb7e27bfc225583e6db +:005f70def2348b70a36db63471163e89fd1d97 +:005f80f209ffdc1c575dcb356b41fb16dc1c07 +:005f905e4e0053d2061bd007613dec581892a5 +:005fa02e7d40ba98cea5f846cdd925dae145db +:005fb0017511654f96a57a0960da68b59fc503 +:005fc0bc81ebc5298e400ca72500c11dda5326 +:005fd03ef6845532daa39051d56fb79e640f12 +:005fe0e13db89cd80316a5e294eec8b9b52c19 +:005ff0f18fc566fd8ef2f4211d1d5ac3056a69 +:0060000d5a9fe8388f81c9c81ef107714d7897 +:0060104191850672be087d3682fd8007594f99 +:00602050f0bc01f2dacbfc4a4ed49cece693b4 +:0060300f466ff0d4c47b37a3e37c632c914f8f +:00604057146a2f4e4bea20e5164c84a8d15365 +:00605012073fd1699e96e1d71ba3a406686e59 +:006060218dc1b39c5696e88923080c52edb0ed +:006070d71a243fc1d2204119292d8529e555af +:006080cd9bb1b1cccf596ed8209d6fa97f4b6c +:0060909dfa4948cb96f6e6f7f2dab2f17400f1 +:0060a069b283f6c6bdd0df8008a47e4aa08446 +:0060b0244aa3fef8d22449a2dbbf3941881577 +:0060c0c2505891955da1d19bcb3c12c54a01fa +:0060d04f10377738782e9d346a706a657eba1d +:0060e02a4f57c5850b1de678cba3936133fef6 +:0060f099860459019a3a9e25e373aba7a50006 +:006100e0456e91bfc5f8e8e92759e4572ce184 +:00611050284bc8f87e7de94369b9601deade4e +:006120cd7fba9fe12996fd7de8c25b5edbbc19 +:006130901a4ab0517b730ac70c9472af06d2d9 +:006140259bbfa17300ed784bc0987caf10ca59 +:006150e2579a31b344b53051ff2137a05aeb89 +:0061600159d6240684f70a7809d74cc070e484 +:006170719175f1aa982f79fc7e026f49ba8004 +:006180733d0e637bd4abd8e432d0970e4a8632 +:006190a0824884cb66c407ce515b9e9131d962 +:0061a02d3884c6b72551f3e0c4d2b6d0a803d6 +:0061b0552f653ae3d37e70624f48c21deee06b +:0061c05078524028258bbeec339c6b289f89f9 +:0061d0460722e84a45ee954cfc5389b7f810ea +:0061e0c2ec6f4907ffe26ada48e121d274a3ba +:0061f0a45c77bc60bd2d0e08c3c33ab1ab25d8 +:006200b137aaa7a79913309473ce10f9794ac9 +:006210dba6023b9dc3eef2bda049ee3b4c88bc +:006220bef83c0b92d07930bece9b37afcd4e75 +:0062300076f2c595ecf38327369bbe0d9d5cfa +:0062402224564a8aa8c359f9e27f5a67366a0c +:00625065059d33451fffc05d8c70270e20e45d +:006260eeb271fa2117b4af3e7b99b63fcd78c7 +:006270a946d58a844909f9bc8f27a3f6c9fe44 +:006280c031ed11114872a764cc9f82223d1ba3 +:006290ff4ed5de8b31a77c26ca2d115c4f1990 +:0062a05ac8c0a9e6bcb0eb48d074f67da72287 +:0062b0ff1292062082a6ec4d81cc489ae19de0 +:0062c0ee8119c0b7d028d801ad766254b2e46d +:0062d001f8a32ec05d4e2f17fb86a2d2f8b0d8 +:0062e056b94b4cbc02f1e98c227c453f481972 +:0062f08a308cb25de6c8e1d69baa196af5adba +:006300ea776e8345fd937e283b777abba7268a +:0063106fc57f03dc79867a2314669a13d40c25 +:006320d13a758f945adad8378050f2a07774aa +:006330da7c3ea855efda8fe246a92e1b09fcbb +:00634005c7bb21018fe005e02439d8727231e7 +:00635040aac5a14945196f646daa51fe46edb3 +:006360617ca4c148b86697f8b34d6c22f8a937 +:006370595d6a1f202a52ca386182cd9712a9d8 +:006380ef655da7ef7c802929d9b9f0e51efed3 +:006390f8b0f5645f6fc96692085260d4bb2f2d +:0063a0b7748d87fd92efc4890904e4262cb807 +:0063b0745de9236bbb82079af7c44068bbfd1f +:0063c0cbe0c5118ce42d033811d6ca59aaabb2 +:0063d03ade17aedf5e931d6d494672a6e5215f +:0063e0c26e664be8c2b200e498f5a62bea9c05 +:0063f062b463151c7ab6d61a71e7a69b2d2ede +:006400c4deadc850521ba6b393e3c8542ac686 +:00641077bb3045064f0a036ccbffe8bb413e27 +:006420964e48ae025aa4f02ee6acf461c4c4ec +:0064308b7a06d77ed46145b9c6671725486b6a +:006440a24b7629a493f8a3b0f90560801447ca +:00645062ffe42c43d201e40e92a866b897c2b6 +:0064605c9b26dd9030d31855668b52fa52c206 +:00647095a7349e3396ca62a4f254f663f29b41 +:0064801b64d480380b54a19278e647df24e40a +:006490abb2c2b85f98aca914a7210ae9324ceb +:0064a05fbc1f45435be9220ac4ace8f453fc36 +:0064b0264683ae03fe3a51316c3fe73d71ccc7 +:0064c08ce7f35a3be061852ac0ab76b8aee443 +:0064d07029aa750ee1da8bab8d1f1b93da558b +:0064e059249a858258ea069be5a8b6bed4b6f2 +:0064f020bab18ed115d97af82258fa9ae23b17 +:006500f417dc4fc04465513ac16100c8fb4303 +:0065107302ba403df81ec4be37318b9785cf93 +:0065209f10b1d471543dbcbc30518f131ac8b4 +:006530f0fabbb78c607dd1ab16203307a2ab70 +:0065402fd7d98ad2104f4a0985e5827edf4e47 +:00655024b5a745328e6f2cf059961a0e901393 +:006560c09bf1071c34fa92ba4c9d1722e09ff4 +:00657044222561798246328bad7833ba352e1e +:0065802d0fee86908403e1b2aae4453c2919e3 +:006590f58decd8bbba574e25b7215cc9c7d61d +:0065a0d3d738b498be6be0b18888820adeb614 +:0065b0d901521113e97364f586e9255360b43f +:0065c0e50b7e9914d8572b8cc85e9aef6a18b9 +:0065d0db64c3d07f91e1e2a69d76785374dd6b +:0065e02719abca3252bf3ca48b268f52342e16 +:0065f077e540e9dbb31d4a4f809e0e233e0d1b +:006600a54aa651c890db279a6fd85ccd707ab2 +:006610120c070710f2a88b1f294be6ee0312b8 +:006620db51a8e39bc8f9353c51ec8dafd486b7 +:0066305fa915f9856f4f3c7677c233e52615db +:0066404ab2906488bae1e97046eafa360d7cd4 +:006650573e6c4d358468879f353e263aa5ca29 +:0066605500f6d2fad9c3ce7ec7211863ed8b15 +:0066700947654b1e930d32d67f76874cff3d5e +:006680316921cf9edd85b01e56ee8a2c482d4b +:0066902c748643814a5352847bab12b2342c6f +:0066a033e75926fba88bf61321478d603c7538 +:0066b025903a881edb1b66cacd1541f610f407 +:0066c0db969b8396dace1fe1e404372a24654f +:0066d01f50caaaa6970ed1d56d32aa8ff5e544 +:0066e036fb2ec562beb2a5e80f06aa04a5a8d5 +:0066f0221f482c66ffea8c397ae13856a36dc1 +:006700d5ff6e81d9442db92c54b51c404f245a +:006710a5083a96eff05fa4db3a4f6cc2a3e739 +:006720b2d2016321ecf865e63241a03d79db21 +:006730a4f177b92ab49e9daf6bf1409ad7f290 +:006740491815ba3da4858ec93d41284f33e925 +:0067509e322ecffd0308bd25a4aeb6c67590da +:0067604dd3f89af211b794b3656b90059ea8a6 +:0067700183587f55f56ae257a6fad645caaa76 +:00678081598ce70725cef6c7de97fd1c154488 +:006790cc4e07a951cb33b2b81edc60a78fa760 +:0067a09dec61d987b304d83c43fe13b0205d40 +:0067b0714d375d78623b75ed35081e56828a12 +:0067c07b71240aa5f7f9192d6f1db90bdd0e78 +:0067d0b9778f5f24d560c7d4971660e32256fc +:0067e0639872face7abaf57fbc8385d764c368 +:0067f0bd37bcb5bbab36452f228dcf508d61b4 +:006800ba2923e83a5b44ab4dae846096f95bf7 +:0068100561a3d37b0ebbdec9fc86ede1881661 +:006820129512fe266373c743cc7e124550f09d +:006830fe0a66b44900c4d92cf37c0bd9e66a95 +:006840000a4fbae0d20dbc2a0d3047182a8c1f +:0068502b347a9a6054324dbf40c2e076c8f984 +:006860ea128bf33689a3f8e673c36f3e577c79 +:00687015eea5664983e5b8058f36188c4f9275 +:0068809519dff62a1e1c35666a3f996fd3203e +:00689094aa06fad0942fb15b243a33481a5839 +:0068a049b2312b428c0b7d6ead02afba2fa4c5 +:0068b0195dc4e114defbfc4f5be952d05c6409 +:0068c0d379a2df76691a12a0f7ce5b52e47530 +:0068d0d3a3667f15231179c9be14388b70f34f +:0068e0eba7751883d24dbd135de64b1733b37f +:0068f02b8a097506569f30016f61475351639a +:00690072babaedcf77817b93d94d70003f4456 +:0069100c3a91a68bb616340f62cbfd7815cb4e +:006920de474787e6638b2bb1203cbc974a9a6f +:0069305e6e849590d118039ef820f1a047ef20 +:006940b01dbd0b86b197d9ac6e03e4d97ac966 +:0069504e92ed627851c2f7f72231d3b99b2783 +:006960a30ee677842b81deebb4637b4906ac70 +:0069702d7ef0ca328ede35aa6d44d7faa5b7fd +:006980d2105149e2cc67b00dc1fbffd27c572d +:006990e036fb02f7d433ffdd8af5e2890991c7 +:0069a09721c178f29c46d0be3086b3c4872035 +:0069b008afa0e38b4ec4119b051c2499fded11 +:0069c0faf10d15cf11b48e5c4f7ec468873caa +:0069d0683f73827b1003bc5c211ad694c1a7dc +:0069e0541f8e763568ecc17a4ba5f367b2c3a4 +:0069f0be3d264cb07a53ed70abec154e09d487 +:006a00476df96ec827a6344c5c27b8919cccde +:006a1010647938d7ba6dd6fa4bf92d1aaf5e01 +:006a20436f341498cb5897ada9604f175ca746 +:006a30081284914f22d60bd1fe6b714ae186b9 +:006a40d1474621d5b9adf0c44d5ccdf96e8a69 +:006a5062a53ed529a7165ded9a4cf157c66684 +:006a60c2b9a9ffec2564237fe15cfff9f180e9 +:006a706bcc415e924c902c19212804605828a3 +:006a8056cdbd7d64e3ce59930d57f66a7640c7 +:006a90d557c0778a76f42f8632d4dab7af63e2 +:006aa0f21e841462fa5b5c795f91c44596f5e2 +:006ab0fd0c01d7d33d45f8214b4b9b9fe1417b +:006ac05e5ec1fc458c873d8f456ab9ba02e985 +:006ad045840aced3e8f1f1756f4d0f9aa745b8 +:006ae000db85083e906bcf6360ba57bec8b1a9 +:006af0c102bb441bbc38a873bb4dc5eccbc6a8 +:006b000b61280bd034da1b4c2c7e1dd6117e06 +:006b105587d4ff5d97c4debc95719d8628ca28 +:006b2057918e6b2e2aa0c50ba51de4ed625165 +:006b3062f8195ef5412248eca83b4ad58cda41 +:006b408249e5f44995bf7b8fe8cb970b79ab4b +:006b50e60fa230d54a69845d7356cdf8d085dd +:006b60d156b2bad3c45dea7907aa95c6b0b55f +:006b702f81fecbed37cd282fc4babe849ebcad +:006b80e94fa9073b66364f024523f53d2b38bb +:006b9071622acb000cd5f0c0f27658ca1e4565 +:006ba0ddaec0070544a52ef81f6a6f9e85f64a +:006bb0ed488b7949f6ba153efc00ce8aac1379 +:006bc02206b3b3a3a0f5633984b483f37a9d21 +:006bd0c57871e87685b0d77141eec407dd0dc4 +:006be047de52cad8acd24e0725855611499d2a +:006bf057ea74ce512886442886c0fbde7c0386 +:006c00d24215027dd094ebe10e5a2738ac9434 +:006c100a50a550ae7b0ec5b9cc96b6b9ce038a +:006c20e05c0e0efa6d9dde5bcf44ae100c7497 +:006c30cd4db74ea7a3688f0c2158d4e260a128 +:006c409949ed0bf3ef1311c91436890f3bc61d +:006c5024866636843dd7a3055b43eecb231dae +:006c60bad987bd8429430564e3d025eac890c8 +:006c704aa3449934111acc506d40220e02e168 +:006c80eefb65190d903d3f0b712749d2c13250 +:006c90ed79f13d8607789db6ca70222930c3ef +:006ca0d699a1a241c24a649af6be9547ee1a47 +:006cb0a72f5a8c64eb24a74e13c66f9d305480 +:006cc0c182b0963f2ed264305bf4cbc09862f1 +:006cd0240fcbc6f578ebf2637f4733391277da +:006ce02ddea1091c5254be0c9f3e4334efa8ad +:006cf03dde458c3c2040235c5d821a62f0ce92 +:006d009a5ae0b2564a668b1c18f129b9d95800 +:006d108a79a6aabef1a9f98d3b8ac671f45493 +:006d207883136b6113a6456b44b4c13484af23 +:006d30ceac3355eac4d0de2dd8a5109d41e20c +:006d40803c04d797b7fbb3ef46f9e786257bea +:006d505cc050df8df8a1d1dde703169c285e47 +:006d604ad058d6f66426cbd33af8802a7eb65e +:006d7029c1d21af5e775ea4ce06b2330757455 +:006d80002bd7e08463d4bac45acd313c66a578 +:006d905cbb167dd1a0393f250bfed6d30f90d2 +:006da0b1413c1b92fcbb896f68d1ff0a4a9189 +:006db017931fc93fa6b7000e62fce690d1707c +:006dc00307cd362f89dc73347316fd1ceb91cb +:006dd05423990adfd8112e0177fd38f4f23a3d +:006de0b1039455362dd5002098f379bc28bfae +:006df088cf8d027804d6f6763ee990cab3e676 +:006e00f2ec29be4c277cf6507479a932d4609e +:006e10f4f91100228fb7a37376f905cc135079 +:006e2088328c523470d0b1087d2859ef62fea9 +:006e30eb7eb1278e13589d11ae872665f90e95 +:006e400df0591332d6eb001a48c4df91a41c92 +:006e50efc68ba552dcadf5a6cb0e9d42ab80d7 +:006e600f15163eecf1863a98d2a030fc00c083 +:006e703e9aea98ee6e11ade586d4db51b1458d +:006e80b178825f040243856677863fc9d7ce8a +:006e906dd94cd8cf7082927f51d22d373af85f +:006ea06574f28e49acadce799a5d5f17167b53 +:006eb028b72866c96e3dd0f450ff6b64c7b1c1 +:006ec0d691d869eadd504dcc0276682489ec09 +:006ed0149f9b5c472cf7dd16cab368a1dcb4a9 +:006ee00bda99098e0a2bc75633387925b24181 +:006ef01fb3225341880138be9835dd596a2803 +:006f00b92b03da90aefb258a4d584015c6cfbc +:006f10d890b4674ceb650291de7fb887b8ded3 +:006f2095cfbae44782f099957d1aa7f9d71ec9 +:006f3012d13ce11ffe736b42df66e412d1bfc4 +:006f40da46ce95e26fe4dfd480343e75eedeaa +:006f5009cde2b23312858ca9cf28bb939a699b +:006f608088234a7d7e567c01caaebd3fa6eae8 +:006f704ea1501f5e55d53a37ad9c35e90f4f5f +:006f80679ea94241853c4f81254569af2beef7 +:006f9027d90a1db50aa25dfc275fb2441478db +:006fa05393263d0bd09545d29f1803fcf4f731 +:006fb0e702beadfaee8bea59737554c4028e77 +:006fc00d59de552c2989634fcec947057f436d +:006fd0f0450dc7afdcb912950186e3ac1bb367 +:006fe08ebf8525f77dc1d06ef9be96146deb98 +:006ff0ece2bc3ff00d477263b1560ba8a39870 +:007000fdea02a5e15d057f3d18462f1a9a5bb2 +:00701058f2b643faf7b707f2242019e9390387 +:0070206d52d1ef64ddbecb68486db9fb7242fa +:007030faddaa913b90a7db17a7427444b118df +:0070404c44cf3407a9d9629cce8154910be6dc +:0070503d260d0c20a74ca0a1f392053bcaad88 +:007060eef81188026bf7884e7159c1bd3aa529 +:0070702207975299bbcc79a10a19f69e7e8688 +:00708097e09607418bb8404ef1a05428c0871c +:0070907f18db1e507e03080ea8e58d57564240 +:0070a0942883e968d58dea2e8e86c413bc5928 +:0070b00a8cb16a8ea9a2b5e2f7e52045a882af +:0070c08db5d7a52df427367edeb7cd5eb2fac0 +:0070d0784921c8cd14d28710a00d38f2ee13d3 +:0070e02ae142e260d2e4261193eb2ff27d6865 +:0070f0e96a3c4302e8febe98f7058da7ec61d8 +:00710045f380ff387a932d5074092e587c3231 +:007110a85e42150f9ce653abb3f5de5345fc13 +:007120804da635c08ad20e45a5434793fd72be +:0071305511d4c3eab7489238b7c2b4efa87f0c +:0071402cc3e618b1b668d8b439fa1d85b13618 +:007150f463b5cd4ffa718e2267a9f503d2d175 +:007160462dd1460754fded98a95f9249f6b56d +:007170c545f02c01a50ca58b5513fa990d700f +:007180c001733911ebd12f87d59bcb429bb86b +:00719099c9653177bf427f324aac9380577d4e +:0071a02db4ba6abbc40a0578e062683912efdd +:0071b0d17c365e0b7941f4a4889fde7d07ccde +:0071c0d8601253ee5887f2211a7c27e75439f9 +:0071d0290c68f452fc6b7cb697862e53366d6f +:0071e0a0b811fd170839d3cfec67a6851e8670 +:0071f0d7d602a8769824c3303deb339ec384ba +:007200e251bf6a36eab16085a4b3d51bc53495 +:0072107da6b6d47e094cb1ea580f9960516ce2 +:0072201cfe7179640fa27d20b9577ed2420919 +:00723063ecc52c991c6697328c23e780417e47 +:007240985323d49fcd6c7120f82dd383952c2a +:007250f967aa4a9d141b8e4975a6afceb108c9 +:0072609547ab1932f90c7a5f28d5999dc30ffe +:0072700c02bc9fbaccea594559f5199f4047c0 +:0072804688e4ec9f859b7e447d555e4e60944d +:0072904308140a20db882278f912b7a50722fa +:0072a0f5fdc322cefe1cd32db052876fd988b8 +:0072b0438d1e9eb6feefb2c23873cc34386bd8 +:0072c033d1adce5e222561215d651b906897b5 +:0072d0df51f479e78fafab2e4dc89f184a2d72 +:0072e0158bb45464708cc7f8c27ac8bdd8b2e4 +:0072f011d023e144af49565ad9be63c052ee00 +:007300a75f2f36299eba3d658ec35c99d42250 +:007310670fea06f1e78f143916dffcb7482769 +:0073205c527e9daa73b884e7ec22ed4892ceb8 +:0073306a7a2d1ba9035b84348534d00e083cdb +:00734039b8aa0b64b866dd7cde157f97ca182b +:0073505e40dd255e011335f4d37dd58be250d9 +:007360dee072a87e1ba5e85b0d7e10b352f4b9 +:007370f56278f081cca4384f416d0058b4187e +:007380c8bce04e5a03e3becac85ce1dac58e5b +:0073906f09c52c6dca7963aff1995b918f158f +:0073a0af1ac6f1ed4b890e49a1ea1eff141de7 +:0073b062ef45e48816bd9ff03093ba2306e494 +:0073c07e37dab9507d03b09ae125856a7825e8 +:0073d027b06c68707a84d2d726d77a826db350 +:0073e0481545fe6d2b6eb19b09331e97a0e9c7 +:0073f00acb8e11d1306490df632d73c6d0f144 +:007400ef98d3d6ebf117a710de44384256f6b1 +:0074106f14d4daf6e0b32e8b34c9f7c11c7542 +:007420f79b20116bacd5da5bda9fb31924e415 +:007430c03645d587187ceb98026f59f03c37f8 +:0074402809919e94a5e9ed556d40e34d06b53a +:007450163d3a632b1b83429df559d69d45f91c +:007460ea43e82afac3006d4182085beab314c8 +:007470b84c0cbb4198b333d096bc35bda6d39e +:0074809a8479a2dfce415bb734b3f83e29955e +:0074903f728f7c63fa82be555e9a2ea30c7f84 +:0074a0f12690f074b8d7255ef1087a5a607a33 +:0074b0cc3e210a6c02074be9a20e05c8bad9b0 +:0074c0735b23e57e203cb1094ce5c5a06542d0 +:0074d07b5e8560f6e38d029a4a46a649b044df +:0074e093e8d7f3d2d196a643ff37366bf0ba10 +:0074f03439912345015860835cbb85c7e82432 +:007500ca52fa87bf80140c757b5009d687eba0 +:007510e9963fff236871fc24b14ec3006bc8bd +:007520fcac3d658ed632ea763ca8971945def4 +:0075308aba09cd154fbaf8ee647db911678f93 +:0075404b06b83f3007fe10c8911a19aa997ff4 +:0075502249c031350a86e19914088705de339b +:007560e0279641bb75eb4e20e7e11768774584 +:007570dac3692e3f835cb5a9df5d5b6e452503 +:0075803dd7fc51848f115e53f5d83728bc9a68 +:00759040f11880037cc14f01a4c060fee5fcfd +:0075a0a1345a0d598409d22d95a577a8ae0c0b +:0075b042ec49317f8ae601ed35daed218f5b57 +:0075c02a00e086d6d55b1993778efc48e0a39b +:0075d0fa566574da12a093d98230615a75bae9 +:0075e01d34aa243e153724b2a8c9ccb470971d +:0075f09f0c953c3a51ff4fa48e29815f454364 +:007600c60b8d6e7a20182b384b6d3f47759521 +:007610365d088207b9f7fee3d8728200f9e3d6 +:007620f7a2d28d2d3176242eec5b6eb8c0febc +:0076309fa3cae15d1b2a62c8295372cf54e6ef +:007640a368350c5dfd659a675b63b9efc315c7 +:00765034f705e6e2b0d5b1eda16411a0db4721 +:00766071af963a5540c0468f520b400180fbd9 +:007670395b0851dd4485b5c780d99807e46661 +:0076800ad82900b07c149d7ad727b86d995e0b +:0076905d963d8fabb9557e23a10a5fdd210f28 +:0076a0106599dd7922d2256152f67707118177 +:0076b007b46067ce655d548d4f9f5545251dda +:0076c061ff085873c75916d3ca27b1414fa31d +:0076d08b5ba5443478e7d94481d2447ba5d7c9 +:0076e02835150611715913115be627c7bd7a6f +:0076f081b17f5a937502da232fd260c6839aae +:007700e5e4b9b9eadd1794a86f555efd14d478 +:0077101a7c91c3247db1265596517ec1b64e1e +:007720c0c84b824f185582862dd5171e8886a8 +:007730c210bd8ba4626c1e99f97c469af70818 +:00774093fb4aa4e92bfc4e4e9c1c1c4d5e1f02 +:007750e542838d9137f6773af7d9f2144e52ba +:007760927d94299b01d8bd7b4dc24235c2f766 +:007770bf13937f625c24c9033915351f58744c +:007780c069cbdf25c0eab20aedce9fc1475024 +:007790daed04e14efed15ee7a2b528a9a28419 +:0077a0f9bf92425dfc34993d8c8b9ae5dd54db +:0077b0a2b9285db61a488da9e8343a4783be3d +:0077c0436a78a4b199a03134c40d559443810c +:0077d0249c12c920f9f1ac483bc5f510d36597 +:0077e0315d242b53af32b174066d26c63cb3f5 +:0077f09cb0cd4053b38b474bfe86af8e1fa384 +:007800e8d5806b06f5648cf49c677bcb7a548d +:0078102fc908088db6f4bfa17d2b2d683676b0 +:0078206e526b553dbaaedd1924c823b131f4e8 +:007830920c8eb785b31b1939511d8cab8fe619 +:0078408d1fef0f092bb7485d0184532b939653 +:00785030a74065e2d50adb5982e77dbbc1d446 +:007860c8498394d0f1d0d1c453c0d291c4669b +:0078701b1292ce1c5f84b3019ff8879a633d76 +:007880d9a42687218de1d63599ca3eac146729 +:007890f841578d2ed75f31c23a32288bfe1ca5 +:0078a06f2eba32ae1e60cf6f3849d832b9fb13 +:0078b0a1238cc2debf5686b9248b90f101c7b0 +:0078c0ac79986a5794cb394d3d9f1409d6c71e +:0078d0abe047c66638025183156fa1f20b3036 +:0078e0e698021ec5554f8a990b948d5138edfa +:0078f07cc2bb07701511f786f9cef954b8cc4e +:007900d9364c5cefbc5a669d39063c7c2b5599 +:007910cb101d267cc92ab92f6bf3cb6869d314 +:0079209766099e62ebe362d60b6b76855d837f +:007930d49617be14f5bc3b53f2375ab560a467 +:00794044eb711ed05dae518ac1f2a3fd3ec4b7 +:007950a740fe3375b2cb4255d4988345f6c5b7 +:007960037a61c50951f01d677174f857c3984b +:0079700c5ff2774a246e73ead24f29949752ea +:0079804204623706926c53d638a20174114783 +:007990f19301f889bbe7dd47b6a2bafa09c66b +:0079a0a88f67ea3a8e0ad4de7a0cc199b4da6e +:0079b01495c5d4a63a72e637539eb21a1b0fa3 +:0079c03a19e59644cbfdab8149f6f93783d728 +:0079d05cadbb806d8796e38c001268ff230283 +:0079e0145a7b5c7edd941db2a5ed91c932599f +:0079f0b1866ada7c9bd02350b5eecb20c653e4 +:007a00efd847856f623d1fe4e6a4cc4584d2f1 +:007a106489dc4ab9c33bae74c1b418168fc00e +:007a208bcb3a39a54252ef8ccd3f276f643f80 +:007a3054dbc26dea9e286a4f9a30b4f5e740fd +:007a40665f134f5c75be75529e4cc34beb36b6 +:007a5013de2380f6b52cbcfc9ce8717e1c0696 +:007a602b4bf4e2d55a4de29d1baf69912917df +:007a70d1f10a2657ff0fffcf02598c595cb566 +:007a807f14792d7a5a0c043539ce059c5925d0 +:007a90a89d1bfe14c385ebcdfb91b73ff5bbe1 +:007aa094a684b9016daeea424d3694356b4b82 +:007ab074512656f6ad502b9c855000668b35f6 +:007ac01afffb45556f7ff95de7af69fcfb72d6 +:007ad033b727a0e655c224b1cd545e39fe050d +:007ae08a5afc7806c0417c226b46e9e0fb2d8b +:007af02714348781e6ed81dcffa57f8a9022a8 +:007b002fefbe0e1fc6adea1d2ecf25fecf4375 +:007b1092b37da69acfadfb638a315d0a70b4e2 +:007b2078c02d9321ea93e4e533e077d3e02502 +:007b30f39051986d49d00d080ae7045c478b95 +:007b4058fcf4a8ff93ea2471b9a56cd3b78c44 +:007b50bc6b587f6c08a43998bcc3797b25bca2 +:007b60b42e507f8e059170b837272b1133c26b +:007b708067111a177ca1fd4aa541ddd6669c16 +:007b805eecbfdbc65897cac08118ad5e4bd4a7 +:007b9027a479f0dbe1c6104f873d1fcadde867 +:007ba03a2a03402ab1468bdedb21819bb788e1 +:007bb075c3fad03bc19de745e57550cf1e0d2e +:007bc0fe7ec3f39afa471836b8a5a27759d01d +:007bd034ae61547ada3c61fc1948fd4c1a252f +:007be0554fe2c12092c1346bf5e8092b6ab793 +:007bf0fc096ceff7e8b4e3e9e936a432a7f647 +:007c00986d29bb93148df134e76f60f87eb449 +:007c109e0e033d366e5d35693a6640f7a39c7d +:007c20cd422e9e8d9375cfbdc7d45bb6ef1f5f +:007c30b9469c518bfc4c9b33c85a72fd421558 +:007c40746443d18e6d45f29cca605058fb183f +:007c50f2a1f1f3280aa341d388643459cdc544 +:007c609de6c475a704163c3c8d4c0ea18429ab +:007c70b34d9d69a6e53a92fbdb58674c4e4792 +:007c808ed7a30abaedc938078e31ffe614f954 +:007c909c345b3ab150ef6da5b457c9be9d5857 +:007ca0bbd8f6d96ee95eb36e8dd02833cba550 +:007cb0b0c38d35d83f3ea8da3c498f3498e798 +:007cc06ca1e4b74668c8dea3ec673b65f8a26d +:007cd02dd333da79f7b4f547e6f208998e3851 +:007ce0c06ff3ec40e6c7f028ee4daf00b04581 +:007cf090d011590e62386003ce1fd3131d5e56 +:007d00edef342f2f91366a6c9b9ba0e4475fcd +:007d108617b82c44e0d0449fd63c23f7842f05 +:007d20a9daa76b179bf198eb7bd27a2b40abfb +:007d30eefa7e0d557f9c60d96851fd91f55a5d +:007d40dc79601f1cc1328eb1b3c64ccbf9d592 +:007d5052b92d7d5ea43a2cda0f079a7b563ede +:007d6003fe59a531ca7fb6b9bf98c849422b78 +:007d708d8e1733dcb66e9f68b257a010ff97fe +:007d8046c6140f964a7f0aa604fffd071b759d +:007d90dd6053b1def4c1b446cb486c1293a148 +:007da0aa45710fe255ceed473fecb39926a592 +:007db0968b95118aee9fba6ac5fc281ac4e801 +:007dc0ae375119790b3f5e18075c2f261967a8 +:007dd03dc03ba71d0929b837c5e4cf69905939 +:007de01a3827a9e67ca492c94fde5513905ef3 +:007df049f84db3db76e62a67179260c585fa1f +:007e00437b1c263230b526cebd27a20f0e4bc1 +:007e10e4d9cca707b48dca7531708470e550c7 +:007e20abc351505d8566c0cfaf72e01c8417ce +:007e307a9ef666aea388be95667ab8c14e7ad4 +:007e40ca5f0a57fd8a2063d67068b5ba18971e +:007e50e59881430aecdc4f05c32fdefd72ba55 +:007e606b6c44b275263bb73161d7b19de799af +:007e70d3df5d38bd5d0c0c99fabd6ee78e9674 +:007e80176cd41b1032858f92a23d63ac71b79b +:007e90ea2894bd4b081da1f3952a5b3706d856 +:007ea04d749d25d8fb76a4288a1599db5f9d8f +:007eb074194d5463b4bed4e2e9b4a0310e2a4f +:007ec09c4c1ac84db00c19ecccf6752b3c9ef2 +:007ed04dcd7f30dfd4b4d1e075687d4774de2b +:007ee089c1526ad3bd99a784956b0ef4507421 +:007ef07509dac652bf8afebfd3fc6319e7e983 +:007f00f93847d74f5481ad28f1573961838d95 +:007f105a65d39b80207b29cc59f944e0c8870f +:007f2071fcdb3bed7a280e50896b42c6587705 +:007f3004554900101410cc018379c4fd563783 +:007f4053dac650c350e2ef7377f4b814653981 +:007f50685b25d1c632d8febd13750a4b2782b7 +:007f6034accbd8c66cdc7b2ae6dbecb31e68ce +:007f70c9739926b11ded0ca5321c70e0c4365e +:007f803f4afd642418e7673d773d69c89fe96e +:007f903b54c18743bf95cbe74644924189adc2 +:007fa0c7d4cffaf86c882de78c22fb84798906 +:007fb0b0028264bad43293ab8ddd18798f5e21 +:007fc0cb701c8edfc639d55b219243101a6e02 +:007fd0479153a08303072ffb14595a1aa06d26 +:007fe0a2dd22061ebe0384676b9d5c1f1bdca2 +:007ff0b8098b1cfccd9df1ca5f5b34fa02ff79 +:008000eb9b2575d0978290091f110509447d56 +:008010fe0c9d2490f5b9b51fbf80b808a5753a +:0080202045a302b4d31daa8ec58b61c7fc2f87 +:00803002f0eeec656320264f60c3ff320c2340 +:0080401794d352e1ae1ed3de655868971d1c13 +:008050f09638dc30e6a80d4bfdd1d90e81b6be +:0080607f42c2d6c5c215b8ee3f2e7a0434bf19 +:0080704498415a15a7ebaba2de25ad2178c2b1 +:0080809797382fab6ef7249f76d4d37ad21dd9 +:008090e9e7ecc82d6bf2dc486efd21cee921f4 +:0080a072f990a8ae557591a034653e113d351f +:0080b0d6c777e4a5d33e28d4cf98a23afd4cfd +:0080c06c57ae7f58dbd7cfc6c72e6b5b41d8af +:0080d04862bc0447f44b32ea982861143b4e95 +:0080e002ff765d229e3ba2cfe236e3e3f1eca7 +:0080f0f7e83acf857f2874db3d7f2a2447201a +:008100c3db77d65f238c5d14c9b76b25fafc1f +:0081107772e5bf3c8472b66688d45038ba72a8 +:00812025389a4ab93d01beabc7c108ff9c9878 +:008130fa7182bba201b826f73b06247ef41262 +:008140aea8b49ef7b3ff52c8585522686b7c2e +:008150975892e6c446623ce99eb18fff8d71d0 +:00816038f663e805b1dc25d164a663ce34398f +:0081707927f589d0ced47db211be46f60f3ec3 +:008180ea94e01a8614235eba15229135eb29b1 +:008190694f6c96a6508b221b56e9c9e4153ae7 +:0081a0dfa312dd0d0abfcee230fa8d78ed7c80 +:0081b02646ef3a9f02a497d3d85b29e7a75594 +:0081c0ab95f35e7cc405c8757b3e7da1ce749e +:0081d047ce3712bf36fd0649028c4715bc8dfe +:0081e05dc842d06889312a619022a726caa903 +:0081f00db7a715af9ed1fa7184e2ccc40d646c +:0082004141a4308fb81414c193cbcb27249398 +:0082104810782bac0707f0d696dd8a11494d2d +:008220d16b8277319c630453d1c77db8eca99f +:00823045726868edf0e4f2c6a7cd526c72308f +:0082408d2218dd83aa8dba4a5cb9ba1a185a85 +:0082505fd80c6a560510d411326512a9ce5aad +:008260b8176d3322b99a7706e170f2b85f64d5 +:008270d2a7b81569cadafb0832c7ffa0d578b9 +:0082807b8b5b007aaffdaf1bce02bb0830f201 +:0082901c51eecb0ac3dbd67a7dbe84d7069d82 +:0082a01690b8b3d5f76f5d8af1d58881bba05a +:0082b0b6873f872a644a7810e343f6a53f2ec1 +:0082c06d10b5fa07aaad666b2695b5dc5f9564 +:0082d0acbc186b4ea96e0f4da297b6816cdfa4 +:0082e0056bd3edc597ace5864acbf0095eff0f +:0082f0617e6ec5b93764f892846f8807ff9b6a +:008300facc3125cff216bc226973a0126c6a1c +:0083108a93f11d4d0f5a38a221c72ef5792da6 +:00832031860edf2b1407aa586039eff1fd3362 +:008330b42b949c63bd93afa25d8dd7f03ec168 +:00834071828886bfba2ca1437ef7f102045243 +:008350cebbeff4e6880e589fff0b077678f101 +:00836050f9e6e382a46813c3857393c435c8fa +:008370912454455b144ead69bd3227276da6a5 +:008380b936b6dc5f54a0b73e5469b666c62da3 +:008390aaf405fc5a2b446bdaf3e9929f26841f +:0083a080009c20aa3d5fd416a6d38b3b6c99f0 +:0083b09a822d9b9396f7ac60cece13de962694 +:0083c0bbac7fc6c47d3c5423113a13b40c4a4e +:0083d025b7a4a96aa9a9faf769c1155a2f85c1 +:0083e057e333c9e3cc01fd4d30ff1be0a424a3 +:0083f083d442a5bcdfaf78e1bf0c8f5ebe9d18 +:008400ee14a04a2ce37f2b5f178be833e0b072 +:00841044c783da54cf3dbc66658590c22a14ad +:008420a815cbaa301ff497da1d66b24705a166 +:0084306d4e10f9ce30124e188f82e1031afdcb +:0084401cf6d22416b52a2c3386d9677544385d +:008450503eda8ac92a059232a9f2803b924b8c +:008460b894e5267e989abda47e629f6d462944 +:00847048494b629ae626b0966a3078c15a389a +:0084802e56ae9e1f329c2d1a89a53310df7322 +:008490d40b618bae46d7f037f7b61018eb4d1b +:0084a04e198eab824d1fdc963bd390d6a2a9fb +:0084b08d7d759e50e2026c157ca5fd6b97841e +:0084c054d22ebdcc72784f7dde92e03a573ce2 +:0084d0ec8b40ccf4840c398c0f10999d9239bf +:0084e0e2602cf62f4c9b415ff9f8df7ec70559 +:0084f01e8d9720197ff1094cfc18fecea4fbef +:008500e7548c5e8e630a04722f7571971e07f6 +:008510dd34a3b075bfa606db60a5dcc98f58e2 +:008520f0449a404ef6d2ca69d1d614f0b2a465 +:008530e773401792fabb0a5d419d194e58bc81 +:008540d4d425565effc5a73881117cd2d9d447 +:008550458db7e541dceba2e4aa34e48b97f8cf +:0085601577b167d0f4b6639a8a44804b49efe6 +:008570e12ad718ab445277546ce3f26d0b55eb +:00858029e452dc63864f16a256ceca458dd5b2 +:00859003ce72189f823c4cb605dfdfde0d8e2c +:0085a050105b1be8e072d4153aaa0927f3619e +:0085b036dd6495ae14a97bc3692828e588688b +:0085c0150fdf46711f217b0fe6b3adabbecd64 +:0085d01a328befdb6c63c5d87d5d681ca891a0 +:0085e0755e6eadc7e20f33babc69467571cf27 +:0085f07da7c525b00651521f13ad48320af4b8 +:0086002572f48a96c0bea00e35d6e0e0911670 +:008610cb68a2f620181f4e6e0258a7e43c3a39 +:008620954582bc155caf70ba4e94612ce2f04a +:008630787eb93b0db6a6cc3c93fd72d0f79501 +:0086408dd2f4008dc56ccfbda2b8a8d11a3955 +:0086507da2f5c0be3f50e75eb372e28527e004 +:008660ea4e55370b6a3622981d8016216db953 +:0086708b4fa0cb61d284a3a95499874c7732f4 +:008680ecc76581915cade4486e853ecd194ca5 +:008690821c8a46215acda6d7473a30211c1460 +:0086a0425d211238e4a39567df7a47e51aeab0 +:0086b0de1a24eaca626e67f12b0531d3a85992 +:0086c03733cad8b85f4130db3c8ea004b473d2 +:0086d0a5c7c50fb567f2a024bdd07b9727f9e4 +:0086e08433cf04dd3c116056d97fe423ac43f3 +:0086f0d9bee4c690770caa52cd4a6a553ce821 +:008700eb30c865a103226db8e64c72c5f282d1 +:008710ceb2d94d36fbdd2fe514563394e4571e +:008720f41d80d21f483ea27057856e210b19bd +:008730ae2c7742ca7b95191b288d60e8512d8c +:008740cc1d72cfd2a62622965eb496fe5753b8 +:0087501d6d9ea81443b962ff30a2bd00e6c41c +:008760ec41e852b1f6c5247dddfd248f435da4 +:0087704efb3f708f9c4fb3f10c8927d5e5685b +:008780051d219368ea1c5bf0efd9f62483e294 +:008790587071061ca2a4bfc921a0afd71fda02 +:0087a04a055329f1097cb13ff62a0314a90d6f +:0087b0b9667e677005080492570c981210f06b +:0087c038fe1e390b9257a2244f55564b093106 +:0087d0ea42aa49410233f1a4ced536949fbb3a +:0087e0372d7e13a48ff67bc4d642465e85a544 +:0087f00c83708a579a8dd16d6e196d9bdab415 +:008800b0896a06cc6828cb877f945c36cd8a91 +:0088109258c9a26f26a60ee4fa9efa4947e93b +:0088201adb25cf3e921aea3d01f275d1de9e23 +:008830e779abd7709642e3b1f4935bf738f4aa +:00884097997d3ba7aedd8a135fcf439fec6016 +:0088507b2928a12df33a938aa171c7275bc8bd +:0088601e1181c0dcadb0d27d61484600333cee +:0088706ae7e895d739eb652b4ee372baa7ada2 +:008880c5e486aedcee8098ede373cb67ac8e35 +:008890f23d8ff3cb4861d9156b2d9ad93458e8 +:0088a0bfb041f3f3431146cabc75ab3a160db5 +:0088b0f0784cd3472f14ae0dea645f57feaf85 +:0088c0045ecd9f5ad4d1dc5379d3b15ad7ddcc +:0088d0d6056a97fdcf0dad154842207c189645 +:0088e074e50bef2f285505cb4d47a0e8b3f6ad +:0088f0e59e90074133f60efe2cf837e1c9cf63 +:008900a6f1e13deae945a22abaff57b441de79 +:008910ad6e14f00dd2b5588e35bf9f11c19d79 +:008920ed1dc4b12e5082ba956597862b0f4ed9 +:0089305ff5bf50a39b01837009cb69aff55908 +:00894004eba0e69c2c0caefd0be04b3697a522 +:008950e6d22ef48be4915c744f7497bc4bfe44 +:008960eca4490852872e149ef4f836095b5455 +:008970e905b533e5e5eb6eb71bce7bfcdd8287 +:0089806153aabc47b15bc7b1e33f2236cdfd89 +:0089904800a1f725502a161286d253c4881023 +:0089a0450e77b5ea33ccc6f1b5af308dbdaa42 +:0089b0eff70f871a8255b716f9b8accc5d60a1 +:0089c011cd293a27b47c2594860046f834d0d1 +:0089d0ea66e21eb04afdf1d73f3f8be2b029c2 +:0089e0d87c26de5b5d839c26a41623df69c2db +:0089f08dba299532279e4297a5c522f9a16e9f +:008a00c938df9ec329f719771a4200da0a9b2b +:008a108e5e1aef5d91b4ac5603e0631375c963 +:008a2031015260cc678a65c491a3448cc0d148 +:008a300b50414b393c25c6afcacf648f7d1b78 +:008a40894d3fbaf03243301344c17c63f40a31 +:008a500f343789fff725df4780387f64a89882 +:008a608b5af076cbc7cfd24733e0e162abaf0c +:008a704566888785dc185b09e87bc95ce7e1cf +:008a80c982a7f9ea97ad8396fa97339a2e97ad +:008a90e534afe85353ac96d0c38164e0d68e04 +:008aa0557a98fc44f22c92ea25fae62ebe48b8 +:008ab038ceb35a1614820469bf5aa02b23dbf2 +:008ac0213de46632117ee59a6ca1ce43b4fbac +:008ad020841956231dcdc93a20be7349b2a9a3 +:008ae08b3f01be7bf0620f4331fd8ab612e1d3 +:008af03fc0c69812bad02183b751714c50a551 +:008b008b5391c79c13d23be1de7fc8067a2629 +:008b10e507534fd76a21a1dfd98842c9eeaf2b +:008b205b6e3033ae46e2fa2104ad96836f210a +:008b30fda26b4893555840a93c1d9f942064c8 +:008b401049206a02191dd1c5f8bb398b830272 +:008b50fd1c2db94ecfb85681a0935401eb902e +:008b60024ff5bb9039e76f7d9cba7f3956417a +:008b70071d8cba9598292d82b3b3cdfdb02f81 +:008b80b05d189c57fbd03a720dd3b2765105a8 +:008b90fb81e54d7d4d288171724b1607ccc1f4 +:008ba01671cc447e1506f7f27569f622d8b74c +:008bb0f0b96e7351956e29afccf22a53ab5165 +:008bc01c241a95f81177de7e5fc2345ce0068e +:008bd06ddb7c5a732e9175af586a175524182e +:008be01030229538cb8951615454154f7cdc34 +:008bf0105c1edf90f112d6c277152ae3d3643f +:008c00d31e9cac02ec08ca1155cba354f39f63 +:008c1051d48e1be9c5c9f2101464194cad04ba +:008c20a0dda198bea70f6d69890b7727995ff6 +:008c30a8662a5e83eff8fbb1ecb3ac9331950d +:008c40a1461274710a7677014af75298fe5b45 +:008c503a015fc7dbd2baf98509a87e157b7ad1 +:008c605d3b7db4aa5cb270b2bff9c2a84c2f31 +:008c706654dc8bab06c13472e117c25a5ed9a9 +:008c807fba2568e57085242cfaf7206fd9653b +:008c9079a78ee23e2983b2f615d8470fb44346 +:008ca0c8e878485ed566e263c82f51e3291b81 +:008cb027d1fb62aeddeb452f885bd53019d870 +:008cc0cc80a8664ec14e39a4e332a43a064073 +:008cd0faf8de88c4c42276f445b0b89fc9432e +:008ce0b2f5d6ced5843abc118cc40c0ab127ab +:008cf0aca0e6f14ecdc2980a3a3f747d2723bc +:008d00aeece7c71e54e0ca8c77be04e4ce33e9 +:008d10cb3aac85b183d29ce6294a9f2f188175 +:008d2071aec143380cc8cb11f3646f66a7e9f5 +:008d30eb8b09f69c7f4d31813c88e76effa4aa +:008d4072626fe75aef9883a6c6004676d1ded4 +:008d509ae6df6124d3046df91faef895401557 +:008d60141aaa5859d353faa13a8f40d2f0285b +:008d70d9235a25243fe190995d9fc0ee8ca14d +:008d801202a949486541699e11e3fde3202c1c +:008d9048f2939ca1e38092449f134eed399172 +:008da0a210ec41dde5b8b99f3be1a2b82daed7 +:008db076640b704575e9a026f2ab66898e530e +:008dc0ec1d14d9f241dd480d82fa9c931bb281 +:008dd039f8b260f9425f837b73512149fe64a1 +:008de088c87fde5be118c0f42e90522deaf2d4 +:008df0087a6c4bfaab83b1add113ccbc0c59ee +:008e00d22ea343039964d6aabfea94d88a5c99 +:008e10b2010840d1a574bcdb091272838529dd +:008e2084aba010f8ba35e41daec42ac60f0222 +:008e30e94cf8dd527ba1ae778099041f9f9f7e +:008e40ac83e3b9a8dd4f43f30f256cf7d1edce +:008e50e47753f800fe2330c5d4dc5fbcfea518 +:008e60266ddfd30362c2b7ca050d21adfad8c4 +:008e70b7e970c19330888c12ca16afb8b9d070 +:008e80b059efeb429f223f8156a87eb23a1ca7 +:008e90cdd31eea46e21b551a0d9d2d6d8f5753 +:008ea066a7f5225855b9ac18102945d143340d +:008eb031b6d05e451b1123a896fd854d7b70a4 +:008ec087ee42a38c5e347bf56e7db42be7adc9 +:008ed065813c030a3127b2dd6b498e823ffb96 +:008ee09d5874b661f92bfe0941b6172e10fb54 +:008ef0b16f8ba06c4d611e50658762e41f51b6 +:008f00a818f9ce404a73f0f0e921f4d339e094 +:008f10d0eb43ce42b91a316659b4fac1fc30a6 +:008f2060aa8664e4b53009e304d70250a4b28d +:008f30182c669e14f2062065af355b397f8603 +:008f40bf8f6bdd7de7a63489a03d4afb87f6ee +:008f500a7a1f437c089551bd1ccd240338bead +:008f60e43cae66d81c4632beb8c67a6d0aae2e +:008f704d5be2af6f96c1297b73a236ddbad092 +:008f80891041076fad7afe2708d48e8ef89a42 +:008f90dc374bf6a08c005241442556786d129e +:008fa080fee917dea81e7ea88f2fd9575d7f04 +:008fb0f36d2761576b955c3a3bc261ad3550b6 +:008fc001e8c936f455e278691e2e9dd49462b9 +:008fd06fe0b2e09beec7348ad6d4cb4ae65220 +:008fe0c4ae9796b3c0aee10d365119e5c9a0cf +:008ff06d6f234effee32d9ea340e88e0961f16 +:009000fb70c408c58524d4db5b3ddf50442fe8 +:009010b3f551cae530c1db79215d239c298de2 +:00902045d94ec00c33e50cfff7adf72dd493ca +:009030f300ff326e6fa0642fa0a12b0b90677a +:009040c055dc3cb35019a9a078112fdaa0f495 +:0090501ecf3eedf14b5a5618585e6cc8c0b103 +:009060561c905886a4bb17890c47d53e62f0ba +:00907068974bc65bf69a7e3948ec68a55ff51a +:0090805597bbe6e7286df766a6116c2e51e535 +:009090cdfb0355f80da5aa10c9ce636cb945a7 +:0090a0738bbdc8b7920405344d74b97f808380 +:0090b022d60d0d0d6cdaacff89f754d80cf2ee +:0090c01b0d61c7aa57bd7baaf5f682d87025fd +:0090d02d9da441df187dc98679d00b52e771ec +:0090e02de2ac59f5d549fde36f6dfd65054be3 +:0090f021db7530a22ddfdea2e77637f25e2db7 +:009100a6d8f2834cf90e4230e162dfc15077af +:0091105635a20ee18b2bd8c9dd2641b17d0e8b +:009120d841189833d92b2ce9b4ee64d76153c6 +:0091304b70a979beff9fd58bc44a6b632ad17f +:009140d0194cf1abf77aace3633d4fa3b38173 +:009150b1b7a3d650fa4eda8d2cedb2954db2ce +:009160658ed95bb0c5677ce3f11348a90269b6 +:009170722bad7158e1960757191847c56b0990 +:0091801468c0018e51eb32acc2fd345db49ff5 +:009190e64c894fc0777c7a50630a4c38d3af84 +:0091a0ee783786b0a1edbe1a862e178011e9b6 +:0091b068bdc73b08474e8fe8bc530285b8fd96 +:0091c085eefd40d43fe93fa440de5ab10f6e6c +:0091d0674ad29aca2bdac790c1b96af4e1260a +:0091e01a0bc0a57f9cbbc081b3a700cd0a6faf +:0091f0efd9966293dd153db3d77bbc70005c5a +:00920023059bdcfbbc3f879afb0409c5a7adbf +:0092104b2009a14c64bf265b61e1354fbe2985 +:009220700cf4f76e69e9772b685d55428a3797 +:00923012285d231fd7b002803362e202b36ec3 +:00924019f81cad0c95ab23915a65b15795eab2 +:009250359c4aa097887d5166d80a1baa0f4ae8 +:00926088fdbe9ad0b9fd5271bc8e012e7a6722 +:009270a1e911dff5c5e04fe92fa0db378628c1 +:00928038866d46a5a627eb660bfaa499acc496 +:009290dee21b83c318947a4841c7b5af56c11f +:0092a0433ea077875593f1c972065e0cd6bca6 +:0092b0fd0007fa2365f424c7aa290d8219cc1f +:0092c076c22d02a3fcced014fe78c8d195475b +:0092d0c82d9658224747ee5e00e307817987e9 +:0092e035845b7b0657afe533b54614f35727dc +:0092f0a6c6cd15f3f671ed5202212a3c2600e3 +:0093007482685d0659204decb788db0e2f5dfa +:00931040dae454bfca327f197751732ffa9239 +:009320a05c89ac8a2c1a43a59f5fefb4ee7047 +:009330ef83ac2bc17bc7e63409366f2b957ec0 +:0093406b397db5a41d6abbc7a349b746b60e39 +:009350bab1940da80469a6679a4f1416fdd93d +:009360f74b1b89366379cd73f26cece699ccae +:009370b3d43137cc1bc4f11552b578d73a4521 +:009380c7141788ebf13b08b64b513f2484060c +:00939039f4db4eef094bba1b09c3308b5e2b51 +:0093a0993d467322052bbbf31ff74d03b835a7 +:0093b0eff075723610912bc39c8b07336e4ade +:0093c000767ca0b8a059fd14209eec93e917d6 +:0093d08c416df1238aec173ff60bcf73a3179a +:0093e02c85892f53e8bab233e6adf9c3cc2958 +:0093f030fa5c02b07d9c4ab16bcc4c13688577 +:00940030069400159417c3556719c914ec3f48 +:00941096ec886dff01997bbda4ece0d2b37a38 +:0094206ab62dbf2d65698f5b2d78bf5bc2160e +:00943098469348b81de992ef3ca5fc49115dad +:009440b57f6e827dba76431eb022b4b12c7d30 +:00945080d9e869c87a9ba2a0f72c8b28fbef0a +:009460d4d3a7dbdb519633302941ecdd09749c +:0094701a66fdd2ac10affbf7a5665fd45b7809 +:009480ba801600fe308733e12bccc089aa4302 +:009490b2016dd13f4a3ce4eacc67a7460d568b +:0094a04683f4721b60e37fb97b137a1ed78d32 +:0094b0fbc5c2cf412cf87ea4fead9e791273b3 +:0094c083d882a4993f5a6ab2f0b9157cae86e8 +:0094d087de141b625d7d92d53cca3c5c00fc9e +:0094e02dc92e9d03a82597a076a4fc0166afcd +:0094f04b050b2ca0418b6e5f23cd6219cb6a05 +:0095004d575b132ee8cd3ed77563f793208fd8 +:009510864c53a3ad1e0c19791e6930d45ff869 +:0095205cf443b7499db3df4c66fa1b93d3c1cf +:00953059cbd1cc2e7a00fdf8c1373b834de3de +:00954046b2f06f590d081d881f9e0afd731c36 +:0095503852ac32c3b402b9235b7c8b47b74b7c +:00956024a466ad1feb068cdc5059958b09b959 +:009570d31b35d735db9253968f6b829f58ff61 +:00958082b904ee1b2a895587189c0fc7a227d5 +:0095909b5e978efbb6d909b863022fe52dd76a +:0095a0617f61c1220636091fc859d2ded4fbcc +:0095b095c5728f796a1cd69105d59bf9f28013 +:0095c0872ed07e2474cf2e8ef5afe8f823f1c7 +:0095d07caef613c12f5b059c0fead4566beb70 +:0095e054d78baae64bf8098c4bbbf552fd450e +:0095f0c087378b4ad9c055320c2c65a7acd195 +:009600f5470d7605b2c3183ffa08874ee1eedd +:0096102028cce804e262917b4c553345ab4609 +:0096204ea45592ee79a4d3539c3724104f8986 +:00963020c077d323fa45c3292d29194ddbd502 +:0096403009035291491d6c2227045d8ef3f67a +:0096506dae6bc4275d798df356aece837f4647 +:0096606e8ba73d3e5ae04d68650092762631c1 +:0096702b1b4ea5d4111175c10f243249e97f6a +:0096807217d706b695ef3d53877bd70d450620 +:009690cf27b39b32017c39d3d9245d8f1fd14b +:0096a0116eabe5c09a30c9190c08d25051149e +:0096b0cf51c9eee119f7ff0ba71fd5a0b2285f +:0096c069d063408c5f112415918086a0116d84 +:0096d071e143b706ce20e601f8107f1032c3cc +:0096e081ab501df07acb4fc7110b83c3f019cc +:0096f08961ff9e7e41aec894f2f84346f2d24f +:009700bb46981766e3afec9cfd100f4d57631d +:009710c4b25d05a878da045216f7b4bede6078 +:009720e42f71b09e8e257795af5e8b449af558 +:009730633725ddba7f2e9f4dc54d86378c84aa +:009740b9ee3a63fc874ef7a324a3a150b3c40a +:0097509b02224b48d4a19b8cab4863fc67f26c +:0097603df517707d64532ac003788de95086ce +:009770269378786ce7dd85000eb381eddeb4f1 +:009780c7f69b7514be5427b13cd00b57da6e53 +:009790aaa5811736354d3e0be1a6da7c62de16 +:0097a0038233d1f0d1f128b1be45b621c4b546 +:0097b025bd716a0ac4cfd88bdb067011ec8518 +:0097c05aaaa7e0da9e089fed00da963b54e23b +:0097d088c96302dd14edbb48ab608386ece928 +:0097e049770ef256ffdcb6f1339cef03cf978e +:0097f07fdd8c146d773988384b54a04831e39f +:009800bfe7e0139eb27764a627e126901431cf +:009810385f094701639f0ffb03a03cb377ecaa +:009820547e62f62e1bd376c0754b0e133f50ca +:0098304966ee446886e886f4139b71eb89c36f +:0098406106ee647107ba0179e0fc11d3e66f90 +:009850a63adbf37c1ee6dcce79d37b1d528672 +:009860a714828eb5f3eb224224661c559f1ee7 +:0098706de191b49a2ab72cded3f6babbff5096 +:009880f7351b64c8f33965574163af4316259e +:009890b43efaab7b59b38063777939036d589b +:0098a0b2ee17f963861ba624b7253576751159 +:0098b0383d008811d5e6045aac7c842bc6eca2 +:0098c050949bd0139e65ca712412f655822e52 +:0098d08c09eb1e6abf27ff1b210e6c9868076e +:0098e0b9760d39f0cf7e38054b989c1b8893dd +:0098f0ea724a73c14a8736182212b51cdf7a07 +:009900971b19f84ce9fad33d4f8290aaeaa3f4 +:009910987647349ab3f0daae9e35de3672831d +:009920bf183c56af6f8d1b77beb0ff9ef75212 +:0099306f82edb28052fd393b1f6daac3964020 +:009940c6dd7d01bc4c384f4cf0547df1663bfe +:009950f9580bfbdc1be0592a5d31b36b2812a1 +:009960806d7af5175758f15060c71043b61148 +:009970d8d11d22c2a602250cc905f969c43d8c +:009980f8c9c6e2b59338074367b7cda64db57a +:009990e5db020f7905753e8fbe9ca4f54a3add +:0099a034139387c3304c5b8e2ca76a1fb1d7f5 +:0099b0627ff561438a6fd91b36114bcf5f6db1 +:0099c031a27c32a9e6ed5b98bc6060b9c7af7b +:0099d03cb8eb31f3d8e1a2ee23b8505d536a3d +:0099e01907f74b6933f0452232db84197ea5f9 +:0099f0ad0a67eff7cc749a0e616867f5dca478 +:009a0057af64ff2b3ec0f292fc66caee74eb20 +:009a10f39884d2f758422974aa597c1f611721 +:009a2062b089b556a0425254d765c4c4523e14 +:009a30621a6ab3f853642aa3a850ac924629bc +:009a40b91e49be5f2ddc9863076ad420bf4a90 +:009a50e1e5e93ccfd96d0657fbab21e99d6f31 +:009a608e42f048cdd597c25246e5149c90741b +:009a706ab9e894cef822cd4c5c26485d31ad20 +:009a80f482cc77ad7bc7d89f347b243e2f855d +:009a9079d1b770aed73a325da69e4195fcc363 +:009aa04a022b20459873ed5eead87f09cf3f0d +:009ab03525a1aa1206e4e97411ad25530f5c54 +:009ac09d1ffc6fc253970bccf5bc47b86bc175 +:009ad019e54049572b3f0dc91be295e551e422 +:009ae0316258a99e1d44a9d931ecfaa7bc418c +:009af06dace5319dd08a953686da7fbb0f7bb5 +:009b00ba4b75f25ccaf0bc127abac6ee31dbe1 +:009b10eaeaa4ffe9a8baa77aa0106ea2375857 +:009b20f4616542dc2b6ff654f820d1fcd1893c +:009b30bf840d8112e83608b432e384c1b9937d +:009b40e9b09f77c3dd7ac6baafb265d6a8d7c3 +:009b50ad367d60812618ace5d62772157a0d45 +:009b60c2c2ffd386fe3dcb9e3b3d4e60ec547a +:009b7070edbe22a232e0181b0804439a310ae0 +:009b80efc1e13e767e0e839c7a6929eb1cb7ba +:009b90be7deaa03a50e8144a3927e68d8059c3 +:009ba0e2b67adcec77b43b8b7564ddcaba9245 +:009bb0dd9387265723cd3e4e450ddf3e8b56c5 +:009bc020fd6227e41409a210eb1acbbfbeb1ee +:009bd02acdb598f1a46032797cbfc942bf54c6 +:009be03c844777d21e9242ab72bd9d7da418dd +:009bf077428b6abf17bb1b92cf6d4b6587ee8a +:009c00aec0581dbd7741df36b5fb5c1d8a92e2 +:009c10b9df16f950c9307d3818f78922975600 +:009c206008b2879b9815c44116c69b3ffb5990 +:009c30291e6821be33617e1af95fc5d23937cc +:009c407bdf02d941847e8e497a5bc662fab14f +:009c50eebc2291574fc852a6b2f555496516a4 +:009c609e8d4dd1600c05666158535eba747c58 +:009c70767d1f6425f3153473f43e166ff1b7c1 +:009c8078d5b0895e684a839807ffa96d298fa1 +:009c90f4f6aecdf49bf48629837bfdd43da99c +:009ca0f1e6a61113991af674b6a89e4156ec61 +:009cb07af7c1deab5e1b00fc213c0a8b93fdcb +:009cc06183fe262dd0ab67bab367da94c1c719 +:009cd04315bbb9039971ac7e9cdc65fade6f0e +:009ce0b3db401e8b7ac234d99ae5979930bb6f +:009cf0fa06d9f24746f959277028cc6788c0cf +:009d00295b4b7bd3d1077f11d193fa36e5ebe8 +:009d10c3a1ba2c8aebdfa42d16227c068c7724 +:009d2009982db4deb989a11fad96f6353e67e1 +:009d30827cd98b69fdfe3318c7aee2330c70d2 +:009d40c40257245fcc36a8be0130191b40eb93 +:009d50d731529b3c799bdde4a1f12e7ea26620 +:009d605d009d96b14c307a7a15d85d02ea737a +:009d70441e06812649f43097e25ba66810d972 +:009d807a48070c0037a79803c021a0da5b5d50 +:009d9027e501e4c5ea6770a512ca8165a38e9e +:009da07c1737c7b120d7daffc3db97567f9248 +:009db070530ac5006f4b0eaad3b94ced64620e +:009dc04742fb5dad69d3af92c34c0a21951c78 +:009dd0dc5e66b0b9b665b648520a370d98d7a2 +:009de08b29a1234f3a8f9e235b2c85c657430c +:009df0f49de2409c6dbcc04edc3ab210efe2c1 +:009e00c790a4be1010a2bf19b46370072d9e8c +:009e100397d76f26f14bef31259e933ec0c29a +:009e20fb607b7fe27651dedba8b6e83fd333f0 +:009e30d79a4c1fc38a9b6747b96e043c8910cf +:009e40e2311897e6112b7443de83adf32393aa +:009e5004565306d7ad78e08f45cf465dd61de8 +:009e600113314b1092b6d6a9405c72162f1f36 +:009e7062fe87f1d214a5e0b197902cca95e7d0 +:009e8082f7651dd596f705716777d08094bc8b +:009e900fd81fb453b15e511dd5f29a8c38486a +:009ea0f6075edddad6577ef9a894b19a7bc1c3 +:009eb084569c4dab395796a1aef67c8e629f61 +:009ec0473d7d744ad8630008ffc7bec6f312d1 +:009ed000b780dff1f80ebfe1881ea76f8d24c2 +:009ee079f891e9791a898f570a08f30121a27c +:009ef04d2a8bb05cf4730ca0ae81a495ade0bc +:009f0052baa2ca4767b9950d42fb45c3d1f830 +:009f1060bac972586f5e3c0b58e3e0b050d9db +:009f20b7b209b5f540ae65dac6d0d6738d3e8d +:009f3036276e9de471228fe0daa6b6e78ee7d3 +:009f407193ae396ee6dc66c0a4bc19d05a395e +:009f50975a651d45c5bfb1ae9f01562a6845a8 +:009f60db9b73aa5d32a8a6260f0eda9b752899 +:009f70879e94d1d8c3f5441b0ecf4b7448c85b +:009f80010656f67b0ae722a7c38232d88de21c +:009f902659c19b04151a2b36439da7aeb037cf +:009fa0102be118c24e168e0b39393a75e78da5 +:009fb0910742023b49913835b7e0aef95de71d +:009fc0122c9421c5eff98b2b3e099bb1953388 +:009fd022d362cad9b891458a8fdd413b0c86c7 +:009fe0ef08c104311b0c19fb8297cbbd3bee7d +:009ff031912a201c33e5450b03d504bee01992 +:00a00003b743c3f15f29f492265baedbe08f35 +:00a0102c318c2e27faf54e7bd821e4104a6d73 +:00a02085d854fc484ecdd7ffbba3fb8f43e73f +:00a030cd5fcb62b51fa32e66789befbb84fcf6 +:00a040aaf6815a2ad8b82ecea30f04f2932cc6 +:00a050b9422c27c089807fb4c97b02ba4568a5 +:00a060ac1a575f2e1083fb633ecbe37aaf42e4 +:00a070bf0ca36608663fda9531475c37b072ad +:00a08077a3cc16975e390f42c99874f7326e08 +:00a090b0b6a71f9e8cc812cb752e4de9ce3044 +:00a0a0e64c25e1cd6e52f310e11b0ae08db952 +:00a0b0c9c55752f4b99d4de9f05d71e232c757 +:00a0c093ca7d4e177860d37e9c6a6e21861c07 +:00a0d065ab46f2c2993a053041cf53dba76bf7 +:00a0e05641a581a8e2493275b54632064f1ba3 +:00a0f031d1111a7bc180b24f8642a6405e070c +:00a100b91c3609f01df8a480d6eaf9f604b496 +:00a110b884f1d58745b9e673036ec99d714503 +:00a12071cca7d28d09d61a648bc38e29bcbdee +:00a1301545e229460804429d2e6f0107bdc319 +:00a140a341731d1ffd43e09df87a41a4a33050 +:00a1500ff5294814fb2784946b731d42dc8046 +:00a1606f9cb93e74d8eb08dcd209fef051395a +:00a1705cd3b44293cccb1982b4c1d3e3a84955 +:00a180282e02ec25d0bc76e562ab0d4e7a5670 +:00a19053df5b7c5aa89bacaffc9e29b3ea3361 +:00a1a00b89abdf5b60587a51cdcd9b5dacf57a +:00a1b0e442ecfb93bcb9c9e788d37c94064805 +:00a1c0fd5d651189a7df782979a230770b9db6 +:00a1d0454e44c04f4c528b3ef9b3c5951bc12f +:00a1e00421903f14495eac35e7d3660d060c24 +:00a1f070830eb4512cb97ee6181709a1ca865b +:00a200b1633703364d12db77594ba4ca2c6641 +:00a210875df02a00c373fb08d5eb7e09090583 +:00a220c26c50f0eccf6ceb83f92d8dd468f88b +:00a230402488e166ccacb36f8e0d4bf923c0d0 +:00a240b71534dae0f4ae67fd58f75e7ea7a889 +:00a250790d85a1065406bd3609c495cc90e854 +:00a2601bf58f7477d21bf5813be26bed6a8503 +:00a2701e87af0853bc204d85cb63dd6fe5305d +:00a280648d6e75bfe15dde7ae22a705e67c3c5 +:00a290a161be213282aa61cad14d8219925b66 +:00a2a0e1db9e8d83143aab3a0c0a37ef2b1c14 +:00a2b0e4b00b378c266624e0096c9020efeaf8 +:00a2c08d6b66297b7840b735972fe1c78b0648 +:00a2d06f5684459aceefce670a2017faf62e66 +:00a2e0396eed3a0dd0e9fa43576792dceeec32 +:00a2f01cb8f5c1f6c45789cde4ccf1bc89e353 +:00a300296a856e20afbb2512dbc0da41e832de +:00a310eab1f0491797fb6062f4bfa661e40730 +:00a32046318c32b00ff33127dae1602a36df34 +:00a330cfeb8ad287d2bfd5cf53cf89fa1b5bae +:00a3408bdce404cd2abfa8246fd0fa6e7995b7 +:00a350e0c8a62ce4b724cc75f2642f51e5b696 +:00a3606eed1a15a707c47d90462e1fb9b195c9 +:00a3700fd19a734ebdeb7e822e4274f6a17518 +:00a380ce5b79ee7243d801ebf9cfc8a6f1c401 +:00a39062907ee1e10d5420be18a3699a2d9720 +:00a3a0f2443f5579e5f3e4a762f9cbf3787eea +:00a3b007e3814123adc75333e91da5de307d02 +:00a3c08a2adb22eccd4fd443e839522da98d9c +:00a3d0597dc5a6386e7458fafd32da178c177f +:00a3e08d75f5856c483ed6d263b72c467bb797 +:00a3f046a9c22582adea51deee3449f7b53ca9 +:00a400d490e81b8ee602cff5a2ddf807ce93df +:00a410feadfa4432c8442126b3bde884601359 +:00a420d1a07068c2dd54381d0e2939994732e9 +:00a430956e65d9aafdf4131a770cc20917ef36 +:00a440111ddf39d612e82007aadc8099e1776c +:00a450a6bd4d0bcd8767a0976e06a48b66c215 +:00a46016e8501e6bcc69ea02aa0c82e0e50efd +:00a47061f95175ee6310b0052cd3ff014de8d6 +:00a4809b090b94a3a811a7fa84a11ba9bb8d75 +:00a490cc6ce1772f0e9d75428a417ee0e40376 +:00a4a01125e83083e956ef3025241585bf817f +:00a4b0988519dd6072b079b398ae6ed15e30e2 +:00a4c04ab1ee6465b57bde73144e9f8853c4ff +:00a4d0bc0d28747737acf6dc921f139d0dfee8 +:00a4e09ab87360dc4181a565ab79c645c52dc3 +:00a4f0874b0f0d582e1ec427fe96ba527addde +:00a50096636689b2cb20ae5acc1fe9b2d029ac +:00a510fca8f7a9b9b775a58fed44e23787ac3f +:00a520c2ef332b2f38a5d32bf81af6fc2f2605 +:00a5301f6decdfc0bb945aca8e10ca9b1fde35 +:00a54099e3bbf92daa201a08d91cbeccf5e4a0 +:00a550b238926036cbe337c24cdfc983497940 +:00a5607e5b958a6d0cfcee5a60a64fb3cdb65f +:00a5704158ec490e0b53150dc06bc800032831 +:00a5800cce2dce9ddb4fd5d8bda8a17a5de18f +:00a5903078a87e8a89a2dd8b3f03674aa2ff10 +:00a5a095b0a88d58154354dc288c4c1bce8758 +:00a5b04ad0e627a94df6a791bd19cd23daa202 +:00a5c081b27af0d08846edcfed4635212b068e +:00a5d0a6ddc429ed9b2c3c890313289206c09c +:00a5e02b0d690ae160abb0f2449855957b2d50 +:00a5f0887749965a33f1a314563a4fafaa928e +:00a600fddcf6eb2733e15623847908eb3a1cbb +:00a610feb2b64e51299d0ccb56b135c9d8a0f9 +:00a6208b9eded0a6f95186d5c8be3670f6cade +:00a630184d1527c09913303ae88be6a52b8e0f +:00a6400a3011641396114d7188f16377d8ce16 +:00a6501c1009b1f36712c67650cdf5ebc318c5 +:00a66017594e1c52b3675a3b8eb70527b4b662 +:00a670e71b54624c437ceb2a2e36bf42257070 +:00a680358378f089a65c250f5621ef3f1e960a +:00a690b38221a3d0c43287a5627aba4a56af03 +:00a6a0fc916ba1af64d3e93ef75ab5ae384ea4 +:00a6b0244c2a8e4f1bdd61a7a1390be0efb0c5 +:00a6c0d31b62598b14bec13e817cfd063c7587 +:00a6d018d782ab2de04119bc0c51720f95f0fe +:00a6e0b982987120f999193ffd04ebcb63de00 +:00a6f01c7e63bc19a2621e54e7192015ad184b +:00a700e903a22b3c11b46c8adbb61244a26c82 +:00a71074de7fd85318e87db395bde341c5dde2 +:00a720639e04eb9aebf4f71013185523804348 +:00a730c5390d672c733a15109d6567f6ef90c7 +:00a74060a5046998abf980a1b62bfae76e6c8a +:00a75012ee0b2730085bccee4a1bfe19a86afc +:00a7604df4ede74c48f85f2c2975a65a9b637d +:00a770c013445d082e279fb269178a0b50080c +:00a7808f0c3900f1adbd303f0f150bcda2f925 +:00a790463b253047c9320ded107af4e620d3bf +:00a7a0a16d474e31ff03e9972d017e360a9ef8 +:00a7b038e1b5242c6eb9eb504d79231f4999c2 +:00a7c03c6665bd916990d932396d3c0503f47b +:00a7d084dbcbbb2fdc35a5e4279a55c4a1c96e +:00a7e0fb893a8fdfecd5ccbfe6f10a3dff51f4 +:00a7f0ca63c928e899881b56c48095cfd7fc54 +:00a800ed2e851e4a289236ddf319f0a2da8c26 +:00a81079861c75061d1d97d7482c4cec28dba5 +:00a8208d612c34916f60cdfc9aa04e18a18b2f +:00a8303d5866c0bbf7da5110259cd884872723 +:00a840e18d975c7ba86abfc1287e1a9c66e600 +:00a8505c2833e3261d0e6e1cb0f29ff62c6f90 +:00a8608edfd962b701b15a129fb740f307c037 +:00a870d9c9f005ee32a7930af510e14ff54850 +:00a8806e3bc83d586464dd4bf2b50172973d07 +:00a89004f9b5d8c2a4160d7bb3e9907fe67717 +:00a8a0c0f70efa252bee1aad8868e4b52be7a7 +:00a8b06644e4b6141fa82aa6837743075efdcc +:00a8c054c1df409d534d316db3d3c68ae67340 +:00a8d0033074b65d36e9abc413956e7c628d32 +:00a8e0f8162668e6bddf3bb1252ac802ce29c5 +:00a8f0781e6e5274e87ed88e4ebe68cfc0b54d +:00a900eb675c1bab97b9392b6c85844d92ace8 +:00a910bb1079010782205c8c07c653efc142f5 +:00a9205aa686fea384b0f555447d3afac8586d +:00a930fd1c561222ba1e30e08e7d81b1e3806a +:00a9407ee7b55ae70813cb7d505a4e51b86f05 +:00a950ceae08f6a4b83e503fea28e16af123c2 +:00a960a41afdf970dbf4316758d40e2f687546 +:00a9706233709b9cb1c34f5e5801b1d4b3ac7f +:00a98074674074ced98c868f9194f8623b2b53 +:00a9909dffde918496af7ea2194660f3599dc6 +:00a9a0cfa7ae8ddce6b626e4d766efc97da9a5 +:00a9b029c4e7cb52ad7ea6d47b9531af95009c +:00a9c04fc522b4b7c42e87b2a99f54044744fc +:00a9d0243ff5a5ee31ac4c69db98ca7a88fe2f +:00a9e02fcc432830a828ab60df4a5dd4be8386 +:00a9f08828700abff80adc92a8907a0da3f5d7 +:00aa00b8ca0890fc64ed0d6060375b27e153cd +:00aa109892519bd079accc8cc04f0c8774953b +:00aa20c9c89cf5594c565e6c8a70f205653fdb +:00aa30ce20a5c7bc1bba58f88daae21465daa7 +:00aa40ecd5fb7a38bb75616bf83166b78246f2 +:00aa500453068494a9f784b1f310bebce7085d +:00aa6066245c160f404086954747973f5f45cc +:00aa7040eec6067f0565b694505932eded517f +:00aa80ccc979e76a9804a8f013137c3886ab4a +:00aa903521e6d7a18778bb80691eaa25436d31 +:00aaa0a4f6f7bc694a0028711f2bcf42fc45fb +:00aab071f50c077abe9f4f0dc1ad38b342c039 +:00aac0552deddb007bce5cfcd7bc994c7de7f4 +:00aad05f4aa3fe3668e256ea086af55a7d0c19 +:00aae0acbbb2f2dc5a7d7aaa6d2922e57dd3f7 +:00aaf08cb8b65597406b94b628eb7a2fda323f +:00ab00aec190cf2ad2861d8914a12699622ccd +:00ab1066bced9b73f6d8ed1fd6e5b8cceee20b +:00ab2095b6fa01a853c61a7c3b025cb312b047 +:00ab30c7d05afd2bd6832dcce39b9798f5a56e +:00ab40d2ab608fcfd6a6374a0436da9c339dbf +:00ab509ba25e05982c10cbee6dd560754832a1 +:00ab609f27f2cd756b02c16ec5d966d07b35e5 +:00ab70f7e469c2136b62c34e997ef54a028f7a +:00ab80712610c36409bb58970f288d512e4f2f +:00ab9084c1e3c2ccffdde00d2d5bf0920dff64 +:00aba0ae45fc713e32a6d5e29667a97f4973ff +:00abb0e1d0bcd06029ee126340357513ade4e7 +:00abc038c47634c8d8608aae04bd97dabd3e10 +:00abd0b7cc677212e255866626bc307e3e9c22 +:00abe0fef3275905989190d3b8f2f0dc8e4ee8 +:00abf026d216f22ed53410bfae710fad2d40fe +:00ac005e5c855d798c2089b18c1df8020df6a1 +:00ac10d18ddc84ebbc21d8bdca12210efc5ffe +:00ac20d558ef0b552a9cc62937ec7ec400d09f +:00ac3001f8f33b49508522332785f4680a79c7 +:00ac40f9381736b031248e5b0a51b4253bb13a +:00ac5063b09f5828a70be53ca50bb6c6c9c84d +:00ac60f6f52ba10b30ecca33d919ab25762bb1 +:00ac70fd8ef0f75afef6f1da77056273ad7394 +:00ac80877e404b5d89a56b2c523dee1e1f4927 +:00ac909c0f63e95c4b83c0ff9a57f6d26cfb75 +:00aca00408781659421d2081ebf64e8ddb426c +:00acb07f169594a4f10be8f0ff2786df5ef08d +:00acc0d22e220fc69237845520665e29865f77 +:00acd01b2d06d140393b1d6e338b77268424e6 +:00ace0f306676e55efa82ce4d885ee1abca464 +:00acf028e34c9ec082d4656d14081c5c897521 +:00ad0050bd7e32e0cf6854668e80ee2b71d961 +:00ad103e129267f4515fb9c2ef6aba0381f8a8 +:00ad203e1056b82cbd114f316afefc1644a290 +:00ad3023286c5a3650c251565234b5de4e0f3c +:00ad40c253caef21d6914a0a50bb20c71aa87a +:00ad5099f2c2d13849c3e5f912dbcb48affc82 +:00ad605a312fcdfcd7d6a4a8c9177ae4804a13 +:00ad70b80249245412cae5a3b1867608614ecf +:00ad80c19ac6f67793a80f5eac268dc63865c5 +:00ad90c90f5d1ac2616cfb479b489f84755288 +:00ada01d315a988dd637ebc0e22a61ad111946 +:00adb0c905e8b86f1df7000da28c7373b39c3d +:00adc0a5e36b4c4e19b2dac016fdd10ada1310 +:00add092ffd2cfa58425fe55c6ba0b8cd6a20c +:00ade03bc4881d79545fc53c1bab19a7edc99a +:00adf04558701fc9d29c8a3690eba0ebc4d4aa +:00ae005f7856e11546983c82865edcbd388962 +:00ae10582f4adc39afc9b15a7984c8ee27d1a4 +:00ae207bdb6bf187aaaaf5e6fa1c33d06381e4 +:00ae30a9d92f21fb3e1e2cfd1613dbaf7dda4a +:00ae4093a91c1332b2bae7f043544faffcad80 +:00ae5022d9c124757aa9bda6a6974765fa188b +:00ae600297c239fc9318b887cc4c78f0a2e00c +:00ae70b0e6d4717b7d75a6f4c627e8687a5116 +:00ae80381e0b4d5cf36eec92b6e875f0c4433f +:00ae904ba31a5053ad850a93299daec0bc0a75 +:00aea0df58abb0b8aea6d5ca67c6fc85ca06dc +:00aeb0740f9e8d339ebd85a5dcf8883c10df7f +:00aec09e801f5f9eb516f168ef2b51d349c970 +:00aed0981cef55f23309a670977f72f661fd56 +:00aee0b3deddb92f91fdbdffb918c6466a1f71 +:00aef02fa55bc435ab2ed9c59e1912783415da +:00af0046dbca15abf19a07d2b5482ca922abe1 +:00af101a65506fddfcd4c70c9819ce7abb1799 +:00af20b8681b9b4a032ad250b8355c1b8a55e4 +:00af30ab396b872e36e01df0ccb79956f03319 +:00af408a90e5625f7293ea325a34f9042283f0 +:00af508adaf01b2199865a25bd7ae956153754 +:00af6024ec7a19af5c7a60d70393cfe3bc358c +:00af702d18e713028f9bd13b70cf6854010adb +:00af8086bb621521498764f1c92d14da1bfecd +:00af903b6cd01d75129d2f38dbdf1f01d72308 +:00afa05f19a1a98b434890ffc6eaccf54fb66a +:00afb06bdfd370caa0c998c00110c08fa4b243 +:00afc0d0b187ac0ebfeddd750d5937bc135df3 +:00afd0787bac1aa3de88629e4be97c1c689dd3 +:00afe0d9b0e99d0807ebf99c6aa4a1f525091f +:00aff0ff66492c53c8f8b53d23109021018d48 +:00b000242efc7be559842c983903f256e316c3 +:00b010a8c254e01f83cd4d0865774f4c2a5aa7 +:00b020fe8b8ff89bbe9232bd799444748df091 +:00b03081995f4150260cd1ea8e937e8cd9390d +:00b0402647e871f9e30f88d76e87699a9a03ad +:00b050f4483bb4fc006f4036d1f20eb82ae336 +:00b060c05b2862fb5b64944426b11d54dc4fb2 +:00b070cbb42aa2cdcf9f4f2cf2fe3780236384 +:00b08069b923f87fbbb344bfe25c4131d185af +:00b090d8f6315d271d0310454542e7fb3f1c7c +:00b0a09db218e2849224f44bbe267b9fa293e5 +:00b0b0b443cebffecc13177f6ee3343caa1c93 +:00b0c0f59daf3c6539540ee48243287465354a +:00b0d036d55874726bbac585de65c647cf2ad6 +:00b0e0cc2d2a64a27ac2c80427e4983024b6dd +:00b0f091d6036070620bb45166c627bd4a0c33 +:00b10035918990605c49baf0103de22cb8647c +:00b110352c069d35b4e648e0f2a5cb9c82be16 +:00b12080360b63dd0dbf47bb57263420dc8ed3 +:00b130ff2c571ad7e909790b87ff3a06b04c4c +:00b140e6afb0f560cdd57be90d9bade5e66668 +:00b15091c7388e0cce2a0b7a97097b198f24a6 +:00b160abb017e09d1cc66851a539501a0c4f65 +:00b17034ed9e12e2877c80e8c8eebfd22d2658 +:00b1805fe5cad883d2eaaa5c71220dd16e2d48 +:00b190582d639709992a0f57b22cdcd87d1374 +:00b1a0a8caa8feaa11ca1b56d39a83e4896c9f +:00b1b0002260647076a8069535d9190bae001e +:00b1c02b87120459f948e53ed0f4d321bb394f +:00b1d05fdb8cc91445cdbc5020775b2667de95 +:00b1e0b92f2de20e33eb87b160def506dfb6c9 +:00b1f01ede335c1398bed2948bc49cb3d4aa67 +:00b2003cdb462cac8773f16fde0b731002506d +:00b210df9ae49d887c07800a3b7ce5bac8a56a +:00b2204b0f201f649aadf9d5a0cad1d4973ea6 +:00b230a489cbfca686081d2c90962cbf6500d4 +:00b24053e1b9844ae0c1a9545d6b37caeacbb7 +:00b250203a60ba2e1a45ebefa9288c8912c8cf +:00b2603b7474d5e9f0a85949aec52a00c54d77 +:00b27041ca73626eca6d7fc9254c763dca559b +:00b280799905443bc7a8fa92e8d2cedb6bc40d +:00b290156666589d2e6f9a3d89e178b3f94f88 +:00b2a04ecbba21a644b874f43820cf289bd576 +:00b2b0e579b7292241809450c816aa17e3893b +:00b2c0f5706380622f5ff509b594f7138eb408 +:00b2d0c4845f7d11588db269d611fc356c52ba +:00b2e073e348b94c32c05f06a3c80b89caffa4 +:00b2f0c69e78537b5399734fc903da933bee65 +:00b3004efe62dea176d823c6ce8c032a800204 +:00b3102073cae408918b6b2076c1a4f1d2c274 +:00b3204c1cd6f3eb2acc262880254ca111329f +:00b3303c5668005910784da77b730759b00f83 +:00b34021e05cf1bcc11932150b53ffacefebda +:00b35042126e66c19b803fbc66a1a7e4c3dec6 +:00b3601802d7cd3374ef0ad113e2b88b3190af +:00b37001e7fdc651d55995d0eb6d2e47726993 +:00b3806028368205c1a620a2865927e057f41f +:00b390f992f1c7bbdf324c88eefe0ed92696a5 +:00b3a07d096210f9466d556fc0a4a53a9113e7 +:00b3b08f4c880fa77710c49fd17d911abf6026 +:00b3c075880026ff5512504427f527a4fdfbfc +:00b3d0dc773b9f48129b93cbb3e229da92e1f2 +:00b3e0d7a51d240dfb12415487652c16f89c8f +:00b3f0d5750a2ede5398371749304fea12da52 +:00b400ed19dba8c299b6a3c954596240134d3d +:00b4102eca2bd116de020c8c1cdbe284cc5acb +:00b42080b1220853d0382e011ea28f2ea520c0 +:00b4300b504fe508316c60ec3a6ad9881ae340 +:00b4409fc0899232b6ad838d49e8f20a67d4e7 +:00b4501d6aa09003e4206b4b610ff94ca7792b +:00b460f3455b6361d9eacbe5aabc5b7ee17e67 +:00b470b43fd6d5f2312f7c4313591c2c1727f6 +:00b480da919b5b0e4d048fa566dcc8ba324003 +:00b490156814e7ea23a4e3f4871b70af20fcd6 +:00b4a009189fa10ec83273eb0a6d303c5684b9 +:00b4b068fa8dc3dc9f95f8735d83d50d08de9c +:00b4c063c1376e935569a9a0d531fb14ab838a +:00b4d0f6a95b934a899acbb94954e6af7e3c5f +:00b4e0624bc29c586960ec6fd7fa0fd2d501d8 +:00b4f007e54517ebf1ad1f51de225123aa98d3 +:00b500ccbed2f66c9a320fea7c43c7c58788bf +:00b510a9f86d6059f6b410f30d6b77282e38b8 +:00b520a28af7e50b547b4e2f9630dbcfd94300 +:00b5308063f35c4c50ead93262e74876b7b348 +:00b540fcd36233b028aa7300ff506377445e84 +:00b550fbceb736b2214106d77cabeaa037bf09 +:00b56039d1baa655e264278bb70f585d8aa930 +:00b5708211e0fcec18b3057a5009abcd7a654d +:00b5806e56f13d2c9ae52ba8d1d8aab38531a8 +:00b590e8dbae6638620a1952a6b37a7ea68aa4 +:00b5a0517256a1506d78a26dcf286af8e07379 +:00b5b00948bfbc8e45f93c0118fe8f4e328102 +:00b5c079b0a4bf5cfc3b17dbee93314944439b +:00b5d0793baaff3a0ed21f81a61881a25bcded +:00b5e0a3c5093778e0654f396bfa3d89ff226f +:00b5f0b02fecb2c79e7b22a0ff32112a7a5a66 +:00b60004308c65b716db0f01741008a3b54d88 +:00b610afa3a1325f4f93ddd89b6c4065bff3a4 +:00b6201c81c2120f0b7aa2d2f521c55b3e2c3a +:00b6303cd114c9ccc97f1e336efb110ddd880b +:00b640ad54772d46653f119babe7b8ce37e3af +:00b650f6dbf932d82eb53f3bf5526ff281cba9 +:00b660734f666485593e8bf339e42c1705a062 +:00b670773203fae7af7839cf4abde35bea7907 +:00b680cc9428b2e1bc380fb79eb483483c67b4 +:00b69041904302de0ee6dba73e834b8b32eefb +:00b6a07f7732de6f59a3647c032e0cb56bdedf +:00b6b08fbfc83fbba7d4bc52d5706c52525343 +:00b6c0a7aac41b8d4c9b0dbe56c06c89ccb7d9 +:00b6d0a4b353c22c92e77c84fada180d5b14ef +:00b6e063d536a35bc5d5323536d0c61c821c75 +:00b6f0d385faa905e8e1e04e88ee7240bd03de +:00b7001584626aeab01d684d38499133c5b518 +:00b7102d4a060a1d986176c67400e5ba55f013 +:00b7204e4d4d1e586fb1e6be68aada35d70002 +:00b7306fbd1202d17678c5ff5717eb476c6ce9 +:00b740f15ca999447ad8f3eb245d32e63fbf9d +:00b7509b2f3f56fe962e2f888171f0ff6fb531 +:00b7603e03b584f6e94b535bb42200e4127075 +:00b7707dcf2f3d50aa5d6b49034e6abaaa6007 +:00b780b2afe57bff10b6d948b1fa67e62ad0c4 +:00b790a28cb0b40c57875e8df085e82b460a4a +:00b7a09720d78d430133e09c29602e17bfcb87 +:00b7b03fe688406192ef62ec342ffc6126d8e9 +:00b7c09299e380542971d767598ddec6fd58e6 +:00b7d06a000f6d277f14f811f03d641a8936d7 +:00b7e07355b5e83496dbcaa2c420c459d7f8fd +:00b7f0cda72190f5827a97443eda93b1cc0e31 +:00b8000ce1ec5ea98e8bf31059399ec2304eb7 +:00b810b54a4f3030bd0558b603fa3ac3ea0daa +:00b8205e9fcf1ff90f0751d6504ddd8437120f +:00b83066a3306481a88724a4743676f30773fc +:00b840ac8e4918632076d23fb18ea78534dd3b +:00b850f5e6ae4f78092fc656805d9c92e2a1f0 +:00b86009017448606b6bec0c8db3c91bc8abdc +:00b8701d433a76a39c03fc4cf25e8b2b705470 +:00b880cda9a1aea1f2b03a2429c9aa5f8e42cb +:00b890e4d195f98e5059988c3c69bf8e2c85c8 +:00b8a0fc115f12d9afbfb8c82feeb8a17374a3 +:00b8b0098ffbc1e3dc1a83d93ec0d1aa97e4ed +:00b8c047410799afcaaef9bb39d4efecf185f2 +:00b8d0156c69a85293abb4884f58c5c9876bf1 +:00b8e007cb6fd515ca0b9ecaeecee3f535aabe +:00b8f0a840df2b02d742db5067ee954307d4d3 +:00b90073841e40d080a76d5ca2af3cb8b9d1f2 +:00b910d994f1f9883572eab298db03ff778cbd +:00b9204724b8f6e7f7eb37ca164b39e7951e8c +:00b930a2ce16e32d16b785155f641589866fdb +:00b940646e9c247239750a5d8e508febc49d95 +:00b950f30fc644eca569d05c1d29d32b8b4833 +:00b9602da6e8f71fe5f2fc4b9cfc699a70fa98 +:00b970d4eac2d8aaaa9775b0e1ad0a9c220f41 +:00b98099da91d2041604ee73491da7f6b3739d +:00b9904f13ab1d0f0c106308f3e4e1b0a3290a +:00b9a06e877de9ca7059f9667212a1083778a6 +:00b9b0aafddefef0e7ded184ea8b4ce1e5f966 +:00b9c0898d7b483cee5e8f70aa809e498d236d +:00b9d041a1eb68e13f821745e98574de6aa2c4 +:00b9e0937a8c5a0f0854e1866a98a42d8c5fd8 +:00b9f01756fc540ae3f8d1302562048225ff6c +:00ba00c720fa707b9238bf9320f0daaad9006f +:00ba10d9fa00890824f0efcf8d8dacb1c1eec8 +:00ba20747e25a97fe6b16620d24d7f342a4efc +:00ba3033b2df2493c540d206eb37a96e0a1ab8 +:00ba40d3e61e25becdc32412af0ad21bc3d696 +:00ba50d993b4b13a1bb792f15e27420c850589 +:00ba60e2a0f6e478c5ffcf7036c51a06f98ec9 +:00ba70c2b2a7d09228992e64231e86ff07c249 +:00ba805b8e1d6bdf5f4bf965a5f5b05c21c757 +:00ba9045fdd557ccef7d1a20d53fe597b9f00d +:00baa03ee563a4f5dcb2815ac54e46794406b1 +:00bab008fd8e1a0484ecaded3d4cfdf2b544f4 +:00bac006d9377d62884514d5a9a61b4c3b9124 +:00bad000c60b9b94054063053537af4ce75b9f +:00bae0f62a12601665561922e04b07b4a1543b +:00baf044ca6ec23555c25b73f42ebccf1862f2 +:00bb00b245ee3b155825abec7d847f6ef713d6 +:00bb10029b603a3cf959364f981e1d500a6ca3 +:00bb20dc0a664f6dc85005ebae6ed00858a60d +:00bb30d969cb2b036562475dfa24316e4bc1df +:00bb40c31dbc76b1e1246aec02efd74930d63c +:00bb5019720c72bae9fa9a92812d52f1064cb8 +:00bb6033c4172e50f2cc8df935d3203431e7e2 +:00bb707ef52853995d0853f3cffd10e549b09d +:00bb80cc1910a6594219f85802a8b8c9f2ae83 +:00bb90aaa5d49e484d581a82f0fc3aca010b7b +:00bba0df23a41aeaa3651a43713fbe1ce55144 +:00bbb06a215242fa8c298704c3e5270288e954 +:00bbc061998509c1c273884218199afb8bb7a4 +:00bbd0a1e03c807d534ad756230e7ee11ac58a +:00bbe0b54157cba028c02e79bf2822b64e5320 +:00bbf06b48b98d021fde3b948dff7297679cea +:00bc001d101995a7d71f1ed7173359f714c0fb +:00bc10d9dc751c4c0c8e85ed05a198a7297014 +:00bc20ab5e54b856d8f79a1ac7f1d50ccc838a +:00bc30e5ffb8b202c841bfd760772ca933666c +:00bc40f8a61b30a8fc2d171b65e67a48e36c95 +:00bc509242df4f9ae79a6c322bf108e999b3ff +:00bc607c893e72c91c170a3a46ca18baca1efc +:00bc70bfe6b75f2db2807a65bd6509b3c6ab96 +:00bc8044904c8095e49154a8b285179c4d227f +:00bc90c5b2b728a0ca274cc5d9fa4439a8432f +:00bca04db0f7c6cee5a9c8a91a1ca9ca4fece6 +:00bcb0b8b4c88d375bb493615d85328e438bfe +:00bcc0753077d46dd6ac46bbb707b0cbd9cbba +:00bcd0a2e8b513187fc0c514733612830177d8 +:00bce0173561389a869f9f638eb5893615170e +:00bcf0a164e2e8dac07a11749160533a0ee70e +:00bd00d783b8594d1cbc7f55ac12db7f0780a7 +:00bd100b698e5a8f016c29ce35b2a0ad88209b +:00bd2048229155966cbaee35f345bf2432208b +:00bd3020ef9bd2eb53c0acf276f06fb315c436 +:00bd409c8528f5a7a69c01552cb7a5e1bc7acc +:00bd50fb73ae0d676f23a826fa6be6cea9b4cc +:00bd603c9896d5d7ac0cdb5c8ccabb1c6d63eb +:00bd702582285d49d90423c4bd6be615b6c1bf +:00bd80ad9e8555c4978ca7ed2be50b560a448d +:00bd90e3a811b585548c3a6159b823a2051131 +:00bda09c385bb0a304bcf15ac67901163e6ca6 +:00bdb04c20594270bc4d9808ff0fb5c53100a9 +:00bdc0e8460416ccc6df3a8abd42d6ab26ae0d +:00bdd034a4459d48a25bef6e3ea884d5e7182d +:00bde0f0c08bc8914b44c52a3fb11e5e34cfce +:00bdf08d591fbf407efbab2ee15e23092364c6 +:00be004ccaa2f4791c8ab2814e2139e650bbe0 +:00be102ee4cd01056d5872bb479c62b9b0480f +:00be20eb715685dfd86416f115663cc2539fc0 +:00be30b3a8f1bfd7ed61beda873ae4020d41ff +:00be407bacfe68eb4d6923133c86d51414e6ef +:00be503af2ebf45d823ad3feac14cded04d36c +:00be6090ddcb6c9546730fb6b918cb49cad43d +:00be70e8a2f8111ec085078cc8aa7ed84dae52 +:00be80f7cd721f2e7a1cb6a8ca927882cfb300 +:00be90f2349fcf114bd8336b8e1ec5eac5cef2 +:00bea05996905e64a0701661ac1f8351521e43 +:00beb0a9a0abb7723deef8fd4f02d8ff60b4df +:00bec04413736e90ef25d3e6fbff1f62a8fd13 +:00bed031d371382a54a165b156d50236c1094a +:00bee010d1fe75a69172bcb82d0529eadf1ba5 +:00bef0100c1942f8e99ec6f7f77f5b05761eca +:00bf00dfcb52122a568fd9d0aa815d1612ed69 +:00bf105e1e92a809301853e2931a24f4b78fae +:00bf20dbad9a0dc6b65ec31239a143ebf79e73 +:00bf3035f96751a4d298503a4c20331d2951d5 +:00bf40baf0a22cfca99daf6e939f29644362e0 +:00bf50d596443316f86b19d4b76660f35ffae5 +:00bf60ff246a1780b6a1ba6c85fdd4086c157d +:00bf70168f1aa7ad0448ab843fc520984bfccd +:00bf8001d04b3f291e24b50da7e2ba5dca94a6 +:00bf90002799d64a1711ad1c8c69083e0f3c2e +:00bfa0d551866d33cc8436e66359c4333b8798 +:00bfb0ee95349a7cb7160c0d3ba4994b0857dd +:00bfc0ddc953064db00ff46d70afc6331306c2 +:00bfd0be48ea3bca4ab608645f44efc0842849 +:00bfe098d9553bf0765e85c01fe843a75b5467 +:00bff01cf0c669fb152ca5fb81bdda8b24112f +:00c0006d02e9aa5658a075680d1429744d2026 +:00c01000ca8c07b1a849b274b156982106bd5a +:00c020690b2e02c29ba0bacf1f6a5a98a3dfd0 +:00c030dcbd7c62004b73122bb964bead6ee002 +:00c04071f5b794b5dc3d0e6b0fd1b2ba1b192b +:00c050f0534b39b47d2ed333d29cb4b13f253b +:00c060fd94ebecef80c6a4183f943599fd3c41 +:00c0701e3cd862f34af8c37d2db05437c02d83 +:00c080b149903cd55446e74aa6c5f6485fb8bb +:00c09079103ff4ab949d0b1d50c19973cb9778 +:00c0a072f6e5e4f2d6e749a62fe886a74a76ac +:00c0b0c7a0b9ee19bc5bfca3e622439a8eee6c +:00c0c0886c6ddb2c6f1589b6bf4f43415520f9 +:00c0d0e20d6aae32316dd6f5d4b8b1cfe676ff +:00c0e09f2759e58d3644025adb1398d46df96a +:00c0f05040f33a1c71d03b147f2627aebfd764 +:00c1009fc94cfaa7855d3f8a9a72b0ba8c47ba +:00c11044591ce44d186900789cd6df34272d87 +:00c120f878357070fe222d72b82be8d5739f1b +:00c130fc5dffb624930a1257fef1ae3485ba0f +:00c1407f94000d627fe8a8fc28461eae69ddac +:00c15087378f6bb7e4cc23f3ed68a3e7ea122c +:00c160f3814cce1c33c019fee7de62ef36a15d +:00c170052fc76ebd271356b233dda6e2dd29c6 +:00c180212d3f5f84bcef577f359f2fd3989b55 +:00c190fcbfc10d31c7494fc4f7dd70412b0c49 +:00c1a018fcfd8e690aae9da7b03df213f10e9e +:00c1b08d82f495fc72ba24a3d827eff9ef8035 +:00c1c0d5972550578ffe83392739b8d05a2955 +:00c1d0a66a64d169f3e24eb410ba24c93cfcfa +:00c1e07349a0eb142e1a459a213c5e4043c423 +:00c1f01e2eb7404d610c7b0ffdb81aacf536a4 +:00c2007489ddf7a1ebdaf7978f31bfdb9f33e3 +:00c210892f6795ff332ba53968762eb2cab4bf +:00c22021d1ced63205d807c6c5fe1e5598e1dc +:00c230d72ad1741aa0fa1b440203132c8533df +:00c240cf867ba41a0f6558c0da4dc065a6c54b +:00c250501b1aebe4799314a6feaf9f12a06c69 +:00c26069e60e9cc76878bd0c05a4b1edf2fe3d +:00c2706c0250204a0b1c46c2417229191775b0 +:00c2807f9f63423ae0123096fc3d4be526b856 +:00c290c3989d7419f4b6d7fd8bb6014b7db3d5 +:00c2a091138e9bbb0cee3dc449a37593238272 +:00c2b0023d7ba42122959c62e89fb44ae09437 +:00c2c0ab57cfb865286bac2cb6e88a314bcbf3 +:00c2d0268947cb552f3e13c0a0465b535835f4 +:00c2e04c39f9eed795a606418c216228f379b4 +:00c2f0d3b4b9c8e6b8ae4ef31a2ed1781c7456 +:00c300acba0dfa372acf090d72a92e1a4df04f +:00c310987daff3dcef1c16038242c30e6a2ebc +:00c320fdccba11cbd5c6e1d4eaa8090b26f643 +:00c330f208d0b892b209d624e4e75e174b4fa2 +:00c3401b60097197b7d5b23ad27d23a2322a93 +:00c350e5db5d5f3fe200f1f575f5e816ff9a26 +:00c360cf770ba05ffd4b8748ae43427fc21dd6 +:00c37067094d5082430e857e2a45ecfad97aca +:00c380ccd65a92bf619c76961d7044c008f3d5 +:00c39028e4f6cadc3ab4038f380d1e322e6416 +:00c3a0ff7ecba04a3d2c5fe17dd67819e98fbc +:00c3b07dab3e5408b60861d90678fa8669df64 +:00c3c09078a877e5b218f5e1072dbf2dec2502 +:00c3d09ab857e3197840a192f06cb4ab676372 +:00c3e0f472eca5c6a92974c43af48051251b19 +:00c3f0bdd70ef6498b7e9506bfb8fa587d7d4e +:00c400dde95e98110658ed3d035a2c76e6428a +:00c4106923c10bfc232525c88d36d4c3d72815 +:00c420cdbcb942f07b895c5cfb668e29b10759 +:00c43050c8fbb97070a0c4af0d46fd8cd43ae8 +:00c440d907e949585da9d98b14bfa2784456f1 +:00c4507d7c43b4533e7a7a417c0746793a64f7 +:00c4607f83d691505d393ca8d73a6db3c339bb +:00c47075733cd776fc146642b469716c67621a +:00c4805db3f0cfc1fb8fe34fc0be9586f81675 +:00c4900bf193e17e9e8c1a269a2fc5f7196365 +:00c4a06563d0afe4df537cb7a64bbd5c447e39 +:00c4b007a20296e9b0710abfc172d5f1b21196 +:00c4c06e551d6ff321129f1054b5ebdb5ff7f7 +:00c4d0d830dba5e95e4bc6902a0946552b0f9d +:00c4e0e27a4339a7e0d9c0be8d1f904211085e +:00c4f0655cb9ad41028c6b70cf6fce824529fc +:00c500e1015b3133b8965d35d9d429b5b72aa5 +:00c510b65e4b9dfa335231459e46e22693eb1b +:00c52075b7be406edad46cf845aad7d9200e50 +:00c530820125fc085969a211a3f9305470259f +:00c54094a1ad84ab8688080e561d24713c094d +:00c550c437a4c56208ce76a777cd2b6a9314a8 +:00c56011dbcbf6ea096d1033e4f25cc1b26332 +:00c57041096dcf6a82618659a5bb6a6417f31a +:00c58008d570abb294f4880f11d41df5876404 +:00c590a50e085646f0dbc6f27572a647e1d722 +:00c5a07112a171bfe32fba81c7772b3868deac +:00c5b0c505a079208031f15bf72a7d42876cab +:00c5c0de62b1260d7f0e7eeccbe2fb1b417496 +:00c5d0f00d9da47e95440119af1de18de7556d +:00c5e0d7cf046ce6484f4527d8c87f9c109ee2 +:00c5f0a0e3a27fb9b108dd1796f37999f462b2 +:00c6007c3fba12364db01d491aa3ff9f45a94a +:00c610e1e1b8364772bccf8ef935450858ffae +:00c6208285034495b2b66883a765aa109e77e9 +:00c6301b86f995caf82705f785cf4015802d52 +:00c64029db533662b2b7c3be635fbfbf5e4f7b +:00c650a2b067d6dc0c62d2f5b2a8c47e33aabc +:00c660fb39a59e0071651c83fe1bbb51ea79ea +:00c670b094074c8355ec5fa97f3a6d8107b36d +:00c6804a1029c4734a40c89d070bea9da13c4a +:00c6906f55b8bd7a2b602761f3ff58d843a81f +:00c6a0343fabcbcfcd17c0e17e2e7770593cc3 +:00c6b0faec5ab52cd8ccbd1877ac39eda0850c +:00c6c00b295accff9a34c8f1fe3b289bd930c9 +:00c6d070181728ff680438426ab5f23d0602d2 +:00c6e00a226d38207411072125b481ca358892 +:00c6f0456a059604045c0ea779bb6770f8ad0d +:00c70031a433f9762940773aba4adc15acbd41 +:00c710dc424442dbfde214a2b1450569556ee7 +:00c720f616efdac8cc7dff97da2bcd04352a35 +:00c730f278ee0383909faae4e10fe70ad02a47 +:00c7401dbedb7af21ba7cefcdf3bc4308ce335 +:00c750c6eee0cda161b15445ecf3a3d900af80 +:00c760bbf3f35bfa22c8432766e0176ba21728 +:00c770a5021de1f6923024c7f742388d074876 +:00c78051bd09b6d0e7a83f0d61e86e58513ef3 +:00c7907b43b3fb705ab678fa4324b2483b6dbd +:00c7a09dfdb0465cc19c6affb1b856c197ab19 +:00c7b0084b6f6e48dd9e3a67e246eb232705a6 +:00c7c06edc3d87dcd511c0d35b67141b8bb43c +:00c7d02e6d4f710e047e7573b395ed63916ad7 +:00c7e079a8fb7f9e93e057b2de8b4b7e16c6e3 +:00c7f033eba0c5a5c7ade46217793219accbef +:00c80097f0770b753a5ce353b0cc3f775c81c1 +:00c810ba92145d7d4f1f6b39a31887942220b5 +:00c820fcadfdf8efe84f2e323490d850a91260 +:00c8306d1b64a0896858f35f24dac56595f0cb +:00c84055b6d0fddd8fab49a529c9e00bbaf96b +:00c850cfa6ebf6d0886240d9f19e45a16a6483 +:00c86024e3e2b6f59c775fe2fbabaec645921d +:00c870c38bb18c4e129868ad151c0e21d33778 +:00c880cb1f1402b1fd5869a633e7a43e4ae1c2 +:00c890b89225399c98ac59c5a8c51e26e0710a +:00c8a0920c6a1ee85098d613b1174186affb1b +:00c8b05b515f59ed9c0da5f31b5dd15034b78d +:00c8c02e3d60ae771bad6ebb77846e053035e7 +:00c8d0637e328c878670ac7f3bbd47ab55167e +:00c8e0a31649356e12a37e5997f0951fb37d52 +:00c8f0b9eec8564b2c75081ee248040e65f277 +:00c900f309d0b2eba47cdd99320337213dfb9e +:00c910e27000819c3224b7ca62343a89876c5d +:00c9209192dfb93b176d60c099bd471bfc806d +:00c930f8cb9c36a9d5ee1f7730528693dd65e1 +:00c94039b824ba99c97e5b4c4b9cfe335d4cf8 +:00c9506b219acd03d75f4bb0cb57fb19695014 +:00c960d21e0831415c0f0898e6e97951d542f9 +:00c970b3be7cff972e9f4cebd4b69cec62f18f +:00c9807aa01fcd5aec287c0b8ec610422d8c6b +:00c990872f5e9bbbb0dd4244cc2df34f4e2ce9 +:00c9a071fee1b9abf76757837f22e58b953f1e +:00c9b003b65d90662954d4ee54873dc16e6755 +:00c9c078b0c7e07121be0bdfc0f6a827bb9d8c +:00c9d0c2af8be24de9e74c92b574dd9ee10d6d +:00c9e0fb858a24382901b0be13b5fdcf1c8a28 +:00c9f0cdc0ac1ab7b03c559ae115a7f119be43 +:00ca000f369ffb5fd704007afaee183d7f1f79 +:00ca10106a4601e9089fcf982e36fd6afb4388 +:00ca2022e362421f64a486595dc0ef5f07aa0c +:00ca30bfa0dc6e4fb45034075ed3aa87a1e28a +:00ca4071f38e09af1e1d1259e95b28da095faa +:00ca50c5299277fd43c4777ba92f3eaf1b65e4 +:00ca60181c639deed3ba50ccda0e812889acde +:00ca7041d176ebd11a390a971f2ef38b5cc5f4 +:00ca807e86d0fe684ac030685b6a85c9b8fc1d +:00ca9012cb57012acf0b018b98b0d2f976fdc3 +:00caa0ea4fed391f192a3ace88647637a0bc51 +:00cab0e97ff8bc630d1e9d5486bcb195904a09 +:00cac0e928a1d091ca0f881e50af62ffb5334b +:00cad066fcec77b53354e28015b8a6bd4211d6 +:00cae0baae18160c8eaa0184a4b114743d9c54 +:00caf0f1eeecd2f9a354a9507ad17032c10c6d +:00cb00138bcb0bf5bf1e108349bc72a190a3db +:00cb10374ba6972ebbe4ebc070a29d36a63832 +:00cb206409441b65b96304f9ad6d041fcbd31b +:00cb300d902c6d5d1f490445854774ba6a0573 +:00cb4005496f27c0a0d4aecffd8e9e279d2fdf +:00cb50fcae69ee06465c753b48e68b6987983b +:00cb603eda424e8811dae082e3285220438a18 +:00cb705ba8f3c586f5073545c95ec713f599e4 +:00cb80b22ae7a85bb5389e1146b1fb0615f9d1 +:00cb90d22b249ab71fa52bb6c2360c917dbfaa +:00cba0efacbd86923bfb01c3635575c3de116c +:00cbb08a61db9c44cdb8f0fe8dd6a52aaed43f +:00cbc0b3f7f7e8a8a087760502c563426fd6b9 +:00cbd0e900cc3f2b4e38167835923f60ac8083 +:00cbe0a4cfc1ac42615881ece388b0a357758e +:00cbf0c72c0abba6e1032cf408248c6795d051 +:00cc0053789c0753550da6e52f8f5c4b997d93 +:00cc108befaf8c12cec2ab1ab72632cd53503b +:00cc20000f4382d5f22d22b9afc68a924614ae +:00cc30574dfca6cf48f25f6b9ef678f98a5c1f +:00cc409b0590ad00a6084e351eca22a4493b5e +:00cc503662dc165ee5c13af6386fb7fd573ee5 +:00cc6051e19bbb0a547fce145cd4c796160686 +:00cc70cc916a24a23718676cb1e7cb9d860352 +:00cc80b462988160587ecb5b32dfa17e09e371 +:00cc90d410f135d893633c68fc4973fb745720 +:00cca03305c2df868f461dbaa35a1b500ec36e +:00ccb02c789d1931ee72352a62efd7b8a5071b +:00ccc010049d14befea1f5aabd184c646fbaba +:00ccd08aa6d3595bf82a300a8d1895bce9e20a +:00cce051c40389b6b10ad2b7d4ef567c202a5b +:00ccf02a00d37d009f54f1ff222bd4d966d723 +:00cd00570da35c1525656eb25bbde864bcd940 +:00cd10fd9ddeb62095a440c582faca94d4dcf8 +:00cd202d02b6d354abab95f119c0a540296067 +:00cd30c0e38c05f54ae7630e6e6eb1b69f93f7 +:00cd40f74380d0c76b24589459d420f37a615c +:00cd5065e0a1961dff8672bfe1239441e68cf8 +:00cd60da7f7fc862d8af89176c35c44909b4eb +:00cd7099a649b73671631bf086746397fe84db +:00cd806d0e1fcab40f71797b453ea6d4bac654 +:00cd9098adb16fa91770e7184405f85014ffb9 +:00cda0d0c8a58685dc9cbc044667b7c30b8f36 +:00cdb0b70b8bbdb01d75feb7d5c7858ea37d14 +:00cdc0a1e838c98f356e41d4d1a7401bad2dbe +:00cdd03d4f72a0b799332a20ce631c44383b3b +:00cde000e1d28318daaad740fab0e23b8feca9 +:00cdf0c99ac9fd668269d6ab7658b1fde34444 +:00ce001c855fa60237b049aec96ecd093fff2a +:00ce1010c74fefee7191d888f0764f7d247c96 +:00ce205931269424968c4ced24fa1e36860ab8 +:00ce30c6016cc444bc7ae93ec0ba1f916ef802 +:00ce40e72e1195b35a85143dd674b4a8605aed +:00ce50a6da897e2c8677fc5e51260f2315e0a4 +:00ce60e00433632fe3a5808bfb7eb6e719862c +:00ce707513e8c11e04e4eaa69c62962fe8ac29 +:00ce808d8f218d341649f304a3b96acc344c0f +:00ce90d470476ecaa1e841958b53c5f04fd594 +:00cea04aa68e4373c9d9debf46370669107f8b +:00ceb0893f06cd71a8c08b57c4ef1709087934 +:00cec06497ebda993f4a6a048bd6b3e1b9554c +:00ced023bab647ea5aa371d1c787d05405095b +:00cee0694190d82754f8ba7b7c04cdcd603e81 +:00cef0e724259313aac3414ca048ba30768280 +:00cf00a8a3732211d20865b98fa45f050b7b2a +:00cf10c42e8ae32da64f7afe17d2dd52a7983d +:00cf20b31f0e3a247676b8417961e30026dde5 +:00cf3015f932dc0e831336bc2ce220bab4d84f +:00cf4046d6922e00c7ceb375d6afca058b2848 +:00cf508a946943aecf3d8c293d9993a9857182 +:00cf6028a221e92eb4baa61fabd1d723a03ebe +:00cf70135efd0f2814fcf1ff4f120a5072b920 +:00cf807c2205f042e39d9f8d0d918c00c41526 +:00cf90a8043fbb4ac3ad8b66362b50b6d62f29 +:00cfa0059adca6efca8d33577e1db78dab2b46 +:00cfb0dece231a825f1498467db5a15deed1dc +:00cfc0eca96a73476eadc7826d39efe8187d16 +:00cfd0be2d05cbee740b648f218d5160cbe5a6 +:00cfe0520b7d33900a015bc2a6ee51069b94ed +:00cff0ef2176df76bba91247cc4bcdfb4231ab +:00d000b2a1004079391bad4dce8c72faea3148 +:00d010b0b61d95654a4b2020bebcf8d83b6cb3 +:00d0206fb502895fb1949939f320a0e1b0cc73 +:00d030de059665f04d815ebca4a409014548f3 +:00d040eb35ed3a22c0b6e54946e78e9ddea1db +:00d050bffaad47e8fe8bca71ab8d7a317fc195 +:00d060b6a50928859b01c45103302a0a2eb5ac +:00d070197a07628e36a84d1bad2536b04ec819 +:00d080157f318aa7d3bc9895adfa7740571057 +:00d090c15b2b7f8b1067c0bd9f88f3df18d6d8 +:00d0a0ca9dbb2f468aba0c3e5d4a4f089a2fcf +:00d0b0c819a4d59259b0e992286c76e0adf844 +:00d0c0c7e41f2b0a8f1ab88024a3ea27ce41e9 +:00d0d018862cf15bdf78c13e8b234033f90e2e +:00d0e06ae58b6707cf1b3794759401dd44911c +:00d0f0668078b3ef67fb2c993d2f30f5c98095 +:00d100924f919c616a8eb00350dd2e1f01cff0 +:00d110c31b3ff23bbe92d5af1d22e2c3c64dce +:00d120b51b6fab22aef0f67fb4cb3308d9d479 +:00d13004118227fe8bcd980d330e746f257d62 +:00d1408b898706289a43d6d217b3d3cd9c1f40 +:00d150a596ca7125cb5fb0b01af61a6ab494b4 +:00d16032b5d3d0bf1fb1e54d14a45e9f704fc0 +:00d170d8b90803c1807a0662c8754261bc8364 +:00d180cca01959dc623be92894e9d154624b62 +:00d190c4a08fd9be7adb9328ced39146d59c4a +:00d1a0734ff2bb71f580aa7ecb5c500251e8c5 +:00d1b09344812cd14f19705bc69a5bcfa2da29 +:00d1c0434ca641172c44c6bbe02ff26a6ad051 +:00d1d037c3164368304a5bdaf92c39129d45c9 +:00d1e0db97b35f1c6a8acf3ac7ede21972c98a +:00d1f0e5a99a15f13be3efb9c965c292363f16 +:00d200e42c825c23d4b8865c568af90a716f49 +:00d2106a2e80144dd7b51f1d676608c6d25ccd +:00d2201a1d6c3bdfb79e201a1c36e7deb5dd1a +:00d230e547435e2fd01c426e6b31a9936b3012 +:00d24034ba1d7867cc6a25f3bb4457a74ed1c5 +:00d2504c7b0f9a0055fe4614484006c7485a41 +:00d260ce93b0b534bcd363238475c188c299f6 +:00d270d20ded50fe50fb15ab4f1b5fb0b4283a +:00d28052addfb6d789f5e9bc9097003d13c11a +:00d2901208199c7685d625b878e748661626ab +:00d2a06f6375f6aee1f3647fd3f425c2e5ccc7 +:00d2b0fa68a42efd492d0222ddd934425f05d3 +:00d2c03c7a8a2a1320eb313a8973b7922142d3 +:00d2d00c868305115f60d89f35692ddcff5c33 +:00d2e0172800f18da3efbd931c34d2dd954ed8 +:00d2f084ff0ce4b65c61cb4dc3fbf83fd500bc +:00d3005bc0f147bb1d067dc7ccf2869cfa0480 +:00d310d90b34351abbb21977652088dbc84148 +:00d320c329a2cb195e6afaccf495bc938f609b +:00d33044cafc5ce20e5f0e915bf2c4c5a5c734 +:00d3405bf0105ebce587218710fa31d26a32a0 +:00d3509afebe4569069005018ab5c3832ed628 +:00d360ae8be4abbb4601b9ac17b89ece7123f0 +:00d37093223c0c51f7679fd72e8228cf5ef7f8 +:00d380dca5d431b51839eecefd98ee1c1aebed +:00d390c22c7255dd71075e956318b4b0f8d462 +:00d3a04fbd3ac0f51d0b7407198d5d9d5dccfd +:00d3b0e5d2309c0366cefac7a9e532a86f6141 +:00d3c00208bda3c24b9aa088c5dd92aa84f92d +:00d3d009c1c0e8b24e0de5137b778db67f7c40 +:00d3e06d603e6aeecbb48c7a3287ca54d9d67a +:00d3f029e642b83cc3ecfbc43c1977abcfea77 +:00d4008c37a608df55857b1f642f0fccdb6836 +:00d410a6b83edd03eb09fc786ac515cee59d57 +:00d420b2ee99ca8b233e319624ffb90adb15a9 +:00d4300487b44cc58090faf5c4d10d6c156106 +:00d440baad3300c9517dc3ad07f8b880397bf2 +:00d45051e1dc8585862037db297a6a4b36b15e +:00d460bbc37b357650be2f73dfa140ac7fa8c7 +:00d470769d1b90fd5dd3b30325f5552ab334da +:00d480530d6290ea9620491120e764f28dfcad +:00d4900d01d8b1c8a6c065bc8f64a4373f195b +:00d4a097cfa354c784b73b50d2baf6fe672c0f +:00d4b0e1f35dea4b7555b184b129e02eab50ca +:00d4c029e6e3507f54c45d86e5e8364cbb5013 +:00d4d0bb711e9c0f682e2e067ea4cce3072ee7 +:00d4e07305d0d9654c453351173951e48d79b0 +:00d4f018453a8f14fb19fad542c767ed5874e1 +:00d5005c995201eaed8ca0e6bc96c9b2488c56 +:00d510e36648aae97cc2fdb5afce4dd1b9b172 +:00d5201a7bdbefc754355946eca79023b7422c +:00d530e9c22da5f4b0d47db857a227861c3299 +:00d540384e73f5eda708586c186ec051ec489c +:00d55067e7d16eda72df68aaed3a2925527112 +:00d560c21d703f0eeff941062ecc56e42aca8c +:00d57072db206dd7bcfce1941de160362c4afd +:00d5807ac62d641ef7d37c80ad54cae24b6e8b +:00d590b1271195731b61a6f69f31baf9b30c45 +:00d5a070298b5171c7465a94eaadf1f0d07ce1 +:00d5b09904fa9bb55f878114d742c3b980bafa +:00d5c0f0a4c79d16fca1e441b706edb9040300 +:00d5d0299b83e0353c907e991c8bb63b1e27f9 +:00d5e09688348b37562bcae83b21dda7b42153 +:00d5f0f8afc1fd6c5e02381f1398651e79d536 +:00d600f35edaac524234515f27e4878b488196 +:00d610799ec9f600a4d80bf791a31bf4ff5d90 +:00d620f894782725d729750900b354fd0852a1 +:00d63088f7b0f0570b2da15fbf5b6d237352b8 +:00d640f31d9150963d535406de86ef3efaa177 +:00d650617d12cdada0ea3fe271cdd1eb274b13 +:00d6605a823633155ae3b435093f7b6b02d417 +:00d6703965787ca6a5a32ec6f04d2554c5975b +:00d680c13be156efaa33f9cc07cf26f5a1e2ef +:00d6908f88f25c21c99ff4aefe4cdfe5116d55 +:00d6a05c1fc359358ec91825f8d50b22a61b9a +:00d6b04e3846b1ca74c8a45c84ab606e23035f +:00d6c099d31fa9cd31956c00537844d0cd0e9f +:00d6d07a17789d0f3884d1dce04980a97d8bdc +:00d6e0bd66883d1dfb4996b4ddf26f88e4ddb7 +:00d6f0db7905a5c8d7d27e365e17e9b1cee5f4 +:00d70093eec9886af3b458c43c7c56fce9e03b +:00d710ce331d734c7b62a90815232d6ba18adf +:00d7204d178d49eb86e9d74e1e00380f7ecb7e +:00d730d1232acd1fb4b8250493245818b3359d +:00d740a0452d35fc5995871b42f25656868a58 +:00d75003c7006c0ce57cd15adb71ddc0f0295c +:00d760650bce5e2e5dcd8cb8c2483f3c52b2fb +:00d770b2fc02b098e2703a21c888159eb032c7 +:00d780e06a34b10b01a974cc33c4989385f0fa +:00d7908cbad3551645b3c7d0d632e33faa653e +:00d7a01ec2aa77a56d65873b00c9230afbbf73 +:00d7b0a094792faeaf15c720947b448fe7bed5 +:00d7c0477fccb3dd3824bfe0be78b101b1fb4f +:00d7d0f7011c9c4976c671b462f22a2e97c6fc +:00d7e023488f77a1036aba12492138cefdf346 +:00d7f0526e7d7cf1b2e31f00724d9c82d3b422 +:00d800cdeb4749308e2de1e8aba6bea3bf2ca5 +:00d810eeebe4f120ed1e0e302728ee758e3f66 +:00d820e901bafeeea75c5eb028ceb9bd203311 +:00d8308c72608a6cdd633d275890639dfa5927 +:00d840e966bf3633d8a4384711c027614e1e50 +:00d850dbb3acc11f898b78fcae4c75971551e7 +:00d860e3abcaf7ae8106c0762ccaf2bf0d4eb2 +:00d87001ed0ba45af468915c620e73e138e413 +:00d8804ef40ce058dab139ec5b6dfd09e7ba8c +:00d8904b4caa9cf133e69e8836ee4347b0bace +:00d8a07e1a237598a243bda8327b2cd2c50048 +:00d8b06da4e932117811e046a64a34f505dfdc +:00d8c0ad47baa77acc915638d0800ac1a7e1c2 +:00d8d0a8973d63e547e78a2624630323bba931 +:00d8e0027a33c43f3d94bb53c35265de6a87b3 +:00d8f0f7ef51bcd687f5d0ef8c754d91de4e1b +:00d90041e85d33c74db1472a0f989fb5235087 +:00d910826d04dd31eeaa089a38fa4011fcc9c8 +:00d920c114962e07deaa44a86c439ddd16077b +:00d9305996d1cc598addb944a4ab86ffb57cea +:00d94025197a929763ddb35c15f2f7bc4d8685 +:00d95094849901740b44468451a82de1bfcb5f +:00d9602f53284cde5d4202eeec877684a7d6dd +:00d970168632f2c7a80e4a2d7ed65dcc3dd20f +:00d98018ec2b7e2be91c60dd90787231d89aec +:00d990291b3dc2ac04635d370c7bd52616ded5 +:00d9a04c8b6fd52edb52a122b0cdc466acea06 +:00d9b036772d2ee72db73cb1d6d74a672a1bd4 +:00d9c0eb2fe5e865b2beb7cf00ba8c6e84797a +:00d9d0993c889bc91dc0a5da3c52ffaa78581e +:00d9e0439f099e961d65c3356ee66c2d1d1e09 +:00d9f0d40cacb4c559e886d6190af9b05d5036 +:00da00bcb382114ce168e3a87980e07e9d694b +:00da10804bcec46afaaa6d9ef55601860a0bae +:00da20df1724f27a9e195c7e1f50497cfbf460 +:00da30f18a649f5fb2ba4c97458d501ee4d100 +:00da40333239e371c211f132f1a613af6c5d82 +:00da509915e44f8cb5c191071e6ce3226a3d2c +:00da60355bc58e6dc5ced36cbefb1fb0d4cf55 +:00da70b9678b2f63f1f52017093e451f25835d +:00da803da37cbcdc4a00c3c1b14393eedf894d +:00da909879e9e45b32721450c2a729d6b00d85 +:00daa09bae5343f1eabaadb4d9158c6fd83cdc +:00dab0d28a358e8ad976739bdeeefc1eba7670 +:00dac0dac2c0fe12cd6a5c1e61e56429af0331 +:00dad0dfeb197915ecce986e84e45ca82b7ed1 +:00dae0a36487a365f0435cb8c9ae58a3577b13 +:00daf0b4c53d57b70d1251ce8921dad49d1603 +:00db001567acee36b6395d995985e6f02d0ac3 +:00db107ad399a3be7cb06ab60f29852700ed9f +:00db20f8a825668866649ca65fb89bacb8a99e +:00db30a15d65bacf16e68095e6b599d09531fc +:00db40c618183d8de628cf5fdfac626174a9cc +:00db50b3cf849d5c0a9ebaa7a91897b0f45184 +:00db60f1563d34259cce51e37b59ed973863b7 +:00db7046559a737043201d0b7655ed5019c660 +:00db80810bc2ce54864c2f953db222c50bc4dc +:00db905f25c44e02c74b4c917fb1bc95becc36 +:00dba0984d3bebfedf8e17d336e93881c52605 +:00dbb06bc3b79a2f596df6d8d458721f092b04 +:00dbc095d1d614549cdad3748cfae1378ff9c9 +:00dbd09509d3cd43a6fee0468f851d037509f7 +:00dbe0693d3b93dfcb99418a7ce6e7efae934a +:00dbf0dd30e325581e94aa89adfb77e128bf41 +:00dc00c12d782c54d857f56d31b18750d84c7d +:00dc104c365cf51671f26f58d373c8e357e080 +:00dc2092243879697c6205df17e5e48c1dac4c +:00dc30fb6efe3f03c089c3f73a4b1135efd8d1 +:00dc40df83cf1cb65c7c30f815243dbccd967c +:00dc5021851ba784577d5699ea661bbd07e7f0 +:00dc60c9969f624b2e141969ebdc3c776680c7 +:00dc7082e5dacf0f053eb4ae6944f52a734c26 +:00dc800c6af824a374628709606888ccd1ec0f +:00dc90fe0d903ae1b32b25a20de2d9b5284bbd +:00dca07fb10ca61a9901a2f83b7b2e56bb6e40 +:00dcb014b2de610a2c92eae521b173ee79f980 +:00dcc04ed32abcfca2c24d29e3fd27e79ca3d0 +:00dcd0875cd3757ada975693888b95502df5a5 +:00dce05bcd87464864afbe11eaf83d2ff11ca3 +:00dcf042eafff7d403fc0bdace6e5e68854cee +:00dd00a0365b987da1d7122bf63c570e0a946f +:00dd10aaf0f9412ccb0ae27a1316bc32c91bf3 +:00dd207c668cecba72faaca930d86f894c89a9 +:00dd305af09eaa500724fee437ad619d647f36 +:00dd40b2a4dbd38a57539879439c3b9bfa3b20 +:00dd505e9b456b79f0ac95c2ac885f9ff9fbf6 +:00dd60dcf9c564ac1c4b38ab53b5e5d8f8531a +:00dd70812e57829e66ee71375973ff54522eef +:00dd80ae170f31a56b7c10e6b6b3e47c45cb7a +:00dd9083677b70dec5eef4ab66b165206b996e +:00dda042496b5419a1ae07cf84d297830c62d8 +:00ddb0b2e940e29f1f4c4c44c55dc2cafdcdac +:00ddc0b4c46e895ea2266106d83340e22235a6 +:00ddd0635f2ceb4480fa2bae4783184f15c822 +:00dde07b447465ca8bf5465c0daeab0583db5f +:00ddf0dc0fc275de6eb1715f0fd8cc85ea996f +:00de005f49e7ef83ba9b25c7dfedbe346b3050 +:00de103be86b88cfc82a9550a2fecf48a0aae3 +:00de20ff638d60188c963bdfb648206c979bb8 +:00de3051126b20651a16fc0cb969d2eecbc628 +:00de40155162832135a5de2b8c6299ca09e043 +:00de50f6520763f3cd65dc454daec7e0ef062a +:00de604b8509091002af64fa8186b94d04da01 +:00de706e71dd50b8740ec4a19574600c7c027e +:00de80b769f0733c784fc346e869043bb30db9 +:00de9093766ef6042711f0084789360c5a7000 +:00dea05deff3cf05ffb4bd0970968d24098fac +:00deb096fb30a76363596be51976c8a20eea2b +:00dec074f6aa376cfe0c94f76b9195c2cf6b76 +:00ded07b4818de7f38f27a5b6018ac6354fd5a +:00dee0c6cf900da31c09677c741d6af52823d7 +:00def08a1e3661e36f3d42dc1a15970e3990f7 +:00df00d0104156f2ae79a6437fcb35fa2256b0 +:00df100c6cb92883257d6764211a282984223c +:00df2089d5a0ed516beef28224e4f5c58b9baf +:00df3089ed11a21bcbb9f5b7895e197e7dd9f7 +:00df408021c1baa2b0dbc058286d3c51234d54 +:00df5096dc3e90a717aeecb9e1ba365d4c0358 +:00df600311c14dcec8d391817dbf21e8fd029c +:00df708e4053a61c68b5a832880269ea3173c3 +:00df8055812e09151ada01b8c8893fa36ea79d +:00df90f5e72b7f05e8f4aa9d2ecfc46416a03e +:00dfa07c1011114e6354910c38bccd3111aa4e +:00dfb07b69589294da904cccd4d11efd8fc05c +:00dfc0cc26aafdd5aa409ccad1ff7f60e43e8c +:00dfd0d3f9a6de11efaedd08651002d400c06a +:00dfe081e3977436924257877cd0887ef537f0 +:00dff0f2c2eb25e460bba86afcdb5e3582356b +:00e000f18e9e041b81d18fddf60708072cc29a +:00e010f354242904525cc1cdfa79090f318398 +:00e020282f87691f823e3b3d9d29f4c1e0aed3 +:00e030d4c37c297c18075b956daa08d6cdb581 +:00e040db64ef2dcaccff58cafe84307415c03b +:00e050048bfa9b268119f2436121f494458820 +:00e060daf38ee0056014de59ef61192dd9a4f9 +:00e070e6a83b7477343571ac3c11e0312f3c2d +:00e0802d33dd344ab6c86350d85210731cd085 +:00e09070c81471a526920b2430d7f0bb776777 +:00e0a0b5b9c85bbddb4e299a7839f3417f81a7 +:00e0b04906604be6d2771c3d77b19c8213c604 +:00e0c0fa4061ace9813e86c8230abee22de998 +:00e0d0dc8f2d1be8683554fb4d010449f2efe6 +:00e0e05f7661d982a6f7377d213448217afa32 +:00e0f0e981180adff39a1c77aa4e0b731f5f88 +:00e10007eecfc8f04facfef84ea2efe91b969f +:00e110bb9c5b023f04bfb743bd57724a835248 +:00e120efd9ae8ba4801f411ce74a5f23ff952d +:00e1300a3d9e2aa0f70c5becf16391f1cec12b +:00e140f1a91e61ffaf6e409ec8911da92e9ffd +:00e150f439de2e8b60a3b600ced7b21b597a6f +:00e1603f3e22c179b5a78367a351ceb0c9e6bd +:00e1705638003f0f1959a06da2648930454e7b +:00e1809c6f1dccbeb07c998e08efa4b1bfe126 +:00e1906156ad64a81a7c14966d94ec38446483 +:00e1a061dfb941cf0026a37fbe2046a02635f4 +:00e1b01898989832062379be164c32afca2037 +:00e1c0f37e4ce36c13f3c10871a85a372124c6 +:00e1d05d9a7c3192a56de59f3866ef7204434c +:00e1e0814a7f435a5397493b120f169f50378d +:00e1f0ce755fa9fa9285efcb628ad2c83eb06b +:00e200462ff359d7a92292169e9a412077d3e5 +:00e210cd10224a40cdd54ef25c0b993108ef9e +:00e22049c6b48cfc4b1f75ccd1403d215c8777 +:00e23085ba34ac729235776d509c03e715eedc +:00e24013a211833b97b949a0e56facee5463d7 +:00e250eb7ec5d81d9871cf0db2779f6c519617 +:00e26044d6241e4c8c359da31775d124f9f3e9 +:00e2705f610b7701ba480746fa96a4246bc3b1 +:00e2809fbbfad1417add55b743ccfa1ad27577 +:00e290b988a91909efc3b08db34cacfe6775e3 +:00e2a0dca285077bd7f3d71bdd8e6f4af3997b +:00e2b0df87a35081a2a2901af4e41a37c3b416 +:00e2c0a349cdd1f10f9fab4c59da6f1ce3458f +:00e2d04ae268d470e4be7a7ddc9ee5639f4f0e +:00e2e098f0b8773887f9c61fa09887a54dd2c5 +:00e2f09e35f0021ce372ea717264c94c5bf7df +:00e300de9bebf4faee912546d003861fda58de +:00e31075f3957d1df227deaad583abb2655d82 +:00e3201b633f8f4553c9277d881f67e25545bf +:00e330312cf370b26d2df585badcf76bced4c3 +:00e3403c1bbabd19aafea9cd672ef13c927031 +:00e3503e11d7d7179a6fcea1f79924b260d46e +:00e36085886c8ec27b11819a550b3f2f285ed8 +:00e37051a17f7aaf5ec848792ace298f169a35 +:00e380487c56a908557aba0ebd5cccc88b61f2 +:00e390c7b5fe5c1e73aabc86a5f9cc0ec666dd +:00e3a034bd751135dec0fac2a52ae1a650d97f +:00e3b0edd3262ff0328bb58e5e8ef7f03c39f4 +:00e3c0f500d8a7ccd0a3d14be2438f960c3a88 +:00e3d0dcbeecb7bdb496595c19a72f6c90cbcd +:00e3e057beb8c92b679bc75d08bfe250c3fcf0 +:00e3f075426149a76f436e30653ca44fae4fdd +:00e4007acdfc02c74607f98aefbdf5d48181a8 +:00e410f226c6849e8de70183c86b12f1cb694b +:00e420dca2c6a774120cae20ccf7aa08a22e1b +:00e430de15579cea1e430092847ee85dfbde43 +:00e440f277b9d5dc3425f6e0861df54140b4c2 +:00e4508c266c1ed9d961f671b262c0a05d97c0 +:00e4605553a48571b53334352ba4c600c8dcf1 +:00e4703723f49d2b094b1235817fbcd4a7e5da +:00e480857a2b21f192a6f54fe6b333f470c5c5 +:00e490cccbc6214c20005d0dcca45ae182b8ae +:00e4a0ec33fa46c47618166f736a478b758e77 +:00e4b00e66abdc8234cfdde82d586c0b2dde31 +:00e4c04f35a26ad96c6eea0b655e4a01844f2c +:00e4d09693b48a2be620c1cf9efeac799cfda7 +:00e4e0c238ef761ac04d12da0aeb363baa8821 +:00e4f042c2a92edeee5c3b3d0db8fcb6386274 +:00e500a46261da27057686ad436f24a53c0113 +:00e5107c31c08d92b4a5f57c9be9e9cf9ed9ab +:00e520d8da7ec1868f1bf8ff6b1e250986c016 +:00e530d13481654af4fbbb1ccf653d3a6ba0e2 +:00e540832bcc290a322897b161f385c1816493 +:00e550fab5328ae07cb129ff0ac5492eceafaf +:00e560742df4c9d9c6c514987a54c9774599c8 +:00e57044bf4ceae214e5c06978c57760d700e4 +:00e5803fe60014a509f573f13b9c3c9b3823f5 +:00e590000b9f44c502257a84aeb2a9be31c3ea +:00e5a0872fb57eb94d6156b9a983be5127cca9 +:00e5b07ef87c26d15e7758e0727111d2116162 +:00e5c04496fdbd9366056f950c840657eae56b +:00e5d0ab97ed0048262c107e4236a75cf433d5 +:00e5e07e098bc9c28100251cbff1a2225da97e +:00e5f0f672cf5da4634b5807174fca56915ed4 +:00e6006a9ab7567526687f03636ad0296dae76 +:00e6101cf54a713e6ade7ece2eaaa854e49a8e +:00e6202cfee2188c26bc5566d25dd36aaa9814 +:00e6308b67fd4bf160d2f8c57f37e3d2898d93 +:00e64048d18199f2597ae0540b61cf5e7306d4 +:00e6507ae49ddbbbe11a7592749681cb30ff2f +:00e660c39b6611d17f45e24eda8f0a5fafdc6f +:00e67037a4dcae02c79e9507d2e9c564ab38b6 +:00e680bf9cddfc840ae6bd06cdd8325969dd98 +:00e690befafe07a9cd6af6790b7aa64c83dfb7 +:00e6a0d383bd9b3256ff7ab814ea14336271e8 +:00e6b0cb1a36b6f0a2081d8d51a2464fd76235 +:00e6c0bbaca3543e57ff52456773083afce84b +:00e6d086418849cbcdf37db146f7014539110b +:00e6e0566f3ff185f24aad435a4bb3130ada7d +:00e6f0153ae746a4fc9a35b3a0a28f1f2173b4 +:00e700ffe9a132ac020759941da43ab4f2a44b +:00e710c7e56a8ed266d1384dbe4cef35a9a452 +:00e7206c6c99681f79f59975b93b60b57890a3 +:00e7306b8f7bd9292e93f05401ba58d22f4154 +:00e7408d99e5923be118f8f0fd45a2d88242a2 +:00e7509bf9a0dc46dd9dce0aefbe36d56d46a9 +:00e760a8220e31bcc8249303341344944da8c7 +:00e77004f5fa6ccfc9adbf2bbb2a761b8cc875 +:00e780ccc3aa6021be0d6e479b89a80aa7fecd +:00e790ba7c2e24acaa934e6f92c910fc1c84c9 +:00e7a06e4fae9c12bb2d072c693628f057150f +:00e7b0ae4086edbbe4ac7c7d159be245514202 +:00e7c084929e28c07cdafd13f77a9fef277ae6 +:00e7d0aa173fc0f14aaf5c646a63070b26a418 +:00e7e06d427acae8d537fd4b037d7973de9f53 +:00e7f06dd04978f198e51a048d0091695c2ce2 +:00e8008e3e14834b5b9493d0c8e0b7c44b1302 +:00e8108b2a34de3d403e6e8df25e742e3a7f8f +:00e8203324e34b7fe89a127c793036cd5e35e3 +:00e8309c3e1e55eee3aa5086e0b5a649073ff9 +:00e840c2942b98422494cec00307bcf8677523 +:00e850077d20edd82cb7ea57bac271c44469d3 +:00e86075dffc7994cef5ffdd980cf0b7cdda07 +:00e87069de0970c85de5b96bde5312a5fcd9c7 +:00e8806cc96914431e0301e7201af2bf4ff6e0 +:00e8906f203d8c3d26f9741e1d5c867020b231 +:00e8a0c4b97b4914e787ec8d9c67928c2e4fb0 +:00e8b0fd0078f45556b410216c29245e1c5771 +:00e8c0d08ebbcb565dfd4678784438a12ee2f0 +:00e8d0a6564b3e606bf8f6b5095290d83fa7d7 +:00e8e04262b8c35edf9aee51e42f1159c5373a +:00e8f06c5d898e3dc89a55571b1c2bc632903b +:00e900f638567fb1a785aea18cb2fc7942ab56 +:00e9100458d3db6c413db9ca268b288c9b7f0a +:00e920653ada63c744683b345e4106ecae80bd +:00e930155e56c91a93da1fc00127d4c30fccf9 +:00e94023e8b056f9041fc8ad9157ddb041a90e +:00e950816c49273aaaa2aeffa5adeca4fa460e +:00e96028c680bdf286081d75cc8c8f3133f6bc +:00e970ea3bd84f42ce1456e27249bec8981a2a +:00e980d2df71ac03f22f7554db4fdf4448c87d +:00e990c75a6bf1153e09e912b2c615d16b46e1 +:00e9a0705e89bcd6c10dbc246dcb3dde3c34af +:00e9b094d4810e84c65febc1b0bc9d80d24f28 +:00e9c03055fa6fb3b67a4d2ec3fea016786d58 +:00e9d0abae0410a0e59c5bffb6b7e7b174fe1a +:00e9e04505dca2bde3ce708a7ac90f9b32e5ab +:00e9f03f6608953a6d48776dc3f538242a305c +:00ea007c62fa18744ea9092acb4c08b142ece3 +:00ea1094c17358762809956a19a5426b9ca00c +:00ea20bff1cafa5ea0da0156e3df4e3412cb5b +:00ea30e2d91c02be8c9c2f05b6c5a305a3fe18 +:00ea40c9a64f7250d8e437d338a6869cd464cf +:00ea50fb2962a48df04134adc57e2354605520 +:00ea60f21b79169a39696e6db621be50c0808f +:00ea70cce5d5da971453d2a4388125ec9e92ab +:00ea80bc2e9843ff7f1d72563326837d3d70b2 +:00ea9034520230f281012f656a05dc618e8243 +:00eaa0c1a6de4acf64d23ad01c6e16f00a5e6f +:00eab01e5abe60c58250b6c5f468189fdd2d93 +:00eac068ce639e89c3da4c32428ec079d97b0b +:00ead04b8420c7fc4cd142e7175dc8d1c91e16 +:00eae04daaa84906cdddd6552bd83bb0830691 +:00eaf06f2e30da953b4055e5da73b3f8bdfba5 +:00eb000f7d8bfdb68730f8cd59e265178d7000 +:00eb1089973fbd493ff7ad786bf8c7703c24dc +:00eb20aeae9dfdc43faf194f91dfef5aa3b441 +:00eb309b4c5d25cd22d5feac04f2f17784db23 +:00eb40b7ab275b816d7058a90dde9f9e5b57ef +:00eb50c30329e66144bb2d0a23ccb75aed35b6 +:00eb605f386c53854478ab220413bb373f998f +:00eb70f765978664d230f2d7b2797b49d46735 +:00eb80db7d3a6ec8c40b862b4883cdf60bfdc3 +:00eb90eff403cc5545e0981b7832056b55f3d4 +:00eba0ea073993a7d402847028ccade72839c8 +:00ebb06c3736023d6dac4f2060a50b5f0183f1 +:00ebc007ded5fa99bfb126c4ba6e9087a0be62 +:00ebd02bfae9b52d07e76175ac098fe193658b +:00ebe0e867b28a84c4ba456137ac14bf12de03 +:00ebf016d9504e91f4f869f12cd17dd5fa1f0c +:00ec00e1cb70f9af119feb63a4c750e77e3aec +:00ec1098847f9361fe7ed333bb516e65a1b7ca +:00ec200b7b498f57111f5846d75d4687f0df34 +:00ec3020e7d584190f324b8b1f4eb195cdcc4b +:00ec407f0c65624e721270730a1e4e1d653f46 +:00ec5097cee38b93862032e981aad8b1ecbcd4 +:00ec60328a1109dfc6e0038aac0bca6517a042 +:00ec709d8a158248820b442b6678110eedc15f +:00ec80dd120e0aa5dfd740c7bb43a597f06b5c +:00ec90bb46f0eafb5280b8ab03d60772e58183 +:00eca0a263cc829396c946f50e253f002af21d +:00ecb0905354fb9c2bc136a8a429725fa4fd0f +:00ecc078d54ba456fe01b25013b5711cf4799a +:00ecd0f0c61041e9d6d39747379937b29762b4 +:00ece0e5f9793a504aaf069a7c5db31ce759a3 +:00ecf0bdd2771b62d42bd6621fb60dfa9ba898 +:00ed00863e743d8b45519c097eb0426eb33086 +:00ed10cb18bdc1c9d4b7d48af94293c3911e1b +:00ed20b3927072dca88a4a62d34b4822bac543 +:00ed30c268ed9416a48dc69d504d78aed1a67e +:00ed4067a8310b6a5b244d73e6967bb0ab5f38 +:00ed50d5ceed4a0960df44d52decc77d56a7a4 +:00ed60b76261f7d3ffb23610b1148ec3b597f6 +:00ed70f3b6a203ef0403fa02c71a385dc13d19 +:00ed80434387c1d57fd850143d9759fd1f220d +:00ed90c5fc38c1ca9157c138b4368cc1e0fbc4 +:00eda0df96f5b9530ce4f3b49376e8ea38c776 +:00edb081f400202e7ab3f848b770e36381799e +:00edc084ebde0357e708952fbe4c0eba3c4f94 +:00edd0ace16f82432b8eed5048337c8c6e89dc +:00ede056e16967346b183bffabeb18e8a5697f +:00edf0c5046d2dcb70be094f3d18eb20aeb800 +:00ee00f7a83b20e228aaa74dd49af9e6319115 +:00ee100fc4e3640c5d1dc8e38ffeb8d9257031 +:00ee20200a13a89ff07f9fc4382ab3402eb28c +:00ee30cb0843ccd94a677efe328911923e31bf +:00ee403eef2e12444b64392590d2efba7bbe1c +:00ee506fa49ba2b3f18ecae86a12eeaa72ef33 +:00ee602d162c92e69a9da06b288eb0ce20fc1d +:00ee70e33ce77a23dc52f909809f4861d6589d +:00ee804b41cf646e80a4dc007e25cd58582881 +:00ee905e9941369fc9fd0f8a4bbd84623e9b37 +:00eea05a57556cb354c5aca2dcfc465bee43b5 +:00eeb0a392d8bf1a27babfcff6e02a38c35c95 +:00eec040a095d4e455d0850ab246a50e8dd006 +:00eed08d61fcca62a1103ef352edb9a72510ef +:00eee0b696cd84a682ac6def0b5a45347f156c +:00eef090decfb519cad5cab457b1e4a7da4a04 +:00ef009217433d2650d0a71af456064fabd8e0 +:00ef103827bce89e5a52ff8eb5fabcdfa775b9 +:00ef20d08cd909f200ab31be3f442f1b2c6999 +:00ef30c71de4682efd1f880aade283cde4b93d +:00ef40ffc8c54bbea3dcc3ea6b7f774b445ed3 +:00ef50aabf051bb8364c6e7d4277e2b9a18d48 +:00ef60cc81da7ce6366d4da3d44cc1217334a3 +:00ef70e088779afad666c21c31b531b1e2be1d +:00ef8000fa9b22cbbfb292c58ec777305bbf69 +:00ef908bee1b48fe9dc5de5ac97b934b6c93b0 +:00efa0c435ced88e3450cc8e51ba05bf2f04ff +:00efb04a514dddb8de10afbbc5abdd06cb2c3c +:00efc0cc971dca0ee40f88071ad04f2e5974f1 +:00efd08cc4f6778d92dd7d3f217060036c5538 +:00efe0649bea572d836e61aa1ea2527040ef90 +:00eff08be41f139fdaee6894fe1a62f6a28588 +:00f000c56d5949920328f160620fc10dfd6cb8 +:00f0106c69690063dbe5d165f270aad295a912 +:00f020e23d90c2495b26f825e999482a2d6e6f +:00f030fcedb296ebe19839e1d820a5514c64b8 +:00f040e92d7303849472c159e4af77f42c1d68 +:00f05054bcdbf67e419aeb9a24b45afa8234fc +:00f06028e393f63b50b24017418649e4003a05 +:00f070a698cee9bdf9843999743ef7df25dc65 +:00f080ec1021e3cd191dece09d30421846ff12 +:00f090d205f809ef5126fcf272a59c472464dc +:00f0a0c8e415e034404993b340a8eea1ae71d2 +:00f0b065b902a49a9a738f7c1c6b8db6076c45 +:00f0c02c3ffa10c0f66ad5327e3026680ebb61 +:00f0d0e4b552234b17f950ddb621751251b455 +:00f0e0f71bb58b1da34932f9f34ef84f626cdd +:00f0f03be4857ea2132c769f1f27c72dbfe2ed +:00f100df44a8272f6adc1d4bfbed69257d1f02 +:00f1105d9b9df1827c14e0b98f085b37decb5c +:00f12032d5f2f26d4ca51b5b1b9c21c950fb35 +:00f1308996225a2d3e387282a4610880845937 +:00f1407d307209211833118a38ddc8eeb3d30e +:00f150502350a9a6f5799ad1ad724fa7fd9e15 +:00f160dc0f29c9e7e015c9256f84c3e076fcd8 +:00f1709068a03cad0f362cc566860c7402800f +:00f180193bd7cdb081e3b13ae0a3ef5b740e3f +:00f190cb9a443624a9636f7603ba6284983f82 +:00f1a063006e65d46f3a285abe4e91811c14e0 +:00f1b0e076f3e4f80563d9036165cde650b9c6 +:00f1c0da5fb48706d7479dc1c824f0da26571e +:00f1d0ba72a9a9beb214260e5ac447b9650e8a +:00f1e03cda4059c93bd898c8497f60ee1312b8 +:00f1f00c0aeb2985bdd90f9d849d77d5092529 +:00f200d33c5b6ffa666029b0910838a1d0190f +:00f210a4c712a38894ae93376bab975f1fc7e2 +:00f220936699020da664f97623498407a054e3 +:00f2305febfb59f9f5cda72a8369d0900c900a +:00f2408efd20e15ff8d662bb2cfb596da95df4 +:00f250658d73493beefb0d4f30f8c9c621920e +:00f260507a216b26610fb120827c841ef6cb9d +:00f2708daac101a66bc98b6639712f2169ea64 +:00f2802d07fd9eb6632fc3af02bcaf870e6ee4 +:00f2906924a52e8de0cd346b23e39da4d0d789 +:00f2a0178b75ba3c7dcaaafaab9aa6f023a882 +:00f2b0f0bc0ddc661dc7bb6114f9e8f762f852 +:00f2c065411f51370190c9590e0b7ac2850d4a +:00f2d0c8e4f7666e1d243be52263fc3aad7351 +:00f2e072e69c0cd75533d9465796150bc426d1 +:00f2f0a030d12a549fe90ce005c45c7aeb8729 +:00f300a5c746d2699773c1186c48ff33032d52 +:00f310a4a5591144033e286c837e0dd8d942e9 +:00f3204e3c384793e81aa062a553540e66e617 +:00f3301e7b8d958a092787892f2c8f28403b4c +:00f3403afbd99971464363af50a834d3cd11cc +:00f350752162b47d958739aa657ede7c498aa3 +:00f360fff1c0c0a7c9a7e9af0330534621af29 +:00f370cb3a42486dce4d0574199730d5e9fcdd +:00f380782c9f42050cb3de1bbe65e8d2d0ab76 +:00f3903c5897cc5d833c2a24b39ca431560b43 +:00f3a007db80019d4fdfa733323e993e7a2134 +:00f3b0f8c042cea82a7e04acde7a6d9e1b2a91 +:00f3c0a1869d717c986b80f0bbfa656081c6e9 +:00f3d0ee1830c54a288751b56098f7a9ea0425 +:00f3e008009149290f18f51a088bf9704a1feb +:00f3f06bde7ee3b0fb46113284e6f9510d3bea +:00f400b17dd212b38a5ed15f6d611cee7ea215 +:00f41053be3336522cf5036893ab68876e55f3 +:00f420f90bbc890ecf938fd67e97a5bbef8e33 +:00f43021f5eca49d6c393248d179627c164b28 +:00f4409a13a8e764c7e8b6de8cfd9a7113d0cc +:00f4504a667996d765097af8ab441f624e3129 +:00f4601dd183d2596feee0ae0dc4d32e64ca85 +:00f470e4db04836217d9a2aad5b6b921d5ca21 +:00f48055f5ffaa846fee9e53d18597ff4d8cec +:00f490a4ce28c071b6ccc5c5edea554349ee0f +:00f4a098d21f8db3fd2bd0c33514261ff12642 +:00f4b0de52d29a3d8edeb12623dafc24c50d55 +:00f4c01bea9a22aa7470719f1092b1d6f8583b +:00f4d060d4c5562d42fbd52d1d3e5a4b32fa12 +:00f4e096cb36edd0a49e462f858296e02dc9fd +:00f4f040cebca61ab5dc092b1771a5742c7de5 +:00f500a8a8383cea4448bcccbfcf97af72a578 +:00f5100e1b7d6a7234cc9d0f0e5bd96a077529 +:00f52078facfed59f1aee5a0ace35e877a4d25 +:00f53046d07bb9211a7f36c8090df81dc13524 +:00f5408a3cf92b6b27fbccb1e300a93a007404 +:00f5501cd457fceef244d49bec15f6078ea4d9 +:00f5603465b92db08dcdfc70718d634d5e7117 +:00f570820ce9ac549c430a9f0a8d2e07aa764f +:00f5806cbe21034a04880642c963b2c1847452 +:00f5907b4c262d8d8fb3bd3b28ed241ce3bbf5 +:00f5a0ec67f1e50701530db87a43cac64cb0b9 +:00f5b059b5af1096d6e9965fc40e46472ac542 +:00f5c0a77eeecec306827607756a31fe2d7eb5 +:00f5d00fe893cdeb5030a2776b452fe007d5ef +:00f5e04be1178da8da6093bffc152e199eefcc +:00f5f09bae13a52cb9ccec953a1a9601ab2e14 +:00f6006451d2f0b172a81dc47b53ae5ce328b3 +:00f6101ecdcb22aa2732ba533b7b98f4a05bbf +:00f620052484f76d44ee8f14fb654f1cecd27d +:00f630f4a72a2dfe33fd94ba6f4fd7bc033c73 +:00f640de09d496d1dd944576591d643c11e27a +:00f650a6511f245390ae11de5c3539a2f464fc +:00f660f044332abafb2f730c5ee41245a826f5 +:00f670abb1fec00e9db697e4c02d64c3bdef0b +:00f6809e382b3fd0e8e78dd3acf3314ec29c65 +:00f690f10efe820975d82207154e9f0c5f02bc +:00f6a0206617f87f80d24c962217752b2c42dd +:00f6b0dbf60fcfdb72e477af7ad6cfac28c4c0 +:00f6c0e15b68301209b79eb54ff4fe05346b58 +:00f6d0f0175876f82a75abfcca5782ad4b692a +:00f6e054068e68e510f70eafc7c0367634d700 +:00f6f0d5d942d4a3faf1880e336aeb85dbd709 +:00f7007858058a97ed4d5c4fbd683ebe14809b +:00f7105eb728e87c70aee8b7ffeec4de9df6a2 +:00f7201954c23bf41d4793e3f029708074a57f +:00f7300df48608db2e5066237d616f412418b9 +:00f7409f9b71c582dbf9b00c935b1f26c09860 +:00f7506b898333c01e64aa478fe26e79c0e7a3 +:00f760733cd457bd1f65f8f69c0d9038aaa660 +:00f770efd322703cfc54de565fcddd41f7f84a +:00f78018c09b0f4db9dab47b3882e719b647f8 +:00f79092b8a5e70e8b1f9827953b278b25f7e9 +:00f7a0e3b8f334cc8ba68298adfc159c7e36a6 +:00f7b043a448bf6c0cb77c7873d6147e5a039b +:00f7c04892e597df92e3ba004fa0e4202b1dbd +:00f7d005390808631b7e5e801966d94540014b +:00f7e02d1fc311022b8eeb58441b852a40b7ab +:00f7f094808cced430aa52f1e8904cb6e3b845 +:00f8007174620d236ad3e22b82b964bf2d117f +:00f810e20ae8ff7e70c1f9305aba5bfc078e6d +:00f820902d006d25ce19e7f2d3307712448e2d +:00f830074c3b3a472b5b5d151d408d395a5de8 +:00f840fa9f4c74fef26347f241cc1c39f81878 +:00f850008d0d08de6ca613e5f6b54c8272139a +:00f8605e9ede26f5448ccd92ab21680d6e4506 +:00f870c184ebf0da3823880f9a84c03aabca8c +:00f880a4af0342d94bc8087f5a27a5cc3490c9 +:00f89056b614622d14b81637ae9d8af1830f1b +:00f8a0c87803985d3801b2272b1422fe18b826 +:00f8b0cdf90ae61a4bab8a9e7475c65d99cccf +:00f8c0381a99ff0c2dd0caf02b98ea4c25f79f +:00f8d00a118231e39fe57df2224355e8d4d6b5 +:00f8e0f0f489fb8b4ee5eccf5d5d8dd457ae7f +:00f8f02560a695c022c14c86b0cd474bfb2cf2 +:00f9000dfdd43decac1e619fdcc8e96746f716 +:00f91089b7cf132940f4ff5adc84682d6e93d4 +:00f920d45cd5edb168d50fea8210a12f26415e +:00f9308b060dbb08f3e82094c4bc6532a4ea8e +:00f940a1d2f801d6c0d4258ddffd23c56005f9 +:00f950126350799808d6b499bdf023a16d3bf9 +:00f960a25dd2c443857a097f9d634341490866 +:00f970504bdfea2a0c24f81b265459a6ad1c24 +:00f98084b44d9145a4b362dd4ba7c5025a6b2b +:00f9909673bd0e6b0751d6ae31b0ffa8db6057 +:00f9a062b24669fcaf3b14aaca54a026da509e +:00f9b0227bc5b08d2d06366b1131534e9429cf +:00f9c00c102028db5c679c2207a34d927f5f50 +:00f9d08b7556e6ddf1d30665c1b5b09b9ed1cf +:00f9e0f9edffac3af9991eef7863027c8758ed +:00f9f00628b1deea3ca18ea39b7faca0420690 +:00fa00cab719a4c9b09cfea9a4d78eeafacfc0 +:00fa101cb6e0a1102256aa7f5d14920d3bcc48 +:00fa200aa6d787eac72520bff2b7a19e7cff49 +:00fa307e214836ea63aa152677b6064e8c93ec +:00fa409676e26007e67058fcb5541b1d872544 +:00fa50975c893b6e2b20716a482cb9ee6ab4ad +:00fa60f8ad75d73985c2261f320a1a9487dd46 +:00fa70d57fffa1c3ffb919104d6bc9f3cd45b7 +:00fa807b7909a892f73edfc6a8368b77957a03 +:00fa900bfa5b5ada581e93b909d8c2fc05dd0a +:00faa000cd7a9a016893ae90b658d336bbb814 +:00fab08a2f82f2a8f3a13ca826fb61081f5500 +:00fac0b205b2867aaedd146be91c237df44bb6 +:00fad0dd08a40ea76e46a0f8e6e70f747a6a39 +:00fae056ccfc03875eea99384adbfaec4d59f0 +:00faf095b6da6841f3bdbb03943871be33ad80 +:00fb0080f99e0e92ce00f41da79109f96c05bd +:00fb104a2f215e0fdaa553fb2867996910a9e0 +:00fb201ed0a2dfeb6c1255224ea1377f92b998 +:00fb308351b59921577432f31310c22cab8f84 +:00fb40f8aea70cfdec5e2deb30a4039fd58fd0 +:00fb503bf03bc1f449f8d206bb7f99d4cf1a04 +:00fb609b053d21ad3400b6ab62620c605234ce +:00fb70dc18c5095cf107e64edb88996a351255 +:00fb8093b158cb281656e9dd1fc344bbbb56b6 +:00fb903f17df3114cf9a657825fe876356d76d +:00fba0e6c5cd95224604b81390f0a9b122d646 +:00fbb07d30038040a0fb2f09f9d3ee4fa78d61 +:00fbc05e05dc991f11a694578cd3b41fc66351 +:00fbd0fd24a072ce78d060826a22dc062c9a94 +:00fbe0aaf28e5e3954184fdc361fc2731b3414 +:00fbf068db537784038ce0ba985431f6272bfc +:00fc00bd5690c2b6fdb8feb7034de366702948 +:00fc106ea21fdb6c5e6e78cf15e5ad8114f342 +:00fc200c7bb5ec814b4ad45e41a6d87e74214f +:00fc3043f9d5dcf98eec945edc3dfee138372f +:00fc4009e87a1ed48bbb4972aa2430e43b0b82 +:00fc5087c476a841776437b28cab8ae7d7abdf +:00fc60c23797c197678a5dfa1f2a1802263d56 +:00fc70edcad81a92a6216cb6adae31d843d9de +:00fc80dd9ecc278cfc4a4e5843097c701f8f27 +:00fc9002a70fd464db5433c8c28355d952ff54 +:00fca0f2a198e981852b0c19695fc971307552 +:00fcb0538480d59855182ffc77e9a8e788bfe7 +:00fcc009e047e6e09ba0d4f493d7405e0a2b03 +:00fcd0074085ce9a68a2f23041301e0d63d275 +:00fce01c9bddaca37cfec6c42d7977ea792fd4 +:00fcf0ad5533755ff5883f991e7d915424ad9a +:00fd00216bc9f06dccf64fda3211cbf81a9fe9 +:00fd102965908684056d3e0e4edf718c8c2ae3 +:00fd206c57e90655ab04899206bd40595d64e2 +:00fd309a7c50a3b522c5ff850ce2ea6bd999a7 +:00fd4038476ea15a2097ff0b38ce9fc85890ea +:00fd50a162b14ca6aab0f08c0b10f531b3a379 +:00fd600d0d3b584856ee9a99a4a86be3cf07c0 +:00fd706e9f18045d0de77c4233bf4f819af213 +:00fd8057246bcb0541439bd844d295f1d07085 +:00fd90b4f9096089f53def5bc3d7a470d77866 +:00fda0fc437e6272edc59d5b7a8df9fe9462a5 +:00fdb092c98f17da49fbfb995cb4585d27370e +:00fdc0ca57aa4697b33e9ba047cbebd1a89cef +:00fdd0bd8c900a3dcb62feed48592361449e86 +:00fde069cb741f5b65284ac66d4f0adc71e4c8 +:00fdf02e378c6492b972e308b256f5d0784fc9 +:00fe00c6b3a257af5c4a57697817178a3aed90 +:00fe10ab056937437d775b85d49b86d330dbe3 +:00fe207549778fd5e1c36dbf7861a62c2c3ece +:00fe3068496b39d97f8273a80067657566dbf3 +:00fe40673f58ae632f89760203d5011ceac69a +:00fe502ec40df55f12a9c0b163e85614fae2d9 +:00fe603db4643e8316bc17d0f6e0cf4ec23a7b +:00fe7014c71222f6e8fcc267ad4f3ea5d6d153 +:00fe804498945141ae08dd1ded89fc3852d470 +:00fe90cbf65cdbc8953d6b9906220e131a73bb +:00fea0c4748ad1d1a9c7aa285d6636a05c0c3f +:00feb0ff3110b87fd98a12eef678219cc0a0e3 +:00fec0544e96e78398637c721df5c40b3af86f +:00fed07b040d3833caa5ef0bca0b87e1cac3c0 +:00fee058276c2a1d47707ca8d5074fe68bc8d6 +:00fef00e84e71d5e81ecada3849a0e5571f964 +:00ff00308dbf9c756f5b8ac85edebbdd7defb0 +:00ff10b0dcc954da9d6bb252d90917f1d5cd80 +:00ff2019ea6e8655fceb165aa3cc0cca9828d0 +:00ff302b88eb9992b0e7f6a6f65116cc98b6b6 +:00ff40eba7c5196289173dadd69216957e531c +:00ff503f829e32a0a3ecf7b37ab9432fdced18 +:00ff60a09841e16fc96849583f8bdad81c7ff9 +:00ff70a5c6a5424d7b17b77c8cf8e7bcaab45d +:00ff80f94c2c38ee4f70410e3b02331d0026e0 +:00ff901628c672b634d563c89824d7e331e92b +:00ffa023c45104b8e4aa6358850fe5613812cd +:00ffb0246ec5984a0456e80d10737b8c0dbf3d +:00ffc0d58b862546dd8eb617fa91669fd84870 +:00ffd09477db807b8a518e93b9ed2a143e7416 +:00ffe037a3b2963829fe4ec51044697c098ea5 +:00fff081c7ec0da0e7bcde0038b3f57390587f +:01000013b525a6c2dbbc2d0b7c9175e8908e3b +:010010f2bdd0069b7dc4574085074dc3019f30 +:0100207a1039c50350c0d5e41a02b3c4acec08 +:01003008a58ef3d308057079b8bc1b87841790 +:010040333a055b872b279ff86981d9fe4abd98 +:010050473e26116afbb3734f50463f40c7f7e8 +:010060f412c8a87bcd1557a9fb8c804fb4a14a +:0100707419f3bb19823457e3596fdfa00c5c4d +:010080fbb343b631021b1f06850e3a437df151 +:010090f2ac9ca1d758059f6efabee33b7f8fda +:0100a0dee9e303d48600300f0c67db88b8ad90 +:0100b0c67a049ddc1511fbee20fdbf19f05c60 +:0100c0efa240b192c66e49ee00fdeb5151aec8 +:0100d06894893fdb89190a71d1d2015a42f758 +:0100e0441a9de0aa3656545c6711617d2a9375 +:0100f0e66ae142ec8d4feac1648349fd3c4eed +:0101008cc976fde0e321c776f94e14a41178e7 +:01011013ff4d4cf9e2cf37744d0d01491f177a +:010120b37927d56665ac7909512239f8f2c566 +:01013062a93bf7293421fea249c796035fbaa9 +:01014050c5ab84899dc33a496c4f567733593f +:01015016062111f32c49cc9e4bbf9dc3b1c0f8 +:010160ee18bf7eb79b14b550bb97f465edc061 +:0101702e3008bb85e8b08a89fefc0906237e52 +:010180d108fc2830d6f9f444fbbb2372254a00 +:010190eaa29225995350495671c7e4d9f82a20 +:0101a0a68c636a8f38b2fcc84e09f7fbe18b4c +:0101b0e7b6ba52d8c6a78e7c8c66296eedabd3 +:0101c0731357e7610e110430147e14c1fefdf3 +:0101d0764b1476dd59c2c91534ced7a6817d61 +:0101e001a08d6d964d0987a0f5fe717b40f2f7 +:0101f065d5ab7833fab41f60e4b4ded5e9f4a5 +:010200f97c82425c34b8e381dfab64d533912b +:010210d61eeb98f26ae60990f7bb7acc1c39b5 +:010220f1232a43361c6d2cdc0db9dd81dca27d +:010230fe912f6e95dafcb9771714ba635b746a +:0102406c446dc16b4e8b593ee2d868b741a42d +:0102507616215e1ea96b4f05c7a1dbf5a63de0 +:010260d98d301724c28a586872123e241a23aa +:01027008237321a756b8318206b1a6583ae93b +:010280d0b9dd2b51c61a837318faae35d921bc +:010290c6f83af7cb41af5a13577690a4d4e883 +:0102a010d88227515daac5448df3ae629c3600 +:0102b0ddc2e85c1275ce10f5287f960f5381ac +:0102c07e6d9c1bbf3ddd4cbe621f80a586730b +:0102d019babe5992e50a7e7e0667ee47315252 +:0102e0b6b5ccfabd4f5d5021bf382879af8021 +:0102f0466659033b7fbf6f8e3aeb0be279bac8 +:010300821625d6373edabbc4c34a485bbcd2b8 +:010310a60a9c48f3adf145f4a7dbd95f04a2e2 +:010320098d148efb1baec5c10076b49dace42e +:0103305bb64e0948fcb1c252fd5c2367f61dd3 +:01034058b2cc6ab9333f048c4d7bbb42134908 +:0103504e170ef1a8d291866b8889bdb7b65471 +:010360b5690eb65a67de9bc5d1f39d1b0dff0a +:01037030bd76993b52e86a24a2401301d347a4 +:010380e7ebec0da61b4537a3fe6d8bba302a59 +:010390ac8bd5050b3393b068bb665b3f7f8905 +:0103a0dd67bfb2c2708c46b29d91211dd5d553 +:0103b0a766c4251b6ed4f040222f24e6c56292 +:0103c080aabc482e10edd3d042818eed332571 +:0103d01263f885e32fae67e7fedd38b98145cb +:0103e044079c4e9539e691f201c5f905f03003 +:0103f0e4de172373f4207ccb74ee6f0b5b4a0c +:010400da9bca8462e5028a1a69063e5cf28c8a +:0104107317ba5f387f22127576cc1f6655dc65 +:0104208b0f0cfe81c92bd3cf0aac2066af3b93 +:0104307a16cd6e3be094f69a19c75a52a2e06f +:010440ba4413904acd54bbfb276d499c74cf1a +:010450002684725ed6bc98eb13aa699debf3da +:010460159497edf35f4f1849a5b09b42078ce4 +:01047022bd76ff783500c0caff9271f9e8cff1 +:01048049dbb08699945a95debe1607bc64c246 +:010490e416f311ae8f5b56b3f14876efcd035a +:0104a0556d9a55c274f48f3f580d87b1c6ec66 +:0104b003b510e2c3bd17dfac3e5bd45996c4cc +:0104c049cac8f84ce7ddf5103e5051c3de4837 +:0104d04418ff415cadb66f69576207deb3d642 +:0104e0a772d3d14637d8191bd04c652ea01db0 +:0104f01c1f1d8de961c448f493131a017500e7 +:0105002aa5214f62b3f77a38774fdadd0a6249 +:0105107fd8e7fbae23e8d2fa0179a47821f0a8 +:010520bb9f51ae80ce3559775d92af6db4474a +:01053062e472c6b118ab8612d46971bace67ad +:010540bbc1cc2d85a2c5a244f703e62c4710d9 +:01055058ea9e50d8ecafd99eb28216c4d379b0 +:010560ce245ff3492a62ed0f57b6098a273b42 +:010570981518c78643364c05a34b6c282990dc +:0105809c13da5d55fba1e17291b87ee7f9383b +:0105909cb3a7f3ad8393e2704d1b8123871d1b +:0105a0c4b7ddb4dde967c75657b7360eab7a26 +:0105b00d2c5cc37cd976f23d16a246ae5bf578 +:0105c01c1caf7c24a6fa7795c8be87de13f925 +:0105d0ad6ed1cc52b7d003fbc1b93e975da25d +:0105e016cdd68d7e73b77d26f3c252cd697182 +:0105f0eae48675746aef59cd2d2132798feaa5 +:010600b801be7c74269be27d1882994e4e6fe3 +:0106103d1156415cd1ed0ff2e4d3695ffaa729 +:010620f16ac0640c14f7058b2e30a71860cba7 +:0106303017e7045e291ce95e4ef5a6bbba64fa +:01064064febfda512e2ab6b6fb58192e3b5ec5 +:010650b984ea340c80eec25bed410b2f6dbc4f +:010660943390dcd9077a1ea09fbcf2b0d60220 +:010670f40dff09a344a871dd05a2d9f3bfbd71 +:01068069b2775b00af847c9d5b4a686baae199 +:010690f6c1c5cc84186aaf0eadf7d59dab0df3 +:0106a05ed74c1b506a2ec625eac2212ac819dc +:0106b0bb3e58365a6b8c2686d2d19d31b965b5 +:0106c08da95aaeaee67ca02ca14a6087386d37 +:0106d01242d7ea257a338012f43592b593dd1b +:0106e09f81c06663e0d93629eeb4cc4fa3f246 +:0106f05d45d888a372f825b761f5749bdae6f4 +:0107003027dd5821109fb8f3bc98cb20bcfec1 +:010710bcc44cb9b133757c11167c11be6fe4bb +:0107205a9a4e3c044f5309eeab4bc78635a149 +:010730aaef1f52141cfa4dc775b5a9b1baf49f +:010740afde1a5d7bbc34d61662afa17a0be915 +:0107505e0454e27c96cd464625e4619ff52692 +:010760bf5e3ad2f456e60f74c5bb7aa491fb5b +:0107701dacbdbf2b201c4e753f145d0c047407 +:010780236829de28a718607eff469a4544be73 +:010790f4ee324536f3be54341f1135d22373e5 +:0107a0c7a2837c82037e68cd95c0b93f8c1b48 +:0107b02de0eddb6200d5b67fb1d0f52b275229 +:0107c070c699bb81a0fedffb22fca01861713d +:0107d0c32ed4158324f46ea7a58ff4b88ca692 +:0107e0ac5b21ae7aa7009f7922ecfc45d64bcf +:0107f03d6222c98d1e9779afa42223e3e65a27 +:010800f947c3df714f000b012ad72b5a651603 +:01081014133725da61183ff1b409f91508c2e8 +:01082096137b3a3cdffc567128454f60afbf0a +:01083078020ed1f2893272f920d009049e475b +:0108400010c6a36a0fe0f0ee8257e5dc4af6cd +:01085082fd0ebf844a736c2c80ae81304922d6 +:010860df19fca35ca2dd2ae50919d08ea0a840 +:010870f7fd3100a93252eeb2345223159f46d0 +:010880fd93361f74a143d0683e1266e112d7f0 +:010890543d3ba6992784e37c7337c9f80bc0da +:0108a000729728f0d0a4afda81beadcb48af84 +:0108b08ebd70a90d49fcce2284f371067e7b9c +:0108c09979efdff62bbc674bdb6966c9124504 +:0108d0b213b83cff57e71b25340a5c534eae1a +:0108e0fce17a34484dea75e4e062c9f8b51ad4 +:0108f0d5d94b2c03dfee2c4abf1771f2940dee +:010900dedb6283a218c29e24bf52c1d6dff6a8 +:010910a8241ff65c53f73cda8c848e2031c0f9 +:010920083c1acc7ed7aa75609f3f1b70b04ce4 +:0109304eb3ee08036d512de507e4c9e58f9ec2 +:010940d633384eff29ea79a6ba1825af5f4024 +:0109504e85f13fbfded619d8522f2fb4f4b12a +:0109605d4834b0ea357dfb799ca10394542ff2 +:010970d0288523953586f8b4636dafd802f16c +:0109803c9d1c23125a3a7a42994a6aec8cb1d7 +:010990b9bb137e3ef8a3c95787632e4e4663dc +:0109a044752a17acfe016ce309c91dbf8fa4c0 +:0109b03ca52e21921f5be8375299b1d6e53dde +:0109c0eada762e3d1825780c98ddc2a38a407d +:0109d0878ca1704b44bc3936f1c33793a29d8c +:0109e0d2bd8958c286055b9b207790984b2a85 +:0109f0acf241899c28db10b48393bd096fa00e +:010a0077807e888654e3c1169b118194c2f1c2 +:010a10e95ef809b3c25e7a868e0fc0e81af680 +:010a20902f3d2607c96cc0b0144f55a7310bda +:010a30a8becc2e74f0bf53d20620b4c0e0ed1b +:010a4020df1fcf6663be8685e912a4a040a85f +:010a502f5f80959deb09639994fe0138c8d8e8 +:010a608708b1cf7730176673dda08bc678c0ca +:010a70b1592fcd4bff31ddbbc61f894309c975 +:010a807e8e7431ac689bb23176ed55daf1ee50 +:010a9000c43ee5f13a0729535228f0696e8a92 +:010aa0d7fec0b4c81d63ddfd9b55762fb2cd98 +:010ab035dca5afad3a77e267eb44b7c3aaea11 +:010ac0dbe02faa230247869acd2b3367d9c358 +:010ad0d70f0cd9989056371a5447e60fb4471d +:010ae01fa0c668c3ddfb80db258ab876381de4 +:010af009201dbddc13c21c8ca5a5ee422d3aac +:010b00990755432e7d2602bde2744ce05c5e29 +:010b10c62b0d6c0a507e3520d3719c89bc9396 +:010b20bd2ade85a42a0baedaae46d09ddf9058 +:010b309be1bb3d1c56526b3e77a077b4e15fbe +:010b40c5a388eb42d666c444948c784417de2c +:010b50bd49e0307dd6bef2ab4235fcb1df4d5e +:010b6009902ff68cac932ac6a97f6183d93a5e +:010b7016e7aee6076a52426fe95c50a4c26d67 +:010b80326f39bb1a3f6655887ea0f266dbf9f4 +:010b90d15cc79b24f0a73293dd861deab0fba7 +:010ba09ab440eb2ab464fbc31f9a8dab10249b +:010bb0f2da78a0f9f5215f8cc95fa7f92efea4 +:010bc08c512aa3ea85b0054e3b81e359c3203d +:010bd0efd1a747d73c3903fc8c4bcec598b3f4 +:010be09d57882fe088c8cba44e3f034a593bc7 +:010bf0d116ba03610252f52bb780ea56592e7a +:010c00308beaa7121aaaabb4d6037476f499a8 +:010c100b1e326009e9863f7ab773aeb20b7ac3 +:010c2082d2a1c812808a445f5c0aebfd5b4691 +:010c303c73731849c477f54573731f1e6be0d9 +:010c4043126e56407aa22aaff77c665616a02a +:010c502a9672eb1b930cd4abdd5c637a6051bd +:010c60d9be7ccb9bd7b2e539bf713b5376c0bd +:010c70c14edf0129a3b2aa9966f3ffbf07952e +:010c804824945989dcd912e046f58f2693e3b9 +:010c90f4e732b0be45b30e728416d0de6b43ee +:010ca03c4886bf836de71694c10117ec6f4429 +:010cb01af0742b081a8ebc9d47e34dc54c7b6c +:010cc0514872a5fb19633d80420e480f02abc7 +:010cd0555c28e566dc8d1dfe2e2041326f88c0 +:010ce071a82fd8c5eaa9de3d7f57325f2873fd +:010cf0c4719d40c6fb87e65687b7d54a65fe70 +:010d00625b9737a637d2349f848d6402f83718 +:010d10f51b2c92d9b4fdf4bbd0d9f5336f7450 +:010d20c5f0860e7faff8cf33b8dfc807874516 +:010d3052a1fe6df01c14d36f49e9af6f21973b +:010d402306272501f61866f37bbd1d643d7c31 +:010d50f3cdca1f0c66d0f3d1bc46f6885e154c +:010d6049182f1cf7cfe463f9ca7c6cb7e42a1d +:010d7074885726c9250136f3717434f8081d83 +:010d806da2524c0d25a30549a797d89856abdb +:010d900ee2c18273d50041d98b1193bb8b42c6 +:010da01784e718e47b3b8953069096b6a7681a +:010db0a24cd2d997062337e166ad904a68f6d4 +:010dc072199d519a3057f1ab66dd07bcf6c6f7 +:010dd0dd12cf2ffefb1a629c79940d0fc06f50 +:010de096abd44c321b2cbfee83ea9ceb6891d9 +:010df08a4923ee38c67929d916f9e86d086cda +:010e00ff8e37747072fed77a7be2081fc63e11 +:010e1003f67e8b1f58f817f49846aa8c0b3e75 +:010e202de37cb0d68fe54130857062f603ab91 +:010e3085da7e1e4714a5fe762fb73f96722e88 +:010e40ddf284ebc99d4d7fa9b4837fb911e4ec +:010e5080112dda3e016e1ac433a4e064122828 +:010e609af9199b442dfbec62b8fb7cd64033ea +:010e707416a34a6cbe73fcb7a64b81294cf02b +:010e80eb5e5c1d6e02b1b7e7e64aa4ed48e8fa +:010e900dfd98383ca6f9ab8802e0af4a47d68a +:010ea0f0750575ccf199bde1be7dd68453efdd +:010eb099f2fc375a7afcd25b9b75c8fbf9e882 +:010ec0bdbfc7674efaaa2e4cc6a1b8e2d8b65a +:010ed0c750828c9669629aba19edf647491bda +:010ee0d4af9e5f63f3c125653b1dbc9b3d8b91 +:010ef03d90b542018141e50992aaec63e1bb38 +:010f006afb186d84940e17befc03aa4a697c27 +:010f10a268ab08d9fbba43dc855fd5704304c0 +:010f20fcaf942694638a5d986a8befa70baef8 +:010f30b3e5a45f83dcf964482f518b6af3a337 +:010f40795194531367cc27b1c24e3728d0384c +:010f507eec3d638fe2dedb0235e8578f60ca4d +:010f605944d6fe7f06304dee77f020ab9a5b46 +:010f709bd3d1601c0a26ab503489b52fa98a47 +:010f801fa25ddea38ed7aa006a5ab1d6c98d32 +:010f90d3a6afe78091e5b091bbc1fe5a41e59a +:010fa05708bd61179186b051127f18698bee15 +:010fb0c21875d25d32b6d9f53e985429f37131 +:010fc0bfddb2826c7870293a53e8f2d4e6773a +:010fd09cfff24351aba2b779e5677953601479 +:010fe08dd8a961765ba3d59f9a93839a33c628 +:010ff00cb6a409b9b7fac8dded193e888957c3 +:0110004cec432709f7828b10b9c406b086876a +:011010707e17d71b6de7cea26eb064c2fcca85 +:0110209f987133a0957cd7ac93123aebda2115 +:011030c19b24e06ff745aea9b901ea7b26bc7b +:011040e0e6820507437afa098717ce7fcd8195 +:0110507915a92816f67fb4737a709960567142 +:01106000fa765b63a2475f5ff6b07fefbfdffa +:01107074814db8b0daa784f0e5918d365a9f22 +:01108099401f9cd6b9c4224f358a087e2c5035 +:0110907240eb696f46913fa2f984d07a98754e +:0110a03a70932137e761fd6c6f2fddf2ad302d +:0110b0d2bb64bdf11845d9bd1ac60833e37793 +:0110c034964c2e9dee782f46a7a2ac10c55b7d +:0110d05086797ac2faa82a0d3bd3b79a8b9cd2 +:0110e0cd2208fa60966a57a049d65bb92bf249 +:0110f0156d6768dcf594de0eb8f14b5c66945d +:01110005f38d0074f154cec23793254ed3258a +:0111106acff4f33e12056d359a4d8abd32b7c5 +:0111203074b7bd748701964b37edda157f2dd2 +:011130857dfd50f8f85fb82f851325b270942b +:011140bc804e8044db86224ee7890334c00065 +:011150b2b6e2852e0139a20bf1ac8cb99d20ce +:011160a94b196fc76ce5f66af69c012684ed34 +:011170f471d20c08110d884b7fc6d88b9e6916 +:0111800f5a27738adc02c9edfd9701195d242b +:011190c7d8b6fa4997c77719033781f235c3d2 +:0111a0668976532b54e5c97542d0988926b3a2 +:0111b0a13336a092cfe1053c1282b22cd719e5 +:0111c03f7f42e1b7c2c6fc0cd17c7acebcace0 +:0111d050573487708cb0b5d6a54f6df9216123 +:0111e0da773a1f001a31cb3772993b9aab09c9 +:0111f05c13776945b7cb14af269162cfa65b54 +:01120087f093c9c16d1c9a556b4caf7e35e7aa +:01121027ddd45f6f07ede3c00204184f890e14 +:0112202a79fec1a0c7bc1a4ed9b576a61ff030 +:0112306c19fb7aa04ed918bbf024487bccf3f6 +:011240832ffca24ad59adb7a12874feb3c6263 +:01125072fc4d301ed226751413be4c477c6736 +:01126039be2a2be247391cf0eac5a9f9f198d4 +:01127095a18ea4dc02c672eac88445f0782443 +:011280d8737aefe9636153fcd86a4f548a9f26 +:011290b6116ce78421957364c1add843352c8c +:0112a034b8ebabff05ccc516c1490aeba88e15 +:0112b01a1dc0a5c1982d35e5bb18d32ac15886 +:0112c05f1c3082133e162d04f6b180b8dfa85b +:0112d06d47b6291403a8b34c16a6da57dbacee +:0112e0b45dabe8e9acfba79cdfaaeac071f683 +:0112f00e2f299f1ec6ef169d7e78478471d913 +:0113002d440e1b1a61d985494ff4c40a698d1b +:0113100bd388d702099ac0f3b44ca4b729c236 +:0113207d1ddf76b8e584b416aa59de9485e0f5 +:011330d8a1e7cb8b2490eb40e4196f1dddabe9 +:011340d55365b3f75e92aa1e0d208918c1cf1f +:0113505157fa13bc6ba05b2e18cf08c6894f8b +:0113601288527e416e57b42d10c6fa59794d5c +:011370d7b11652a3b57689b45b913705ef0072 +:01138080930bbbbd8b7024e8053140fb6a63c4 +:011390452014fb16c78ea1b986be8a129f21b8 +:0113a0e8187114a3b2715d330e564c0b0082a6 +:0113b09048aa05dc9aa4a009474917db7eb870 +:0113c0908441e42c1b2ae54ca042995b6fdf3a +:0113d0d89822b94749397c241fe8e31d55f9c0 +:0113e0eebdf7c46ce0f14f2d0e2c5f9bd90c9a +:0113f0d59aa87fd4d4c14b1500882d4a044f95 +:011400597422840fd6bf44391e43c8ab176777 +:011410c1be41598f894fb7e7fb54d8ee2b4a23 +:011420a93aa4d0a4bf46c7f4c3caf0ab46ee0a +:011430850ca0595c6f6a79fda4e1dfe064c77d +:011440c7049fe60f6eda530789445814d62c90 +:0114500a60297bbc97f183cb1ea9b5233c1dc9 +:0114607720cd07c1fe3746159e7998c303647d +:0114703584332aa608305fcd8ad1d4136c3b84 +:011480fd3a0558e8d135fc5f2c283eb5deb2d5 +:011490b677d27f0e7fcb0d7ab2eb29e8b22dc0 +:0114a0edd098c2b402dc85f7fae90c520de200 +:0114b0cd554586ec204e3ad655b23b8c7eb9f8 +:0114c0e683539e30cf7f3a67e597096d313fe2 +:0114d073634d6be6004f94575631e6e97ec65f +:0114e052c32a7f1e571edecf217d51da609cd2 +:0114f01b8b18410ba4620de39a3bbfed0c103b +:011500df197230b9e3afc22d0cb0a3d4fded56 +:011510c13b3e36bd998d1f816affa749693f0a +:011520e36b7c86488a8f5d1365d8e62dd353a5 +:01153098ac46fe0a0ddfef6b109de86905bf80 +:011540bb6f3864e224a3644558ecf3057df95b +:0115504ace9b54b94d2bdf230693f2cbb5bb44 +:01156026bce55c46e746d5ef7a416a00fedac5 +:01157075d039d9728d586bb2d6792a1046ded4 +:011580cb5a288548972c5a26668b9942a8d61e +:01159095f99f24edef7e1bbb14b14b4caa3989 +:0115a0b255925355f544766d0b188dc74c5578 +:0115b0371c8462874335ab184d7a73fe900d53 +:0115c0de050f2c3402f0eedfea92e5133b6ad2 +:0115d002c6b53b2a831cb451ae5a30f74917f4 +:0115e0b6d22dc0475c9fee3b4a6a8d912aea9a +:0115f04096a964dce0af4796401848f083cb0f +:01160085e892982614d8d546dd159891083343 +:0116103c92e70849f5a114a9b8a94abbceaf94 +:011620de56f23c5a79f9f18330d4838089e6f7 +:0116300abe53cacd6b299b580b4c7b3606c213 +:011640928af748692815f383aa528b1d22c57f +:011650374d873bb11426bcce60a62c683b35d5 +:01166072179fcdd096d19034941a91e561250d +:0116704e55356f60e3487d510455f375d5b13c +:01168084e03cd0d559e0132ee2598d12b9867d +:01169027ae79608d014674e80ce1f0e9a77712 +:0116a09c5793a97ff3c8a41c45857c00ea54b3 +:0116b0052a12719c77a83ab08731d46c5d6a46 +:0116c00808788c25eced77312fbcf6acea6a41 +:0116d0e373a9eb5a57d8a6b777fa4010915bc1 +:0116e0d5ac8fbfc8230fb4892e31a83873d4bf +:0116f077f6ed80fd0efd2842ee99a36e1f601c +:0117003daebe69139ed13b6a4146568ee71b27 +:011710eaf2b6a23fe70e25933c7174072a3192 +:0117205c51b107b56315b52ec6dae16aba4e19 +:0117302cb46af756054152e6a02cc0b6aafc41 +:0117407b1455af1ed0cde63838a0d1aa0641a8 +:011750b3f06b37758d0faf77e49b070600a98f +:011760904d54e36042eeef7c96fc9084a4277e +:0117705f058794887c343c24e98bc792a693de +:01178078b3a8419b2cdb28e7049704f9b19e96 +:011790ac62b18c54de5365a6d65e817745ca0e +:0117a0ecdbd2bff79635efe21a3481097b02b9 +:0117b0549f1d5137aee2be5ce0e66cd8c100b3 +:0117c0a654ee906a193ec0f5c850fc7d80bbd9 +:0117d0ecefd98f764d30e7b11c6055fc7c441f +:0117e02c046e01e5f93ff06474fadc49f7388f +:0117f0a315893c49d9759a5f1d2e5c8f3c46f8 +:01180042c1d42cf5e52d17925de4e21abc7b0c +:0118104aa8912e3187c279fe7d7a8c47f4fd30 +:01182024ac62d7d50a3f41a20e8a134102dfd9 +:01183005685a9cc6a25d7387b219aee7824596 +:01184032ebd4c674212b49d516e50ad4cac264 +:01185020bb2c6492714ade999d916cccd86c01 +:01186070aef521c5e165cb0715884818e66bee +:0118705d9204b564033f9eb4590225dc315413 +:01188090b2146533f30d115c8d3c7ebb346c28 +:0118905f44ef57619320262937aaf511edd27f +:0118a01e8ce48948ae2e1a8cac5dfaea8f2222 +:0118b0c16a398c5e63deb092e0481769f169ee +:0118c05e2f243643d80c93937cb8f0779b6272 +:0118d064033b86c562a75e47701155afd5b338 +:0118e0019bb5d424691a672b9072ddbbea45ce +:0118f0136ecf856f78848858501c5e56b11bb6 +:0119008a3982f82278fd1c79f6b340ff17a2d9 +:0119108df4c525fda7a7e36f0ab9952ace4c2d +:01192066e224ff87ae44a8d811658051ec9d14 +:011930e4a3581aa223ea6d2fc8fb790becdb86 +:011940be0b5403aaa8e9035342fcf068e823c7 +:011950a1c9c695ced41508945c55ca140f641e +:01196070f63541d531be527434d4f687e75534 +:011970dccca5caec4b305d920fa58e7ae88535 +:011980d1196e4d4077b1f77c4325935d093e2a +:011990d7c3cbfa4a58108d0c6f5ef9d3bb3c46 +:0119a00f3c7b8855884befff267d4aa29964f4 +:0119b03c07ab3a479d85894d0781db7c1f9588 +:0119c022b8c1e5bf087297b3f6dc0ccce5761b +:0119d001badafd8f06782179a48690fb799dc8 +:0119e01ab03ff5723f68f25d1c721a05d93f14 +:0119f0ee6bf3042439b6ce0a990d7a8625dfe5 +:011a000b6663a4122396d37c2ec1f697136088 +:011a10e8788e94a3a38c201c4fb6cc245e6e02 +:011a20c14f06dae00868c7218662458fb131c6 +:011a3046807cabaf16e4d8c36a02892b78ba4c +:011a40e8b0bf19188ba6ff91e635a4a6fde7c1 +:011a500008760083016db30a5d401ef6706163 +:011a601fb019b3a8b600cb3a721108ad9f077a +:011a70b692c33543be50248337b612982c75a8 +:011a80ae5b0616045da154b91662899ce37933 +:011a9052e22aad7631f82e2cfe3a4290ca6ae0 +:011aa05d0cd8410a97eb9c5c95cd00f5bd9d0d +:011ab00624be2d589ade2d35494f489c638c7a +:011ac0a1fdf4cd047c3a399e70e06d27e4840b +:011ad0e1318ab9d9c41c0d7d64c6fce057eb14 +:011ae02242ef428b659d96aaac465be607c973 +:011af014807ca8efa613e1ab110647a2c477cb +:011b00f7836715bf4f983827b8bfed9616f14d +:011b10f73d6f43985b7595b006c9c78cb3d74b +:011b2098577076b62d055ce61d0015f9a9e3b8 +:011b309db51cbccc207133e3eacc49aec0e039 +:011b403ee509a42b955dad75a9356d28ccc28d +:011b50a205486d9ad9dbcdf3416c7b96e46bc4 +:011b60b544292d0fcaab461a2c59aeef8924fc +:011b703efa14f144348a5f487743a5985c1368 +:011b80fba40da51965c57421486979143ba393 +:011b907707a273ce975d4651c85d5687fd71b4 +:011ba0e7821d828b11dcef8eabd98e178b4d59 +:011bb0a0f7db8fd0207aa9940ece8687f5bcdb +:011bc0135cb3773f2c7ae68e44bf68cb4f6099 +:011bd0fc147f15797652a662400b4456b481ae +:011be00d98a650a9c377009166072fbd335670 +:011bf0a274d02dcb6de2361bd4fa4d2b3304e1 +:011c00b356eec9719f54eef46f50d33d7778e6 +:011c101baecd2a736f6a4961ac19397e380527 +:011c2027407c29572ab98ca962108ea5bfc979 +:011c30ca705c68f42d906ef6b71f409d0a82eb +:011c40243cdbffc285f4c36b0dbb6244d6f645 +:011c505d14dbd41bd3413c4ffb99d47b479e79 +:011c603a104f4cdb8da32955d127e8e688a1e8 +:011c70f9035c1428f552178fc3002ea96444fc +:011c802f8cc052f8b74bda894ce949fbba3068 +:011c9058c448f7b5177ebc3f461e671e5018b1 +:011ca0d32432907fbebf3b7fdfe5da023a90b6 +:011cb0279d38b247bb90f59cebd6363e901f0f +:011cc0667a1bfe65f469f8ff2f2981ce4b0865 +:011cd08e5058004e24cd2154d1fdfaca716f52 +:011ce0011c8a8ed820a98b5c6c5748e46da47f +:011cf0913daae9fea6b94b7b34df9047d1ceff +:011d005823e3fdbebfe232d70719f6e3edbc10 +:011d10d713e9cb0d6a00fc9039be2e70905d80 +:011d20195c4d1d0304364680459f4a99ae0eb9 +:011d307c2ab0c9c24bfe852fed7159a3b8a7d1 +:011d400d54076aefec41674f1b8b5e054c65a2 +:011d50463686c27ddff56a9a76acee0c3d69ac +:011d605a7c081f1d67811fe42c8325b871c3b8 +:011d708f81911defef4d10a618e3029de94d7d +:011d80904027c7372254c5abba67e7e5295b37 +:011d90ad35ce2ccf89b523ea31964b840abb51 +:011da0256065ec7a36f2fd6d9dec206bb922ab +:011db061e8430c57779affb6494c36696a3275 +:011dc04c5a674c490b4e7c57d2d2ff2ec999db +:011dd0f9b82e0621ea5245766861627dadb7d1 +:011de01e734444cde4fc2eb29abd92a1e86e41 +:011df0f37c7f5d341647b3f5f32240b78b8839 +:011e004d335c650396edcc5581acfab1cd80e5 +:011e10bf4253367821c5bffc98b7ad04511005 +:011e2045d47c3e0ef02578c225d0b27787bd3b +:011e304d1107abf5786f8cda7c289c1d90fa1c +:011e40b87e5787e6be67e1e96870b801cedc01 +:011e503a93109a72ebe3ccd70ed87b9e31759e +:011e60fee1cbc848893dd6377ffb3766049bf3 +:011e70652d0cc2ef19c599b78b118b27fd3703 +:011e80d64ecbbb46991be82037bcc49402fac1 +:011e9097a3f78bffaa5be32e839bd9884c5c4e +:011ea0fdb07ecf48cecff2fe68a58059751cb0 +:011eb02130d4fef7c9b76002cb66c098da0b7e +:011ec0d56d55661c33f3aad2a4550326a2475a +:011ed0b1aa0a66650c4f1dcb627811d3a80689 +:011ee040571cf13289ab51d930069faebcb7d5 +:011ef038b123408409a4c9ea8e6b1280c30053 +:011f00e1239dde67e34dbf4ef22a4a235be13b +:011f100772ac4eeba1bf1631173783fed6f2fe +:011f208c411e7c64c5213685a13dd69efcef87 +:011f3045fa166471a8b5539b16d0f56da7f669 +:011f406adfb22cbb68c9fbb8acba2622745a97 +:011f509840e83a427eb9d84897856504fe4708 +:011f60542e76b25bedbc6ca9186cfa52bc9eba +:011f7079a040ee00514e260d31f5cba9502923 +:011f8068545fbedebf65a8776542cd9621d4db +:011f90df84d89f75c4e6956a28ea9671e39ebc +:011fa07b0e42fffb0c2cf815ed78befacc5ef9 +:011fb05692cbe195b90d5b474e8a7f7c03b79d +:011fc0eafad78ca374bf58d60515235f148cfc +:011fd022b0f138d75126fb5604cdc0302fceec +:011fe05029875d5c5d4a5ddb4c5d81a23679aa +:011ff084b42ede32d1bcb5f7b7542a4ff8ef93 +:012000453ca71856ddb20154261a65fbe814ac +:012010efa4d2c89ef314a69ed270710c79869e +:01202067c560bf1764864b04e99e42cd71cd64 +:012030966e75c74018d5e6b0c01a63de8e6eaa +:012040db351ae72465ca1f945a4e1db4b6608a +:012050e462a97880cd4fed2f64899ce0ea5ed9 +:012060b4543983c0e3c12710353a84dcd7bbb2 +:0120700fde9dacc5207cadcd52af78f26e35d4 +:0120805d6d059e373a2f6fef5fb455d0650804 +:0120901e9a169c3a05d0daf15e98a5c2eb414c +:0120a0260120f962472e8e21b82c2cac0260b3 +:0120b027f3362af6230f5bfca899b0707f60fb +:0120c0fe578ee1e511adf318c3b059903135cd +:0120d04ecbb898ff2860c28eaabb0c8cf6763e +:0120e04b807254101dd97a48473d8eeeefa639 +:0120f0e661029470e73566a20ce3b6995cc5d4 +:0121003ad09fbc0d67c2996d63cd26a383c257 +:012110025edc8e4a25d6147636c26f0e542713 +:012120f4e9674938bec2e22055865f8045ffa4 +:012130448cd611a983accb76d7e82156943923 +:0121405e6daf589c56fce10abb20b899d2db84 +:012150a6456244d41f842f521088228d4804b2 +:0121605a34af981a8f915ba1ba2ceb4398eb54 +:01217090fef37f06998495d9284f68e257c2e8 +:012180ccb8e2b519f94b3ad0a98b0ca73d5298 +:0121902d22cfb4de9bcebd7b0e858dbb322f11 +:0121a0c507ece482cde8211298da1e71d3acd7 +:0121b0593be2760d66da565e14c6ae5bfd78dc +:0121c072afc57edc646e248f87ccaefa4509d8 +:0121d01641c093196212cb540cc7b621e8c21b +:0121e0ed7135ec3647eb6909d3b46fa2341df9 +:0121f03b407941c0f85e022e95c68a3edb4458 +:0122002138165296b828712012d406ad3b33df +:012210685975b7d216bb2dc128012076b6752f +:012220325f5573c0985872e474a9f8d0579ee7 +:0122303aa4f0b1b0f366efc67dd409fc73a313 +:0122408f3a0eaf973182cbcd4ce14a98cc9ae8 +:0122502149f9c7e0a4715ef7a91e2e2a937a29 +:01226036eb12b41fe8988e2823bebf84da34f9 +:0122702bf7d0d9ba503f94a2e7d93bef772afa +:0122801028c4ab53c7b97c88c103c4d8970e02 +:01229003ed79d2adf879c5c02ffe2c5f85bafc +:0122a0bafca05fa82378c9e5cfc4c00cd76ffb +:0122b0bee9d57243391432bd6243fe40f228cf +:0122c031e15a7526052027f700521db8a32830 +:0122d0f676af32b6dbd3473504c6e7cfae9c9d +:0122e0ed9bce17bc174f8cba630b9ac84ffd7a +:0122f0a92739234dbba515e9f8086807edb7f3 +:01230043c320fa1c4258e0893af3a8e30839b7 +:0123109f8a3975e956cf59392ed7f37ccffdf4 +:0123209d832e6f1dc81ceb46344549e39a7a5a +:012330a2fbe8bfc86ca36695765f8ec6b8fdd6 +:012340316f206fcb9472e8a0a80fb7c805f3bc +:0123501bd7faf0846e993fc0b30ecf58823335 +:01236026c48ff97c87cc6aaa2f868df07f794d +:0123708ec404e7546f26c17ee151d5fa7d84d9 +:01238081e608d1c32c797e5c1c7de7f8ee2aae +:012390718096c925472333a25e6f55fc86724a +:0123a03db5ddfd35fd6d294fd200b17b85c2b2 +:0123b01d5076d067efd5accca4fea66a16b28d +:0123c0e8f8513e7fea6a39c0baec25bbb701b1 +:0123d0b0c640dc22942c57a9f13426c6357781 +:0123e011abbc4ad12b69438250714ad6c167d2 +:0123f00aa5de1ebb9c382d63c2d062aeae6329 +:01240066481526f68f806caa58eaba2b745b44 +:012410de4d118935cc08d6b7da74dcd0f93ae5 +:012420a2a0549cf36443c910ceaaeb6a2c486f +:01243092846a543371c0b3104dbc864b2ade7b +:012440107733988d46ecf5354c73becdc52f87 +:012450d16a5f18075f5742fbf00270e46d493a +:012460c5a9e3b5b62d0de9ab377cd98d7a8d68 +:0124701850d014da784a2148e6a071bda5550f +:012480e958dfe2859ce895c3d4e4a8f643d5c2 +:012490e9f417d4d50d57a1a4f6638e8cd394f2 +:0124a0e6cfd938bff83bf0f90262bbfc98b26f +:0124b0c13305bf9844f77f63c5aa51d6435a56 +:0124c0c7a04b17c120ec0016d83a4cb448c4ba +:0124d00c42a6b5c809b5373267a1af6cc7fc21 +:0124e0d2ff54f79c4c59537651cf526cd8fab5 +:0124f09d9abc03d3a28917e6b9d35946d41fbc +:0125003e04b28c3ed938e78828c78083ce110a +:012510899e8d421d8501e99945f22a6f693a7a +:0125209c40a41b1dbed667e1af25f3bf434b19 +:012530d171b02759fdf3ed549a83e6bdbf4d12 +:01254030cfa06ee3cb4c4f1dbbfbc0ebec352f +:012550999a2d35e0a1b61e6386abe68728f1f6 +:0125607eb8071165a64ece0ee7e19d795047ac +:012570d8b492c17e6d96a6e53b7af0c72e7a14 +:0125808381bb6dea4f83d41c1dfad4bbe837c3 +:012590ff54cad6ff151d2206c0c2db753b68ac +:0125a0c4e962d4f0342f41dc45fa4c983028a6 +:0125b05b258319f53326f60cc62e9c4330f303 +:0125c0ca7213236d6e094acd24358401143100 +:0125d0471042a92ac3243e613e86509f4023b0 +:0125e0942ca49202a0ea62a3b36706a709fb55 +:0125f0b3b4d420bb9cf515c18188eb34bcdd8b +:012600a11f870455b07b28a9510b54120b7ca0 +:012610d86462174d1079e3d358c422941e808a +:012620def096d17ba64b9b33b4627c76548efb +:0126307dc0c643cd2fb602f6015083c44bba2e +:012640e236d05dcf67bcc318f2a239c73e359b +:0126500c87303ff2ca0e8c49ba918029a5ee50 +:0126600ad840ff4fe52c95197fd28b4ddfd308 +:0126707f149d22798904a0559019cd04f6636d +:01268076225819ce912fe49980376d52f0489c +:0126907cec5386b8afbfebb7aa9d92abf3c3d0 +:0126a051008a7abcd3c230ca07fe393e0cda83 +:0126b0f9c5a79e05d9e071a24c0762e3457910 +:0126c0decd2aeb162364bd0cec82b15144385f +:0126d052af2a184475ce17abaf8a9a19a448ab +:0126e01d1fb46754e4136cf809aed5605f9c1a +:0126f0690fa3812af4b1a05c5b785504fb8473 +:0127003a4b54bde2987eb73662b6efc532359e +:012710b854e3d4bc8b3bd74807dfd9e309ec7e +:01272024133b1139db7fc46b9afb40429ba810 +:012730b939d2b15d84f10020182cc722f81209 +:012740590ee92ab6251e2de7fd7a3e9ebd56c0 +:0127502e45d028833568f35fcbf00e12324367 +:0127607a99b059bc5de322b6c7bd3764e539d4 +:012770ff9cdb45956ed1b1f8619c1e6a630d59 +:01278009d86c21fdf9f78a1e5b0c38d5cc8b01 +:012790769376bc811f9c4d0352ea12f653a8cf +:0127a01a7e9da9bba3c932f66bb78a55e772ba +:0127b0580895061fee2197b6f4346cfbe6a210 +:0127c01f718fbe624423ac6b19e8051162c084 +:0127d0076e628329950cc114c59a37a6e3e379 +:0127e0cc2ea82fd677fd6a6eb37472b12cea4e +:0127f01e85d51af429c0eff1e1a5ae5b03f4b8 +:01280039d28a9454f65ddb396c250f1ebf8e05 +:012810a5b5be259247c513c71e1556a4b8b494 +:0128209c83bd55126e22d033b98c52a678fc58 +:012830960966752f78c990d8bbccc42f9508ec +:012840abe84576efef8b69fd6cb14c94be5150 +:012850637710190686404868343a931a694967 +:0128606ae092162afd6e6aa26fcb2097ae8b01 +:012870a82510b86efca8fd30e90c904c4fbfa9 +:012880d26c091dd4c4bb40dd6e20010b7f5ccd +:012890765c8b3538901ba87e60ba5e7eac9e33 +:0128a0cf2a27e331ab86677b10c0dd04f5cb47 +:0128b0431932991943e937e973744e68b59c25 +:0128c0baf022261cedf92c9fbf13309d2d51e5 +:0128d0fc537e7dc1b3e4e7fdc9f1988f14b578 +:0128e07e0d5f2a31fdfbf16add0396aeff000c +:0128f0affba7351ead0e335c4e404efcbab7ff +:0129008f3a05c3f8f64a04f782b15f9f808e10 +:0129105dea27f2d6adc2047c6476f21227e2f4 +:0129201180d7b1b7c679f420a49a1c1bb476a9 +:01293010fce120ac74423ef1cdcd60d175536a +:012940c8ef343b31edf070faced8f462b5ff5c +:0129502bc23b9328a39c87fa9befc5e30180e5 +:0129603fa52886013025339ebf7285124e6256 +:012970e8d15f26446cb4141cb296ee3934bbbf +:01298004481363e0d37353c3b9df733515bf2d +:012990bf02a11dde92932653b2c3295d692b15 +:0129a0382774feb70462b30cd044d0675ed8cf +:0129b0aebbfc35a6c3c1f828fbdb4fa14f3b02 +:0129c073dcab5dee03dda3bbda1bbd19427a52 +:0129d0ade5568c10cb901842fdbb4355f80a40 +:0129e04bcdd8042bc034444818aecf52c00a47 +:0129f01fef0b2f9de89b14485215bf0f97da45 +:012a0067a85aa5a480e2d9be308ee1a1a22f52 +:012a108c79ad2dcab8425ee0c59feb8f3c8208 +:012a2055135f3acca4c2928a05945baca53c35 +:012a30939fe52a3406beff5ab11a7caae1bb05 +:012a406cd6af359c0a39d99d5c6a96546c588c +:012a50916368b6c39fbf88b5e8ad81d1111279 +:012a605a3758395e2a10e779cf93e29bdb39a6 +:012a70c1fe34989ffc6d157e3912c24eea2ccc +:012a80a94965303dc8cc4fc344311402583c12 +:012a90744edbd53c7900a2c83fdb20cded15ba +:012aa09eb0e270f235079475a3e514ad18b568 +:012ab0486961b17b04c83ef1a11a08b519e6b6 +:012ac000dfb2c4418fe0d246b06bd26ddec08c +:012ad05b13ef414a2310cc056add3b6e7bf1b0 +:012ae01737962c79a6058c2acebe00b15abc51 +:012af01a83e25cda8cc6783b19f37ad6d254ae +:012b0012caebf581b62d376f75c75b0214228a +:012b10306ea9269afe15dc60e093edf99cf269 +:012b208fb21d38b2bbcd15a82246adaffabfe5 +:012b3054764a3f2a60ca6761e1fd9c2e14c0c8 +:012b4002c6466e627a33fa2e8c496611e16c60 +:012b500baf92b4c84f98e7a79ac4ebd90d7283 +:012b604e4c447fb9401d01f7d80e7972d33dd0 +:012b700ffc1b5d0ce1f8a1380d2d135acfdd31 +:012b80b296b98ba6e76e2e412661e3c45ca735 +:012b9008bb2a331da5d68fc921c84817fa6287 +:012ba0e82f34bfd0e196d11f8372f27e496fbd +:012bb0325d996521e8a34a1f38a577cec85b20 +:012bc026395ba857d7b00c2d6ee664e73dcf53 +:012bd0cfece2622e5ed0485b91897040873f92 +:012be03ec65cfda8108c2465f3799f1e80f616 +:012bf056cdef1b29b12eeb015767b714a2fb12 +:012c000eebd7599fd8a09e4761262e022e6c6a +:012c109d6dd32e5e9a59c8334ff18d3f12e147 +:012c205dfb272f9f569a679db256a83d59e3ba +:012c30d7d18e17873965c2826e971774da0dac +:012c406e64749be3a4fd9573950f57f192de02 +:012c50f77a7d4b7e3114ebec968fe21fa54318 +:012c600f6bb8948a626b23ae436db37dc4ebca +:012c7077a4d5f8b96d46707271b2766d90fb84 +:012c80a9ed2549f741578880930e995035d8d6 +:012c904d2a2e8f39c897ed8d30a19006c17bb2 +:012ca03fe1fbc9a4544d835b38e98a0a14598b +:012cb0dde0e4587713169285508e159997acfa +:012cc07aac1ab9d81929113ee83e67cfbc2175 +:012cd00c2415cddd20a941691a1a56d3d04e27 +:012ce07ed4af695ce7aa265c986b0320fdb1fe +:012cf0d70b748126cad2aee83e8c51164c9a6a +:012d0069ddce0c4a47c9c60834c023ed32b180 +:012d10c6f9a1f844c9f7ee301d698ce40c74b1 +:012d20e00d0efc617bc86b859a83a6c3a8683f +:012d305931d1b141ee106f7973e3dc655e7d20 +:012d401966097d2119fa49d75cc9b1b0740ab6 +:012d507e94b724fcdc31303c13d06dfa61b9dd +:012d60b3b1c75a2368b709d618b8579b27b4ba +:012d7001f0ee780754e6d8d6355ec342089eb1 +:012d8022d0aa3a847921f29175efbeaef42ca1 +:012d90f9a28889037a52add29545013571dfa4 +:012da073b2af8d18b9c6774bd9b06b76d7c805 +:012db060bf4c0de6fde30ead42bf5b78b5e626 +:012dc0868f784e577f98f0322556580b8885a3 +:012dd04ef8af82031a8f978f01d3c67a47a32e +:012de0b7e88a857dcbd1977e25c7016e3437de +:012df03979529983fdacafce1bced17c250d5e +:012e00c90dc75fd3403059cd4cab4ffc160ca9 +:012e10093fdcda0085bea4126db33d982ced4c +:012e20d655307ca42f2b5e08d34631be82ebba +:012e30e2e112480981f27c6d0846b761dd75db +:012e406dfd01f1877ddac6d6e749c7251249f1 +:012e500c3ffdda773ec1b679892e118a17c0c8 +:012e6006817cb70fa93b9e656648a23948b9d5 +:012e7007eeee08dfe8bc1344f0b7021a5c26af +:012e80ddea5d53d5afd9f19cffbe597d9a0937 +:012e90fa65227c90874ddcb97ac0e2ecef46d8 +:012ea06cb9de3afd3628f4970b88d4b7d1121f +:012eb04cdbe31978f605de0af3cdf4036af4e1 +:012ec027285d6da638fbd811fa8ad73920cfe3 +:012ed0426d5cc644f59a35fe49983f66a88558 +:012ee020698bb7ec9ee17cf16f498937c9b1df +:012ef08ae3388286d36bbc8cbfd1e027379725 +:012f003ef8786899860a0af7db20bf3b13abe9 +:012f10d1e88682dc34893fd928833879c8768e +:012f20ba8273243c80d1ce00dd7a559a1f7e8a +:012f3030323ccefa96aae6bc9df716f86283c4 +:012f40bfbc81e31406b5f98bf3bcf14752e453 +:012f507a0198e56362c34d54534a4399088583 +:012f600f68132d5702b5294347d8b7eecc568b +:012f70d93640bf6f9d59f23b2d98ddaddb3fce +:012f809f6dedb65a8073a9f1dd4c5cb17ddd1c +:012f902f9b3d17b98275925e56dd7279562f00 +:012fa06b7f2bf5732afa15638401976b3d71ea +:012fb0982dce0e15a1e96aa8debfe4d5c42872 +:012fc0791013e28d5dc315c0edf9dd57798cc9 +:012fd0927a69d3e4415b4d3d6c590f63f0b505 +:012fe0b4d85618d44fd05f4c2fe625bf3b742c +:012ff011d50a6c66e421aba775590bd20d5569 +:013000eeaea4039b1e3858edcf8914bfa6ea48 +:0130100ab1430d6c83c291121f3c00c42c89ed +:0130206b2d211758e4a4474391e1d016e30fbb +:013030da4fe0a698495e86caa6b8af967fd794 +:013040c57716fc91aa701c9bd5c8dd9a6212e8 +:013050cd320ab46654b0a99b0900f3ac9f34f1 +:01306037ed8a7dff86b7cfd2507879f89e685c +:013070358bf1a0fb2988cb26455ce4cfc3965b +:013080c719e09c1e10d5eb748d0909a7b0226e +:0130908fe1c74f9f6c9b680a4906129a2ba382 +:0130a0d27b94437249f9f75b44f8cb5d56a9a2 +:0130b03dcad07d96417e9d4c3848ccc134c977 +:0130c059781b214048dc639b043ef9fa1d7f70 +:0130d0950ae5c43ccc0e94c04f26ff759ce3fb +:0130e0d7d6412761be35b9263ae7a7c8de806a +:0130f0ee7cd760a2a273a8ba09051eddf1fca6 +:01310040ce21d1e3f4408f0bb8e5dcf24ef74c +:0131109427dd151b4d9df0f3478105d6458788 +:013120cab9fe3de2bda5efe2204f7db4ed9384 +:013130a7b39974f149700647f9de19467691f8 +:0131400c7e6c121a76fbfadf97ba5d6c247b4a +:013150bd61ef712d7a6aa8ce221b0ae8a8a075 +:013160fbe5de8a869a93b0608fb31b2cfc81c5 +:013170dd659f1e9487d252740f55490975ea9a +:013180b78bf8fb996bd528c49bba661826c3f9 +:013190f081968d149459e6e49deaf36687e7d3 +:0131a01489270c7178dab3d69ae626e7fd844f +:0131b0807d000dcf12ca4c484f4dd6d672b9ab +:0131c0054b316cf6ffda8e1af99d8ee80e32c8 +:0131d01a83b58a7d594b5935bdce181cd8a0a5 +:0131e08876352b492b0cf45aa7ece89c1e0d63 +:0131f0a5572115c1652dc0b0e6304ce7e50b18 +:01320021785a557bb9ca6e587aa614f636092f +:0132102575067f9a1d7e40f3d0814386671c11 +:013220d3ac6c3f1d5cfc6e2c7e6052143ea510 +:01323013b93a13a33e4448c7b307a2a3cca548 +:0132404dca04bacf1c7f113c288f3b363afbeb +:013250e98da936e1d4ab6e5863fe7782390555 +:013260b76df45e1d5fd380ecae4f0e00fda036 +:0132701faffc911db6ed5bfbbb90891a661576 +:013280e09dfaf40d96f62df0d855349b51c987 +:013290a41f06679c53de914582958b8c84d1b7 +:0132a09ac3d9228e61abbae2247dc25d0d4c46 +:0132b0457553aba7368ced50fa0b1885d8aedb +:0132c017a3b09ef6a4370002a7e2c3f56c827c +:0132d0db0b4fb062d5641c6dc23f5a8a7866e7 +:0132e0523a5877b3916f2381f0703810758e87 +:0132f0b4c0d96594f8f5f641c531d2109923f9 +:013300bf922674f005c82aa43e4dd7da962cac +:013310539453f4364b09df7ce0aa97d79e87b9 +:01332086c69c4f93568b1afbd6f865f61b13d7 +:013330605f2040b650da0e9e73be08d71c3e7f +:013340d02ce84e640f3d869aae4fca44f15b70 +:01335021738db543a58c218d2c70c90869a897 +:013360cf2a4f83512b1afa8ef2bcf512fb63e0 +:013370696ed1b99a90e03220a3a5bd347c7e54 +:0133808a92afa20d79d7f4f0af96c73addd9f3 +:013390f0a3fdb6a485ac6da9c580fd69b6b393 +:0133a0f599fd7c80af5c58747875d882d4155b +:0133b0af3da196d3f0498faf103a8f23aa6003 +:0133c08d48361002482cd20443ca74ad2c89a9 +:0133d01c83d183063d1f0753f08ce58e6e07b0 +:0133e0523f0c98f4fe50fe1ae1a4c8e4c4d142 +:0133f05e9501aebe156e25609ec4651674484a +:013400e2a5d52d7881816a92a991a7174c76c6 +:0134106846991eb1db77a3ef56c069f1437ecc +:013420ca92b96d2714a610fb5448c1252d62f4 +:01343091d20a6147680cfe519e4e03d2f92e31 +:01344006043499b23a4bda535b97fc9f0a703e +:01345056d2e0eeef2e36365078cf3a89e17707 +:013460a4e43e1497acf9e2f99fb2d6392233d9 +:013470feabe47120a77a48fa0c1e263b349cfb +:0134806572bfe661fbbe75d4992e70d95599f8 +:013490fa5e3daa8b77d15966ce00620bfbc813 +:0134a0e2b80729194b7cf0d699847dd32668b8 +:0134b06914c2cc99572e2c50446c6db429acad +:0134c06def41293d441e4c45e3d23a76e7bf45 +:0134d0dd9304d48924a140374c7075154bb09f +:0134e032217f18e2a713f9cf9f2c8bdd571047 +:0134f0acedcb51610089c692195422f335a494 +:013500aca4f005892c11f22895ecd989931efe +:013510ce3b35a7efd3d21aad74f63af644f137 +:013520426f7e16c769150678d76c3772e492b8 +:0135307a012f466e63d3eea4a07cb0789ff6f6 +:01354063ed5cf21c3d182b82fa39d355f966e4 +:0135509f9ec93be7f0ad6abe912d113000bbc9 +:01356060a022f62b14c845ad3039d2450b66bc +:013570b025bacbba02da49931c2b2b4bb5e43b +:013580846aec7da385d8f1dc36c7e0e3c5ebb5 +:01359015aaabe54861373f4903c0babb07d243 +:0135a03a37c92c826ade7afa1440567c7642d1 +:0135b0f17bc279cd3396a13120c26ff3ccd6f9 +:0135c0d476eef0f7c9349e8546055654f88ae6 +:0135d06018644f3934803b4b37f43466724eb8 +:0135e07fb44f560461d46d9ac7dc4e57abf673 +:0135f0c3e83c62b6ba6eabe673e50cbaf66688 +:01360083bc5647ccc70d2344fb53c856bd4270 +:013610217c0cdf1ca3afe3e4a59ad8ee3e751a +:0136208343bbd50d67f1278e350c378b9a6d0c +:0136307fd7f4821ef41c16bc862f3f0a171fd5 +:013640b45bae81e5d725d7b1a613060d3a083c +:0136505c08705de0884c4c5ae88855978d6bd7 +:013660bf75c03f3cf0722fba34e1dfbf0ed574 +:013670f4a71554ec47908aecdb48557640daf1 +:0136803974fe64c0e53fbe4b79628c891699e2 +:0136902ae4f70adb86664bac43d3ab3478e665 +:0136a0e36bb7dcbb887de8825a55765e43e038 +:0136b02d902a8658ba132ccefc9b2a2d018877 +:0136c0b957da42f3813573631789173075f8c0 +:0136d0935ce82e8f6351044c3fdf081df4daf5 +:0136e01332f50ef23b83a0d3ae0b363eedfc15 +:0136f0faf2cb6db2f88b0d0aa9d47d39e83954 +:0137003f9309094aabe498bdbf44d926f1859a +:013710b58d0fde21a2c5cc56dd767379a48aca +:0137202bfa91148c50191d2407ef966779f001 +:0137302a048be0557d6b1850df23f9ddf4a834 +:0137406b0effc5255db01ded8224dfb879c910 +:013750b433ed9662822307ac22fdbb61718f5d +:01376067a1a71fee81580cc60b6516e22ef617 +:0137705982e8fd844400bdcab7a174d5092efa +:013780493dc29adb882e18aa52476b51542d73 +:013790b3e295f57185ee938f3cf045c1d6b686 +:0137a06059dabc26cb851b58d74ad240f98439 +:0137b0507ca49a910031be7311c18143ee97b7 +:0137c0b6b99fe6b7e42eae68efe669a98ae514 +:0137d0a308082f45f098cd4bf40e6a0aba13c6 +:0137e07898b387dfde634fa00be5c0db33ba2f +:0137f0d734665c29d8ca87dc1ffd86c4c8893a +:0138003f10553b776c4872916313c40d117297 +:013810468a0ee8dd81c5f0e6c5eaae4edaa6e1 +:013820656754bb3e7b2d1c58eaf4daee2d5d98 +:0138304c97312e93851fe0fa478099b1c94695 +:013840e787681bd0cb27cb8302469fae090205 +:013850ac2e07fdb6a33e53c3c738c23051b79f +:013860399ae03ada0a19a91b16d345993c4c05 +:013870f615b24181f79eb4cf92aace84efc81f +:01388088201c2b2c5f8b6b4d2a45f0a51c3c5c +:013890dbeedc34b750ff95a3f1c312badf1dcf +:0138a0c17526dcbfbbf80e637470f022e8fadc +:0138b057229d205e2ccb9ed5111ba05b03805e +:0138c02ffa7902f0423336e5bedbb1637929b5 +:0138d0e04231806e067de8f41a2c72cac13d78 +:0138e03a30f012b4b78bcd6c1921758b4003e6 +:0138f082eb32189877b9705e876fa8956c7bc9 +:01390062ac5625df127ca7ca1ab68f447bfe88 +:01391008588ce1884a950c1eb2026276e018a2 +:01392024a82d1071714914382c59051155005f +:013930b72d2049907c18b3b73f37d7606d3bfd +:013940186a8c9e199587689101a517cea09340 +:0139503a0b73fef97911ab494bc3f7aadd5129 +:0139606956bdbf19dc34a95f7b9b10465faf89 +:013970ee097f52499159642cf9b98b1a8f5b8f +:013980794122ca8e212157c857296cf407a87f +:0139908c0775491299f6a774deb5fdb82f741a +:0139a0f820c471178a7a24c9be2b93310968fa +:0139b0d1464e147539c261a0cd6d3700178fd8 +:0139c03d888a1fd7d9a4373b7146246a95682e +:0139d0a961caff6bea4e48dfbaf4e8b9581d3b +:0139e07101705fa4f40e901cded841fcb172f3 +:0139f0a2b29fb73bbe6ec6abf3522a3b47334a +:013a00c073bd6be62800bd9672839188e1c154 +:013a1082bedac2b141e4e7c8c5cba0c5fe5683 +:013a20b337ca9049317a30d7bbe1b9e31296e2 +:013a306464f16210be52726cb295013322bd06 +:013a40dad2c0d9c9794eb809402f76e667691b +:013a507a833476023ed3749f51e57322c0833e +:013a60fe76506c7fb991c096fb516e9327d3d6 +:013a70b2f08f1ca56c1a87dc5f905e7d6bac33 +:013a80acc879b12a3e1ff56e63f286c0098f1d +:013a90cb740bb11467a7ab27516361ea9e8b6e +:013aa0e7b6fa0a9d8bcbb10796051df4c223b2 +:013ab0cd6f15836ac7f5a1f295c86d9d83e885 +:013ac011c42ea88792c9f62ae98e9965b864df +:013ad086b55db8ea4546cc37f9c3877f07f2cb +:013ae08d7cbdfb0308e3fc928aa68fea9a54ed +:013af06553f49cda42295ffc2dbade88c3b8fc +:013b00859092f9a99ae5a16e917e5b4253b686 +:013b1033651c6d681a584dde31773418d9de64 +:013b203ccda10d6bb0ad154739cf9e58b138a9 +:013b30b838497e6aa7838ed36f31c789788042 +:013b408df9b8995cafb46bb943b481535c22f6 +:013b50b1820c3a9ea1c29a325613d31bc723ab +:013b6015cdc51def3821238a2586c1219d88d9 +:013b70a3f041a383e5688d23bb7b80379c2199 +:013b80ef322539f4048290f8aef1b7c2bd9b04 +:013b90d2dfaed1972875d97de8ab4bdadfca0d +:013ba024e880761bbe2c59c25407c4c8acd3e9 +:013bb035d1a48c02a818d1e5d9ad276b5d1647 +:013bc090cc673a36fd75d8a285ddf085c3f383 +:013bd01c21199e9229992a3b52865eb05bd3be +:013be0803a1d9376a7bd9256f7d5181fa0aa5f +:013bf0ba1b806f9ba42d987ac8611e4d5a4af9 +:013c00e4d18791f90f96eaad6a6180cd665249 +:013c10809eab446978bc70e82dd065f04dadbd +:013c2052a7815eed74b9d849073d67d84a4508 +:013c3082f88e36ac2f81e0d03aaaea3bf66879 +:013c40bb20434de27bbeb4f6171911932fa1e9 +:013c50dfbd593b851b68e632dd30dfb261fd7f +:013c6018647316af5913656957385fc8a3dcf6 +:013c70775d2c8b3f860029d7b3caf8dc9fc3e0 +:013c80686cc08b3b0dde34d8eabefae0396b0f +:013c908e5d8124292f66d48d942d726f07cf22 +:013ca0b41312a519612047468271f238ac0d20 +:013cb064ffb965c309bf78de78ccdbee4d5bd8 +:013cc0db5202618967cce65bf09e89a3839dcc +:013cd075e81f0255074033860a197ab300b487 +:013ce0bc714a0bd018033f573e8000754f5ac8 +:013cf01c204dd467e86fc3fb553d2139222b2e +:013d00cbba233d7ea35898e2bb12af35f5e5bf +:013d107cff0674f24e4c77fd9d7f8d2e4d2579 +:013d20245306d5b95553ef65580774b3017b54 +:013d3019492991434f72f60f1ce675b6221a3b +:013d404bba13ad31eea04625aab13b1d94a141 +:013d50caaf631d9f93927267d7c2850a253d2b +:013d60412815e7e87347e13cf9a7e87ba4fb63 +:013d70b4738a07319d34b0e638311932cda672 +:013d80040d950a1c132bf79bc0e871aa974402 +:013d90f451de854bb54055271ffac6d271d613 +:013da0888fc3ec17ac2019d919a824e8e5dd17 +:013db001bb2966425541a3ae9d262ec6594f91 +:013dc049deb94ba8257a5d01a9f9b7c5da9173 +:013dd0a3796089beab1e151f2621f85765ef0f +:013de01b707e08e5b8f555647f28f419449744 +:013df07fcfb1a1fa0c540d532af51bab178557 +:013e0063b7b3887af6535a347ef5aa726f8711 +:013e10b9a0ec0f37e0fdc1cc8377c713834e9c +:013e207bc843f5e86db96f6bcae164b4e58461 +:013e30d853c02f96de968a563c6bbbfe3244df +:013e40b6a34b9986772cdbb4db843877ed22a6 +:013e50befca483ca82fc7e4f3dddb38a7096e9 +:013e600c62120e903303bcfe68543219d7f48c +:013e70226e61f3c2ae721bc2c08db5518fbcce +:013e80b6e1660899f91f571928c6c74a974186 +:013e90436cb5ae9682e215a1388ef644a3c479 +:013ea04d98ff4f10b8bfda35acf886883d3c9f +:013eb0619b813af7d700e46545c0802bf26e53 +:013ec07b4cd078cec4424e3370bfb6492849ca +:013ed0df0d44850598d6abeca85e4529d9d2eb +:013ee08be2d4c954c9c68d7aa090e3676ab17f +:013ef019f629bf65b33b8a72b7402b78223794 +:013f009f6ed5e778659a9f38d139c08f13a2bc +:013f102755f2735fced46747b2f5f61628be5e +:013f20c3664263f8ab6ce0a85dccacce7c03d4 +:013f3071341d5fef952e705228d907a0384760 +:013f4086d7c7c76d0c178d6941ce7ad17f379e +:013f50b6cb416e84a9897030df3245126ec89d +:013f606b0d6e15e71b32d052f775a5819a3996 +:013f70d7e28ed3b6f351ea77e70f5c01adba56 +:013f80e68387339f2a94f20c41ce8dac49ef9c +:013f9018cf223d19b94af2c48a91bd3e9aaa82 +:013fa01213abec39852118d9a4783185178281 +:013fb0138c42356cebcaa25d66cfec49f0e8b6 +:013fc0749cc2bb821a1b58cf768a6a8c5d226b +:013fd03c7fb333dd32afc9ec434bc9dbb45304 +:013fe04e06ef3af2197508efe3ca290e84aa49 +:013ff0efbe2d07f6e54d4440d822a017293753 +:0140000cc5d928d30bbb4f311c55d668f7857a +:01401061e448818b8cdc2cad5e0770dc3fd0e2 +:014020dcc81d25bb4d82b9b5f18f6f81a3448f +:0140308103d2b49343581511f682306bb405e1 +:014040bfefbc11bb6616a17b5ecdc184360eab +:0140505969e32bd1f145f3656e0cfeeaf565b0 +:014060632a1b6d69d1c2d461a3785d673ee950 +:014070fe653a13da955e6b441c3100e36d4bde +:01408069bccc5b04c17af304e18d0e8515ff96 +:01409048084120ca29da8b682135ed9dd6744f +:0140a0e539759fcbaf459e9541251a4134841e +:0140b09928d38d9be719a870d70f71d87e1e69 +:0140c060a71f41e89d0103ca124e2ead86e582 +:0140d07dc7fc0c0ac6d8cc9b7f8767d07f0069 +:0140e0acccb412490723682934e98718f42854 +:0140f01fdb1e44674c29c358aa9f133e1bcf66 +:0141003f4cc72a40ee9f682c26f16965d735b3 +:01411023d4ce15b52735d643abac0e421f623e +:0141205e04a241c81a27421357c0dd1a76ab2f +:0141304859b67570dfd130ea47b0641d02e797 +:0141401d0c11e4a7c284a71720cd3008946423 +:014150cbb3b8726901d7bac7f4d325d2e1a67e +:014160672bddf9b5932a9afe58b753712bacf1 +:0141701b2881461ee5f5b3e9f435c2065f6e5d +:014180c57b00a71f2711a58e2fcbfc2bc7a598 +:014190f7282aa051641d347d07bbce72e07def +:0141a031b5d632d8e74d2723dedde2a2d3c033 +:0141b0808f2572020588bca235eae893265f9f +:0141c059330edcb4d905d4473116eeeb18bb51 +:0141d0aa9679fa9af6c3e2407fab2571a3dc6c +:0141e08799f358976bfcd7dacbec7689576466 +:0141f09377dc5cbe153bd407f0a5ff512fd1c9 +:014200625a4670b349c9d3745becdf423d8a7f +:0142109b199929a6807956d75e12885fe858b6 +:014220b09d4cada0298cf06e6a9aea667086e8 +:014230661560d74a4c3ef5ac36346bca386af5 +:014240e9a7dd48338c99e44159673ff7905fd4 +:01425085a4c7160815ceab5b6a6b7d2ff2be21 +:0142606018ca879a3111331fa67f0b571a8fbf +:014270f1382aae64c14473cb2a213fa62ed6fe +:014280791eb2acd5eac4658a236e8e945ed7fb +:0142903a7e804dfcfffc4cffeeaece99a15196 +:0142a0ae4f9c21def35892368819eb3c9c6e98 +:0142b0155cded77e9f5dc785c15ad6ac87caa1 +:0142c0fa497a47655bb0b844b942eebea84435 +:0142d09b518df1044bd1293b4db71dd8b354b9 +:0142e0ca77783a5b0f0a3de2b57c5c0b297252 +:0142f0f01f5ad7f09ea4bd2dcdad94b279e8fe +:014300391b31956ea1906f8d86f37b11decf3a +:0143100e5e87838535c741de7b5b2cddf16c5e +:014320fe2dd5c088c4f9e23994aff0962143e0 +:014330c9295fc0c15e71730d0cd2415b6a3da8 +:014340b454a01f9d4dd08cbac5969ae343df50 +:0143501d296e1d6f591a058008f781270638b7 +:01436005f5cd6ad7d1365c6d5a82e2e9c826d9 +:014370599c29479a1749fde5401b616473f83c +:0143806cc38e5e5de3dffbae403f017812b91f +:014390e5abdce3ca891316e47f6820327ce579 +:0143a09318dcaff32b81a828cbabfcf6af91a6 +:0143b009420d15b4ff61a8ba9b91461824edab +:0143c0fd27cddd30f913efc86c5a42262b47d8 +:0143d0a364280e6dd6c27703d54ecf23e6ed38 +:0143e0d53e5f167084594c9b8500c95542e07d +:0143f0712a40da1b013e5267d65afd71eab0a8 +:0144001b76791fdea37276007f9b45bc590109 +:0144108614bb16a36c1f8f6601233dd21f2453 +:01442029c6487402da620874c38b4dd7573074 +:01443007596abd337eef23f5a3560bae7b9962 +:014440ef7adb71a10fa158ed5236ae3e594465 +:0144508995909cb27e5e4ea07f4d157898737a +:014460871f1958c2676f2bf1665bdbf93b8447 +:014470ef17f67159a6c1f23b881d830736b147 +:014480f0316881d5e62476eb73e3aad07584b9 +:014490966a2d678309e773c30bf1d56fbab26f +:0144a0c4e2bc473a1e7e07d5ca9fd01294675e +:0144b0517a0b035c313ed20c2ab18f40cc3a27 +:0144c010e327572b97710098baac458f6ed9fb +:0144d02b319fddc08536d69ef993c355e37f14 +:0144e0024b56d8393ba1630ce6384842643368 +:0144f02355e245a116764708210e9df0f4f459 +:014500f0300b3d954d045f305ade43f6b657b0 +:0145109b93471519bc13439716b73180d62230 +:0145207125ad3923eb50de398ffb905223b311 +:014530946afa9f0e66b88cb4f23ac1274b97e3 +:014540ccd6ee5521a259feee7cca4e7a7f48f0 +:0145503117f6b4ae97a9f388eb2b1394f88267 +:0145607ea9f6a3314bb2c2f84a57ef19de5d02 +:01457056199670b9b4a3185f2b70554e4f9aa8 +:014580c271bb36c9481f74bc19bfbf57a49899 +:014590a69c5a489bc5e1867bfdade8d4ad4633 +:0145a04c2e7151dd496a4fee25f6dfa435d49f +:0145b029737fa3cc47def55b94ab55339cb145 +:0145c00392cf5b9e00077ecdb906811c3d8aa5 +:0145d03b2b7d5207312134a8dee11f4a2fe383 +:0145e06e948ba65d309b0c7f7fbf9a68399cdb +:0145f0b99dfa58309d8aa5f7abba7ce94ab10b +:01460058560814c5f2ee992ef13785e146f4fb +:0146107635632165adddd5a0cbd2d36f020c61 +:01462027eb0f6e7440b134b730b62260564416 +:014630aecd1c599b9d5c028b58c854255919fe +:0146404e959ceee3c14016a1d3eb63946891c0 +:014650df97ca9af27b15d1425173c35ec25acd +:0146602f1c36efd9193a5eb6d52d2337e093d7 +:014670b140d7229a8f6e5f2a6a8e113f0d51c2 +:014680f931fa4ec20baba84f0dda8e859b95e9 +:014690bac071d3ca528962921473387e078d6b +:0146a054dd047e0c3558bc29be4e46033d56b4 +:0146b0d8ce6b32a74e997aeeab42bb1da56819 +:0146c055b3ee6f69dd7e051df338c5879eeebb +:0146d0d0af1391d46fb082ff602526d390db28 +:0146e09d46e8bce85e7030947b96da2ba47ef0 +:0146f04c718dfe850b556d63df65aa4f94e612 +:014700834dbca29f87840ba3ab98b2026a8b43 +:01471075dff698d00ac5aa4ef7e6bb2ef0579b +:01472014b185605e7e7bcd30139727e2c8059b +:014730ddc84b795b16196057fac5a990dfbe93 +:01474068b7f2e5d0c1bcf2fbf649cfc7b4ae85 +:0147509d93b5266a5a0e318dc16f96fc6c7ec9 +:01476003cf95745e9e2a30979a2f3153ad58c1 +:0147708238d4cfa390ee90911e200e748c47cb +:0147807dc0db3ee72ac4f52e25a62674f3c0f2 +:014790a31a21fcfccb94a498133f53956bccb2 +:0147a0becd85bce5030a1f73421a821f99199a +:0147b0565ba1c8a2bf2a358fcd24ae71bbba1f +:0147c016ca99e827537048580c8db4410af948 +:0147d00583849a8acfddb8976adfa341b50f79 +:0147e02ad8f0349fcd9b53d5e08384a44f8b86 +:0147f0ee409a7332db18d6424f79df07315736 +:0148007a8a7d8511b59d759fef985a6dde24be +:014810c50e33925ae06910fa49fb027d6dbf33 +:014820a9733154ce451d01c60cf6fcffa4370b +:01483093ebd475eeb7782a72b56d7361f6186c +:014840dfbff344a96c4d7eedc1be8523098ecd +:014850cfeacf91080f3b14b57d67357c5e9a46 +:014860b91b67feaef7c3064e045e5dd7212f93 +:014870d69b81bd9b069715b636fef003a829a2 +:014880fb6ddcf55bd9c3e38be91c70aee35d47 +:014890eba98639e1c104e817a9b4c15872c507 +:0148a0091ad6b3b29c1f9fd2432d4ce042da57 +:0148b002ff5dc40de99f5518f9ee8b7e7f7d3b +:0148c0295e2692886fc7e1a566d7a7fa584f8f +:0148d0185d105fa5d7a5bd9c2f1d2ce1728d7a +:0148e0e606f09715abde3e3708a58a2cedab27 +:0148f06e9386246e9ee8b04935df29ce54824b +:0149001d7c841c7f3263854360fb2a150e4f87 +:01491023eee59421adc74e06d077bf22c10d6e +:0149204c48d39325fae6f9bc9662aeeb57f2b3 +:01493026a28203ec300eb666c3971f4b6b890a +:014940d1066337963c8c24e85cf11a92ad4ef9 +:0149504c374a71cd98bca20c3bf1fd673b02bb +:0149605cf51170e846cb75b0e58dca15d04f6e +:01497000fbb3705fa3ad1168add44cd7ca3824 +:014980b12259a4f99e3faa948e374644e59a60 +:01499001b0cb1ac28d0b6121ea625a3d2cb06a +:0149a0be5e408d07427cff6d531fb763dc1294 +:0149b037712fd841f15ea5e7387a52929cf5a5 +:0149c0f3c96f12ab6a575e8be769ebb2c0a5f4 +:0149d072fa23de56e7feff2492f4608118a7d9 +:0149e0aa11b2b5f4f4887e293c171ed4f93c99 +:0149f0c41b6666a8af78090cae0b777cc6b6a1 +:014a0097cc10c4d11859e8290a2f06e4edcb2c +:014a108c69a670f4a56e2ac237c4d45faaf6b8 +:014a201e1371f3381b4107d123fad7f8ea2a92 +:014a302c4ac3e28b3f162735f5c529ca03a70f +:014a407a1acf08909a2c706115dad023ec3c53 +:014a50e0b0eda462e635e37569b84c8d6620ea +:014a60a1de36a2f0a17c60f7e95e79f4c4770d +:014a70535c7f38c91ed7097fb1242f519f5888 +:014a8001270be5b2ab6e518daf531a6436d1dc +:014a90bf43c51d88e39cf0f816fc4e1f54cce0 +:014aa06e27548547c3f1deeac8480bb0a8d3c9 +:014ab0df7d6b95cc8edfb4ad60793bcc3cdf8b +:014ac08d5a826f7c80dc90b72d8834c6540f60 +:014ad0113c1db3e8ee6c3008c0ec5c9f38fcaa +:014ae0ca68066e39b7d0694561b3df6215fd46 +:014af0da351d66f1ec782662c9cd61df8592e0 +:014b00ac502df395e5abe4e8371be1abb6d03d +:014b10706a776dfb1f2fad846729ca73599254 +:014b205ab29c88b372c780dca874803cb7fc8c +:014b30aa4c40b59ee2d4043ef7c4d8c0b8a0a5 +:014b40c3c2262d972da55bc1593f30132ec8ea +:014b5048cc5934aba152e3b5250a06ba56bce3 +:014b60d53e36186a9409685d10f2aaffd7fb23 +:014b70bc43d514a0cca428582534215cc98113 +:014b809897772a524cf687ed812b71300de72b +:014b90c7569811c84c3ddbfe6e9a022608087e +:014ba032d3b10b627f09e1d682b9e85a37987d +:014bb0dfd308e966e1990d3b83569e1f8149e2 +:014bc08a5ead95887a8235cdbec48e4a84b422 +:014bd02e19d7b70b2bf28ea5691d6b3e5a5caa +:014be068cacee9397c61cde836c0298dc625b7 +:014bf0e30ce3893f52b75b0fc18743427b1bb1 +:014c00fbf9f64ce6209ff8ecd302f293ff95a1 +:014c1062e902da423705c06773762f6bd5c525 +:014c20b64aae5f15bf58d071e06633281730cb +:014c301748c4f39b7eae0889c36bbf21e68407 +:014c403cc7aae605b760d81a061e93f212f352 +:014c5033c388223cd2dd1961f3fc3bfd9300ba +:014c60a08dbffcda4a1448e1d01d6c55886533 +:014c706471564f3951bcd5f567e4a92130f148 +:014c80c04fcfaaf5e02ae89d7f0d7b4df9b11f +:014c9075e1b66c243597b965b2c157269d6b7a +:014ca08f0c3f8677b4f7ffa32a03206ca6da81 +:014cb0a07ca747a4cdd2660d30dbfe94623110 +:014cc0184960afcefdd3d0c2dc8ae6345775da +:014cd06fc9f57ea13f159a7ad41b56ce7ce4c2 +:014ce057b6eb3d6f1f8d17df761d4fee670e15 +:014cf0dfe00e93ff0e52d287510ec7820123eb +:014d00a6c4bf44b47c39ef7ebc9353046cce4e +:014d10e27c03a87c23607893d34607d13136c8 +:014d208829cd69d481e503b0722c50136b0408 +:014d30f1cf04a0189a625c5ec60f8c854ea1b4 +:014d40218352d23198fdbd4ce06e00d052d1a9 +:014d50b31c1b74da3e0bf0364768a2457083b8 +:014d60ce3975a14876dde5d58428ef79de84eb +:014d70e01d3014aa7e62dbb395a5c1af1e084e +:014d80e15e5538e85f37c7dca33deb5e84a723 +:014d90bc0ccff7c7c7181cc63481bb19c626e1 +:014da0266f06dd648e95e031867eb6c8291b16 +:014db06bf8fb00e44018f7991cfec6574ef38b +:014dc0c63b8de0922e9d2d64027bf1d7244d59 +:014dd01e41bf90f68c134307ca8153344cc2a8 +:014de06685d464b89de8f149df7622920b6a6b +:014df0f19066958019400d7992e9625abe2d16 +:014e0065d23bd6d6d9465538275dc191f6a676 +:014e108ebc3b25becdb30f9bff3d55de8fe29a +:014e2035bc3844b9e8bdbb0ee50fec28f5a37f +:014e30fb88e3088981a07ff26b17c2d2245b5c +:014e4011ce78b22969047cb2927b8e7d666ea5 +:014e502a7deb3b14f1cf6baa5ea8dd9f99d9c2 +:014e60a46168e6620a1ee12d8d3387ba14860e +:014e70af4f3e9fc9f1e44df5d29d7982045839 +:014e80be78d9ea32efe043883cc198d42421db +:014e9034efb80710ba1dba277161eeedb48371 +:014ea0a6f6ddee9e0f4bee3fde640ad3371b13 +:014eb09c74fb7dc8321b535d5bba6cce3408c1 +:014ec096c751df9bea2d97fd1b1a95259dc85b +:014ed0fca5ac8c8a733597d648669d7203a349 +:014ee0cbd1a10c63f0be07cebd801018f17e88 +:014ef0c97e2952e2e8741957577083029f2a37 +:014f00c099f0acd68e3d059a0516920dbebc91 +:014f103938c057a05eed2f40c20f09d1b12559 +:014f2059751957e5f4e6c1aadc33f92a45bca6 +:014f301a45b0f5ff5390e0865f492748b2c425 +:014f40c3ccab3114f73b4362665b719f46a6c0 +:014f50b8c5a80d974a0fd4f512e201bf65be8f +:014f603367c66fbfa1b15707b36c9f47643613 +:014f705069290969e1d29f3c104d17969ac485 +:014f8013afa76a9b46496deaba5b185a8dd865 +:014f906da515b4c4ea9fb30e9f9f484502c094 +:014fa0141b4f756903605982f85577808332d0 +:014fb0f38d0c9d4fe1f8a82c05ea9655dd7a6e +:014fc041fe400810a04f12596b4cf0382fe77f +:014fd0fda2d9491ee218076965907c1feff902 +:014fe0b0c5ed0f0c649b6552aeec1da0d9eceb +:014ff07e186f6e5754a4ecdf0402527f9c17a0 +:015000c78b9fcf62759b85fff4dc6749d9d441 +:015010bd94543341d068475f417f51ca794f7e +:01502033d6d14b5ef9117269dc19f5ef57f8cf +:0150309bd783c33c2b33d12a99d818c660ae75 +:015040094381c1bd64ad3efc07b95b6be31143 +:01505094f2092657efa8626527603755d28699 +:015060d3ebd7ca618a60349fca2da53266ed05 +:015070deb4cb58543ae14274a9d869aa4c9b52 +:015080fd6a4d3b78342fec95e0cda3c418411b +:015090d6eec98f0d9cd8c99a183fcc0dc57cab +:0150a0fc4c4c69275b7a8e278359532af44d79 +:0150b02b3898ecb55e6e630fef79a6f2ddafb5 +:0150c087b92f98e13688a2bc99b79d3c3a175a +:0150d0cae757829b0fa51549561364bed585f1 +:0150e0bd32db298a70ae949f21cacba986a162 +:0150f0414e9a74dac244909d243d02c80fd596 +:015100bea2a346114d5b875f853011852f7f6c +:015110ec33a60bf173ad99e574dade32d8a482 +:015120fa372264881ee038c54cd9a709ef8c7f +:015130199c7178d4d1e11210a729ce80cc7f47 +:015140f3694dd7a01642599b6b3c0ded7beb98 +:015150f7d65048bc363a86af438193c08da50f +:015160ee73f19bc1a006c85797b8e754b26a3a +:015170d40391267f0d1dca5057da4a08ca5422 +:0151808604e38b974480df079c1e689e690ec6 +:0151904f8c73885e5635c3f5387d7c07bc2170 +:0151a0dc0595f861c43ecd23ad96c541c8ccc3 +:0151b0bd4bccf43576bb61b82f1a73cbf02bfc +:0151c0e447b82e92b14c9707186180c20e5c2e +:0151d032a15212bec754fb1d2deeca8f4a393b +:0151e0773e43745ce569019ea76e0715963232 +:0151f0420b3ed29fe954467bb2b2c931dc7dba +:015200ea6d466c9096f93a8d17526c81721808 +:0152109dc560557760d4b615df81e07f5e618a +:01522023bb8b4885e966ec58e45a0dd5f7f2a9 +:015230e0b6f851b4beeeca8e33144c9c76fc7c +:015240206491564e073718192847ab3a083955 +:015250d7f9e43c328051c14bbddc7750b02934 +:01526074ea3a8217479cd49ce63f3dfc5fd43d +:01527060a55d84001acfe6fff953e3233ddc01 +:015280359495a3f8e230f256f67a5039631cf8 +:0152903a0f220e3064a456ba808c8ed98f670b +:0152a0ab071630171135bc3178ae072627cfe4 +:0152b0afec58c8bd0621eecea3288a56c7e112 +:0152c0bfb5780ffd30349c48c954539d1ae33c +:0152d040ebb368cdfb0a6e7d2ccfd3c64c6d46 +:0152e054c248114c5c09d97e690f6595909ea2 +:0152f0167934a6b279d62c23bdcdf7a418620e +:015300795e2c7951173e9a9323a3722cd72699 +:015310d4d55c44009ba57f154cbddba6518a9e +:015320bac08725c1b6e8890f2a8d380e28552e +:01533003ee3a6f93f23a668f1a1de7f959fdc0 +:0153405635460d1ab70b0562fe6a2771b7d0f3 +:01535039ed0971e228e01223537d2dfa263ec1 +:015360865061bc0261bde8c686ecbebfa79fc5 +:0153704756c0f067f88fd55dd4621a7544f489 +:015380412f17ce9395d307af07082806a749c7 +:01539034f9a05d63a4c878f3b314c9183f295f +:0153a01fa505815e9fbdcaed5a73e6651d29c2 +:0153b06ade26196d2163bb304152773aec149d +:0153c044180cf4071384bf26f929cde433510a +:0153d00d2d4bb9966b963371546c0073983a4b +:0153e02fba026db5dc13e4bd1863f5657c1789 +:0153f04698fb51434de6133c921b45096174fb +:015400d2551c05c69f2317e4abda9420f5c2b8 +:015410887842ee81c7e8295db32c232fc2ba62 +:015420c96688652c330835ad7c78f6e6bb918c +:01543052163535365dd93e32e3ad9401f66a6f +:0154406a8f4f9b968a886b2622e38a560bf719 +:015450c7164b7710244f3cf33ada41bd64f8a5 +:01546072fd75a75308ae3571a5bd64f8131edf +:015470f57670aeefe7bf25c9d84b92def93c07 +:015480de8eca66f1c603d3aefba253e8e389b4 +:0154909b5b4b0a234215e18052f4c934bc147e +:0154a0dabdde2cc855971a01835730881b61ef +:0154b04736a0efeb683bb5108a774e36123df8 +:0154c049bfe1e093603aa2c47678885ea09f43 +:0154d0a8dae5a5995ae8c3766b58d4fe300c1a +:0154e0cefb66668c02db4dfd1c69ff69c329af +:0154f096b1dcc95cc73acfe7f1599826edda85 +:01550065cd1ed6299ae1c81e0bdb72c46a0a5d +:015510cc13448940684d25c28fc6f2a1db885d +:015520fdd425bb1b4695024cc10f63733268d3 +:015530b887abef3d982e6baad5091d313eda1c +:015540b3aa9465945391c8a563ceda74997f27 +:015550cf6293c7b7d88ff7b7218333a99febfb +:01556081f408e9b677fffedd3ffbd59a259e6c +:015570a3e57958d1f42df24188a868b6478b74 +:01558009cdb020b826b57c6c5921a02d66bfce +:015590a869083958690ac9aeb24587f16afb1f +:0155a00aff66362b0534246a0c49837497c1d5 +:0155b04b28a5cf017815487ad617faeccb23d9 +:0155c064f58ec11ba95a3483f2f23e0a00ff4b +:0155d0a4cfa073c27e759cdc2e2140b04248bd +:0155e085e375d479c51dcb38c255e2155b4263 +:0155f023282784bf4ed57053aef4801b0896d5 +:01560010c0e4173440c62b2a2d3cd3e78a59c2 +:015610bcc785a92c07c20452f19b6ec2da8f88 +:0156207828f8a79a562ea16321f9707b481d4e +:0156309cb80ac046d43642caba0be97d74fae0 +:01564042f3ca3875d95f207726bba928aa923e +:0156501e8caeb517f5eed9897fbc43a93be2f9 +:015660787af56bbb8715335fd7c8a90fd0748b +:01567071b6814f7a5cfb50caf21a8152e88f3a +:01568090898a7427dcdc9a0cb8da29cfdc813c +:0156901cd870f4d2749c8fc2d5b0baf35b73d8 +:0156a027862a3a39a8b41d66ad812fdbbeeada +:0156b05dcae8b5d4919bab3fd928d066c4be9e +:0156c06490c6d27ff9932fe9abb853ac006384 +:0156d00ac3d8d707f1dee45d8ed593d8cc7f3e +:0156e0209bb947a0a420a1167b831a8609c047 +:0156f045a442093c61522a1ffb53ae21e5a0f7 +:0157007c922370c929dd0208eccf97764b05bc +:015710f6c00c623cf7bd8b428e6d59be21265d +:015720242889ed33e375b633fc834c4748070b +:0157303b257b5f9901921a4ccd5f5f74ab2372 +:015740601a0901367b71a30a142b7e03c02785 +:01575037fc0457072059d77098202210ec1d24 +:01576005dd81cf098ff28566434414fbeea31e +:01577088dea14fa61b29db437031121eb915c4 +:015780ce634987113c616c5daafa7c22eba03d +:015790eb2328cad984b75cb53f226a7797d13c +:0157a08fb7fa9513afcabb279e0dde707d9698 +:0157b08cbbb37df00b1fee8df8705c03e45ad2 +:0157c0eec25b1414f523111f9e589f75c77e11 +:0157d093e905be7831fbb792a0d55cacc65f3e +:0157e05b4c1eff7152760d61ea32e5e6454abd +:0157f0ef1b73899bd34b9fe319866365e54262 +:01580041f8357c28178395f2130c9a84aa350d +:0158105af989ed6c14571945a10fe09593be88 +:0158208298d6aaa576de4850f63bfee3df9bb2 +:015830f7c0e7de4c72409f9a00429c09f00909 +:0158404273fd4a7d98ba145bfe5eb6fb1a6e2f +:0158507d4c98cbdda7866982cff7d9d7292884 +:01586045d7d5452f760e518d7ff46e04dc38de +:0158705b5c2e2ef5332c32dc7bdec3f3870ffc +:0158807cc9956ef1b576678c2ff140b6ba4612 +:015890cd9414593aec0dec32ee6aa66c2dfe7f +:0158a0d1fa2af4ac0e5edd1cec42b80cbd7b78 +:0158b05f3e0943309ae5fe2828d281e6ee4fc5 +:0158c00e4d9c5b7204016af45a79a58c87dcc5 +:0158d058a646fc8d645a233ef23dba5089d2a8 +:0158e045a972ade89a0aa273a1065fe2abd884 +:0158f0825a7ce1010a65dbfb66bf943f10b587 +:0159002162b0bb60805e879b892b6150f31284 +:0159105d4dcf75e76d60c4a81517effe6ad6ff +:015920cb6fbd395392fdcd619cc35c5938995a +:015930f9aec39a6fe871772549f8e04f410e72 +:015940dbeb8e7ced88e155c466b9fdd33e7726 +:0159503ae394e64920628329d33b8dff175579 +:015960393b960eb627dc83958bb265e02d50db +:0159700a7724eb475ab21c42e5009f87597795 +:015980dd6114effd3794182726019b71b20f9d +:01599067e9f3c898f62a25035fa0225ec06cd0 +:0159a0b4022a16e318f02f72ae3d1394334371 +:0159b06a5cfa40b604c0b0e428e5a575b02ccb +:0159c0550dd1121ffc9a0e2db90cbe72995300 +:0159d03103ea0cc5f1cd91d7b234ea000aa9c5 +:0159e0fdea34db4e911293aa1c75207cc9cdbb +:0159f0ffff95f4e4bd6dab319705e7c2fdec59 +:015a008b82b1740107c58bfa3db39e82c120b8 +:015a10902ec2d3963d481ac702825f308f5860 +:015a2019a445325abbda679614876a0b579897 +:015a30d63ba8e0bd1c818d7d03b8143f22582e +:015a407220eb1eec8d4c9b0c129ac64c6adc1f +:015a503d48188cb2de84acdae8986504839059 +:015a60b76d03d45e4c1a76d8826b89047daba6 +:015a7021c991ed1bbf379a7041cd57572b092b +:015a805402c324c791cd11b23c6907b6b1deae +:015a903dbba2dba6fe7e77d09f10467a36995f +:015aa02c45497fe3a604fd4f78e5c92afe8ead +:015ab09e23bbd1cee32ba7d36f45bdbd3a02ee +:015ac0a480ad88b67a34915e875c5e146febe7 +:015ad0a2213dd97c5619af6afd9053280f67a3 +:015ae0a1cb05edae2c9a93fe52a9f68cd284e1 +:015af0346eb27e94dd00c85361086319ad7cb6 +:015b00190aa8fd7585e4cb39cfc6bf63517029 +:015b1069b4e302a7abb1b12a7b3890d77d1290 +:015b2005441750137dd5658e5495485d181a92 +:015b3052aa4fe2d15262f2cb0a62f2e1f6ba54 +:015b40d3de1a59004ac18c9a5c3244607c9521 +:015b5039f061d5c489467e8048ca23d0d233e0 +:015b60f76a4d067a32c2f1a3e8a22e6cdaab20 +:015b70b2aca23d9d796290288322616bb39a41 +:015b80e5e14e021d720d2e3e4647a8d258609b +:015b9028e2fbfd8c6bfb3b263fd6bca8553769 +:015ba0e5d7a4eda6223bd69deab460fbc7fc3d +:015bb0779de5ba6f8aacd87ac38dc295d0f2aa +:015bc0676e11fa0bfba60bab33a3307e6b916a +:015bd099c9eac0f4b034ae6c949363c18771f0 +:015be026191aa2a767c05ed2ada891680f420b +:015bf040ececba03ca4dc1a39b2b1795e513bc +:015c00b6e5db6d5db31dfca70802f0910c99ef +:015c10e8e0bef1e4df5be8dad40f5dc85d7658 +:015c20073973ec193e2aab28005918f88c05c6 +:015c30b0893202212dc0ae17acad79e2fb8566 +:015c4046227528b68b3a6b83791479f5ff4c10 +:015c50628b2f31a6fefaccc3cdcdc35f42a238 +:015c60486ffe39de232a3046584a115ba2ee39 +:015c70d993d5abd6228f791256511dcc3f978c +:015c80a6152ecc50bc5094fbff783a7cdfd8fd +:015c90868e0cb3ca0da55abea3b64ce4807c5c +:015ca0d828fd3039a4b92b88eb5e05f4444b1f +:015cb0b2fb80c4f1265962850331c3fb43baa3 +:015cc07c5fb91f09ea316510b960b3b0b13148 +:015cd0c025086033fb645e784896e6697ccfe6 +:015ce02fb59941e044b259324e285992e16ff9 +:015cf075bab827982222472945775e0a5c22e7 +:015d00a1e06e7f827d8f47515ee63ec356028b +:015d1086bc39a0b17610f5cb7d87da2e5cd841 +:015d20e8035737ce59fa0477e7affe478c6f7f +:015d30320d71422868ee119b801d09bb5bd411 +:015d40e12f4c152584415346192edc8c0deea4 +:015d50a55cccf3b50e0133d5551b9d2b714dee +:015d60d96542c76589c6854d781fe03b647184 +:015d707525273d478619420ecca0316f2f51a0 +:015d80d010b0c90589baf8545d8dec0572c07d +:015d9033e2a1c96206639d2ba93f2ac732c2d3 +:015da01dff7dedd76d7e77792eea89fd97257a +:015db00c8f30593bd8ea3978dc83b664ae7935 +:015dc0656ade38d4afec4538fbc0b10ae18e60 +:015dd032254bce0037cc462b760dacab446e64 +:015de00b05500371009d7795890d455cd4d0dc +:015df0e35d33a51eddb6a21853e1f7ead7facf +:015e006d2843446b1883f55a0b8a34621ec3be +:015e10cba6825c78f8fd47f6302acaf917c50d +:015e205828aa5a9639165a88f6242d85014f1f +:015e301db5b45815bc7d12ef7364e4710883b2 +:015e40c162522f826b934e26894855f711d25f +:015e50b127d2461895d289c704e7de4992e7b8 +:015e60a419d8b15be119fb433b0366d7b5a64d +:015e702b5c9001288373bbc6af222d7149a7b6 +:015e803e41902ac80bfbb968019fda30108d3c +:015e902762afb39ea153b0f9417c0feec43b26 +:015ea06abc06821f91dd011d4908ab3366788c +:015eb0e70b42554f81ca109e1eb979b9df8b9c +:015ec0737e0c347783c18fecdd034b34663b50 +:015ed0afc3208e4adcfb0f727863c7dce2451e +:015ee0c0208efac7ae20f16393e6f56aaff3a0 +:015ef0f0e15d1d60c2d3f5c1f2d366ba093c68 +:015f00b0c713591fd1668777e1359c1548af03 +:015f101e77cdddadd3b59c581acde61a03b897 +:015f20cd0eb8939d28324ed8c5bdd2644bca7a +:015f307c4475cfc3c89f5acc1ee84bd8a0b6d6 +:015f40a008c8b3b2b4ff46c750a53a24352bb9 +:015f50b8b1f2e851dc0d73a672e6fb40851a5a +:015f601dbea3eaee587289285ec5aeffe95e7c +:015f708978537b705aa40873e9a650f64944b0 +:015f809c453fee0044d6cb104e7e99c2f5446f +:015f9009c0c122ef77cba6eadcb3b19e72b01c +:015fa015a1b0a367d4c3fc1caa94c3d4f33577 +:015fb062435305516297b8efdddd1dd357a104 +:015fc0b18c4c4bdb7d8074043228fb59ed82d3 +:015fd04cbf10913ee2073de7dd6f1c80eae7d7 +:015fe0d3b61ad7c74556b5de58a6372ea00be1 +:015ff01e72592614848efb5b59d42f2de20390 +:01600086026c89ee3fcff795ce2ec1028d885d +:01601027c7282f96ebb42494980fbc517d5d8d +:0160205851dec8f4ff5e82cec7ce6fdf0ad6b5 +:0160304ceb81257a7c9ab8259ad6d035920a98 +:016040d905b2437e880792025cde3d07d75dbb +:016050fedc003ba025b409eb899179d586ca7a +:0160603929af5203fb3dd837ccf868fcae5d1a +:0160706605342501fc4f53f0940dfa727e2882 +:01608034385f122a4b731d3b690102fcbeb3dc +:01609017008f35bbedcc98b839cd49bea4b10d +:0160a0d6ac0cebaae46b3e8beb04d5640f691d +:0160b0ff262af4e8df3d0ba9f20c0bb0b581fd +:0160c07eb2df342c84ee03148f3708bdea0829 +:0160d0c28b96e72789916ddd000a6a5f858a6b +:0160e06b3e8266b7efe5ec3cbe6cdc340e2e24 +:0160f01737f1fea7a75388056fb43696db1a4b +:016100f3455ccaa0a667ba53e86430d5c91240 +:016110edba73913e143512f627f2e8769bc3c7 +:01612039374380d40fe9e48f5c4e6dd69d189c +:0161308354121daa5943d1d889934c182cc988 +:0161404f5a88078157d3cf24b068065d9fe0c1 +:01615054a7b10703fefca82bbc0214128ad7ea +:016160208d5de7fb57674843b1c1b36ed9ccb3 +:016170ed0ba0447c7eb9642ef52f4d0bb4cd49 +:01618098d388577c8b3091b01cfe42583b2a54 +:01619043e3e76d513d9362f62fde37f6b4ea27 +:0161a08c318fd646f64c9a55f33633dbefb5e8 +:0161b07256b72ce7d3e95b421e725b341fb1c4 +:0161c0b07b789121d3c4b9e44487ab3cd3232a +:0161d0db38e32de3ad68d704e7d8e949c11a35 +:0161e0731441009908fb8984cd3605fffce55f +:0161f02aa216541c506a3b00e4ae8e8849702b +:016200e0c8412d17dbfd03ab9cb93fbe68ae37 +:016210daec0bd7ceb576fd4356411f43fd6a84 +:016220f4c3e54e56e084a8a32ca28c12edfd2f +:016230e434fc149c6ed717f76ba47f4b5af7d4 +:016240c2ebd05c57d47f82ea3324b4c2ce8d37 +:01625067d25d0c892bb20e90262584aa3765ea +:016260e8056c3d2bf19e16a5d3908b68b0deb0 +:016270de911bd715c9f519af80e9e8700bf111 +:01628081597155ef71840dc8f351162292fda3 +:01629044935a233387a0e847ef550f7d543fef +:0162a0e27dbe7c221b423dd21906f67c2274bc +:0162b0eedd5b9661f8a9612e4f861c5eccf031 +:0162c012674adfad89cc96acf554867fbb86bd +:0162d072798c1f727ceeeb5b28307842797a93 +:0162e024f5272e90408c8ec871c14ab2a86421 +:0162f0dae884d2c391b9a18258e230aa8d7d39 +:0163003661e3e5a0acb0cd33d8a52cd9f300e9 +:01631063b040e4b66e5a0fec078edcef8bfebe +:016320e55a136ee7065621e61eb1b790115078 +:016330e175a15e7817d34f6483b5995a0d3511 +:0163403eb92181f5853429ee5149966c15df12 +:0163503b0113eb3b72c36e684a2400acbb7d33 +:016360c8773d11ad9e7b3c9647784810b16004 +:016370ccf1596f7bc9f572ad35c256db9b6bce +:016380d48b3c32b93bed6c21cd49e07354d59e +:016390c1e8da37a1246c39d0ac9ed8a1e9bc05 +:0163a0b784c5990ca669d6bde277e11e8d44a3 +:0163b00b376dafbf98bbb5c3fcb921c069e73f +:0163c098d057d5e124dcb7e397ccbf0f3c6bb0 +:0163d0e47faf37b64cd326f7377a66367a62e2 +:0163e04f44926b532c47d3234cc3f71618c768 +:0163f04a65e24710ba720b6e46f34b12eaad67 +:016400290aea4d7f64de08175cc0b7ccb2e038 +:01641015a38f9136b7fd385b83453ec8ff96ed +:016420afcab97499c5688cf646b7092d528e3c +:016430be4b5b24cfc50843c569790a24a84354 +:016440d6e05528e24a2a8c1489ac4c50ba37e5 +:0164500adce6deee91d72e72b13b7e9a9831c8 +:01646055ac4d9d94b557f8734ac6889e0162d2 +:016470e21dd5f1fb31317fb1e91085fc233efd +:0164808810f7f31892b0498c38fcfc82f2cdd4 +:01649016e51ad46f0947af5974ec58d0acb105 +:0164a03e491d60dcb6b15eb2c74982a23c52a1 +:0164b094014bb40adaf80ef91bff0f2ecdd556 +:0164c03f893b6c87f2e9815b50a2b3519cbd61 +:0164d09366400dc015f38c21e23669ba622a3f +:0164e0d7828511614fa5cb5171caf0c855fd10 +:0164f0b4d01046bf2f1e7cd0b021ff48bb0d79 +:016500e8e29b21a08749b4757843f04a868085 +:01651002abadd06502c84e5ad61ccde75de7f0 +:01652099f7f5ebf6755629c8c1dfa3d2b3a7b8 +:016530fec983532ea12ccadea7e44f833d88b2 +:016540603991fa2c9342cdf835c508797fd349 +:0165502045a02a9eb21938b0231462e48552c4 +:0165600bdbb90f85246d619dac9c39b8f86ca4 +:01657000b431c331ae90daffcbd667e24a5123 +:0165802ac8916a09511dc70114d266766c385d +:016590955f21af8179f2a88a0e8f32c4cf5ef3 +:0165a04d553fc5094321965fe5becefc74fd64 +:0165b05878cf8d275709f370c1e7ad92938e3f +:0165c0c8514c2f88a2e282354008129cee50d9 +:0165d09f453213c64192ef2200c8316a2440b4 +:0165e06f0ea0e492296a1c88df625667f44a79 +:0165f085790b27126157254bbdd70cc6606e9e +:016600051a24718f6e4632cd914989fea1a799 +:016610d73d60bb7fa1c30020b9cd81de4e0687 +:0166207859000f3f88f4b1e2ccafec2aa44535 +:016630730daf7d488a4f816805cd96e4a00b03 +:01664009233b89ce8a98d127653f7858731320 +:016650ec57dc4aa362fb31b3c7a83fa0216a36 +:016660921bc52c4c94c817350597b65931e0df +:01667052c2a9bc086befab994b944c4cc17558 +:016680711c0772704abd193913ac255ee92556 +:016690604e7bb231de08dd5341fba9f5b8155d +:0166a059accf9bee0dcdc24c6d419baad44874 +:0166b0321592972762c96ef68ec67237babbc1 +:0166c000151237e8c536eca9e1bc8011f1aafd +:0166d0a7c0a57d1515e789a5e0a6323f81c5c4 +:0166e05dc275dd9a37fa2d76c6c6205f9e7f9e +:0166f003be5307d810f3470b75a9cda12ce137 +:016700ddd143761f12c708ee64193f2575c57b +:01671019da162344d0f94f8042211df22292eb +:016720f71fd2ddb91cd439f058b93738dba6bf +:016730cfc35010289f7d1d5d37105f19490cb6 +:016740d74419a92c00e1eb0ece8bb2666a0d1c +:016750f0767e483d89a10b18a519d3a987ab1e +:016760e8433d73bf786eba836d6804aaee0072 +:0167708bb8258c347b7c607a2e7a192f70bba5 +:016780d3e23ef96caa8db84658297a9981b123 +:0167905b87c91abb0c49fc87a22b2a2e003606 +:0167a0628d7ea0e45e38d18b43fb5415d304f2 +:0167b0e58340e975d13240b758c7e2e0b384de +:0167c056f316720d947661bd02865e97fb3702 +:0167d0cd5832a01c60229a04aa7d2e307da508 +:0167e00ef4b38069b781f83cde096ea85cb4fc +:0167f081812df44b53898b45f40fc46819883a +:016800ff33ffbcb738c408f771de798fa5c741 +:0168105b16674ceecf337a26a96a2aa3a7bedc +:016820a2e8a8b3f7addec425600cb2e4da72dd +:01683014e9d9b4b45bf3e5a50f7a8ccb53bc91 +:016840f635338062064c7b7882e914ef499351 +:016850bc0d2a3988e9f7b89fee65b88b696e15 +:0168602a43a2d297460af072e5910ac76d346b +:016870913c52d3b680af61e2e8aa01fdb2bba6 +:01688093473cab5274b6e622f85139841c248b +:016890300cedcc62ab737e9116e70bcbcd9659 +:0168a0a8b6e882e7be3db3a1540686ccc149e9 +:0168b08d05919d63afbd13cfdde03d1be20489 +:0168c05b50d6377f6187201d67382c15afe2f0 +:0168d064dcfba11ae068fcadc39ae4a6fa2c93 +:0168e09ac6cf368d6986db783f6795b8f10262 +:0168f00eb7fcfcd0fbd94f97b7064664ab07aa +:0169002260e94470c473a5bef865325d6dd123 +:01691051293db171f6025e49025b454d621542 +:016920c0d6714301ca13e97c94bb7f56e144a2 +:016930b8d9a52ab9ee853ab9b654c7930d67d9 +:0169404a397de82fea79a08ecf186360f40aac +:01695095b9b8ed43ffccd30a00ee45999af58d +:01696061d98bff2a5e9034aa0e5e856e0bcf6e +:016970eee3858e6446810fcdc64a6b9b70161a +:0169801cda2fb4118129748aa75e48a69a79d6 +:016990a3fe70a583e52ac81765d22d3f85ca98 +:0169a0db4b516985d71a456fa157f4beadca88 +:0169b02d1b935209808e4654c2b8a77f936de8 +:0169c0ffea8d2265fffa5cebad2f8df3038a06 +:0169d0b97617338c880270d0e4533b10ff6586 +:0169e027d6c328d7482bc7cd20c81af02099d2 +:0169f015743077d10042ef1f118d1a3efed318 +:016a00aa8878a2d06d14e8cf7c39af77a4ceee +:016a106e762cd293e9bcd3a3e780f0d4d7ee18 +:016a20e23f6351abcc3d274a3d1e90d9ef6b91 +:016a30e61ba35c95ed673de79fc8ba90138340 +:016a4012e18020194738ded2047b5471eb1f84 +:016a502067412a33c1072607722b49f25a175d +:016a60b1c4a311ae30afd6d47a767568b8fbb8 +:016a70d503c4c2460ae3bc7f9cf8c80e10747a +:016a805dedc1dc87ac8e7fb6a2fb233182fd3b +:016a9097ab28a5486c8c3a456a3ec2f167e6af +:016aa0585d05ef9d329fe76382e797e5a3ca84 +:016ab04addcb3bfcd071da621fbf289c193adc +:016ac0cab6b52a3d50173daf1232a0a3efd7ae +:016ad0e42105b8285164d2760aa64d0d818509 +:016ae071a4f823a5d13e3015b7ee9016a43e2e +:016af0fc45fc9b41469d0c4b39845df7e85edb +:016b00a54d69a258a653d0bc4d43fb7a5e9100 +:016b100dea8fc48ccac197468e53cfecd25884 +:016b20de3273c0bf719c7403b22769ecb0f782 +:016b3051a49f73bf8bca271ca6d5696c64ee7f +:016b40afeb50d1dbf7c1a2aca529f556533da7 +:016b50f5c055efc9adffaf3a36128004711f7a +:016b60c988124c7dbf5071496c58fc8960ba88 +:016b7014a8aa6c485741a1b96812de94d31ea5 +:016b80745b7f2bd1f6c763be666856520f15e5 +:016b90be148c68d43416091971b656fbb345e2 +:016ba0b9d5d4ce1c3acb2cd014b1ccf3237af8 +:016bb0af4545a66e43438453b076edaf569cfd +:016bc0b745a4118b5ebeaa336019b02b743544 +:016bd04e2acc5d3bc1b68d626ce6e63cfce097 +:016be06b63676bcc04fda059a11f9d0414c4e0 +:016bf082976d2fb0572b9427693de941d02037 +:016c0015624a6065c83e7c545d912cb5198dd4 +:016c10d188d4384a26177ed34b20e8f6080f79 +:016c20a41bdc5fe6759002cf3b37d52bcc66ef +:016c30f0958199e4bf86ebbcda7952abf79a44 +:016c40f2f4068460c4f1f19febf015893de7ca +:016c50b60b7fe4beba191ff6eba61b262acb89 +:016c60d8817b38a5e96af7b67b19e07b971057 +:016c704cf85bf37e17c0d783466e65802c097f +:016c80e97e01129b127312116e31642af4a83e +:016c904c5a7cb6344c2899d686e5a54d4364bc +:016ca0fe82b6c3ffe4f9df95ea354eed9ee3bf +:016cb00012d82c56b0b0204add1b4d6288690c +:016cc08f2ba159cc55cee3bbb53fbc2345938b +:016cd02f8efa5c38881a3f03cfebd11f00008a +:016ce0c6540ce6b770e8f657ffa53153170a0e +:016cf0f24afe609aa30b24b27971f231e47294 +:016d00295b76da8f2500d601c0ccc6566e3445 +:016d10fad0b96633e8b0e8c8eb2c2da26d52d6 +:016d20011f69ada6fc5f4166b9ba9aff9a4e47 +:016d306105191990e124bfff64689e18e82dc6 +:016d40e5cbb144042e7084bdab0df34e7c045c +:016d50b5373ea2bf51d76e98aff8fda3d98589 +:016d60a787072aa52ff32f44128631e103d568 +:016d70c0e2889d8162cd1d4bacd3969bd7f222 +:016d80dd3ef071d3b3d86b3564bc1b226ec963 +:016d9052e350c982a1bdbababdf320d3d5c704 +:016da09ebb770104b05ffd90fec90c8ce508ed +:016db07b8a566d11bbaa72e838429d92b61403 +:016dc0b7a93a56f63c12d19cf693e07f120093 +:016dd0b1f2bf2719b1bae2a3f8fd7f5b4eabfb +:016de03b882f4120f0ff70085a4b6cf6c1a358 +:016df0ca65e2a2db488d71176a400c09d7174b +:016e00ccdf27126133e200074796957edded1a +:016e1002d97e9f12af29d1698407c59619ea1a +:016e20e62c768f1c5564e4330b4325a103be20 +:016e30ff931ed5679f3ee528cfae02238dd6fd +:016e405b83842a8895af0547baa71bc1a4679c +:016e508642d5c227b610e3ec61398fd2adc1e6 +:016e60b65d0e071971100bf53461308ccafe57 +:016e70bae53651d51fac8947964f9db3107ffd +:016e80f29f64557166a9da8f0a41f8b516f9e6 +:016e90b2edc073ad3fec00cd338cdbd8c9e0ec +:016ea02ae43e2e36ff2cf422ff3e5242be5cf3 +:016eb021f1b4314a6d5e0ce545283eea20996f +:016ec0363922cfa8cd0e9cd51f9eb7ce38b940 +:016ed03a7ef33239d55ec74bea65e9d4b7da74 +:016ee0b5455d4cefb7901167e9ac067ce68197 +:016ef0d5b0c5e8994970f13373cddc3bc9ecea +:016f00ffb9e8b72c852cd04ce00c9f167527a6 +:016f106130786fb3de9c6ea72f1c1feadc1129 +:016f2019c4ad273b9c4fc15ab3ef19d2a53d96 +:016f30277479b3fe48f6fc8256dc9706bbe60a +:016f40ed34c64a3c1ed1da5f890e83b27c14de +:016f50cb6b5413e08a20f149396fbc6dcf855a +:016f60eedad8967f9e70566977c323ac60088c +:016f70e2f4424040baf1d54c7c9120ae14d44c +:016f800df40dfa362a4fb7523b001183a703f9 +:016f90629ec4d52da3cdd0d1ccbc9d9cc1a903 +:016fa096a5bfa75c235391dc057fcef0e1e9a2 +:016fb0ce00865c5c64c65da42de41e489ec279 +:016fc039e82958d3ab2804fb4e865f3423e334 +:016fd07c5995f6e665dee5518b31a7a6e8879e +:016fe0806bc6b50dcf4e16e9128f4500c002fc +:016ff0162a34c11c1a307dfabc2f93fd46665e +:017000eb5b51aa339357a9dab8c6e0e4d3bfcb +:017010332bd8ab26dc675ae285e8f77219e5d7 +:0170205c6b232204bc000c5b1855ef19744447 +:01703090c2ca8a591857acf010787f02150728 +:01704088e97539993b93755f3f0c4c4cb718c6 +:0170500f8b467cf6029adf43958186cce3e4fa +:0170604d944cb72d8c876ed939daa2c005e90f +:017070933fded7462d7eac362f31b0861e92f7 +:01708071ee9fa3e4b323b149d290fd9974fca9 +:0170900c1ee4d00bc4d55aff30e0ec7790cc00 +:0170a09a6f69bd9f12220977be39461c68543e +:0170b0906a900ac83774cf39d5e172214a3d61 +:0170c03b5e7ae8f1b63df793a299d703f5b0a0 +:0170d090d084baeef944f1e052ce37852fddbf +:0170e0c169811e60dddd6c8dbc1349bb52357d +:0170f0f03bcfd9e18c2abbdc890f382d6a69bf +:017100b4da36d9f17780baa94c88282c8e927b +:01711072e8289fd1a5e2f1e9165691fd76cefe +:017120f3bc8bfec715109825d7c42fad418e0e +:017130aa38e2f17c9a5768a8fd773f977906bf +:017140f22d22cd4d08fefd436870b1b0aee067 +:01715095727f98942343c370b1d776d78739a3 +:017160c65a4dbea1dd8401d736210a40da08bd +:0171700caa74ed53d798153e3d1d7bd593c36e +:0171801b8dd94ae09d4e352deabdec7003715c +:0171904a35041170dddfad2ff47caf1b18d57d +:0171a04d078f4a0e94dc35399487fa745f313b +:0171b088fd9a2ac0e251c09a32fa321bdb6d33 +:0171c0e7c53d75a6b5e335e73cd93104c6d037 +:0171d0453bdc322e172148f6e3e8ba43c6fcc4 +:0171e0c4a7d0b9ae25f810f21d67b8d3c4f172 +:0171f0d342f4f6520a20bdaf163e17aec6469f +:017200570064d0fe7a0e4fd9e66b22788b730b +:017210328912be27e5e9ae280c2f12f9c1aa98 +:017220bf0ac3ae19aa34e51bb05d786061f3c7 +:017230df803a5a1a78460d52ff0a4d8c89b862 +:017240a3ae81f03dec553adbb546a1182fcb4d +:0172501f543f6e770a1a1d8679b4c91d1e6c91 +:0172609fe5d5f732dea589cba3577dcc1380ed +:017270dcebecac5b07afba06c2f2b858f8c59e +:0172800705aa0366f4ae0508b073a61ad9c1e2 +:0172909303331589fbf2eaebdefeb7bb11c4c1 +:0172a00f93812efe3e3a0f996c8f327e9a7f70 +:0172b009d025451fafc96782507817ad5e26b5 +:0172c078ed599ca2ec1694510384d9a00d6a02 +:0172d0642a5fff664be0cf24bab932ef7c6485 +:0172e09114f6be3511bbbec620fa19e7fc7771 +:0172f09364e43a48949891e9e10ff5b14bec00 +:01730060bd8e449f906ef2b64aae84e7a9df2c +:01731048428fe504ef4517005ccae7bc28694b +:017320463376c4031600c172885d1483af3c38 +:017330ec8407309d2a25058a41811a0d35db96 +:01734084da32c0ad6c183459696d654e866a4e +:017350dbfef3fcaa95824d66c394fa36466a23 +:0173609e642ab1488b4e3045c5abc1a44c8b97 +:017370b6f386c8bb491a065a473c4061d67fee +:017380e9eb45b2fa77ba245d4c8092ddb8123a +:01739084de0e99c5543d7c0bcf34803591037c +:0173a01aac208fdd5d86ad21fc0c1d92e01c6f +:0173b03a8bddfd33f2c091e5d446c9d167d983 +:0173c0ca24fd1cbe52591921adefee10532319 +:0173d0d2d68be42b54aa5005ad07e167c1f8af +:0173e00c412c40d545c8e5c9b81be83e3816c0 +:0173f09a9a626011945aedf5a55beb6965947a +:017400b50535b97afdc289855fd1e9812aa1bd +:017410c24a4f065f4d7b7732472edec142e561 +:017420ff56c6c2e7ae27bf3eed8da3f2b10973 +:01743079c091a491c30ff95c199e382a6790c2 +:01744086d1be39b6457b280a45bb05abbe895c +:01745093bc990a2c83a67f7bb166424c06a070 +:017460e898c5d0c0509f9937aa6962aef66e85 +:01747098f546147e02aa181aad2750c2c501ad +:01748037652bf94c3cb19e9e40645cd465294c +:01749017b17c443f670a7c87c2e02309adb553 +:0174a08284504e13dfd2448c7f4fc3d217e8cc +:0174b02da9703f2c28a7f48bacc147d73304b0 +:0174c069bb54e06c1c4eb8fe4bfc9148204ddc +:0174d03b9f4a3dd5e9827fac4f029afe794296 +:0174e0311bc5f87e3238589222f32bc951ff25 +:0174f05b85dadb9f33db80466a7ef385f0ceb0 +:0175003f7be6e668682c8f2e98d8ce00c09741 +:017510448bfa7d5fa4be4df7220b266342d1cf +:017520958c758bd172b0830909be0ad3de02db +:017530d3caee8101145c50f78b07d4ffdd511c +:01754092b048c622e5db5267dc1cee14e75c4b +:01755094976fd93250ba034d928e51729c7a70 +:0175603f940ae8c9f31b6f6ee7e70f0ec19003 +:017570fd6e27e4bc2319ed5bea474a2fceca46 +:017580986046816a575f715450926761b400a0 +:017590e84579fc10465ccdb23431bb13e3d1e9 +:0175a014816fe6615f9ca5b9e2263dd6e67f7e +:0175b0cfd81501a9e51b34cca1f650aa69057d +:0175c0f570dfd73cfed40b0ddfcba6d5870675 +:0175d08e2956d93a3dcfe36b80fa4c9112d21c +:0175e07f4ab8b7cdadb72d017d653c6edcdbf1 +:0175f064fe750e65cb90a205743f31d50dfc2d +:01760096ef0c4d712d7dae775267484287104c +:017610b470c70c5de0c9c0dd61d6c168167a10 +:0176204514e417af522868aed79bd65b61f849 +:01763028d2d0cdbaebd692adb34cea1bd692a4 +:017640341c00cfda56cdcca1079aec8b42089e +:0176502d8746cc1eca94edd903190fb0bf9412 +:01766041a1bc8e23236591ce69f99fc954bfa3 +:017670860532d77938cdc2b90a6e89b28f911e +:0176806c9cdbeef8faff228cad40b3859045c3 +:017690f2faa300a9a32be3479a3af0f93077e0 +:0176a0c0c7c8ecf43aecbfae4acace3de73e84 +:0176b0cb7684f7bc642b51132a0dc4414c89bb +:0176c0fd3621cc4daa6a13a892c68caab66721 +:0176d08a989f235c7955ebc26015599d1fbf7c +:0176e0ce870851a666a2c6e9b57366c8228305 +:0176f069c4e4edf727ed46f81d0f1cb24e8082 +:017700d82e57d2da96770a7669592777148b94 +:0177109caf088a9af41f96af81e94218f285f1 +:017720158dd83adc336cea8b7dd081012f558b +:017730cbcbeb6f0ad256a867f0c47bfb1d8fb0 +:01774019d5cee9e736afa5f06512df5c7800ba +:01775046ed1e68a0f32bb323268bf1ccbac0db +:0177600f460c4c2fd6c978c55ef74966139dd1 +:0177706b1509e742e3bad4076fc9a05a26789e +:0177802249d89ca274f22e4ec3dd10dfc976ad +:017790354b8391441ee430936be4b74c1e5ce3 +:0177a0a60d2f76f153877f2f536c8b7ab62d13 +:0177b011ae27b7e9ef0dbbb06dd0d254d9a092 +:0177c0bbef101dd7663f9ee1f118adea61dbd1 +:0177d0346c2c5f803073e1eaffc478b47e971b +:0177e0e372345886379e24ed7d68041127d5b0 +:0177f0d1abeefd0891162cf6f25efe24bdb953 +:017800294a072b088e3ad04f47d2f0e7e53903 +:0178106e592750e14e2bbf4132891e7c8feff1 +:017820aba9020260434aa815a0850f4f791ccf +:0178301bf20b7cc8b7317a3c2bc5f6f30c6872 +:017840f70381660292722e121dfd5fd4fe4c5b +:0178503b098d872774d14d4f03124154df5bc2 +:01786029e17c70f11bb3e1687d4fc272462482 +:017870e384a3b5883fb4fc69d99b7d06ba960f +:0178809d181610044877e1a93e68777d531313 +:017890133ee9caafc9f8d0feedb20069375b5c +:0178a03bcfaa59ba77fb14fdbc68a696690ba7 +:0178b03916871eee030516ae40ff9dde9a621b +:0178c0dd10a98b1a7680c8edb0b6d8b6408983 +:0178d07ace514b265824b32b8613da2f3d3c8a +:0178e0bd349674a58245c7d127243f644f0f3e +:0178f0cc6296c12379785e7d697372f0bf64ec +:0179005a0b33504b280740fc9b511051b98d38 +:017910e7f84839eeea9e4962882057d6b23cba +:017920a02f28aa39dc6bf19d0cad1609b9336e +:0179308d9b7ae896de29e982095f8f94f07b14 +:017940dbaff75b349374e37c9ccae28b7877e1 +:0179501c67e43461bf645c88b60faca28dd1e0 +:01796060ac736b409a918ba186374098a3083d +:017970f56d50374ee4e1588e06d2d15c72dbf1 +:0179801252aba9308829eb2351fae56fec8a69 +:01799000f7a568085f7039b0ffad15ff7f8d00 +:0179a0bf4a570b306f6e94e708f88ed0c95595 +:0179b0c338023bca9d36cbbe99caf995b554b4 +:0179c09e5729f7c1f2ae757e8b4f1b02f6cc0e +:0179d0d787f86f8deab0d1305c8861de070102 +:0179e08f4ea8d63c0e3e50fcc8b15b9b1829fd +:0179f0bc26d006d83b9766cfd65500c78f60d2 +:017a009a059ca5d27036130747e047126b451e +:017a10ab93cb1c09a5b777742621cf182fcef7 +:017a20455a271c622393852fb23948787bf1f4 +:017a303a1fd35ba0aa5a3b1ab7398c44dbb5b0 +:017a4082dceb8ac3247149fb1cb568bb6e6a95 +:017a50cffa16b4db03257586226552d42d0358 +:017a600bde6cf9965fb038216edd301eaf7d20 +:017a702bc00bfa7fecf5b0f605e570a82e41ea +:017a80815470dc38b6b9981e566f7d06168e5a +:017a90cab82c60d7fe931d1912284988ccc8fa +:017aa07eb8eda877e96f0382a2bb93b9139ca2 +:017ab0d52cc52db7f7a195143e3092341bd404 +:017ac08fb14479d8b9d1d2c5a8e80c44689f87 +:017ad07201b5746de003b645128bd095b81b7e +:017ae04c83863d5fa61818b47c1a80afc23a8c +:017af0b2c8268987dcd484f71506d45d111eae +:017b0044b964f5a49aa96d24afdc32a9733a0e +:017b10c4c085b5e06c2bf2f031c4ad7dd9c339 +:017b2002f6208c21d5c523aaaab6715cc5addc +:017b3056597cf702006a9be9905b502befa48b +:017b40196f50fbd40c7b0670198e8daf1d3524 +:017b50b276db5d03a0c0c3b1d0a8c7f3f6b077 +:017b602421159e810e2c035e6ef3cd0eb6f541 +:017b70954f923d618802563ebc97596e80ec69 +:017b80c9dee9d247476c94bd641b6097c7095b +:017b909e63f4050e9f0ba8405d82971b0e3c48 +:017ba0a67db6b47386e8777de4910aa246c03b +:017bb02604670f7a3799038b12c40a7b672940 +:017bc09cadc0fd4b666185d97650833ca67bb3 +:017bd04d137dae5e09f4a6aa39364b52afa3f6 +:017be09545a2a7021696fb023519843dc3ed8b +:017bf046daf4ac70f5c9efa67bc017495e1f21 +:017c00486325624a3ecc4de797197a493bad8a +:017c10f56b923384fbf47d0eb54d361579ee5c +:017c20951bf038f9bcb589fd1fe64821b6db28 +:017c30ddc55da1a13bdf7e12cef6dee39a3827 +:017c400d560bfe2d1ca78032645279d21023e4 +:017c506b007e1efaea951a045e8c1c18ea4eb1 +:017c6055aa37320bed5bdf7e06561c9aea30a9 +:017c70372847c657f61eb1eb45d93180aefedc +:017c80a87696406dd7db1adafa6f9f5d45aa50 +:017c9057a2e8c573e1942f9d31c641412c8792 +:017ca0eb199f5e7b625fddd74fcaa74ba7e2c0 +:017cb008d10c1f74cc92d1cc7a29e913bc4f6c +:017cc09b22b8367312ace3c590031e17e46bc4 +:017cd0b628730fb6bde1559d66d01422a5b82c +:017ce0f3cf180aa667f2db994472392992ae4f +:017cf092ed8875f0af16864e09ddd24693bdab +:017d001d5e902b50de03d5e981a73f8dbe1ef9 +:017d10520076d5b72644f8a9c7cfc393494faf +:017d20552018fcd0e324615a3631b49e2288e3 +:017d309b7c51fbb7aaed11c91632ed2457659a +:017d40a2863fe5687677942452af3564007478 +:017d507bb0f0c3fb6497bc1eb1e8623e0b1e5e +:017d60fb502468e4c6dbbd51a9a78730ec29e9 +:017d70a4a992a0e84856b181de16dbf6bfc08a +:017d805441b0d466ff6f0098c66edde1c3de78 +:017d905365d7c047e46ca6e99ff953b369edb9 +:017da0f71d0b3fc53fb8befd5c7a6a957d4ae1 +:017db0bde847437b4f2a701b507684a9903a1b +:017dc04642615ab30862948f11096a6cb0d38f +:017dd0800a292456768f5ccf1d8ecaffe1f7f1 +:017de00c4d0bf786d03560aa7139fbd1d8a25e +:017df071c420ce7bf72d7c89e1d1eab2d1dcf9 +:017e0052cfee2b0e163c5d3eefcfeeeb3ed617 +:017e107b215fefff32eb480b059dd67698b28e +:017e200c902fc386a5bf48f2c2c5167abae6fb +:017e3099f4e7371b1ed6467268ac8aa9947c39 +:017e40c335645197e5fb05680f0966c6d5841e +:017e501f1f52574fc1ceeb8590abb4166ea0da +:017e601602b22b806210f2db9bb5e7073b70dc +:017e709031acd40dffb9ffaca8726ab6453ea8 +:017e803448f4c8c277c0d9572b28990b9b5b21 +:017e909a26ecd80ac2ae35aed00c6132ad30c1 +:017ea04a13646058d67ca7ac5e89ddb9184c6f +:017eb095beff8ba9e0b4e6bd2b646f4640b73a +:017ec02ee49eacb4f7c32775538d5583150f7d +:017ed00b74ebe1757f30df3dc0bf9e6d15907a +:017ee002c82766479af7a7da79d950dd43dd35 +:017ef0f3978dbb20acd53432f46cef114aa79e +:017f004db6b08c88af2d8a7bdb7fbb0386dcb3 +:017f1050751703492afb0d16fa70c13fc2b0c3 +:017f20fc90e224c47a16fad6ab6c1de836151f +:017f303685d7cdef0bf61b033604fd25466ecc +:017f40ab97c6504ee63268f298026933a27de3 +:017f50abff88e2ad70e6a0f16634c0e4e8b0d5 +:017f60e3e5097e431dcc8a526eb5da2293f7d9 +:017f702a1e085620bd2fd1e0e705ed58fdf249 +:017f808c5d311e90c927fd5d8e74b7aaf19394 +:017f9018c18dcc7ac34890c2408527de9f4918 +:017fa07ea504b34e992cd537a9fe93451fd928 +:017fb086e583d11d7c3d1007ae2d94a3b8b1d5 +:017fc08069786169afafbc969bab8af735114a +:017fd0ca422cbcab06ed74027d6d240a4007ba +:017fe0b09c8bb5344a01f1cddba6cd0ef196de +:017ff09ab88f49339309dfa29335225602bc54 +:0180009deda93d44d5897194731ab563baad7e +:0180103bd5adb6ec818198c5b1b691af967fe2 +:018020481c278dbc8e639f3bae997361c54cba +:0180301c87f79fc39ec7ebc09225615583c319 +:01804036953d6f394888d40fcd37984fe9b601 +:0180503242256e78360ed21ec3b24b7396a314 +:0180600d8d72b602c3cec3627813195fa39fe0 +:018070b8501a12c6165e929549c98eb7b1333a +:018080a71698fa31d34b7b16d6f72b9affbea6 +:018090e4da29f5267d8730b24151f5682dfe12 +:0180a0cb02abc97af335a2a2dc0f3e7d2438d1 +:0180b00e997815efe045173e2cd0657d867e46 +:0180c04905a7008301a8ed60862a5db915f6a1 +:0180d01a7e9df0cce7dc33544805074e143bec +:0180e0216396c79976f2ff55bc856f7e0b160f +:0180f025a69265dab17307e9d90f9ee6607df5 +:01810065f8eeaa53033a8c7283116d5e620f88 +:018110d0a9f7861243a40a4f81c40103282262 +:018120afa4865fd166e30b52715cb0da90162a +:01813050d369353ae38cfa1c51f578e97233e5 +:018140e55531ae9573e820186658c487d6523c +:018150b3e0d84cccc62732a591565830193bc9 +:0181601fe65229f3fb23210b50e502611a4da6 +:0181703cb2aa6f300e7fd872ea62d9f1d3a05c +:01818018bdc88cfcbfe9207546d22c0f26b648 +:0181902e640aa43fc061c4c6361666ea8e725f +:0181a018f1f1a38400ff2269a8b5233fe3fab4 +:0181b0b0600801a1acc3a68d1e9abe090211e7 +:0181c07f30070b5fdf901f67bcf1a6e2b7d565 +:0181d029fc0bbd0ec81fdbe6116418b7771312 +:0181e096f2cfb8d4ae418362fe25c0dd861175 +:0181f01590dace1bc51324ef6c0ad96d2ff173 +:018200560ed3eae2c3972d5063dee850a25851 +:018210bfc94c2f66b8f4ba54d2c53f8b43e2e5 +:0182209230e2514036786f94f797d8c3060703 +:018230c1824ac21b9e2d54b42e94bd27154aa2 +:018240b3ec681dfc7a31a35684b9f958ff8c47 +:0182504c29ec4029e8a9bd0b0b00436fc7002d +:0182606ef05d47c5bb2c956bcd5497f01ca389 +:018270b61296050d78986731232cae5ffa06e2 +:01828079eeaa86e5209f620351d7632524f7be +:018290d501a87aed00cdf015e5d6f6443cd90f +:0182a024f3f0375003c30f19a26f21d612758a +:0182b0bb9b076ccedc87b220c9b17603389ed5 +:0182c009f6414e5d5fa96120e9d997d005e4e0 +:0182d03f8349143b373eba79bee8b6cfc5f228 +:0182e0e3e1f9254fdb54f93d1bb5634bd4d2ac +:0182f0f6f4d169f8b75d061346a07aad6b53c8 +:018300ea17a370843b9c403e66ade0f708c513 +:0183106da80aa6fff5240c49eef53271075d3d +:0183206bfaaea1aec8b7d9bb6c0d38a42553ea +:0183309dffe3844b256fd6540f0e9096d77202 +:018340d2ad5c81791d319f5fbc283485265a1c +:018350fe4182ce20d717fb8dd2a262d3b2c18a +:0183607428214eef4db5b33a0f04827491d45d +:0183706c920eb3005cf9aff5ff5c70fb83f745 +:0183807166ebd3b220e5194f492b1c3b83961a +:018390c50eefa60f634e80e1079e65abf38d40 +:0183a00c1e862713c8eb7304d9ee617d606f1f +:0183b0fd4961b2eae655093bc31be1616e7996 +:0183c05e5d1a99d7cd83ca580a03132320105c +:0183d0c453b6fae06788ad0f2cd60b0da1c78f +:0183e0be86db71994f5e62d1d65b3ff61c36dd +:0183f097c8d120f693c88e07050def0d4131f7 +:0184000136f8894ffb597fcbc47cfafe7ee2fe +:018410508c86f6da8bdbb74bf1cd6c3a90691f +:0184208ffca4fcd1e695f8a0db2830952d67c3 +:0184303967b94d07eccc58da6a52e58c3859a4 +:018440939b0fd3d826267defcc5079756d3763 +:0184500b977c9b58507f2c3d9db2f0f56dda7a +:0184609b54b7a182ceae6d8b1dbc0b2650448c +:0184700dc3dbcbbc0708c85de05f8e8294d0d5 +:018480763c4f2412335592cdfd7e422ca3157e +:0184900d4cd647b48c538c2b1cb92ff3042975 +:0184a0fee50963db7d6c71a83cdd8f0a735a7b +:0184b0b0c26cc3af9cde43b7a08202f6b6b999 +:0184c0cac43300474e72f1641f6b912ce64ef0 +:0184d01265a7772dc8099fa77b3746e34494ef +:0184e0fc1b691710b3495257f77f8c39d5fdcb +:0184f00f5bd358668ba61f2467c2c332380a7b +:01850052168fd128c0f254330a06db73283be6 +:01851051f2645d75db695a8985e76979483b97 +:0185205ba062f9fe0ba3601853a80dfebe84a6 +:0185308e2cf241c80ec46b6658a2d1caca5e35 +:018540c1900077c885554cca8104a3a4418a83 +:0185509107d603e11cde19217446a53a6dfc90 +:0185600a27c163dd580dc72a632a64627d4c96 +:018570365a4c5f437e66fabf148b8716dcf3b6 +:0185803a418b1f1f47b1c816a519d2efe2267a +:018590bcaff16ae4e499a6cfab26bf87b557f6 +:0185a0d1c0ef114d1f19612cd8aa603fd52e45 +:0185b0fb5cef0c96f5823afae92584364bca36 +:0185c064f9084deeee4b7cd2dceb3298e4ebf0 +:0185d0b655a165be7b7d90a18bd2a83095c671 +:0185e0008358603fb18231203f8f01fa96cdcf +:0185f0093b598f0f38c27c68dd81fab0e03f36 +:01860040f5195608ad613227f782a83f638c5a +:018610eaaac5fe77df0eb7d341941f2f37546f +:018620280ed39f0c1cabc4357def04191bd142 +:018630f905df999de2294a4b30b66129141dbb +:01864052d7559173416f3738fea34b84b193bb +:0186502efa6969676fb590b754dcf8cde51108 +:01866060310255a62abe9c3c452d8467979042 +:0186702515dd1c0ab52005318842a2427a04c2 +:018680fb22d9d1daed2d9a19865f8be6a58840 +:0186908db7200626a657d3ac10c78f368d1ff4 +:0186a0d51a104bfc898195051d8e74d7173b53 +:0186b0ebc82862169f298cc112cbb62e738e22 +:0186c005db84a72a65a0d2cd11ea87898f79b6 +:0186d07439141575a15caff99f500caaf82a04 +:0186e061a3deb05106e2d951e96d3d6704fa8e +:0186f030ef6199c0a30013e0a4668661a022bc +:0187000a478586ba9672fc47477def4b0b806e +:018710edf52711199fd268bdb770aed3747950 +:018720c26914b90ede856ffaf864fbf90aa66d +:01873088582d337079aa77ca1f27c8f5702c3a +:018740e7651857213da1fed4274e8b9d30f7f5 +:018750984b86e786799b7ff1f2a4de9cf2fd3b +:0187601e7e61c8c4fb53864a4cd079e7185407 +:018770f9b07e844d384a5bbaf4f2e9b2f98e85 +:01878062c487b2d84747543c2d4421238a9968 +:0187904027a02122f1e19d909a832e5410b174 +:0187a071e8429bcfa63f95910cc9e3b55667b5 +:0187b0012b871433525ab11609ddf3e1def295 +:0187c01afe93e700b5c2519632a06b28f8708f +:0187d060418c8832bcf1fd2ac0eff596d38cae +:0187e0344b4c0e9783d7769e25e9b8a72b2081 +:0187f085cb2e2d4e83f29f8ea6998770b13d88 +:0188005ec93fcfdeeb17e5f5dc38091da609e0 +:01881006bf05acf0aedcf2c987d9e1099e1f61 +:018820b10ec39f1c550ecb7dc2bf99ffab94ab +:0188302887a7b52760713435bdfeb30f8278d5 +:018840e69fe7216e825dc64c1a91923052d89c +:018850832267fd3c31b48cc298a054c9e87914 +:01886038e43c8cd77cbf203d43fd9b5a4f3cb8 +:01887052e6e3a0bd59a4d52857e238a6c46b6d +:018880d31ca37f5373a63aefbd7fe9ac362589 +:0188902bf6f4e1db94a6623edb68a58c21bd1d +:0188a0af90d4457b443330c6062bd1c8c79701 +:0188b0cec03cdadbff602c9d0e25338564e1d7 +:0188c012cbd927419f2bcbb906f97ded6f12b1 +:0188d07816bcc744479ee64e5bf2e6c7b3ed9f +:0188e041e6520a1cc590342e4534c8db23a68f +:0188f0f293ffbb04d660611722d58e21457477 +:01890082e1fb3a0452b593d813ab98820559e1 +:01891054915b9a30b6f5d5512936486d07ef79 +:0189202a69caae1af1ae69503b3e53877c4b07 +:018930cedb135255b2ae81000ece4f824e1358 +:018940a34cb8694c52bb8a571a9828dc4a56d3 +:018950f2323ef7eaddb954b224ffba43d5f676 +:018960c16904da518da5405b499984cb8d1c51 +:0189708609ea6b3e617c7cfade32f7bd2c711a +:018980b5d73a807c794c652358b3fc52295e64 +:018990363ee4c5b23e9302d1c3bdd62c008067 +:0189a07cf2a969921daaf9df7bbc684d282efd +:0189b08905caba869528c008ae9fad29a0f72a +:0189c03b9d20228a0972e25ef61948241fade1 +:0189d084866a15defa78571a54043ef39b32cd +:0189e0c49e2a841d25f9caee987b02083e777e +:0189f0a03818a114aeb0ee790d0272fef9a156 +:018a00855c5f638ff0d285b01e4bf5f5d77285 +:018a10b4992289b59f1f4eef862b1b5b81975d +:018a204028d5b5b09e35b4009fcf1fea32dbae +:018a3066a038e30fbbc46a671c8924067eb81e +:018a40cd68f665de01ced157bb6a5318c5de00 +:018a50786d755f15f8fcd34ab93af85e5047d4 +:018a60f86b6149eee1d17369d2bc6352068696 +:018a70fe79230fd63e2bbebaf917ee024e7529 +:018a80d0a50130e2f51b6e191be9694eb55775 +:018a90b8f462a66748c573be373f7e5a515109 +:018aa08c6cbba7e0a28d1e6a8c07ef65751987 +:018ab02959906dce4b74b25c5dd40d20cd5769 +:018ac01b9ae4ad6e6e3aa32f65a1269941186b +:018ad06341ade6a658122a04dfc9be40d8e106 +:018ae081d7bd871fac96c0100183ee55d72e80 +:018af04ae49c8657fef1a908b1042296734538 +:018b0096de76eccf587abefd7ce6a36d942d04 +:018b101764a7f252de33465b62b96a2cf4deab +:018b20b2ddfe87838470991f434d7b7f378a92 +:018b30a0ee8f0ef98b43e28d7ce53f8dcb032f +:018b40ce1374a739d7b09f2f044b9471f33900 +:018b5070e4d895bcad4e339590097da33bb1a0 +:018b60248059a31182437b0c076bdb18787052 +:018b706c2510acbd5c7c9eb87cfb4de39c3989 +:018b80de5e222da02d03668e1faf02f5f06a29 +:018b90a2e3612b1dec43c8b0d07785121e52c0 +:018ba0e30ee43a1b9eb730d8ba0e240c3c23a3 +:018bb0d41af1d128c492e5b54029a7a835a382 +:018bc0ee2371e5daff3c705e6af97fc3cdbec5 +:018bd07f97100a6cc2f2eba8fe152c0df086fb +:018be06f154b29d98969ad1b431a5cc815afd2 +:018bf09ab891d1b96908f1e85f7a0a2933a1d3 +:018c00c4c804ac22fe9b1a3f4c1984d26083ee +:018c104a6e930cf7b694894ff7d253c0f680c5 +:018c2085de3745d28b662ea272f3253faf54cc +:018c30d53b80ce8c38fbf42a37aefb928414fa +:018c40b08391ef460f2feb3701b1371c6fbc45 +:018c503ff1cefb16ed6c50c352ac528c8d57ad +:018c60a793051f1c965b292b28e39416fbb297 +:018c70c811f9a62aeed241245b2d2e456a0c6c +:018c80c33f98888f32016cda8269df984ba53e +:018c907fcd76e519980a966be7c3aaadfaa156 +:018ca03e92026c5039d5ab5f5932bdaea85498 +:018cb0ff5648a697eb8ad8418056a22facce9a +:018cc090ebe99852ba6d50d8d9f01e3039c45c +:018cd0409e86ec4242ec307869e0f2cac0e2fa +:018ce04ddc2859010a5aa40a3e77bfe90b6abc +:018cf094695db7e71d62579ac3fdd37c70320e +:018d00245d5f96864052f411e3c0c2c9025284 +:018d106f2ff9792d53adf5a790a5cb76fc5894 +:018d202880106229255598e0d4b083a86032f4 +:018d3005faeec1631d07188468a3c080001b71 +:018d40e9ef7cbb2cd0539598678a83861be407 +:018d50abc66ac17dfe3b83cabcc05afe6b2808 +:018d607df2f3fee824e55f1c9c55e1dccb8897 +:018d70afae40574f9b301602f6031726e53805 +:018d80e88c5a3dd9d869b65c393ec3a2752d21 +:018d9055aa7da604e92651437f6966edcd2367 +:018da02a009dd4efad617a5aee1eecc4d9e522 +:018db0b461bddef2a5fe17300cf0d290dd9171 +:018dc02b87e2c28007dfbf4a1332fabd9168c4 +:018dd06de8a9826cbce6b6a9c935410ac43b94 +:018de07db895bec1c019539be0ee5f3bb39eb5 +:018df03ef8023db954795fe4ebb1f5b1819f1d +:018e00692aee4ea795f53a2bf8bd4d2e5828cb +:018e10311d26ada6f9f207974b39198de655b9 +:018e20640b1b60c01b0d8a085db6fc3eb8d5ce +:018e30a344a742d26ee9ae74de041b27378761 +:018e402eea6aafc0b3a3d1d5a311bc04bb323f +:018e506cb6aa561a9017174746e41af256063c +:018e60974e46f9b1f1ed5ebf1037bc4c4144e1 +:018e70156d562694c0b1a0913d8e7944e55868 +:018e80a29caeb8e6ec0b3b7355ce5a3e7616be +:018e90ec4ed8047111580b0d0f2d6940c7c4fb +:018ea0760d54ac586e357a5056d5bdc240f446 +:018eb02d88777890dc0afce88fed19acf93e15 +:018ec0ba422fd5415be50b79956d797f35d152 +:018ed0f9b1e01efd9f166db613eedb2076eb5d +:018ee095364fe2366f6b73c075422e544c8133 +:018ef0c2af0153e5d742752e79ce1982805faf +:018f0084fa539185aa251d1bcdd17a0731847a +:018f103ba739781d41024425f03fe941d968c6 +:018f20f240c73fb21e9cd16c13753a4cb0f930 +:018f30c3cbf4f590c4efc05afa00ac48882fd4 +:018f402cf5a26e93e436bb6ced6d2fc7dde740 +:018f5045d92d791fb1774011a3663684c3bba4 +:018f60b61fcf4698ea3c6b30bfbff406d11ae8 +:018f705bbd50e33f462477eb3979920c12a733 +:018f80fcee8e6178cc90bd3ff136a97ba06925 +:018f90a401926451c87a2377157f7b24404c9b +:018fa039725feae4f2eb227188049e57f25f9a +:018fb04ce5f677a75d646d0ba99efd16ece1ea +:018fc0240717b47f6a4fabd506bd588279c02b +:018fd0866bbe04f252bf3c500707db24160977 +:018fe018ce85cccea4d1fefa4e9abfcfcb4fdd +:018ff01b34a6a0729c929cc87e5f9805000303 +:01900028665e3b1fbea20aa07aa2562a3cd35d +:01901096f4879cd308fa333f252a2cb8fda209 +:0190201050233f8ab09d05a889678f4dddaf26 +:0190306e56735018a2af2665fc5acf28410e09 +:01904038d024befde07b61d01df38a223f4f2c +:0190507f378e8800da413ffae66002f8469c38 +:0190604809ef8a5dd66ec1f5722669e945eae4 +:0190701f812ddac35af3b158381ca5ecede2ce +:0190809010e434b51656795886e631a15f561b +:01909022f874cd04501a40dd933ab242b7fb1a +:0190a0d36929f3be0259d057812746df512913 +:0190b01d53bf6b72e4a8778b51cb615ad61b51 +:0190c07bcf31bc79983333177dc7a1b7aed0a6 +:0190d032fbc75ff0a034ae67dee9c98b6ec729 +:0190e0f477635bcda7fff3b53d7caa59655c21 +:0190f0d1c3d1dcf84c65992f763c95511f6182 +:019100716d8fe7a5dfefa406a4f6613a51614b +:0191108ebc26d2bb8bd6e8a02fa611eb7c7a29 +:019120dfbdf1aa07e3c493bba09adad1d40933 +:019130e26ab1fb10319abf39cef49512124b35 +:019140f4317f1428d189bedbd3e4dc4cbe832e +:019150256db2de4a5af2cebb15ff84481d5fe2 +:0191604e0263412d6903847964b251a9aab3e3 +:0191709a8cbfc31cc38d1518d3bb9e47168efd +:01918059aa603bb11e07623abe2e240f961781 +:019190d1f042d0ace898babff652d66a3770be +:0191a038e4b25971d5bbd87df94af8c0801ad6 +:0191b0ee2c28c6b85e53d7f463a0cf27dce378 +:0191c06a834c093f4cea0c330d766fe5a01b31 +:0191d08263539b5bdcd6ee8d88f0199bed04c2 +:0191e0e4a2d5dec7071fd7788a4699c1734105 +:0191f0b1d0912436b80b624e8d2bfe4cf174dd +:0192008de4b2f9d4da2c264adfa2473ad5a8c2 +:019210f25e86d1d9f4f312b79002038e4be05f +:019220ee305599dc50b4bf8a17c16cc837d92b +:0192309277b6fdb205fb4dd07175cad22aaf98 +:01924001e3e4741e28034fdaf13b1b62296ca3 +:019250f22a3443115f05a34820053cb0a51d75 +:019260260908a01256b16e3aad96a8385acdbb +:019270ac64082c476db4cf9185d1749481390d +:0192801f759d80a9455f279074772a5366ad09 +:01929068b3f21c3a5b45498fd6e5a1672c0705 +:0192a04601c082a06b87b2041f494270fdb654 +:0192b0083cb53e3b78d3edfca90bb6e363992d +:0192c0ece2e7a44c0ecc29ad3852a73ece3b49 +:0192d00e4e87e582c4a577ea5e41203f5245fc +:0192e03e27f70f0e977aeb0ac19a6820081f41 +:0192f0439cb2d97e8d3757a18dfbcbb610ac9d +:019300eb832bcdaea168daaeb99f9932f5ea1e +:0193106c8c6a6c705e0a541ee12d5bbc0368be +:019320cdd8002875a8e17ba7f0c8b2e00be195 +:0193309a64947d2d1fde335a9835f1d5aee025 +:019340958b8a77a5aa79109c6dedacf079afda +:019350e22b319ce904a91f1c986e1e333e75c2 +:01936087089c5a62564df0e9979a47b03a1e57 +:019370a9a4a5d8a2e97432c1463c092c6a94e8 +:019380e7deac3af8945fa693c9b36d0602c9c7 +:019390cc73cdd36097ba6bb9ba9b7eeb8e5bb9 +:0193a066dd1a5ad33c3138cc1a9566dedfa9cf +:0193b053c6fac83e201bd79f4a2a053b267f0b +:0193c051afa51da923a19688d538902f7964d9 +:0193d088a8b4ce6c992f2a80e8fdf82c335d76 +:0193e0f49a7c6248d91e64002fbf3d33f52362 +:0193f0a99911e10b476647cb9c64d3bea42b7e +:019400b1e48f86792e50339e9c36f5b1f4473f +:0194109502752ae231d43e96ab379b31d8455f +:0194201443715c0a900ef1c967a1bd292ae29b +:019430112b291aa30612feb2c3bfe10f186265 +:019440a1615b1575287e8a9cc1bf5c52aeeb67 +:019450fd62adc1449f97a1b23136881427901f +:01946012e20e565836091d13125ce4cc8d4292 +:0194703764da9182e3d02b62b5262f3b9c89a3 +:019480fedd132d4a7a2f2eea56c0575131b844 +:01949000ad2baf1fb5a220ed959a11bb7cd8fc +:0194a0a77bedbf15bfa79a99c50009a0634a30 +:0194b095e1fa32d2241cea63a3206e717f9742 +:0194c051117afa144c343ae1afd79ec24d856f +:0194d0dd75172d7db9db97a9f9693e2e2be99e +:0194e08da44d9f1c7b810fb98b4bcc0c30ca2e +:0194f0659c65304651fec9c74836f22482445e +:01950042fb1718f72e090dc6a5b8e55f54ac94 +:01951043b9d2fd837409e1955a67eaa00bf522 +:01952038d2c450f2db2eca459d589f8f488dc2 +:019530fda30b155fae3b825d6984c1fcb5f216 +:01954006819a861773c42d767406a3ee225515 +:01955054000ed8ed5ade4a5837a2be04289859 +:01956012e02a7c6b2c11f9d20cd628cc5e801d +:019570990d1da67faa40c7ece2fb9e9e2b699f +:019580d2c30d68e1313b5066178c818b01c294 +:01959043c9a06089a07a947105d5f729861e62 +:0195a088cdd75cbccf06f98934517e885ba35f +:0195b03a5949f55b880b9c2d9ea0534e9b067d +:0195c02cc50e9ba2e832d4ecd0261c1c1f3884 +:0195d02d302c4900434e7847560254606e3b36 +:0195e035b047b2cefb9352037b73ca09abd6f5 +:0195f0fc926aa8d26f8fed9922f9a5fb7fcd5b +:0196007c3f0311196f5ce48fab6028cf8f8ef0 +:019610315e69d83ba1fe3f68995225bdc8ba4b +:019620bfab4a1f362685d1f7f5c293d73b1ccb +:019630bbd17ed097a5b6cea8e6e767e2d25394 +:019640a993a0d43351e1da0024577da505faa8 +:019650b464f96dcb1f37aaa5ec43cadfabd044 +:019660d61022d542bc208abd919d33b0ab733a +:0196702e7aba1639305c703bc66f3630abd457 +:0196802de32b15dc9914a160b59b194e5eab0d +:0196902421798887efd46b74f9e37b0cd65ce5 +:0196a0f6bffc13d881b050cf3e5db920a0c97e +:0196b0003461a25047cbe47c656aa88a76e135 +:0196c042b83de356365804d378eb7de381f937 +:0196d04e913be7efa55944e53248b09d20a49a +:0196e0aab464141eccfcbd73bdb57879fc4e5a +:0196f0ce1be6f835d14f5d7da5af014c011c1a +:019700ea107e56258522a6237a457bc1ec2e24 +:019710b2506787c4d5bb01f6d9e8aacfef75cf +:01972074dfa0b2993c6c67546506d7a8297613 +:019730d0cb3ef6cda11b0e764d113baa84306a +:019740eb85f6ead440b6903d8fe16be2f30710 +:0197507979a233f62dda90ebdca2f2877c3074 +:01976041d72f5b36c8e4fa7ff3d20ec531fce2 +:0197709583440ac594be605145932dff31986c +:019780c960e937ccc8a2c27f7e30c3eca0071a +:019790eff38123b89bd43913173b1441d17cfd +:0197a067f2f2993877129f612decf6db1a09df +:0197b07fe7605f71d0f1d048704d3ee137633c +:0197c097cee59d6bda71d822af07d84559be20 +:0197d07f494c07c0f616ee7fbc55bf034c1c6d +:0197e0d25e165d87744d3143db55f31fe74170 +:0197f0d0ac1dca9da9ec00972f3cd7ed9605c7 +:01980096525a338d5b1cbdbc5189a2ec61555e +:019810f41bf14d9b5f58a2676c9017e946463c +:019820165ecc2b4445b15d8f491beae36d92b9 +:0198305d68fe552984b090f1ee8ee9106ff6c1 +:01984003d15c24a61cb7f1352b807a5d2a8502 +:019850e0603a0b6cd16aadfa5145e9a81aef5a +:019860a35f5be6b97afb68afdaea6b001b5395 +:0198704b81adc1815e92f6adb0d1e8f973affa +:019880944fe295d8c6c94fdafb3232376f993d +:0198900c302b0f33e2c301769dd01a7c13c87c +:0198a040ce4c42c97981f496b4f7f0f3cc90ba +:0198b089480890c48094e902c5354b606cc6bd +:0198c0e8a05076af608c919ab656bc9c91fcde +:0198d025f15c3f17d10511cbc10291ac3a0163 +:0198e07b2b41158cfbbeaca5381d9b61a0c0c2 +:0198f0bb8cd52d4f49b02d183347a0e5d9a4c3 +:0199007eb192ab0c6662f704d901b483e47ce2 +:019910b1b7acfb0a8a4aaad790d6d59041a492 +:019920e6d2db1638e665e2872189c51186e516 +:019930f9319ed09a25e23be69300e327c57330 +:0199403b4b0755673d56091a5b328dd6ee2c6e +:0199504dd08cd1e2237f03d0144687a1d0afa5 +:01996050f2ca4ec3a0e6b3c9ab71c2b6861bd0 +:019970c197e04fd4f74fd4729a0795852cad33 +:019980ea022f2ce7e59b70bf0a4e4edd942640 +:01999067ff27d13dc8ff4787c6f1f8dabeaa5a +:0199a00eb4dfa18f9bfb82634e9581b7124699 +:0199b02a89f8d5bc6a6eeffaa9a20c8db5e92c +:0199c0ae6cc120d4e2eb3558f27cccf7f1c47b +:0199d07f4f01cabf09d72ccb9f2dda7c0cb07f +:0199e0e0bf8ce08664fbe9f2258372e7b16bd7 +:0199f090dfa9b57536b0b7d6e080172ca430fe +:019a0065ba1a0dd53e33d7590e02e407705d02 +:019a10211f3f343070c8faa144685d2f089eab +:019a208b878550b36c9b4f6717307d07aef0bc +:019a3003f3063bf517c40f5870b3c4031c9d27 +:019a40e72d7acfce11d37cfbb554f39ea371ee +:019a501ce53be1ea44e69a70df8322c999afb6 +:019a60954aa8cb565947a07707e8aeafe87955 +:019a70ecc8a8f24626d7e67f1705c6ec41d7c6 +:019a80f7cb42fc4df435d5c33d010c87a631c1 +:019a90249840921b5523e6762f1fd6caa469e0 +:019aa0056aaf7ae4785e7e0376ee2a058593bf +:019ab01e274c163a581689423fbd0c36763b14 +:019ac0d7d46da25894fd0cfe4af90eb4ef7a2e +:019ad0c88ac3efd9248475aa5a355396e42993 +:019ae0ef452eb2513cb8562557ac76b107d1e0 +:019af03d24006fcd1b503c4f45f8e424215d03 +:019b00eecf4d787b8f65fbf7ff3ff92b1a89a1 +:019b10d2ce9789c9b13483e92dadec4e9f77e2 +:019b200ea310e9cc525dc600aa859a59b5748a +:019b301ed9b53f1219c25a62bcc0585f0698cf +:019b40a4656c97dd0f7f8788c2ac91ef482eca +:019b500e4547888bb157d985c56f9164d6a158 +:019b605e9c719ff92871bf082367ef6c369968 +:019b707d26117e97840b67038a962db40929df +:019b80efa526cf9ad72b7200878393d71bb329 +:019b90e7e98a20951d41cfd2baed16b13a211d +:019ba092e40b48a79e3ae317c4b3dc977f7c9d +:019bb0060ae0a554e199c5a861892f321ade0e +:019bc03c9cc20683999f44ea709e24b9b50aba +:019bd0a8e23686cd113881b1607fddbcfc89ac +:019be01772382ed5e562c8eb116e2b1c0e2e29 +:019bf0ffe66f9b4baa7da31e7aa0e2494f3ea6 +:019c00eeb98fe990aed9a5fde52ae375900e24 +:019c106b4a54105f17da06af3d8db82039a9b0 +:019c20540f0954cefb4c1dbb12f34c47ee7de4 +:019c30f2bb0a2d1aeb03f4e8fa7508f31d98af +:019c402fc7e036193ec73dee29a5cbb59d5d6a +:019c50b1ad27c31a6b655be0a0bbb1081549ea +:019c60f6d54f3cb7a254be947ab0d18c2b5fd2 +:019c70c5a24a4a9fe51d6b8d7ed9eaad513a5e +:019c807b932ab4a4b509e29b987efb321f82dd +:019c9045d27e2f0e6d010337138f30d4a54607 +:019ca0921480076b1919904f5172c2e053847e +:019cb0e0ed5afc6c32329e338363480d53cd39 +:019cc06a71654eb8c756766203ef33a15d56f6 +:019cd09033554548b72e1bcf2f1f1221e2cb16 +:019ce06ea3c99b7bced37dcfc653d6f825d2d6 +:019cf033226f09741c6fd0c8b44964293f1216 +:019d00359b7f6f20a3d462157ca8ec7136c896 +:019d10f3db2b67cf6f1e583616339359437fe5 +:019d203a63cef538968e5615acd9c034e4db30 +:019d304a0b344899155b87529254b65faa3ca5 +:019d40f285592bbc443d4b70406152be51f723 +:019d50b72e300afa485f71d58727c9275c2f08 +:019d609af1fa618b7d5ccc84fa845c1ad4e7b1 +:019d7033cf16a0fabba1b8a4d86c79f4f1e915 +:019d80f7d1ffa8c722efaf2035355dd1cff219 +:019d906b2b6bf355445d0d39cad698153a6f4b +:019da02582f2ac1da71b9db58a1e2c08f31666 +:019db0760ab62ba837e547d61bb9ad35a90d5f +:019dc0a297b72d9bc056ba377320898df6cc68 +:019dd034b3cdc1518a12594ef3d5664f41921f +:019de03adea9965bca35b9d92699bbe392c18f +:019df0be1f76b90c7ee4de5550cbc948315bd0 +:019e000193d1b086b80001feb549c309b1018d +:019e1068c52bd0c5d49e83894dc0f026b60524 +:019e20fe55122c1ca11efd000b3f3893225c93 +:019e30250b8ee9fac2f7d3be12a1708d800647 +:019e40d39006c6e778fdaae563176538b9b906 +:019e501c402f6584764a1f0486e4acf95443a1 +:019e607e560dd1bff0bb4d75e13ffa350a346f +:019e7043cd9ce5f9a13578cad0939554ef59b3 +:019e80500ff04c30bcf67c6c35159c297019d5 +:019e9037f76c7c191e721ee053ee37db37dae4 +:019ea00716e355d7acfc4a0189d281b02fa17a +:019eb08f0087ebfd922a4920b8360730a3089f +:019ec0325c3ee2903cd7bd7c441590229cde9f +:019ed06e1d1bc9bf516f9f3a9fbdcfd743a843 +:019ee0206f7882364b103925e9316574c9a115 +:019ef05b9415d71e8927c9e5fa69799a3b8288 +:019f00e30af8c4baedee93bea0b3211a745b3b +:019f109d4afe40a7c78a53972f013f18bc9dcd +:019f20d476232326a7e190eb91b3b17c1d17a0 +:019f304b46d7d4d42efd472371511af6523b51 +:019f40505adaeb98b67cbee0f1ac97fd69365f +:019f50fe6a970a41dd073cc16b0cf2f6f4dd31 +:019f605de41eb8743fecb6404969432a4576ed +:019f708a3ea6913e618e8ddeb952a622249077 +:019f8087a501f8e2b27febd24e07588f9bca0c +:019f9046bdf05fc9769f713d1a9a0c427705b5 +:019fa0d4bebd621f514084f6363474c3d0d130 +:019fb0dd314106a9d895859635def7841d824f +:019fc0f740c09fefe968dca934b62034513be3 +:019fd00b12300201d2d5e0cd9d9086ff9e53be +:019fe0fe11b5a3d10c807686ddccc2b931c1c7 +:019ff0c3d823deb2cd35780d88ab74aa000783 +:01a0002b15cbdd4193ab6cc1f1fb297871d765 +:01a01044bd2734ef4b51baeb521815b30e6be8 +:01a0200bb68171f58c57bae9e89fba7305ba11 +:01a030496d7e57eb9a62af4e3093550720e34c +:01a0400866e285354b2060e97a4d5d906aa054 +:01a050d1969c0b82b44a90c372790d3b0f0280 +:01a060083c5ca9b0d035a82346f13831397ffe +:01a07064f2fe389a8e6f65b6b30e01215bb706 +:01a080ba19f329996aa591419c58ea4c83602a +:01a0908b17d9a0e50ce3b0e2605aecb0c84efa +:01a0a0a8731c887a47f5a0131c564d8969d5d8 +:01a0b0f5eaca6ed9ce353bf21e67073dcd6e4c +:01a0c0728f458fbeebf46dbd6ee1ae3aee43f6 +:01a0d0626caa5dbd0567bb29631397fed0b20b +:01a0e08d2e26c961560ac27f67844a6cfa800d +:01a0f0435f51387d3a2793efc155bdcd00f448 +:01a1002076899bd30dbe6a290f182537a10b23 +:01a110108cd88aee0b8538700753d1fdf4ec99 +:01a12088feeb0f1202961379451205533bc932 +:01a1308e7fccc5d4a8c67fe649676bf930cd9f +:01a1407630e86fea0dbb4a3210789ecae0ef94 +:01a15091bfc69dc2c5f0bc309aaf0bb195f119 +:01a160704c5b2430651ad449af7a780868eb0c +:01a170d38aeb1d8e7df8c110c3980d4ff7bc92 +:01a180c98f6a80616d178f79a3c3080ad59689 +:01a190a1fdaaad0569ef895e386ecd2ceeacd6 +:01a1a03ec2808da2ecb5ada3b187df9db0d07d +:01a1b072ce780368d98838ad46d6c93f5355ab +:01a1c0fb8dfd6410be9037b60f876d206f7fca +:01a1d0046db7ae2113ed65342d79a457b35d25 +:01a1e028d68b7e2829b779e271be0ded4fc558 +:01a1f02dffc71707a9603f5bf8eb8ffeca6d85 +:01a2005b0cb1fb36da532dc2e928b5c2fd0478 +:01a2101d9958560b13ea6939927e8750b8ebf9 +:01a2205b82d4e8f609612e4bdba6e7b4ff2d9e +:01a2304f98eac2762ac160ad91d740bd6168c8 +:01a240b96dfef0cc3eed7c89eda6e13459d2f7 +:01a25013bbb4bf23fa81b4de8dc223843627bd +:01a2605b8dca256cbc0297587539338f0ba5b7 +:01a27036cfbc7c8bdeb80d34df49dc4a0b7057 +:01a280e23470995b2e683ddc381d879c7942b8 +:01a290862032fdc1135602522a6f1011fcbc0f +:01a2a0a9e775bb87b80f3fdd6b0f21db340426 +:01a2b03122ad6040984810071223ff34d748d1 +:01a2c046dfa144d28fe290d5cb599b14655056 +:01a2d0d914bc172b34e23e131b89495a96e743 +:01a2e0c62635a876fc083b413f3f922c73f86b +:01a2f0b586006311ab0209bb8dae612cd35132 +:01a30010b28478d26ea4832bae04fb0a5aa589 +:01a3106ae666bfc6f29d9372fc71542a08b5b8 +:01a320d9fd0f54f15b0e06153b097318a5a945 +:01a330bafb20f0f8faf42e513317dd18ed209a +:01a340738cd17dda636429a2ceadc3df62765e +:01a350c02fbe9c618d1cd87305c7e81049c49a +:01a3604a1c96520b7eb6baca112e94c08ce89e +:01a370e7a532e2a3acc7b992e50e7f652f0a85 +:01a3801dcbfadceaa4b3fd0f33ab59de492d79 +:01a39000e9c0a2784a6093c3757c5683e7048b +:01a3a077fc721871f26bf52a8e0eb96f3a8ea7 +:01a3b0ab63f59ad0bf2f30dc9bea1fbb60d8fa +:01a3c007c081bdb872124bcb17ea783a1030ec +:01a3d060836e432a6f3d6c827f67b6ca6a8c00 +:01a3e0151dbad26eb2aebc3376627fb50628c8 +:01a3f0e5870745dbd80333800e8dfee2bb887b +:01a400073383980601f285d7209393f0bd1203 +:01a4103f816b4df9387b03dd931e04a78872b0 +:01a420ff4048e94766da2e937c33f8951b2a2a +:01a430936448b475db51a14f9b2c43782ce43c +:01a44020dc7956b89e267d52f5f91d5a9526c1 +:01a45047ac11b837b61d21b0aaad174fd9f79e +:01a460fb5213fb48ad2d27b224bac62a995202 +:01a470dd07255612d12a2458270a166b16ca19 +:01a4806df711877d30f4251020f0278e2f128c +:01a4905a1878106c0a18b3bca68e7eb5fa6e5c +:01a4a05fd55565d9a7f57cce0053152969cc1f +:01a4b007fa2794b1817217af9f110f0c91e35c +:01a4c03510b76cd2f067212153566b950e3522 +:01a4d0e2bbd63feecc8dee52f82e405a7cdad0 +:01a4e0aa1ef8913d60d6ceecc2f5821e5fae13 +:01a4f081241cb00f11fc4bee48830503b5ba35 +:01a500b60da37debd7d3c79a173110c289ea67 +:01a510d1ae2cb6f060d3e65c80b866b8fb5ba6 +:01a5201f9576621b540af9c8350130a5b9cfc9 +:01a530cc97b1784215534120093a9a68d70c85 +:01a540471cb4df090ed8f1ed2801b5dd1b6cc9 +:01a55010501cc0e7b829a279aadf7a7914d94c +:01a56092a292a9b49db87acae392dacfa8a023 +:01a5706641da00d9cd56a35de478b6ef5c8973 +:01a5806045284e9dcfcfad5eace1cb06e159a6 +:01a590eb7a8edb6dcc01b6fd83412b41cc1983 +:01a5a0eddcf0343892943172198b3f3d54a2f1 +:01a5b07f9f0b75d6d1c9ca9fe6ce49e55f43dd +:01a5c0a3ee20d0bc81e23d7d53066877072e67 +:01a5d0795521a3841e74f3da94abd89ddf3710 +:01a5e09c579423280e4994677015fa88d3a0f7 +:01a5f03d3458e02c64e5c486ccec8c59c537cf +:01a600e80e6cd237f2511a1e57c6067bdedf34 +:01a6107b8b8cfa3b4e09a099718bc22f616752 +:01a62085683fe50694fa4085d66a0e642fa993 +:01a630c0bfae0ee81b31ff37dc35b3bd3aa73f +:01a640d414d052ad7e2ba39e1304f63bbd1728 +:01a6506cfd5e9245a80d291942fa5c94aa13ef +:01a6604bd3751e63a0de648e8ff7c8ace42d4c +:01a67091f9607e0ae46f66df9cea5ce722471c +:01a68036e0ecc1251ebb6ade2934a9b5cd70b6 +:01a69068d0b69546edf697e642c77cb3bbd2f8 +:01a6a054d0090c04cac1e2f89ef9c06ea5331d +:01a6b0df510dbb9520a61949d851fca78f8cbc +:01a6c0eef2de123ebfeacf2dc401694b92ae2a +:01a6d02633915dcb51f6e6f9a521c257790602 +:01a6e0481eec74759810056f911448da989b75 +:01a6f04e1245d456ad193888ec71047a720198 +:01a7003aae965501c1435aba32b5e2ade08f41 +:01a71052f3e25fa0af0b4cf3e9fa38b6401573 +:01a720c37f6955a845a634ad383732431eab3e +:01a730c24f9d9d232def7f2c6cd0de89d3abeb +:01a740d6890a8ade22b204aec9f676723903e2 +:01a750e2588a243f2ce23ef56a2c4d99d065af +:01a7607049a89e32f7931d25c0b92c8f8ceb64 +:01a770dba90774b1bfe59c5ec28b4b8ce5522f +:01a780f00ae6042cbba746aaee8694c7e8b26a +:01a790deccb0f2a122d5c05c3b7ded1c1edd52 +:01a7a033f60ec2d45dfe532fb09e6edf2948cc +:01a7b0ecd0c581246b3259fc5e7b2f100a0616 +:01a7c0daf5b75733ce2263374fd26c944f919c +:01a7d00d51e22e943eeac89d12a4b3592dc65f +:01a7e0badb6ac2bbaf470ba4cf43f26782f6b2 +:01a7f03c770e350465922e978b647eaaf8aa89 +:01a8001f825f04625bb9b75d7075a97bc6fd32 +:01a810d931d828ebbf9eb05a40d6e2313eec32 +:01a820c1932569bf823ae358adc39efd73b330 +:01a8307b488ff0a74577648ae74adf3b36e700 +:01a840e31bd3be49927fbabac0fec603c6c2c4 +:01a850021603d655515dec16c4570c74d5e6a2 +:01a86001d19a1d2d9df21e49371949d6d3acce +:01a870d684bb040cfe1296d989cd604cfbc863 +:01a880b9c3f96c13d77919d001a8911eaeed35 +:01a890dbc1619dd682af2580de16a4ba77d30e +:01a8a009c7b88c881e9c6b92231485b2222062 +:01a8b08f0676d626d8dc65aac29a50e36d20f4 +:01a8c0eedadfa119b2ee1f9d287a5c7f3c1f1a +:01a8d08294b2049d17fc2f90b427c883f1cace +:01a8e0c93e71264b7a5395a85a10728211f64a +:01a8f0d7dae3d95de0a7dcc4e088c451465e24 +:01a900913618d8afc687d39dc3d09d7882199f +:01a9107603e25be92e3ee22181f561f8a893de +:01a920fc7a1a21e971430bd6410f3661f5643b +:01a93091476a67505e2a5ea3414a10a913778b +:01a940bd0725042789d3be3d804360ae074fbf +:01a9505d339f34776fa4c9958c174977b0314b +:01a960ce0683dad5524a5b83cdae2c8089c19a +:01a9701801289ab97801a4bc8f2538c47536e2 +:01a980dfd012f7282cc43f9a5d27b50174e6a0 +:01a9906306eabd42089b4c89c0c1b1dd7c05cd +:01a9a00fb69664c614cf5016752fbcad568778 +:01a9b030b005c901dfffeaf88e0165a5f06d5e +:01a9c022feb10f0cab5b58ef0c2992a2eb717f +:01a9d0d536a346386071c0dc6ec058a39c3813 +:01a9e04a009513061074b12a6208d04c66422f +:01a9f00a97bfff8d42a62708a9840ab0ef2327 +:01aa000a0cc1f7347add59069928210ae3a391 +:01aa10588ef043b20fbc8d3b1fbf2e8de4d144 +:01aa201b918c8856084f126f5028f454f94bc7 +:01aa30eb1faf55f2556e7fc5fb5125d98a5835 +:01aa40460d80c88255b2d6d6a7efb88cfd681b +:01aa505852ad8381ccbabb98bc7c9d2cec2125 +:01aa609512d5cc6a9ea3fe8fe7c2b95bc256fc +:01aa704f8cad0c7dc70430ffbfa5f7b703bfe2 +:01aa8088e2808a7df51c23dd34030955f14dcf +:01aa90356109b52cab408d9c63f8e8d4e837e0 +:01aaa076ad4378704c44e48c665663c01c3939 +:01aab05bd093e36f3037c36ef0369a99c6d22b +:01aac08ff9e2fa8e2af38849dccc52c9de8c49 +:01aad09b0ff4d59d83dac34078f26094248dc3 +:01aae05ba5d9dadc0d90b2c06154d67f3d3691 +:01aaf0a76e056b57e25f6d2d35e7196566ffb2 +:01ab00d70e8b3cf4cea8e3a57cb33ab5a80971 +:01ab10427405b594dcc49e5044fe5cbb35e1ab +:01ab20132b1af37817aa35f61e1696c16ddf7b +:01ab30c89d5b6bad03032b5973c734655fed29 +:01ab40161a45a3bd430c63f909f95d71c8e6e3 +:01ab50b141d6435f8a43bdc2a86fa2d3c8bcf5 +:01ab60fd7102d99bc4effce7b0371f3d13bd16 +:01ab701f6177dc304e60b21dbb10dd43959895 +:01ab803909eada21bd9c0fdf527c7bc7067889 +:01ab901e6b00e3f1c5732081319307049ae290 +:01aba01fad062b81406a8d1d2997554f0e739a +:01abb040609498c3f3917e966f384044ae060e +:01abc08492d012d1f0b853525dd7cd67881d47 +:01abd0034a98279d00d6f3e1cceb5d80c7847c +:01abe0c2655edec07a6e8391d5ea02d1ec4a67 +:01abf09ed56d2e80bff1fa0b0fa3e07bec41c8 +:01ac004cc961db8875eb41e8a38df76a998db9 +:01ac10611c3019a77824d5d6b8f64c1d92c4d1 +:01ac20997eda3257ee15178935ac1171f834f9 +:01ac30e54c64590b165f66730e711ffac7b7f7 +:01ac40ebe41fe82a3cb4c0a1e0ebd8f8d54487 +:01ac50041676fee6145b1bed0050efb00746f5 +:01ac60cbc1ec2cd6cb0957f902bf2379f8f79b +:01ac70c4ecabac2eefb4f16d61bdd7d6fca9c9 +:01ac80290a841ae5558ec1a31316924db03e00 +:01ac90ae9544deab7aebe1dd45ba52c73df6c3 +:01aca0d60848a696775593d904107b1989d194 +:01acb053f892a9482a79517353ed3086d3d2bf +:01acc0c8ffd14ec1b80d6087e5569edc3b9bf1 +:01acd0ad78ffc459e27efdb4918dc59e5a6b54 +:01ace0b44511e8dd0671f078ffcebdaedb4461 +:01acf029043c2a6b843d51e4e1c32278577581 +:01ad006a1da7c7f34d1a0119b61f690c8801fc +:01ad10ac801c40dfbad6b0c38ac3416d84e229 +:01ad2030a9485dcdab6cbd32e1213b01822b19 +:01ad3057a1c033285ff04ff18f3cbfc13890a6 +:01ad40a754db70f30a0bed8543157837083d2c +:01ad504fddcd33e585c61330ea17a4db882792 +:01ad600b88e7ece20e497c76191827ae9c83a2 +:01ad7036d891870af1e8008590e18d83c5f353 +:01ad80c43fb673b7c1d571ee0757b628c06e22 +:01ad9070ac7a340a40c023ebd513b96f77a5eb +:01ada0668f50188e1ab44481aaf6dd97029438 +:01adb09ae9372eef1238ea60f011e57bb96545 +:01adc0d73848a73228388171fa76a90c89b943 +:01add0ca2bc2d9159090e0845532ff2a4f6ad9 +:01ade09dbc377964a5ff29668b130b6219df5f +:01adf0d8790bb4a956067aed7de737f9d8e7f1 +:01ae004af2ca615e5109e44df3a4f4ac9048f7 +:01ae10bb0ea81b03f4aa71bee9ecc8f5045a1b +:01ae20933d5343786e9dab11a223582cbf49d9 +:01ae306d7f2b7faa833b44caa3b23d94d962b3 +:01ae40e623ac660d1e4bc4573cd51b1d72cd81 +:01ae504fb1c037b164eb0a95e9c0706182b7bc +:01ae60c946f2380a83ff64e591c87765e347a7 +:01ae70aad0941db60bc5d2bbfbfc9bc58b8f0f +:01ae80e296e6ae39f5defdf1928a2b5273f8e0 +:01ae90ae64a58ebae9872cb472eff5f52cecd1 +:01aea02fb2c17f8d02ec429221882b68d0a886 +:01aeb0f5f8048633b06ba20d658fe23d2c28d1 +:01aec0dc626f5c41f27adeed2bedc3671996b5 +:01aed051854cbe9492be27838a338c67d999a6 +:01aee0d8972cbc95618b422cc996168897ddcd +:01aef03e27bc1747b7738a21de5147b93c4bd6 +:01af009b0ef5419aaf165849d672a62d94eed1 +:01af10dde3148a8b1d07ab33a1ca3885fec7ab +:01af20504e4c94cfc45a41160927409549064b +:01af30993fafe7a5f6a4acf9ada4531b81a8c9 +:01af400d9d739d5a813c1b4f215690984fb34f +:01af50023105437ad3df65a71b9d2fbf2668ee +:01af60a98b138bee79c5b929dccb540b86a8dc +:01af70a753e453a474228d9f588a0abd15ce21 +:01af80ab7d84230b846a983f58bfb28c61baff +:01af90d841b43b1845ac58f42aa45b32828027 +:01afa014ec79ad3f848ec0224e8f068bb799dc +:01afb04abfa34bc08c36cfd59ba50df55ab51d +:01afc0bf0dd5f9b82015fea9c014698b7b5e10 +:01afd0bcf8db1bf60d2efca011f386e57179a7 +:01afe07ef4d95c9e80d3eccef565f4116eb8e8 +:01aff0e8b21d362b9a4ceb7ab1ba1020e61814 +:01b000649e798e10b4d8a72d96c28a6d4c2fe0 +:01b01016be45a870d9cb6cb2d4211b3a5a4019 +:01b020e5cc44e255a9a08f378d398a7366495b +:01b0307dfb6b0b0f30239366214df7319af9b2 +:01b0402a9ab3aa0acdad60d8faddf8242bbd12 +:01b0508d80958e1425a827140edb316634337e +:01b060bc420403e7f57be316b7093bf9f00535 +:01b070b3fd1a855fdd660f6f04bf5771aae044 +:01b0804a3668a01c1c96b255ebc40f95c4632c +:01b090015d6780388af83eb9326dd64c6b20d2 +:01b0a065072a6c1d0c631f515c92006d240209 +:01b0b00f74f8ae76e945ac2bc101dee088e9b3 +:01b0c0f190ce64a15e76ff767c586a292aa2e4 +:01b0d0102685f52910432eee4965aae771083a +:01b0e0330195dbac3cef2a0208a1db61068651 +:01b0f0926302a807ba54a951673a9dbe907adc +:01b100f2c2b5cfc0c650e9c2d31e538c390708 +:01b110b887c953b861b27a7bfb1efed15464fe +:01b120629a854fcf203641b1f3fcd9146af7b3 +:01b1307a1b9922644722fe0701e44426b12de9 +:01b140a7064b60a71a246fd41b5591412e4b50 +:01b150cd9cf0aaad41d93425a53b24b5b9929f +:01b160f5dca7414c3b1fb5277f01be4a776991 +:01b170acaaf5905dc54510e3bd94d10bbf60c6 +:01b18092d3e3bf0351355c123dbc9288029d3a +:01b190b6932f6e9cf5b230c79702104eadb24d +:01b1a0864771ff47518354f5761388a04fc2bd +:01b1b087ed774f0b1c7fa688a897ca370e8a39 +:01b1c03ae9e5baf360cf9e54740419803d3303 +:01b1d0100114e9f4f8a34b05330d1970b31f6f +:01b1e047ae829f46bcfd0ac43054a51dff8691 +:01b1f006ef36ffdc21d06f50cc9e4dc8b12a1d +:01b200b9d379ad3e22925722bb98ac95935222 +:01b2106d7cc4b3663854b586a41d73acfd6f21 +:01b220e17b093cdccb642b33318b4a4134923e +:01b230b397309c02322bbe19a79d8cb8d98b16 +:01b2405e34a7ff8e7adb95c719c8fa9bd4064c +:01b250b4d60c69505af2a226f5262f8ec76b99 +:01b260f33d0d34932cf86d09cc496b3404d425 +:01b270faf285e0f6cde17470db7f34faff22ec +:01b280cd093168ed02cdf8bb297c6ef26d7719 +:01b290145d872e8e080be8652e0d8d7108d805 +:01b2a02b2ddd9ff84c014a32d8b3bde7868683 +:01b2b0400f74780f8bb4b32d9d17d150b3f4e2 +:01b2c0452ef08d36c54dc5e720208bcd840464 +:01b2d02195bd5c325f6e1560d96884e4289b9d +:01b2e0634dd28e893bc071c2f7994af4235897 +:01b2f0fb3ff709244f89a4b147417643dfcc59 +:01b300f8dbbc2101999c5a5aeea644c80c4d89 +:01b3103a2dc4380150424abf4fe58f6efcdb37 +:01b320a770d2e680aa29cd4f969949120adc78 +:01b330357a4c1b62234afb92cb99ed6f12ec92 +:01b340df1649faeba8234e830ceedada8a5960 +:01b350cf6cdb1d84cec6a0d53d9623e15cc3b9 +:01b3601da9452c3db7eaa141f5aafa8fe2df2e +:01b370073fba3c548d54a01d24146b4be7911c +:01b38030382248a1364c2d135e2e818d015474 +:01b3907b7dd0fc092fb4e48ba05bd39dad599a +:01b3a0d5ed31aa73640757c03e5a4bb3bd0ddb +:01b3b0d6a19dc99426659946437e5a7b426fe5 +:01b3c0d75cdec2be772b16935f4bcde9f22b91 +:01b3d0fabdfd58eb0b9dad3c8bd6f4895ded67 +:01b3e0f8a4ff8bc3e47cc134d579c083d0ecc8 +:01b3f054a7008fa61b7f88eb1f79b9056cbe5f +:01b4007fc28b7f91a33237b1946b646e1270e0 +:01b410c2022dc722b242248692a605df272a75 +:01b4203ac43cee818f95b45733fdb8a8b14853 +:01b430e17e51774cb8e37b8a736455bb6f1c96 +:01b440c355d4cfa181e7952a103d020942a83d +:01b450e55c6a2af1e4f8c416aea570a7f35d85 +:01b46098eb8113c8d6981aa12ead193e493dcb +:01b470f9059fb04fb20f12baf13d904ee9d551 +:01b480d62b594f9a5c367a6539b9f23ea39bcd +:01b4905d45a8360b1e91d54694b7adce673f28 +:01b4a033cf1ea872174c8a83c3887cb660f1ef +:01b4b0338598fc474090b23d15291837afe5d1 +:01b4c08d1df42f7ea78a2db98a5e2c6972e0e8 +:01b4d085981e3c4991e4df9477108fda202186 +:01b4e0aba602191e41960e9ead1d1beda37251 +:01b4f002a256ef4e5a945026cb7dd2cabc228d +:01b5009f132e7da76dfd075fb40cde898dc970 +:01b51034d895ee334b36b1054b0c9ed05bd8d2 +:01b520d4ec0469c8474e3a33eb3b61c378fdda +:01b530156c8913e623eca053c2207f6eb75f44 +:01b540bc60ea994200a0dd920c4b264c2cd210 +:01b5502aa2465c8daaa86121288859dd11cca3 +:01b56062a7b28f80838f195446b1e338f369ac +:01b57047a19045a675d7d808b1965b4b33112f +:01b580177da31b8b07e199e5b2f5a7ed02cddc +:01b590298d8e788cd53c34631f75d3a8fdbb74 +:01b5a013f277be5b9e6b05daaff9ef5dd77dd2 +:01b5b066983fc07cbd405deba03355496c05db +:01b5c0da9a970b47a63832920d1741f1227413 +:01b5d0a227391b8c1bafb3adc0e976606dd143 +:01b5e0e435eadcbbadf59fe29380c76e6ae4db +:01b5f057ed1a519a00265f1641bb97911be633 +:01b6001b5eaa6045bd003fb560c00a147b90a4 +:01b610302b95d74852b6b18192e0ef857d1812 +:01b62058d4440386c73e6d9700b94b5182998d +:01b63031b70702d65a9fc9adae7306ebdef890 +:01b640fb5bdf445cb86201a5068712b200b236 +:01b6506b713dad09ba2d2c495ae39f5184bf23 +:01b6609e981008bfc4a5547f8672a0f4826928 +:01b670e6abdc8fc36a430110db8354d8bcf611 +:01b6808aa734101e8e56b7a2a13e07074842c8 +:01b690e54ee8d567a250fd4a881c9e7b065e10 +:01b6a07b6a6ca2160c3be7906d6c455eba2968 +:01b6b0e23703f78eb9d56eb66d5158e5e6832a +:01b6c03ac05992f4245c486ea88f65a6ff6c95 +:01b6d05e6ee194f633744eaab1be939abc6874 +:01b6e0b7273df635856566f563169e14765c94 +:01b6f0169776ced110d71fce5c5207abd7837c +:01b700ec17b19c613708340136ec2b4e02948e +:01b710c612556da239058bcc258d8be909f069 +:01b7202198e060f5f8393456516e4b79387e37 +:01b730d4669696c58aebbeff3a383bc6720111 +:01b7405589596d4dcf26cf1f1d0d96c17b48b6 +:01b750e8e5b1f67414fa9a0e27218c164f89dc +:01b7602c1aeb736d085663a07dde70fb77e41a +:01b770d803a524385327724401054a411bba7b +:01b7805ba5370bc5819a068d0ec0114cb6e489 +:01b790ebf0565fe36227d6a95ac68518a4d420 +:01b7a0b50d3deeba2e6d4bfab4e6054d4872a0 +:01b7b0d29c22aa2108ddb9487af094de6f3342 +:01b7c03a2acdbd7d8d9adb20437b068fe66a4e +:01b7d0379cac67c386c9271d1e1d544b076b2c +:01b7e086ab0eb38ea281c9c672801bc03306b7 +:01b7f0116dbc3b729adb64d627c26d1b27567f +:01b80089fb81663ef526586e733cac9f8f663f +:01b810006ba28fda8e2ffd34ded4b6b7972646 +:01b820947fccb638a6c1dedccfaac8040d0b82 +:01b830f27d819dae2f8781667236ededd058f8 +:01b840ef693f84eeb11da5d5d5b6199ce2f74d +:01b85076f457c7cb06ccb668729ec8c8db4b15 +:01b8600848a09b9eb2d5b1ea4fdd82f9cd02b2 +:01b870fa53b47608f04b5fad6e92c2834446e8 +:01b8809537ac86234748d0c1df5122478f8ab9 +:01b8900ef6128c3ca851d3523bb2cff7800a34 +:01b8a095442db3d1993dde152c8d68f7718b54 +:01b8b0a4e9f533cea673ec91f7d8798c7a2c00 +:01b8c0b7e23c9a063338d7bfc7a106c8e7cbb7 +:01b8d025a2f93bf4f925bdf227e16ebceb5f71 +:01b8e029ff9a46fc7cf83973b80a0c78b604a1 +:01b8f05e515104f8b79fa555a72899583d3d71 +:01b900f0d7a53c53da22be1bd85493b33be324 +:01b910fd5a04229403192d83a3eb165a4a0d0a +:01b9209511671204f02cae40d4d5a4a67cbadc +:01b930d7401bf5e703172562f4a0623b43517a +:01b940ccce65e49846067b224015f2411f7655 +:01b950b1b4a8cb0f708323bb17189b4d86eee4 +:01b960af48eff813fc01861d8f6a58afdf9753 +:01b970f8906bfb6b3ea607e78e2169526504e4 +:01b98045aa966a4950bd4849baef351c87fec2 +:01b99049c826ca1ab1058aede06ef0492c3d77 +:01b9a0184ec5a20bba939b38c687c0724debff +:01b9b074790bcf475a9b0a03773eeca73f8c24 +:01b9c0b491508d6aed84b7e5ea86929479191c +:01b9d0966f0af4402cbc7b5e8a3b91c76c540e +:01b9e0e325987807c232943f4d97bcbca62f09 +:01b9f01d88d6b3afc50c00906b4c6ef1e7313c +:01ba00ea152b9a9583a40bc74d647a768b94d2 +:01ba106204c975ac8870161a989baf84ca6f39 +:01ba2067501548fbace132925ea15e72f60fb7 +:01ba30c29af0a2386685f1b0c5cb7c41b07ffa +:01ba40575057b6315cbdc01d4d3454821b65c6 +:01ba50dbd1f9b71dd02409ce1c5b3455bbf9de +:01ba60091719c9178ade91e06cd564429596e7 +:01ba70d4034c2da41b36b5b34510c117ed9884 +:01ba80dcf5881ee8f172ca2fdeee4acdc481b1 +:01ba904c0210cfb7c4e6a5c855a24bade3f0ea +:01baa009ff2d2bd6aaaaf779749f6458536d19 +:01bab0d4e1fd90e4de5e1dccbb98aad90974aa +:01bac05eb0bc33421c3d1ea74f736d8da2fd24 +:01bad042d871c10426e50df63cf50071d1cb7a +:01bae004b4cba73919fcddde52d324d378e95f +:01baf0486ff34ae5157945b13ebd2a1547e303 +:01bb00ef285b37d87bd4619f42c2acb8aea394 +:01bb1042bc74b2818c83d838386375ced05e17 +:01bb20be9cde2eab36ae5ce205f12535d7b14f +:01bb3070925965dac368476b860d91955cb945 +:01bb403a099996ad68ff22667da00b0356abcd +:01bb506f6ad541eaddd19ede87cde115c6f4fa +:01bb60903dcb3a582f55f14be1e6fc356467c4 +:01bb703e8a23e29f218ef9200ca72dedb1c8bd +:01bb80fc7f40ec1bb7cf58adbe2528ec04f8a8 +:01bb902c96da8d605bb89e709fbcda83bfb9cd +:01bba0d23449c7c5d8a45717294db5aceea4ae +:01bbb08b3ea6a0f3703bedd2e1fec3d62c1827 +:01bbc076c73d5d75619ee917bef5ce448d9be1 +:01bbd0ee7a9eff46a2fcc14f260bf1368b3fb0 +:01bbe0b8b322880f514d53c1c669cdd54349f3 +:01bbf0cb3b1619c61b895219f467e8fc438e2a +:01bc001ca0bf948bb6fe2216527c646d77466f +:01bc101e13f645352bb33b48381b9f46c2e86e +:01bc207df3b432eab9ec2ed57a451678f07159 +:01bc30d9a902e76b0f73d754d1244cd1ce59e7 +:01bc40f628836066333eecf29783c78c1a397c +:01bc50ad148611e7689b333797137ab69320d0 +:01bc6055d9091ecdabc2c49934effd4e9a1837 +:01bc703d33d990120739df988f0c8550b49eac +:01bc80a09329c9d8e2816795de1ffc8d531bfe +:01bc9092f8cfabb2e1e768a2c04fe4b9210327 +:01bca027e6b7907f923ec58663fbafa0b40e60 +:01bcb0d8b059726477b35ce7914468e0d30003 +:01bcc00e8ef54e556ec436aae52c5e93bd9b44 +:01bcd04e2a602f1db1629aeba4111d61a5f942 +:01bce03a2391ea3844997f962a19ac9a61f338 +:01bcf0a2347e9e516c1b0c98012b3759231e1f +:01bd00c162b27981ac5a133d50c48a74b842c0 +:01bd10d354613e2e60ccb291133d0ffba0bdfe +:01bd2090e72ca94b8a1537d5ba82d377b2e444 +:01bd3060e5c1b4df5ce367ed684fd7f4d6e0d5 +:01bd4012238d48cd40ed96a43308967bec5f53 +:01bd50f1a6da6b46c8c1c1ba130192916fd5ac +:01bd60874b2f1d8dbd2e0a13c09499a5345687 +:01bd700ae5b3a4a48f1eb4856ae67aec938725 +:01bd8003704497d114d06eff9f3115705b3a3f +:01bd90b5d709978ae6c5ec65d5ae7ba22c4ff8 +:01bda07fd64eafaf1114400b8e90fdb42dc2dc +:01bdb0e525b2da8f962fbd700642389cadca3b +:01bdc05af770c808535e43ed158e99a8df0cb9 +:01bdd007d13805c9e890f8c641d4dc95309899 +:01bde08c7d71a67c7e9b0b10b1a8d3e49ef614 +:01bdf05b33cc8ba38258069479e7651a4ed450 +:01be00583f36b7cc87f98ffa805fe4e498ed4b +:01be10a8447b7cfd25349a33867a1e04ba799b +:01be20a86e0cd2d56b97c3c657aaffbe6bc166 +:01be30bcfb2c26cbb64094fa17b34cd49f35f4 +:01be40a9824ebf4debca3e636523bb338e4eec +:01be50099337bc03e4d09f34ddfcced777e08e +:01be60f3d5f62dfaf1a5040140ed79955011e8 +:01be70320b519708cf478a2cbe6bea372f81b1 +:01be802947be3f1a87f3e3ba8167c4dd193cee +:01be902e9ce6a628dfdb2722c58322fb1e03eb +:01bea0008571f5e5ced3b9680b82afde012342 +:01beb0770d0f90f49304b77bd6a8e32a881a5f +:01bec07452f6aa24804a96e8eda2d5199eb97e +:01bed0c33059df9b05c197aba741e235006fe6 +:01bee05c21280952c3c75dc7696e84126ef076 +:01bef0a87e845f16ae0266392eb3f888815eb9 +:01bf0078258b991ba24d767a7026f3c6484981 +:01bf108061b6c4ed67974c1c9a5b9e9ad87f59 +:01bf209a40b659ade710acbb53672b86b30047 +:01bf3090890c1e84ee2c268f5002fa8e66907f +:01bf40b7e5f14aedbb6d09ea01d64ed78f2572 +:01bf503fd511f14e47848139415c165e621ca8 +:01bf60cd1253869900418d21e985591a6a2ec3 +:01bf7000f066244088fc1e35eede713214974c +:01bf80c012205b1e836f5c948559533fef0dd4 +:01bf900565c74bc94717ac1560a3e205e35bf6 +:01bfa092f625d7bc59133d15e3daae69dd58a8 +:01bfb0fc56730e52f54f8aacfe3cc0c022c732 +:01bfc09cd760eb6262bfbb752b3f3e2793f57f +:01bfd0bc12449972f84c8949848d41b7515319 +:01bfe05ade06f6347644dc488f41fce1d7a70c +:01bff0b8c7bbbd8ad6bf573cfab4571be94b4b +:01c000034217e08a6e259cc76e4461866a46b7 +:01c010aa4cd33a141efd8a0457c881dd6ad8ab +:01c020ad480995327310fcb4e3c4f39d18739e +:01c0303e8701131aed1f77c63b393c1b32c64e +:01c040403317107da47cc67a2fd05baa9cd7d7 +:01c050d4bf259e2182e178ee35351052146525 +:01c06090ba5f2f4a50819c6a199a8c49697349 +:01c0709594b898e2eab63d960021694bae4e29 +:01c080c9b372a05d1fcf5db1e3784447d37605 +:01c090a607ad79715199aa1103e8f3f459df9f +:01c0a0290abcf5037183b595521eda6c77424d +:01c0b0fe1047c67c5f0cc898976a7f49caa062 +:01c0c04ad125c9cc746ea70c1bc6e61a6127c4 +:01c0d02388bd19e86584e7a0921c5f4e02449f +:01c0e0360ac841c187ce8ce16aa6059d1d0945 +:01c0f0521b0a03c27ac117f5edd16de1e34bb0 +:01c1003a226d7e243f293f177a92e971fdbdef +:01c1106c91e03abdab61837c45c092e004eb2f +:01c120975d612dc78208d3d1f7ae9db35b13a0 +:01c1301e2a961e3a8ed92bcefb095942367866 +:01c140f9459423a04da08d8d5c41ab3ef2119e +:01c15029139a88622dea0208449504add0f318 +:01c16040482e244ee54de5bcfdca99fc5c47f5 +:01c170ef25e6a7f9a854ebce28a79d9632b59b +:01c1801539d940d7abb4293483b64270978d22 +:01c190051a8f8430837682c8cea2bdd81be86f +:01c1a04f1325d60f576ece180e7e159d335322 +:01c1b027598859d9998a4981cef79fef0bb424 +:01c1c0f4fc24466f68f952bf05f4fe6c1f4427 +:01c1d077646058be98f2cca51867e8177731dd +:01c1e0c18847578df21166921e38437140579f +:01c1f0d5d49fde60ff50b1a1b854c73adec045 +:01c20062aa1bedfb6048a1c92b841fea9f277c +:01c2103ec5f3ccda1fd8e3cf23bd5c4a89eb82 +:01c220eca48832e51c0975760b43a05ce8d17e +:01c2302637b0b58e5b9eedda500cc89d2b42b6 +:01c240a7c43aca76363457bb228e8b986c6879 +:01c250b75d62e3b7e3f0ab0ecd1db7f0f98bda +:01c2601484dec9a72a5891906ca2cc1ae05892 +:01c270f8244cafd75895dfa9d113b6f225e4e2 +:01c28079e021693c16e63bb6f7f18ceb21f791 +:01c290346a576e77f06be7126e5bcd777a6290 +:01c2a045a796758615bc51165ac424d2e1fc52 +:01c2b080a06ff588ec3b0e6a95663a65ca280e +:01c2c0b945358f46675a57856818fd70a26e4d +:01c2d0cc03e176180fc8947bcde2fa2493beab +:01c2e07be0e9210e3e3397770986fd8f178797 +:01c2f0e4e5ad9210a3c4fa8da44a686c28af30 +:01c3002fca6a916269614d9d3956f583bc28ef +:01c31098f3576c2b155734c02abed44d5105e1 +:01c32089cec27b859199cc814444359ccb7fd4 +:01c33020c197ff330397a53be229a2804de88f +:01c340635057905710a77fec74ecf04d48ad7d +:01c35004fde874ef1cc90df5ce213979d3990a +:01c36009e71d1659bf8b2f37554e50220f4501 +:01c3703a459ae92814880142c992266da0dad1 +:01c380a60553cbdef1b43af73e63f244e9d02c +:01c390eceddbf241c8ef96ac368cbf265006d5 +:01c3a020a21f89929c76232822a97a32628549 +:01c3b00f3025339a7c2a7ab9ab75d149c5b182 +:01c3c03d1af938eff01efd32ec43b81325a6f0 +:01c3d0f7576f4afd44ba2cc6c22628f5f6d449 +:01c3e04d7049a2bb3b84d9c041f38ad91a975a +:01c3f0e932bef100a54ef11e7f8f663f4862a2 +:01c400aba9b1672840f9fd0d95d8070c51c183 +:01c410039121eb9d759281f2b254b13dabf758 +:01c4209d6faa8d2198e4f348a3778badfdc938 +:01c430390506b969c41ebb8628ed196318a1a9 +:01c440f72f3e574a4466b209d9907f3ec8864d +:01c450aa172441699ccc22adbbfc7fd91675a1 +:01c460f198474ab83f74909c1be036fa2ae053 +:01c4702fa4b7174ff829bab62cb43b9271bae9 +:01c4808b2a272193aa1deae9b959fdfe0243a6 +:01c49089618bf1023e9e703a4a83f1c12f97d8 +:01c4a073adfb6acc32c587af56804ecd0d9f33 +:01c4b0e392517dcf9fdd2ce327dddc560260f7 +:01c4c0331ff67c7762a18fb1b60b0812ce9902 +:01c4d07386d5c67c405121dcf42834e6a22fef +:01c4e03a4712545e8f561f7c4e8fd1ac58e30c +:01c4f078f8d9c6fa190b4bc414d29fe1ef1816 +:01c5007d8f695a5db58e4e40ccabe11fa5b625 +:01c510b3561847bc5b22e02d8e35126bf24d47 +:01c5209c5795cc6e20df3672c04f5693a74121 +:01c5309ca383d467f9963e1c37b8c951181963 +:01c5405f9a03b74a45eaf8e611ac77d99f8814 +:01c550e77b1aa8324d37765e37bb0b637c2dfe +:01c560091d8e101c28420d4b868b24cb480037 +:01c57029caec60eb8eaaf02118a36a6994af11 +:01c580236d357367a3185be807179cea80bdfe +:01c590b88b74d5a58d9be449270c4f32cc21a3 +:01c5a01bae3179b1d3009c7b7bf5d5462cbf5c +:01c5b08e6c753dbe2362073c9286ee08d4ce3f +:01c5c07d36f9a1ee34ddf645067ac8017bb493 +:01c5d037f4c481a77b5f0e67d295a5b5472265 +:01c5e03f3db950574398b1992605c1bb9d4807 +:01c5f0cd8be36b49a8e4b565e4404af7ba54d3 +:01c6001a5445e54005ebc27347c591d5e2b3ee +:01c6108a0fe2b1341f040ebcc687f64f332fe4 +:01c620246547109a12def97c09467033a0eb0a +:01c6301c56b21644f6b4a2a750f147aa16ce3a +:01c640d393e9299ba4e07300b3315342dcb926 +:01c650b7ff7ca879a0cfdd9f85210780c1ff6c +:01c66050fe97f1196521b11b61726540bc8af7 +:01c6708bef0fcd25a59521a730488d7eb8d8b0 +:01c680ffceab9c87fb77c90b140f046b99df2d +:01c690e2a00faa64b33f8505957a87a7e0cae5 +:01c6a0d8ce40e4daef4d41c977f5cb1532905f +:01c6b03ab1e80e92ca5eb9263d2f1bffcd8f28 +:01c6c08796b7059e034dafb36dcc95c0331b3b +:01c6d0752e2065ffd258bc6c3d4959f8d3d9fb +:01c6e0fecd7df4da27782f84c22eb26be3e22e +:01c6f0217c50273e6651fa275493ea65468c73 +:01c700c712df9cabe5011a44f08a45b5f693e4 +:01c710f59d85e44b484f667acd33d25e3afc7d +:01c7208e21dd947aa32f60eb9c8972fc584e97 +:01c730e41683d5ec329b3ea68b8982c4c0e462 +:01c740667315629a32eebb54de02a209befd9c +:01c750b94f34b20a5757c47e05059edaa924cd +:01c760ed441559d4810da45502fc74bb27a9c3 +:01c77062793f9ae18af521c14d220e77c1ccf1 +:01c7801b7c3b24aa7ece6538c2ce509bc01376 +:01c79042e0216f27d32dc8372b18478d217d12 +:01c7a0e17fccf04e8f86a360d7dddf6bd34f32 +:01c7b096531a6d87bd49ee07be61822dd4e8f6 +:01c7c0d66473f37b27ca1bdf28af31651ab5a2 +:01c7d0035cab88b0236c8e565f7d74307bc5fc +:01c7e06e36c963065b75c8771d178d69ddecdb +:01c7f06e6934936a3b3ea5d5f8d7da389b9f3a +:01c800acaf18422586750a48b3c38b84ac63fc +:01c8105f787c226bf9c929c96fc983732be2e9 +:01c820557dcb58e45057cf63d4cd2a0d54b24e +:01c83099f81c46a29ed60d701e98b48c924b8b +:01c840a9f52006afd40af150b4a3a40f9fa336 +:01c850e6f659cef1a118779c17eb4aa72197ae +:01c8604772c9794ce57538a72a8d266d710eb2 +:01c8703b9fdc5e57da81aa4215a3518011fc8d +:01c8805a9a0fcc855bf59fd4caf8bc3dfbab42 +:01c890c753f346fbeb0fd4cb8e372981d65c0b +:01c8a0671c5505c1c2b01e37298426133980bb +:01c8b04377f2504e778e6ed73b0927348640b4 +:01c8c0537cc32a7e05f6bda2eefaee211ca23d +:01c8d0d63d422edb985c11fdec92b61a336614 +:01c8e05c8b5434802557b91092efaf03157b4d +:01c8f0d3aa80be96f3a438dc5d599b074c6f68 +:01c900ae23d6c5650783fb6b69f9036052ab30 +:01c9108a5f78384d22ba21ea6ad38a39c1691f +:01c920b0700c597aa594767f44dca05f02b93f +:01c930ce50d66cd9a84cee414b5f3e77188d3f +:01c940913274e2f3f98da4a5bf9cae1e7e87f2 +:01c950be15a84ff7e74555cd9b411961392c1b +:01c96060b7c5156e308985de610fee1c0f8f97 +:01c970829ca9a57ff05b5c61e7f68dce045a01 +:01c980bf806547f8606a76a79102333697c57b +:01c9902247f9f24f0b4694beb3bb19210fc784 +:01c9a0105ae12d19bf869313b0b2d7c93cccca +:01c9b09e0fef24b2b609fb8d9d15febac6f4d9 +:01c9c047ddb46062b25d408a5e6e9cec5e0ba7 +:01c9d015c2f0bb7d74b2dbfb8fce582c6af933 +:01c9e045eca860bd513c51ce39bc67b0c5ee5e +:01c9f0c4ecffd20657b9af9b8d420e4cb50f0a +:01ca0055f76490dbc11a938d7b37925e9033cc +:01ca10f90138c3a3c11e233b6b07ac7e311049 +:01ca208928723457b8f7f0f677ba4eaa42f1c6 +:01ca30bd2022fd2014ca6d4365d4b244017006 +:01ca40d992f4ff13f20cc85cedac0e6325f7a7 +:01ca500d3a36853faad84db968b8b680282c0a +:01ca6093e4cbade87499c7ca657dccc05a74de +:01ca70038d3658f3a30f6e6440037d3fd3ea7f +:01ca808994c67a1399329c784b79c2697a4a9e +:01ca90b97bb3eff40e8dd6876b5afb5078ca52 +:01caa0b92c3a51fe000900811c23c4997c5e55 +:01cab00349d13e0051089e97f047dc0030b496 +:01cac08760bb59010f6f10ebb573cec2262773 +:01cad0ffb1e21958fad9212456fa6d6cdde4fc +:01cae0d93a617be116cb2387ddd123c332bfe7 +:01caf02c3bd8674e8e67f71951cf7eedf9ecde +:01cb0092f48c2c3f73e9e23286fc4603dca55b +:01cb10d9f985e4898b5957f09aadb32156a9f7 +:01cb2016cafcc78b5ff02c3035ff850c6a449d +:01cb30f910b452093065c2ededd261957045c8 +:01cb40e77fd113ca62736bda311e3fddabc5e1 +:01cb50edcea7cadc6fcaafd4ed4f7c5855b36f +:01cb6053092d4aacf368ff077506cfafb7cb75 +:01cb7062914b41877ccefd07d55da6c2764ec9 +:01cb80d00247e2d33dc2824c418f9f6b9e295a +:01cb90c499bf2885fbe83595cfc245cf84333e +:01cba08d9e5dda589a951461db50b6470086e2 +:01cbb0b4d97f87dcf4a6767a7b2784027fb182 +:01cbc02485e516c07a39a32cc059482579ed59 +:01cbd017798dc3d5a5ab34ee0280263d05c832 +:01cbe081564b7c59a4e2339367d4b488fd85eb +:01cbf0ecc7360412ee11cb2b26b9e0c26b0709 +:01cc00bef4d66bf2ab108d17b6935b1c533ef0 +:01cc10547891b2c18f160fc03f5e68fdb26117 +:01cc2017194adfac3654942d7e0a9c7c123370 +:01cc302627ec386a33d783c78d3ddf95e2ee9e +:01cc40fcbe087725ca18bd8a8099e4ffd92c54 +:01cc506443594977f46ced4416fc99bfbbe7ae +:01cc60dc04c4d3d4b03110a57324a64bea8e45 +:01cc70b5fcf9cc71ad0c2df877c77b564f8da8 +:01cc805f49270a67041b798f37cb329e572de9 +:01cc909a3fa3ed4eb8a25fa15778157d1d80a4 +:01cca02a4b777d3bd4971262b923a3f642e706 +:01ccb09f02ce26c65cf4d6ed9d309d3e74f6d6 +:01ccc0a65389be73276f4ede0cf73d467ef2f3 +:01ccd000a569efed28a1a4ca933168186c25bc +:01cce0f469bf4110fdf3654a7da6478702c60e +:01ccf09158f350b12da77984f226147f5d8ea5 +:01cd00aa010274f9e202bc757da105a7e1a50d +:01cd10036e3e0b586df473fb9370deff2b003c +:01cd207b2e65c702c8f4f190d94a921446ce64 +:01cd305148e0f88b1e2c24fa24d384b8270337 +:01cd4007fc2b2a84f453411a53f1adc2d54457 +:01cd507940a270ef5011a3125c158a5efe42fb +:01cd602abbcc2597554907384561b7f72e7026 +:01cd706437fb77762153377529ad26c6317dd8 +:01cd8070dcd794605883d3c9461d78ecd26019 +:01cd909c58487c37193e7470fc5891f4c42621 +:01cda0b406c44daba0ba449d2e3a6033ffc48a +:01cdb09f6768a2697c77c6e3fc4c635b8f4f8d +:01cdc03d32dc83bc1979dd547bb1020c65dff1 +:01cdd0d6407b3c8924a457acf8b7b6d26dcbaf +:01cde09dd87ce1d49bd854bcc576173e6020e2 +:01cdf050a8afd6c5e085bf684b925fc6cd59fc +:01ce00a19fae9a6cdaf093a7e4e820f7205045 +:01ce102e2344cb282c5eebe606938b0a4b3b96 +:01ce20084f5d575d02565d83cccd65a3418a82 +:01ce305c78a94eaf4bf3cfefefadc429843bd8 +:01ce40657e20339e902e75039d27086a506394 +:01ce508cb58c25a164d1cad50b8def88dc0e28 +:01ce602840be5c39d86cc726ea63273f55d5b8 +:01ce70863dd218856af39f63f5060fddcff564 +:01ce80f9864bb118a753f2f4217900dd43c46c +:01ce904bc1ec0222e08e15619871615c052c4c +:01cea056f4706cb918c09da61cc4c3a63de051 +:01ceb05a53421091f8f60537d51cbcdcc9542a +:01cec06b8dbcab360679c9afbcdca0ef7c1196 +:01ced092dde3eb9574c72e58746e4389db87f6 +:01cee09c6e7396cd855f03e19d5ece145534b1 +:01cef05f32b9d59f0f6ecc37bc0369fe1ccbcd +:01cf001f0969a9f78551731a708fa34fc7d959 +:01cf1092d0d024eb990614799dff9708d8302b +:01cf201a81f246fdf90f9245c1494bf63b6a7b +:01cf30ad7e32fe0679c4fd32ec8d3537b843fc +:01cf401351a76c3db89809130ca80aae7fefdb +:01cf5034c3cdf272a121ee583e82ec372b19a4 +:01cf60a39e8bb00101e64813b3cde71f8e9579 +:01cf70d8cb9313ae4588e172760d4f14b52633 +:01cf809189f352a070ecd9d242830b0e71adaa +:01cf9046743570c703d3b12f77ae7d8b0a9c44 +:01cfa0243b89cb4f0d80935dc1f720e4cd69e5 +:01cfb069abe2e4346d87a42505ec422bdd1eb0 +:01cfc0a9c39b60e858b5340c9487cd7858c2aa +:01cfd0a634842810a468a9457b0d10ae0a7126 +:01cfe08fd8b63a2f69c12af8056f7f88dac962 +:01cff05a94a21bd23c257eac7e89869336d5a5 +:01d000917ec0b3a64001134d259b2ee139b212 +:01d0109b6f9e0a72ac3a59fe42e228e2fdb4f9 +:01d0201db3402bfa9ee00003a53cb109c2e77e +:01d03080670d31793ea5ad7a623cb92285c5ac +:01d040f1ba70f7c56f0f43a05fcc506b9f73bd +:01d0503eb04da856b79ccc6f065ef9e06b22c2 +:01d06064814e124b623d28f9a4b1ddf0803b4d +:01d07024b5ed7aea8ee97c74b19ada7b47888c +:01d0802224980973335da8d12356ed16e02e7e +:01d09050c67dc65d0dfab494cd8527a1cc23f7 +:01d0a0d59ace8e03c51e26809c6dc0e7c3cfb5 +:01d0b0f282d87df26f7c76f74fe5980d2a3093 +:01d0c01b9a9a02e56287044cfe3f1921c9a806 +:01d0d06c8342f4003eef1ae2d3b0d756cf3a96 +:01d0e0d43498c82f47d325b2cdb9f3a4f56d40 +:01d0f07cb21f5d4a73eedc485fd3b2b963bb98 +:01d1006ddbdff367c02f92e03543e535f48054 +:01d11035e043e513bf98c074f8733f82e4d979 +:01d120c9b666012956ec0deb1d8c7dcab98e71 +:01d130fe316d7a54765d19611a04ea071b22d8 +:01d1404c96febe98d7ebc2783481d470bd3fd4 +:01d15092ed9c2b9218b4e1039cfa3f593ccf42 +:01d160780783fa778ead1f8afb318bffc61161 +:01d170ccf5053a30b0da059d0f5bee61d6eb32 +:01d18044e2c2ea392b6f2ef2b7e55745fee207 +:01d1908cb822df03278e380759b4ca273f3600 +:01d1a073bda32b0d1b3e897365dd72a726b683 +:01d1b0fc3b20f9aa817a1f35ca7ef2df214d02 +:01d1c053d52e6d64cd3b83185d8f322c0bd9ca +:01d1d0b764eca8cd16cafb824aacddd03d34ba +:01d1e0a8a30ac4080f23d066591ce2839e344b +:01d1f03ea31321173a1b051be5502df6c0dc85 +:01d20089816ae48ffb218b6a31777a00188e40 +:01d2100e6909a9141c77140c97ff0c2bab89de +:01d220f042cb41d91f54231572b878730e2257 +:01d230d4043bce7cdbe0007d8ac9bc02d637bc +:01d2400ee5bb964eff49ae5ce56e8763c057ab +:01d250d91e5790ebc97ae4d99311381d2fd1bb +:01d260f5f594859a67058e6235b88cef09e0dc +:01d270b7be81d5ee868a64e385489ea342040e +:01d2802fe0916950a55a10e25f65aecf0f16a4 +:01d290693d9357525a0cc0653eeb9ead9653d5 +:01d2a0654752648635326d6effd5e7dbb490e5 +:01d2b05e8dbd3a87a1c33fa0f4a0a7e35eb383 +:01d2c0ff24a4fa0b3e9c396758639d6fd75bc0 +:01d2d0e54218e6e098f7c7de1070962fad89b8 +:01d2e0393b3882de62a00b6a76549ed5cf55f3 +:01d2f055981a796205229594aa8cbbdcab716e +:01d30001b8c793fa241a2ea59ad83781c6d8d9 +:01d310f9bc8de785978ea05fb40c6401afdebc +:01d32010dd398f6420a14580e2b7ed951e5c9e +:01d3303cb03a9c1049b9f4603afe7594f3e4bb +:01d340ad6dde2c3b36a87c22776a9721313407 +:01d350661b7cb168d77fc198cb8ae45afdd9fa +:01d3604c5bcea2cc6f926442371b9eff22aeac +:01d370a2677a9ac1af538235f96c2531021d92 +:01d38027385c8a908ae1f861e12fdeda57c9fc +:01d3908179dd85732b4651eb8fa7eccb3e579a +:01d3a0b681a04d4b2e0cd40111ff3135b50fa9 +:01d3b0a95e9e9b7a067ba62a3c72e643f6b7e8 +:01d3c08c4e7600579b73a8e7ffb6596e40ea2a +:01d3d09f209774411b07b0b1bd6a6206e4c684 +:01d3e05674aa651445220503a9da58b0bf9d00 +:01d3f0f5572ea9cd1292cad4efa8eac39d367e +:01d40039f354b876045a5b03a1027581c360e6 +:01d410c1e1cf1e944289a57dc116f5924b6ccd +:01d42079605fd340dd0b3b6e58fbaa87fe8e36 +:01d430475a405623e173234392e572a96ec9e7 +:01d44004b1a6436e753dec4e8fca20d2fc1a7d +:01d450780102004002989786bb71c0e7685208 +:01d46014676ca1867444343eb498b5d0fa1cfa +:01d470ae7d775d65607c3b049f57e314728301 +:01d48016c66cad78e86b6edb98a96d21fc5319 +:01d4902cc1e3bdc203083bbaf10bdbb662d9fc +:01d4a0ea700915d95197188580f117cd5fbe03 +:01d4b04544023101247f236d139b66a44ad9bc +:01d4c08ebb99b8e62e07f1de86ce725a6a7155 +:01d4d03aa951b52f15380558d61565f4c4e74a +:01d4e0e800c13cf0b117bcdee9bc6096bb1020 +:01d4f00d0a4113cbd1082b7a54c9f8f3d9bc54 +:01d500451f387baab501cd5d0179cfb21a62c1 +:01d5103ce66b17af0056ddbe411b6520743200 +:01d520567f673c0acd2faf2bd7296492107491 +:01d53030dbe642d5b0f22367a30af7c4e2c3f3 +:01d5401f4eb3dd3413e648862cd8de3d79d8e2 +:01d550edecd436641032d4b2bcfa7aafa1d640 +:01d560bb408f721cb3a845c0ca3f6d4ccde1c5 +:01d570555fac945d6aa5e8d5aa99a2def94589 +:01d580358f5446876fdce3280a069e1de3d790 +:01d5902d6d7a21a4a66669bf8a15459db58cd0 +:01d5a082636c5476c29980314002052fc382ca +:01d5b0214736b9cdd886f0d4dc33b06173094a +:01d5c0ff688c86476c46b8e02b947dca19adf9 +:01d5d05c7b586db251339d179490e5e9610bf3 +:01d5e0b9ab745d0fcd3e7559936dc3c3e42587 +:01d5f099200bf07e7abdd277747f5c86902935 +:01d600f8cdf9fc7ce255bcc63b7de42bf43153 +:01d610f3a9cc3ee4c549549728127e696e47b4 +:01d62069d4807a80b4f42149810cb98daa58b1 +:01d6304dbab27403b39decd7cf211e824fe2f1 +:01d64038d9cfd2751198aebb179174720ba268 +:01d65030c0d7ab1a74ab0f994b4a63886af3c0 +:01d6604d3eec9e952acb35e6bc4eb7e5aab35f +:01d6702ad8303d726889ee4fb620b113d18b3c +:01d6806cdbb860a394c58d0b68b43d59847392 +:01d6901dcefd248c3829429c3600276f822d2f +:01d6a0ba4383292be8b4e20c6e5019c160e0cc +:01d6b0aba546911bbf556caf425e22099c3191 +:01d6c093409738f0fc1d1343c5f421d61aeb6f +:01d6d084d16eddc8f6b96e164ef9bea20f0977 +:01d6e02b563bd756bce8dbf86ca26440e94514 +:01d6f0f6ddb0bdddd2397e44f458502fca0a62 +:01d70037195028723aeb89fc17e41a7d0b0991 +:01d71098b62a29003609020833539737a5f755 +:01d720e360e9ffc117b90aa43ff3c69fc29484 +:01d7305a402aba16cf97c5e190ec50b2a62cef +:01d7406d61417987294d409695951140422103 +:01d7508ccbfaf7c6edd23345965f84b9266cad +:01d7608440b908ad967601c3ec6056c336a6d1 +:01d770270c1d58353c8df705a1f93bf3a5bed5 +:01d780b0711266830f3a2ae981fd3e2a84e0ca +:01d7908f14e99c1b8f48c0a335ace9c6c3ff7c +:01d7a0af41e73b43a88e3d514d27a933aa7dfb +:01d7b09b3191ad12c35d14a49d0b6477baa29c +:01d7c06b439e0cff57d3cc9ef1675b67c23cc4 +:01d7d0b7f1e5b663c491471dc8307371c82b1e +:01d7e0530ff4c0ed32a7e937a323cfcfb0e461 +:01d7f045fcc16645595ae881922ddc04310497 +:01d800ed8b0885bceb114dc6bcd935ca0363c0 +:01d810ced52833687f4ef636e3b86b1209f5ab +:01d8204be05b4d5c08b2a357485a22007b0e05 +:01d83071b870cd6257ba621154a9216e3c7fd9 +:01d840cc23b191c2feb0ef32c5564495f3e287 +:01d850dcd0d4ef1b01774e64c1b25880d2c351 +:01d86088ef839253a43e9511e0408e5fb4a570 +:01d87060b6ab7cb92d8c7161a4ebb9f75a111d +:01d880015b5e1b70f5216ead2c54e63ebd8af7 +:01d89063bbb7d4b1914d2a3e524f1d55e5c3b2 +:01d8a07e539459716210172432598da2e744f7 +:01d8b063809eb6cfb37bca776044c5651d4f26 +:01d8c0c9409014ccc5261c0625d1d489676987 +:01d8d0b7add1404908e09b1a820a5e97384402 +:01d8e0f57dd533da477eb139552634e01ab46f +:01d8f0a2797f3abb683888364048ddaadb1a8e +:01d90076eb8a0e80a977d0d49d730532e9ec76 +:01d91007ca5a170dda6f1a7fc038f2778f681f +:01d920a9d7ec8f3972327046982ffb194891d7 +:01d93098e6b98443ea69a49e23da68352a73df +:01d9409c8303cfa79985aa4791990cf18db35a +:01d9508e66d41ec16bb3196c83bbb618f4615a +:01d960eb769455d55fdafea565fa212c91411c +:01d9707582ca319e1221576f9d7364952f227e +:01d980cd1f30bc130b2adb0f168a70bb678d9c +:01d990f4bbff0f40ab264c6dcf33486c9398cd +:01d9a07b35fe9f548ee9f474bcf86cd0af618d +:01d9b08b8c056c24d9b018ac77ddfc284fede0 +:01d9c05c67f5649f5322e6afb28d900a7dde14 +:01d9d0be385075a2e3df7e77101631d34931bc +:01d9e09cc1f95c9e77f67c8b51832d6b9fe5b6 +:01d9f0ffb69b4a6822cdfc9c13b76531c109d2 +:01da002d919faa25a3a462c191839fc693dde9 +:01da1033188074beb7bc6d587ea22ab147e39b +:01da20a26dcb1ef313a0fe14267cf37ab4aa4b +:01da30803c9bc6158ccfa5132e8b8162e911fd +:01da4020d0e8e3408e339bc47af066ef6b68c4 +:01da50a4e1310c7f7746c2093cdaeb177093d4 +:01da603ac106222ae2471b3ca8a536d6484c8f +:01da7062060929713e982c95e6f8321429ad87 +:01da804c73d80de35946c65d2e29a688dcf78f +:01da90799528619c71eb0dccc2ef78a6be9d64 +:01daa0c00ebdc48f989cf8a2e2f0479c0f8353 +:01dab08a095a7df5b36df84a9b6274e6de7145 +:01dac09746f449297117fd8e47e84e91405a87 +:01dad0ee09ccb0f3287118b32ad96b4e0c5430 +:01dae0783ee2500414bb5319c5059f1e490a6f +:01daf02610087645e6c5dddb8cb2a944ecb0e9 +:01db003194e4d32838ed2d3192c4ee27575ff4 +:01db1076fb851bb43ed84ceecd1fb7cd7d6387 +:01db2022ca6f34c7794f6876524befae07d2e5 +:01db3055c20f2d9a6f184a473d42885e1c1898 +:01db40ed3acbb833b88f7c94dab42cf5b126a5 +:01db508896dc03f8db4e39a230a759afa604c5 +:01db60d21fc039a351d18509e0ed32a0f7bc64 +:01db7093fa6e11f3b85361370efbc3e2fc3871 +:01db80d28b57e110b61db576e65874a9627dee +:01db90089eff20e68e5aa8301e0f79f34b0839 +:01dba028e50d6ef4bf838a2f5852d8f6483a1f +:01dbb00f595423081409f9c2f2093500b6d3ff +:01dbc09b3f884993f85581e672f4512dc61c3a +:01dbd0501afdff53e0757e5972647ae56719a4 +:01dbe0252dcd50df02e39c3c38b80d11a6b1f4 +:01dbf0d5a8534171628dc6786429b8b881f7ee +:01dc00eff2b1cf8c3883187240c14bc50d0226 +:01dc10d422984bbd118bad7b882d4fa989dc51 +:01dc2085639dc40cdea0afe1efd181ef95181b +:01dc30640dff30062597125b468e65b40ed22a +:01dc40ed799e2a277be6a86b07e8be1ea1f1f3 +:01dc503b33cc4b9d250ee7c9dc18b444042d9b +:01dc60f65ea79e558df0336f37de4f87967ce4 +:01dc7093362d9c7ad09389f7c2cdf4c820b609 +:01dc80ec61bd19b4e0b4a82260d686b0f37030 +:01dc90f73977c2aa2c7352af5104aca7a43104 +:01dca0497ef5a2b77eb9e17cfdb88b32394309 +:01dcb0c10cdc448086cb4dbec26a216d177476 +:01dcc0960d0005168c944050e4f891afb49442 +:01dcd0bef544ee50eb052c01808abb922f0eda +:01dce02e7efead11183ec782ccc020d5200b39 +:01dcf0e945798e142b3aa5ab3d32822a4c2cf8 +:01dd005c6487d11c562fd560fd539d596f6c7f +:01dd10bde9bf4aaf21eff8fd8a78512ae7fc36 +:01dd20f98592e4e4864d140e389c96f18bf8b3 +:01dd306105577c171457beb9e6e355ccb479f1 +:01dd408a9fec9ada3525458563143666655a90 +:01dd50bbea8fbec432e4f7bc72845de28527e8 +:01dd603c25b47c764e30b71bc551336faa5e51 +:01dd708e37d30d35e7f417e314d9ca57e6de31 +:01dd80f7f1506abbdc351acfa909de8ca384e6 +:01dd9022fc337855eb3571ef95ca31b23f207b +:01dda0b2b3be117cf4c152db830b191495dc4b +:01ddb0ed857d26bc3311211acf12e6760d2b43 +:01ddc0ac0e123a81be5cd68914cc127198e346 +:01ddd0e570762198f854363f2f80c371e9cd36 +:01dde00c39eacc1fe859d22e8665c6dad9f783 +:01ddf030fcda34c59b2687394f49fa2b939e46 +:01de005a0b35e4dfd40bd8177d38fee7a8d7ab +:01de1097b56f9c7c9bb5b49ea177998de7b315 +:01de20fcd3c5266f62c58e84803d4962995ad7 +:01de306e6097a09d8f7d86f714c3cccce6d1c8 +:01de4044bb8afe4bd8740f6b2de089ee9b9d1e +:01de50c9876cd1ee97d89fa2471d2b4483b78a +:01de60c3dd30525642d3019a9001ffa67fb741 +:01de700a08f20d9175084a402a52f3b585e85c +:01de805ccbe33a56f48051a2af395f73dc1939 +:01de90146b8267731e6b9152eeec05f9917a28 +:01dea09ef254929a3ba34b7b1b2ca2b65d568b +:01deb0922cc0dabc55b2598ef030826d84904a +:01dec09a6a2fd207b3be37f2c61144299eebef +:01ded00ba6ea54d803488cfcb56b86094d2b8f +:01dee0534bcf81eb388baab91e664193acd05f +:01def00becda526bf9582a79c37ff8308fc5ff +:01df0078e07d0f01b4c8e7bfe0ddd6e6131212 +:01df105b96bffafc0a5f9ea86cb7870adef5f1 +:01df209c4c339e4a3cbb4db551708c9566afaa +:01df30a611f9c369718d6ff245e1d5ce66b91e +:01df40e2cf3610ab3cd9d3dee29723f9474497 +:01df5008212e128a128435fdb1f3d3181bcd5d +:01df60b360015fe96c85d4fefa8c0611ab55ad +:01df707e946b2b6c72c8f96c21c11037b40a96 +:01df80f523bb7d5824d46c98894f0b37ba63dc +:01df90ce556bac62b03a6b4a04d279489732b1 +:01dfa080ef8d96c7b2fe733a002223f781adf4 +:01dfb03b061a4f018dbba00e7ecb00e8a96eae +:01dfc078b0635d9d9292c955173e67c234476e +:01dfd0b1b2b71d0fc1d2e408127ae837568f21 +:01dfe0e4a24b2c9b6c8347aa792422cb369ac9 +:01dff0a0d47ece4dd17fa1a97581942772a131 +:01e0006c8c89ce6687c7ac43f3273d9e1c3583 +:01e010eea86f42