Mercurial > public > mk2
view code_part1/OSTC_code_asm_part1/pled_outputs.asm.orig @ 186:57a654c199ae
BUGFIX Gradient Factor algo.
+ Fix calc_hauptroutine_update_tissues() crazzy calculation in GF mode for deco limit.
+ Backup lock/GF_step/deco_pointer during ascent simulation.
author | JeanDo |
---|---|
date | Wed, 02 Feb 2011 00:09:30 +0100 |
parents | 3e351e25f5d1 |
children |
line wrap: on
line source
; OSTC - diving computer code ; Copyright (C) 2008 HeinrichsWeikamp GbR ; 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 ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>. ; routines for display outputs ; written by: Matthias Heinrichs, info@heinrichsweikamp.com ; written: 15/01/05 ; last updated: 06/06/08 ; known bugs: ; ToDo: More comments PLED_divemask_color: GETCUSTOM8 d'36' ; Divemask output color bra PLED_standard_color_0 PLED_warnings_color: GETCUSTOM8 d'37' ; Warnings output color bra PLED_standard_color_0 PLED_standard_color: GETCUSTOM8 d'35' ; Standard output color PLED_standard_color_0: ; Common entry point movwf oled1_temp ; copy movlw d'0' cpfseq oled1_temp bra PLED_standard_color_1 bra PLED_standard_color2 PLED_standard_color_1: movlw d'4' cpfseq oled1_temp bra PLED_standard_color_2 bra PLED_standard_color2 PLED_standard_color_2: movlw d'8' cpfseq oled1_temp bra PLED_standard_color_3 bra PLED_standard_color2 PLED_standard_color_3: movlw d'192' cpfseq oled1_temp bra PLED_standard_color_4 bra PLED_standard_color2 PLED_standard_color_4: movlw d'196' cpfseq oled1_temp bra PLED_standard_color_5 bra PLED_standard_color2 PLED_standard_color_5: movlw d'200' cpfseq oled1_temp bra PLED_standard_color_6 bra PLED_standard_color2 PLED_standard_color_6: movf oled1_temp,W ; Color should be OK... call PLED_set_color return PLED_standard_color2: movlw 0xFF ; Reset Color call PLED_set_color return PLED_color_code macro color_code_temp movlw color_code_temp call PLED_color_code1 endm PLED_color_code1: ; Color-codes the output, if required movwf debug_temp dcfsnz debug_temp,F bra PLED_color_code_depth ; CF43 [mBar], 16Bit dcfsnz debug_temp,F bra PLED_color_code_cns ; CF44 [%] dcfsnz debug_temp,F bra PLED_color_code_gf ; CF45 [%] dcfsnz debug_temp,F bra PLED_color_code_ppo2 ; CF46 [cBar] dcfsnz debug_temp,F bra PLED_color_code_velocity ; CF47 [m/min] dcfsnz debug_temp,F bra PLED_color_code_ceiling ; Show warning if CF41=1 and current depth>shown ceiling dcfsnz debug_temp,F bra PLED_color_code_gaslist ; Color-code current row in Gaslist (%O2 in "EEDATA") PLED_color_code_gaslist: ; %O2 in "EEDATA" ; Check very high ppO2 manually movff amb_pressure+0,xA+0 movff amb_pressure+1,xA+1 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 EEDATA,xB+0 clrf xB+1 call mult16x16 ; EEDATA * p_amb/10 tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55Bar? bra PLED_color_code_gaslist1 ; Yes, warn in warning color movff xC+0,sub_a+0 movff xC+1,sub_a+1 GETCUSTOM8 d'46' ; color-code ppO2 warning [cBar] mullw d'100' ; ppo2_warning_high*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag bra PLED_color_code_gaslist1; too high -> Warning Color! call PLED_standard_color return PLED_color_code_gaslist1: call PLED_warnings_color return PLED_color_code_ceiling: GETCUSTOM8 d'40' ; =1: Warn at all? movwf lo movlw d'1' cpfseq lo ; =1? bra PLED_color_code_ceiling1 ; No, Set to default color movff char_O_array_decodepth+0,lo ; Ceiling in m decf lo,F ; -1 movff rel_pressure+1,xA+1 movff rel_pressure+0,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 subwf lo,W btfsc STATUS,C bra PLED_color_code_ceiling2 ; Set to warning color PLED_color_code_ceiling1: call PLED_standard_color return PLED_color_code_ceiling2: call PLED_warnings_color return PLED_color_code_depth: movff hi,hi_temp movff lo,lo_temp movff rel_pressure+1,hi movff rel_pressure+0,lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] movff lo,sub_a+0 movff hi,sub_a+1 GETCUSTOM15 d'43' ; Depth warn [mBar] movff lo,sub_b+0 movff hi,sub_b+1 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag bra PLED_color_code_depth2; Set to warning color call PLED_standard_color movff hi_temp,hi movff lo_temp,lo ; Restore hi, lo return PLED_color_code_depth2: call PLED_warnings_color movff hi_temp,hi movff lo_temp,lo ; Restore hi, lo return PLED_color_code_cns: movff char_O_CNS_fraction,lo GETCUSTOM8 d'44' ; CNS Warn [%] subwf lo,W btfsc STATUS,C bra PLED_color_code_cns2 ; Set to warning color call PLED_standard_color return PLED_color_code_cns2: call PLED_warnings_color return PLED_color_code_gf: movff char_O_gradient_factor,lo ; gradient factor GETCUSTOM8 d'45' ; GF Warn [%] subwf lo,W btfsc STATUS,C bra PLED_color_code_gf2 ; Set to warning color call PLED_standard_color return PLED_color_code_gf2: call PLED_warnings_color return PLED_color_code_ppo2: ; Check very high ppO2 manually tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55Bar? bra PLED_color_code_ppo22 ; Yes, warn in warning color movff xC+0,sub_a+0 movff xC+1,sub_a+1 GETCUSTOM8 d'46' ; color-code ppO2 warning [cBar] mullw d'100' movff PRODL,sub_b+0 movff PRODH,sub_b+1 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag bra PLED_color_code_ppo22; Set to warning color call PLED_standard_color return PLED_color_code_ppo22: call PLED_warnings_color return PLED_color_code_velocity: btfss neg_flag ; Ignore for ascend! bra PLED_color_code_velocity1 ; Skip check! movff divA+0,lo GETCUSTOM8 d'47' ; Velocity warn [m/min] subwf lo,W btfsc STATUS,C bra PLED_color_code_velocity2 ; Set to warning color PLED_color_code_velocity1: call PLED_standard_color return PLED_color_code_velocity2: call PLED_warnings_color return ostc_debug macro debug_temp movlw debug_temp call ostc_debug1 endm ostc_debug1: movwf debug_temp movff debug_char+4,debug_char+5 ; Save for background debugger movff debug_char+3,debug_char+4 movff debug_char+2,debug_char+3 movff debug_char+1,debug_char+2 movff debug_char+0,debug_char+1 movff debug_temp,debug_char+0 btfss debug_mode ; Are we in debugmode? return ; No, return! WIN_TOP .200 WIN_LEFT .100 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movf debug_char+0,W movwf POSTINC2 movf debug_char+1,W movwf POSTINC2 movf debug_char+2,W movwf POSTINC2 movf debug_char+3,W movwf POSTINC2 movf debug_char+4,W movwf POSTINC2 movf debug_char+5,W movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return PLED_resetdebugger: bcf LED_blue call PLED_boot ; PLED boot call PLED_ClearScreen ; clean up OLED call PLED_standard_color WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .133 DISPLAYTEXT .134 DISPLAYTEXT .135 DISPLAYTEXT .136 ; Display Debug intro WIN_TOP .100 WIN_LEFT .10 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movf debug_char+0,W movwf POSTINC2 movf debug_char+1,W movwf POSTINC2 movf debug_char+2,W movwf POSTINC2 movf debug_char+3,W movwf POSTINC2 movf debug_char+4,W movwf POSTINC2 movf debug_char+5,W movwf POSTINC2 movlw '.' movwf POSTINC2 movlw ' ' movwf POSTINC2 movff flag1,lo output_8 movlw ' ' movwf POSTINC2 movff flag2,lo output_8 call word_processor WIN_TOP .125 WIN_LEFT .10 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff flag3,lo output_8 movlw ' ' movwf POSTINC2 movff flag4,lo output_8 movlw ' ' movwf POSTINC2 movff flag5,lo output_8 movlw ' ' movwf POSTINC2 movff flag6,lo output_8 movlw ' ' movwf POSTINC2 movff flag7,lo output_8 call word_processor WIN_TOP .150 WIN_LEFT .10 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff flag8,lo output_8 movlw ' ' movwf POSTINC2 movff flag9,lo output_8 movlw ' ' movwf POSTINC2 movff flag10,lo output_8 movlw ' ' movwf POSTINC2 movff flag11,lo output_8 movlw ' ' movwf POSTINC2 movff flag12,lo output_8 call word_processor PLED_resetdebugger_loop: btfss switch_left bra PLED_resetdebugger_loop ; Loop bcf LED_red return PLED_divemode_mask: ; Displays mask in Dive-Mode call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXTH .267 ; Max Depth DISPLAYTEXT .86 ; Divetime DISPLAYTEXT .87 ; Depth call PLED_standard_color return PLED_clear_decoarea: movlw .0 movff WREG,box_temp+0 ; Data movlw .60 movff WREG,box_temp+1 ; row top (0-239) movlw .239 movff WREG,box_temp+2 ; row bottom (0-239) movlw .090 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box call PLED_temp_divemode ; redraw temperature call PLED_active_gas_divemode ; redraw active Gas return PLED_display_ndl_mask: ; Clear Dekostop and Dekosum rcall PLED_clear_decoarea call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXT d'84' ; NoStop call PLED_standard_color PLED_display_ndl_mask2: ; Clears Gradient Factor movlw d'8' movwf temp1 WIN_TOP .145 WIN_LEFT .0 call PLED_display_clear_common_y1 return PLED_display_ndl: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'z' ; Sends debug-information to screen if debugmode active WIN_TOP .185 WIN_LEFT .119 WIN_FONT FT_MEDIUM WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff char_O_nullzeit,lo ; NDL in minutes output_8 movlw 0x27 ; "'" movwf POSTINC2 call word_processor WIN_FONT FT_SMALL return PLED_display_deko_mask: rcall PLED_clear_decoarea ; total deco time word call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXT d'85' ; TTS call PLED_standard_color return PLED_display_deko: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! btfsc menubit ; Divemode menu active? bra PLED_display_deko1 ; Yes, do not display dekostop ostc_debug 'y' ; Sends debug-information to screen if debugmode active ; deco stop word call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXT d'82' ; DEKOSTOP call PLED_standard_color WIN_TOP .118 WIN_LEFT .94 WIN_FONT FT_MEDIUM WIN_INVERT .0 ; Init new Wordprocessor PLED_color_code warn_ceiling ; Color-code Output lfsr FSR2,letter movff char_O_array_decodepth+0,lo ; Ceiling in m output_99 movlw 'm' ; "m" movwf POSTINC2 movff char_O_array_decotime,lo ; length of first stop in m output_99 movlw 0x27 ; "'" movwf POSTINC2 call word_processor WIN_FONT FT_SMALL PLED_display_deko1: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'x' ; Sends debug-information to screen if debugmode active WIN_TOP .185 WIN_LEFT .119 WIN_FONT FT_MEDIUM WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff char_O_ascenttime,lo ; complete ascend time movlw d'199' ; limit display of total ascend time to 99mins.... cpfslt lo ; skip if 199 (WREG) > lo movwf lo bcf leftbind output_8 movlw 0x27 ; "'" movwf POSTINC2 call word_processor movff char_O_gradient_factor,lo ; gradient factor GETCUSTOM8 d'8' ; threshold for display cpfslt lo ; show value? bra PLED_display_deko2 ; Yes ; No bra PLED_display_ndl_mask2 ; Clear gradient factor PLED_display_deko2: ostc_debug 'w' ; Sends debug-information to screen if debugmode active ;GF WIN_TOP .145 WIN_LEFT .0 WIN_FONT FT_SMALL PLED_color_code warn_gf ; Color-code Output lfsr FSR2,letter movlw 'G' movwf POSTINC2 movlw 'F' movwf POSTINC2 movlw ':' movwf POSTINC2 movff char_O_gradient_factor,lo ; gradient factor output_8 movlw '%' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor call PLED_standard_color return PLED_simulator_data: WIN_TOP .65 WIN_LEFT .105 WIN_FONT FT_SMALL call PLED_standard_color lfsr FSR2,letter movff logbook_temp1,lo bsf leftbind output_8 bcf leftbind movlw 'm' movwf POSTINC2 movlw 'i' movwf POSTINC2 movlw 'n' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor WIN_TOP .95 WIN_LEFT .100 WIN_FONT FT_SMALL call PLED_standard_color lfsr FSR2,letter movff logbook_temp2,lo bsf leftbind output_8 bcf leftbind movlw 'm' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return PLED_display_velocity: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'v' ; Sends debug-information to screen if debugmode active WIN_TOP .90 WIN_LEFT .0 WIN_FONT FT_SMALL PLED_color_code warn_velocity ; Color code output lfsr FSR2,letter movlw '-' btfsc neg_flag movlw '+' movwf POSTINC2 movff divA+0,lo output_99 OUTPUTTEXT d'83' ; m/min call word_processor call PLED_standard_color bsf pled_velocity_display return PLED_display_velocity_clear: movlw d'8' movwf temp1 WIN_TOP .90 WIN_LEFT .0 bcf pled_velocity_display bra PLED_display_clear_common_y1 PLED_display_wait_clear movlw d'6' movwf temp1 WIN_TOP .2 WIN_LEFT .115 bra PLED_display_clear_common_y1 PLED_display_clear_common_y2: ; Clears with y-scale=2 WIN_FONT FT_MEDIUM bra PLED_display_clear_common1 PLED_display_clear_common_y1: ; Clears with y-scale=1 WIN_FONT FT_SMALL PLED_display_clear_common1: lfsr FSR2,letter PLED_display_clear_common2: movlw ' ' movwf POSTINC2 decfsz temp1,F bra PLED_display_clear_common2 call word_processor WIN_FONT FT_SMALL return PLED_diveclock: GETCUSTOM8 d'39' ; =1: Show clock in Divemode movwf lo movlw d'1' cpfseq lo ; =1? return ; No, Done. btfsc menubit ; is the Dive mode menu displayed? return ; Yes WIN_TOP .2 WIN_LEFT .64 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff hours,lo output_99x movlw ':' movwf POSTINC2 movff mins,lo output_99x call word_processor return PLED_clock: ostc_debug 'c' ;If > 0 display surface_interval:2 and clock changing every 5 seconds ;use timeout_counter for this WIN_TOP .50 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff surface_interval+0,lo tstfsz lo bra PLED_clock0 ; Not Zero, switch between Interval and clock movff surface_interval+1,lo tstfsz lo bra PLED_clock0 ; Not Zero, switch between Interval and clock bra PLED_clock3 ; surface_interval=0, always display clock! PLED_clock0: btfss show_interval ; Show Interval? bra PLED_clock2 ; No, display clock and reset counter PLED_clock1: decfsz timeout_counter,F ; =0? bra PLED_clock1a ; No... bra PLED_clock3 ; Yes, display clock and reset counter PLED_clock1a: bsf show_interval movlw d'6' cpfslt timeout_counter ; f < w? -> timeout_counter>5? rcall PLED_clock_reload_timer ; No, reload counter movff surface_interval+0,lo movff surface_interval+1,hi call convert_time ; lo=mins, hi=hours movf hi,W movff lo,hi movwf lo ; exchange lo and hi movlw 'I' movwf POSTINC2 movlw 'n' movwf POSTINC2 movlw 't' movwf POSTINC2 movlw ':' movwf POSTINC2 output_99x movlw ':' movwf POSTINC2 movff hi,lo output_99x movlw ' ' movwf POSTINC2 call word_processor return PLED_clock_reload_timer: bcf show_interval movlw d'5' movwf timeout_counter return PLED_interval_reload_timer: bsf show_interval movlw d'5' movwf timeout_counter return PLED_clock2: decfsz timeout_counter,F ; =0? bra PLED_clock3 ; No... bra PLED_clock1a ; Yes, display interval and reset counter PLED_clock3: bcf show_interval movlw d'6' cpfslt timeout_counter ; f < w? -> timeout_counter>5? rcall PLED_interval_reload_timer; No, reload counter movff hours,lo output_99x movlw ':' movwf POSTINC2 movff mins,lo output_99x movlw ':' movwf POSTINC2 movff secs,lo output_99x movlw ' ' movwf POSTINC2 call word_processor return PLED_logbook_cursor: PLED_menu_cursor: WIN_TOP .35 WIN_LEFT .0 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .65 lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .95 lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .125 lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .155 call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .185 lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor movff menupos,temp1 dcfsnz temp1,F movlw d'35' dcfsnz temp1,F movlw d'65' dcfsnz temp1,F movlw d'95' dcfsnz temp1,F movlw d'125' dcfsnz temp1,F movlw d'155' dcfsnz temp1,F movlw d'185' movff WREG,win_top lfsr FSR2,letter movlw 0xB7 movwf POSTINC2 call word_processor return PLED_menu_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT .5 ; Menu: WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .6 ; Logbook DISPLAYTEXT .7 ; Gas Setup DISPLAYTEXT .9 ; Reset all DISPLAYTEXT .10 ; Setup... DISPLAYTEXT .142 ; More... DISPLAYTEXT .11 ; Exit return PLED_setup_menu_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT .98 ; Setup Menu: WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .99 ; Custom FunctionsI DISPLAYTEXT .153 ; Custom FunctionsII DISPLAYTEXTH .276 ; Salinity: DISPLAYTEXT .100 ; Decotype: DISPLAYTEXT .142 ; More... DISPLAYTEXT .11 ; Exit return PLED_more_setup_menu_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXTH .258 ; Setup Menu 2: WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXTH .257 ; Date format: DISPLAYTEXT .129 ; Debug: DISPLAYTEXT .187 ; Show License DISPLAYTEXT .11 ; Exit return PLED_more_menu_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT .144 ; Menu 2: WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .8 ; Set Time DISPLAYTEXT .110 ; Const. ppO2 Setup DISPLAYTEXT .113 ; Battery Info DISPLAYTEXT .247 ; Simulator DISPLAYTEXT .11 ; Exit return PLED_reset_menu_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT .28 ; Reset Menu WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .21 ; Cancel Reset DISPLAYTEXT .245 ; Reset CF,Gases & Deco DISPLAYTEXTH .284 ; Reset Logbook DISPLAYTEXTH .285 ; Reboot OSTC DISPLAYTEXTH .286 ; Reset Decodata DISPLAYTEXT .11 ; Exit return PLED_simulator_mask: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT .248 ; OSTC Simulator WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .249 ; Start Dive DISPLAYTEXTH .277 ; Bottom Time: DISPLAYTEXTH .278 ; Max. Depth: DISPLAYTEXTH .279 ; Calculate Deco DISPLAYTEXTH .280 ; Show Decoplan DISPLAYTEXT .11 ; Exit return PLED_temp_surfmode: ostc_debug 'e' movff temperature+0,last_temperature+0 movff temperature+1,last_temperature+1 WIN_TOP .100 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw '-' btfsc neg_temp ; Show "-"? movwf POSTINC2 ; Yes movff temperature+0,lo movff temperature+1,hi movlw d'3' movwf ignore_digits bsf leftbind ; left orientated output output_16dp d'2' bcf leftbind movlw '°' movwf POSTINC2 movlw 'C' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return PLED_temp_divemode: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'u' ; Sends debug-information to screen if debugmode active ; temperature movff temperature+0,last_temperature+0 movff temperature+1,last_temperature+1 WIN_TOP .216 WIN_LEFT .65 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw '-' btfsc neg_temp ; Show "-"? movwf POSTINC2 ; Yes movff temperature+0,lo movff temperature+1,hi movlw d'3' movwf ignore_digits bsf leftbind ; left orientated output output_16dp d'2' bcf leftbind movlw '°' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return PLED_show_ppO2: ; Show ppO2 ostc_debug 't' ; Sends debug-information to screen if debugmode active WIN_TOP .120 WIN_LEFT .0 WIN_FONT FT_SMALL PLED_color_code warn_ppo2 ; Color-code output (ppO2 stored in xC) lfsr FSR2,letter movlw 'p' movwf POSTINC2 movlw 'p' movwf POSTINC2 movlw 'O' movwf POSTINC2 movlw '2' movwf POSTINC2 movlw ':' movwf POSTINC2 ; Check very high ppO2 manually tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55Bar? bra PLED_show_ppO2_3 ; Yes, display fixed Value! movff xC+0,lo movff xC+1,hi bsf ignore_digit4 output_16dp d'1' bcf ignore_digit4 PLED_show_ppO2_2: movlw ' ' movwf POSTINC2 call word_processor call PLED_standard_color return PLED_show_ppO2_3: movlw '>' movwf POSTINC2 movlw '6' movwf POSTINC2 movlw '.' movwf POSTINC2 movlw '6' movwf POSTINC2 bra PLED_show_ppO2_2 PLED_show_ppO2_clear: ; Clear ppO2 movlw d'10' movwf temp1 WIN_TOP .120 WIN_LEFT .0 call PLED_display_clear_common_y1 return PLED_active_gas_clear: ; clears active gas! WIN_TOP .192 WIN_LEFT .65 movlw d'5' movwf temp1 bra PLED_display_clear_common_y1; also returns! PLED_active_gas_divemode: ; Displays current gas (e.g. 40/20) if a) He>0 or b) O2>Custom9 btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode return btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! WIN_INVERT .0 ; Init new Wordprocessor call PLED_active_gas_divemode_show ; Show gas (Non-Inverted in all cases) btfss better_gas_available ;=1: A better gas is available and a gas change is advised in divemode return ; Done. ; Check if Gas Output should blink when a better gas is available... GETCUSTOM8 d'42' ; =1 if gas should blink movwf lo movlw d'1' cpfseq lo ; =1? return ; No, Done. btg blinking_better_gas ; Toggle blink bit... btfss blinking_better_gas ; blink now? return ; No, Done. WIN_INVERT .1 ; Init new Wordprocessor call PLED_active_gas_divemode_show ; Show gas (Non-Inverted in all cases) WIN_INVERT .0 ; Init new Wordprocessor return ; Done. PLED_active_gas_divemode_show: ostc_debug 's' ; Sends debug-information to screen if debugmode active ; gas WIN_TOP .192 WIN_LEFT .65 WIN_FONT FT_SMALL call PLED_standard_color movlw d'100' ; 100% in the tank movff char_I_N2_ratio,lo ; minus N2 bsf STATUS,C ; set borrow bit subfwb lo,W movff char_I_He_ratio,lo ; minus He bsf STATUS,C ; set borrow bit subfwb lo,F ; =% O2 GETCUSTOM8 d'9' ; get oxygen treshold movff char_I_He_ratio,hi ; He ratio cpfsgt lo bra PLED_active_gas_divemode2 ; Check He bra PLED_active_gas_divemode3 ; Skip He check, display gas PLED_active_gas_divemode2: tstfsz hi ; He = 0 % bra PLED_active_gas_divemode3 ; display gas ; O2 below treshold, He=0 -> Skip display! movlw d'5' movwf temp1 bra PLED_display_clear_common_y1 ; also returns! PLED_active_gas_divemode3: movlw d'21' cpfseq lo ; Air? (O2=21%) bra PLED_active_gas_divemode4 ; No! tstfsz hi ; Air? (He=0%) bra PLED_active_gas_divemode4 ; No! ; Yes, display "Air" instead of 21/0 lfsr FSR2,letter OUTPUTTEXTH d'264' ;"Air " movlw ' ' btfsc better_gas_available ;=1: A better gas is available and a gas change is advised in divemode movlw '*' movwf POSTINC2 call word_processor return PLED_active_gas_divemode4: lfsr FSR2,letter bsf leftbind ; left orientated output output_8 ; O2 ratio is still in "lo" movlw '/' movwf POSTINC2 movff char_I_He_ratio,lo ; copy He ratio into lo output_8 movlw ' ' btfsc better_gas_available ;=1: A better gas is available and a gas change is advised in divemode movlw '*' movwf POSTINC2 bcf leftbind call word_processor return PLED_display_decotype_surface: WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor clrf EEADRH read_int_eeprom d'34' ; Read deco data tstfsz EEDATA bra show_decotype_surface2 ;ZH-L16 WIN_TOP .125 call PLED_standard_color lfsr FSR2,letter movlw 'O' movwf POSTINC2 call word_processor WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor WIN_TOP .150 call PLED_standard_color lfsr FSR2,letter movlw 'C' movwf POSTINC2 call word_processor return show_decotype_surface2: decf EEDATA,F tstfsz EEDATA bra show_decotype_surface3 ; Gauge return show_decotype_surface3: decf EEDATA,F tstfsz EEDATA bra show_decotype_surface4 ; const. ppO2 WIN_TOP .125 call PLED_standard_color lfsr FSR2,letter movlw 'C' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call word_processor WIN_TOP .150 call PLED_standard_color lfsr FSR2,letter movlw 'C' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call word_processor return show_decotype_surface4: decf EEDATA,F tstfsz EEDATA bra show_decotype_surface5 ; Apnoe return show_decotype_surface5: decf EEDATA,F tstfsz EEDATA bra show_decotype_surface6 ; Multi-GF OC WIN_TOP .125 lfsr FSR2,letter movlw 'G' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color call word_processor WIN_TOP .150 lfsr FSR2,letter movlw 'F' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color call word_processor return show_decotype_surface6: ; Multi-GF CC WIN_TOP .125 lfsr FSR2,letter movlw 'G' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color call word_processor WIN_TOP .150 lfsr FSR2,letter movlw 'F' movwf POSTINC2 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color call word_processor return PLED_pre_dive_screen: ;Display Pre-Dive Screen movlw .0 movff WREG,box_temp+0 ; Data movlw .25 movff WREG,box_temp+1 ; row top (0-239) movlw .120 movff WREG,box_temp+2 ; row bottom (0-239) movlw .82 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box ; List active gases/Setpoints btfsc FLAG_const_ppO2_mode ; in ppO2 mode? bra PLED_pre_dive_screen3 ; Yes, display SetPoint/Sensor result list PLED_pre_dive_screen2: ostc_debug 'm' ; Sends debug-information to screen if debugmode active WIN_LEFT .90 WIN_FONT FT_SMALL bsf leftbind movlw d'2' movwf wait_temp ; here: stores eeprom address for gas list movlw d'0' movwf waitms_temp ; here: stores row for gas list clrf hi ; here: Gas counter PLED_pre_dive_screen2_loop: incf hi,F ; Increase Gas movlw d'4' addwf wait_temp,F ; Increase eeprom address for gas list lfsr FSR2,letter movlw 'G' movwf POSTINC2 movff hi,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movlw ' ' movwf POSTINC2 movff wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! movlw '/' movwf POSTINC2 incf EEADR,F ; Gas #hi: %He - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! read_int_eeprom d'27' ; read flag register movff hi,lo ; copy gas number PLED_pre_dive_screen2_loop1: rrcf EEDATA ; roll flags into carry decfsz lo,F ; max. 5 times... bra PLED_pre_dive_screen2_loop1 btfsc STATUS,C ; test carry bra PLED_pre_dive_white movlw color_grey call PLED_set_color ; grey out inactive gases! bra PLED_pre_dive_color_done PLED_pre_dive_white: call PLED_standard_color PLED_pre_dive_color_done: read_int_eeprom d'33' ; Read start gas (1-5) movf EEDATA,W cpfseq hi ; Current Gas the active gas? bra PLED_pre_dive_screen2a bra PLED_pre_dive_screen2b PLED_pre_dive_screen2a: movlw d'25' addwf waitms_temp,F ; Increase row WIN_LEFT .90 movff waitms_temp,win_top ; Set Row call word_processor ; No, display gas PLED_pre_dive_screen2b: call PLED_standard_color movlw d'5' ; list all four (remaining) gases cpfseq hi ; All gases shown? bra PLED_pre_dive_screen2_loop ; No return ; No, return (OC mode) PLED_pre_dive_screen3: WIN_LEFT .90 WIN_FONT FT_SMALL bsf leftbind ; list three SP in Gaslist movlw d'35' ; 36 = current SP position in EEPROM movwf wait_temp ; here: stores eeprom address for gas list movlw d'0' movwf waitms_temp ; here: stores row for gas list clrf temp6 ; here: SP counter PLED_pre_dive_screen3_loop: incf wait_temp,F ; EEPROM address incf temp6,F ; Increase SP movlw d'25' addwf waitms_temp,F ; Increase row WIN_LEFT .90 movff waitms_temp,win_top ; Set Row lfsr FSR2,letter movlw 'S' movwf POSTINC2 movlw 'P' movwf POSTINC2 movff temp6,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movlw ' ' movwf POSTINC2 movff wait_temp, EEADR; SP #hi position call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo clrf hi output_16dp d'3' ; outputs into Postinc2! call word_processor movlw d'3' ; list all three SP cpfseq temp6 ; All gases shown? bra PLED_pre_dive_screen3_loop ;no read_int_eeprom d'33' ; Read byte (stored in EEDATA) movff EEDATA,active_gas ; Read start gas (1-5) decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'7' ; = address for He ratio movwf EEADR call read_eeprom ; Read He ratio movff EEDATA,hi ; And copy into hold register decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'6' ; = address for O2 ratio movwf EEADR call read_eeprom ; Read O2 ratio movff EEDATA, lo ; O2 ratio WIN_LEFT .90 WIN_TOP .100 lfsr FSR2,letter movlw 'D' movwf POSTINC2 movlw 'i' movwf POSTINC2 movlw 'l' movwf POSTINC2 movlw ':' movwf POSTINC2 output_8 ; O2 Ratio movlw '/' movwf POSTINC2 movff hi,lo output_8 ; He Ratio call word_processor bcf leftbind return ; Return (CC Mode) PLED_active_gas_surfmode: ; Displays start gas/SP 1 ostc_debug 'q' ; Sends debug-information to screen if debugmode active btfsc FLAG_apnoe_mode ; In Apnoe mode? return ; Yes, return btfsc gauge_mode ; In Gauge mode? return ; Yes, return btfss FLAG_const_ppO2_mode ; are we in const. ppO2 mode? bra PLED_active_gas_surfmode2 ; No, display gases ; In CC Mode WIN_TOP .135 WIN_LEFT .90 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter read_int_eeprom d'36' movff EEDATA,lo ; copy to lo clrf hi output_16dp d'3' ; outputs into Postinc2! movlw 'B' movwf POSTINC2 movlw 'a' movwf POSTINC2 movlw 'r' movwf POSTINC2 bcf leftbind call word_processor bra PLED_active_gas_surfmode_exit PLED_active_gas_surfmode2: WIN_TOP .130 WIN_LEFT .100 WIN_FONT FT_MEDIUM WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color read_int_eeprom d'33' ; Read byte (stored in EEDATA) movff EEDATA,active_gas ; Read start gas (1-5) decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'7' ; = address for He ratio movwf EEADR call read_eeprom ; Read He ratio movff EEDATA,char_I_He_ratio ; And copy into hold register decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'6' ; = address for O2 ratio movwf EEADR call read_eeprom ; Read O2 ratio movff EEDATA, char_I_O2_ratio ; O2 ratio movff char_I_He_ratio, wait_temp ; copy into bank1 register bsf STATUS,C ; Borrow bit movlw d'100' ; 100% subfwb wait_temp,W ; minus He bsf STATUS,C ; Borrow bit subfwb EEDATA,F ; minus O2 movff EEDATA, char_I_N2_ratio ; = N2! movlw d'100' ; 100% in the tank movff char_I_N2_ratio,lo ; minus N2 bsf STATUS,C ; set borrow bit subfwb lo,W movff char_I_He_ratio,lo ; minus He bsf STATUS,C ; set borrow bit subfwb lo,F ; =% O2 movff char_I_He_ratio,hi ; Copy into Bank1 register movlw d'21' cpfseq lo ; Air? (O2=21%) bra PLED_active_gas_surfmode4 ; No! tstfsz hi ; Air? (He=0%) bra PLED_active_gas_surfmode4 ; No! ; Yes, display "Air" instead of 21/0 DISPLAYTEXTH d'265' ;"Air ", y-scale=2 bra PLED_active_gas_surfmode_exit PLED_active_gas_surfmode4: lfsr FSR2,letter bsf leftbind ; left orientated output output_99 ; O2 ratio is still in "lo" movlw '/' movwf POSTINC2 movff char_I_He_ratio,lo ; copy He ratio into lo output_99 bcf leftbind call word_processor bra PLED_active_gas_surfmode_exit PLED_active_gas_surfmode_exit: movlw .0 movff WREG,box_temp+0 ; Data movlw .122 movff WREG,box_temp+1 ; row top (0-239) movlw .175 movff WREG,box_temp+2 ; row bottom (0-239) movlw .82 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_frame return PLED_confirmbox: movlw .0 movff WREG,box_temp+0 ; Data movlw .68 movff WREG,box_temp+1 ; row top (0-239) movlw .146 movff WREG,box_temp+2 ; row bottom (0-239) movlw .34 movff WREG,box_temp+3 ; column left (0-159) movlw .101 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .70 movff WREG,box_temp+1 ; row top (0-239) movlw .144 movff WREG,box_temp+2 ; row bottom (0-239) movlw .35 movff WREG,box_temp+3 ; column left (0-159) movlw .100 movff WREG,box_temp+4 ; column right (0-159) call PLED_frame DISPLAYTEXT .143 ; Confirm: DISPLAYTEXT .145 ; Cancel DISPLAYTEXT .146 ; OK! movlw d'1' movwf menupos PLED_confirmbox2: movlw .0 movff WREG,box_temp+0 ; Data movlw .96 movff WREG,box_temp+1 ; row top (0-239) movlw .143 movff WREG,box_temp+2 ; row bottom (0-239) movlw .39 movff WREG,box_temp+3 ; column left (0-159) movlw .51 movff WREG,box_temp+4 ; column right (0-159) call PLED_box movff menupos,temp1 movlw d'96' dcfsnz temp1,F movlw d'96' dcfsnz temp1,F movlw d'120' movff WREG,win_top WIN_LEFT .39 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB7 ; Arrow for menu movwf POSTINC2 call word_processor bcf sleepmode ; clear some flags bcf menubit2 bcf menubit3 bcf switch_right bcf switch_left clrf timeout_counter2 WAITMS d'100' PLED_confirmbox_loop: call check_switches_logbook btfsc menubit3 ; SET/MENU? bra PLED_confirmbox_move_cursor; Move Cursor btfsc menubit2 ; ENTER? bra PLED_confirmbox_menu_do ; Do task btfsc onesecupdate call timeout_surfmode ; timeout btfsc onesecupdate call set_dive_modes ; check, if divemode must be entered bcf onesecupdate ; one second update btfsc sleepmode ; Timeout? bra PLED_confirmbox_cancel ; back with cancel btfsc divemode bra PLED_confirmbox_cancel ; back with cancel bra PLED_confirmbox_loop ; wait for something to do PLED_confirmbox_cancel: retlw .0 PLED_confirmbox_ok: retlw .1 PLED_confirmbox_menu_do: dcfsnz menupos,F bra PLED_confirmbox_cancel dcfsnz menupos,F bra PLED_confirmbox_ok bra PLED_confirmbox_cancel PLED_confirmbox_move_cursor: incf menupos,F movlw d'3' ; number of menu options+1 cpfseq menupos ; =limit? bra PLED_confirmbox_move_cursor2 ; No! movlw d'1' ; Yes, reset to position 1! movwf menupos PLED_confirmbox_move_cursor2: bra PLED_confirmbox2 ; Return to Profile Menu, also updates cursor PLED_depth: ostc_debug 'r' ; Sends debug-information to screen if debugmode active movff rel_pressure+1,hi movff rel_pressure+0,lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] movlw .039 cpfslt hi bra depth_greater_99_84mtr btfsc depth_greater_100m ; Was depth>100m during last call call PLED_clear_depth ; Yes, clear depth area bcf depth_greater_100m ; Do this once only... lfsr FSR2,letter movlw HIGH d'1000' movwf sub_a+1 movlw LOW d'1000' 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 btfss neg_flag ; Depth lower then 10m? rcall depth_less_10mtr ; Yes, add extra space WIN_TOP .24 WIN_LEFT .0 WIN_FONT FT_LARGE WIN_INVERT .0 ; Init new Wordprocessor PLED_color_code warn_depth ; Color-code the output movlw HIGH d'99' movwf sub_a+1 movlw LOW d'99' movwf sub_a+0 movff hi,sub_b+1 movff lo,sub_b+0 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag ; Depth lower then 1m? bra pled_depth2 ; Yes, display manual Zero bsf leftbind bsf ignore_digit4 output_16 ; Full meters in Big font bcf leftbind bra pled_depth3 pled_depth2: movlw '0' movwf POSTINC2 pled_depth3: call word_processor bcf ignore_digit4 WIN_FONT FT_MEDIUM WIN_TOP .50 WIN_LEFT .40 PLED_color_code warn_depth ; Color-code the output movff rel_pressure+1,hi movff rel_pressure+0,lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] lfsr FSR2,letter movlw '.' movwf POSTINC2 movlw HIGH d'9' movwf sub_a+1 movlw LOW d'9' movwf sub_a+0 movff hi,sub_b+1 movff lo,sub_b+0 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag ; Depth lower then 0.1m? bra pled_depth4 ; Yes, display manual Zero movlw d'4' movwf ignore_digits bsf ignore_digit5 output_16dp d'0' bra pled_depth5 pled_depth4: movlw '0' movwf POSTINC2 pled_depth5: call word_processor ; decimeters in medium font bcf ignore_digit5 WIN_FONT FT_SMALL return depth_greater_99_84mtr: ; Display only in full meters btfss depth_greater_100m ; Is depth>100m already? call PLED_clear_depth ; No, clear depth area and set flag ; Depth is already in hi:lo ; Show depth in Full meters ; That means ignore figure 4 and 5 lfsr FSR2,letter WIN_TOP .24 WIN_LEFT .0 WIN_FONT FT_LARGE WIN_INVERT .0 ; Init new Wordprocessor PLED_color_code warn_depth ; Color-code the output bsf ignore_digit4 bsf leftbind output_16 bcf leftbind call word_processor bcf ignore_digit4 WIN_FONT FT_SMALL return depth_less_10mtr: movlw ' ' movwf POSTINC2 return PLED_clear_depth ; No, clear depth area and set flag movlw .0 movff WREG,box_temp+0 ; Data movlw .24 movff WREG,box_temp+1 ; row top (0-239) movlw .90 movff WREG,box_temp+2 ; row bottom (0-239) movlw .0 movff WREG,box_temp+3 ; column left (0-159) movlw .90 movff WREG,box_temp+4 ; column right (0-159) call PLED_box bsf depth_greater_100m ; Set Flag return PLED_desaturation_time: ostc_debug 'h' WIN_TOP .150 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter OUTPUTTEXT d'14' ; Desat movlw ' ' movwf POSTINC2 movff int_O_desaturation_time+0,lo ; divide by 60... movff int_O_desaturation_time+1,hi call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) bsf leftbind movf lo,W movff hi,lo movwf hi ; exchange lo and hi... output_8 ; Hours movlw ':' movwf POSTINC2 movff hi,lo ; Minutes output_99x bcf leftbind call word_processor return PLED_nofly_time: ostc_debug 'g' WIN_TOP .125 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter OUTPUTTEXT d'35' ; NoFly movlw ' ' movwf POSTINC2 movff nofly_time+0,lo ; divide by 60... movff nofly_time+1,hi call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) bsf leftbind movf lo,W movff hi,lo movwf hi ; exchange lo and hi... output_8 ; Hours movlw ':' movwf POSTINC2 movff hi,lo ; Minutes decf lo,F btfsc lo,7 ; keep Nofly time clrf lo output_99x bcf leftbind call word_processor return update_surf_press: btfsc premenu ; Do not update when "Menu?" is displayed! return ostc_debug 'b' ; Sends debug-information to screen if debugmode active WIN_TOP .25 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff amb_pressure+0,lo movff amb_pressure+1,hi bsf leftbind output_16 bcf leftbind movlw 'm' movwf POSTINC2 movlw 'b' movwf POSTINC2 movlw 'a' movwf POSTINC2 movlw 'r' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return update_batt_voltage_divemode: movlw -.20 ; ~Centered between ppO2 warning and max depth... movwf hi,BANKED ; Use the hi variable to offset the battery in dive mode... bra update_battery_voltage1 update_batt_voltage: clrf hi,BANKED ; No vertical offset... update_battery_voltage1: ostc_debug 'f' GETCUSTOM8 d'31' ; =1 if battery voltage should be visible movwf lo movlw d'1' cpfseq lo ; =1? bra update_batt_voltage2 ; No, show symbol WIN_TOP .175 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff batt_voltage+0,lo movff batt_voltage+1,hi movlw d'1' movwf ignore_digits bsf ignore_digit5 ; do not display mV bsf leftbind output_16dp d'2' ; e.g. 3.45V bcf leftbind movlw 'V' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return update_batt_voltage2: ; 4100-Vbatt movlw LOW d'4100' movwf sub_a+0 movlw HIGH d'4100' movwf sub_a+1 movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 call sub16 ; sub_c = sub_a - sub_b ; Battery full (>4100mV? btfsc neg_flag bra update_batt_voltage2_full ; Vbatt-3500 movlw LOW d'3500' movwf sub_b+0 movlw HIGH d'3500' movwf sub_b+1 movff batt_voltage+0,sub_a+0 movff batt_voltage+1,sub_a+1 call sub16 ; sub_c = sub_a - sub_b ; Battery lower then 3500mV? btfsc neg_flag bra update_batt_voltage2_empty ; Battery is between 3500 and 4100mV ; sub_c:2 is between 0 and 600 movff sub_c+0,xA+0 movff sub_c+1,xA+1 movlw d'20' movwf xB+0 clrf xB+1 call div16x16 ;xA/xB=xC with xA as remainder ; xC is between 0 and 30 movff xC+0,wait_temp ;save value incf wait_temp,F ; +1 movlw d'3' cpfsgt wait_temp movwf wait_temp ; Minimum = 3 ; Check if battery level is low... movlw d'7' ; Blink threshold at 6/30 == 20% ??? cpfslt wait_temp bra update_batt_clear ; black if WREG > 6 update_batt_blink: ; Get BLINKING warning color, or black every other seconde: GETCUSTOM8 d'37' ; WARNING color btfss secs,0,BANKED update_batt_clear: clrf WREG movwf box_temp+0,BANKED ; Data movlw .172 addwf hi,W,BANKED movwf box_temp+1,BANKED ; row top (0-239) movlw .196 addwf hi,W,BANKED movwf box_temp+2,BANKED ; row bottom (0-239) movlw .0 movwf box_temp+3,BANKED ; column left (0-159) movlw .33 movwf box_temp+4,BANKED ; column right (0-159) call PLED_box movlw .179 addwf hi,W,BANKED movwf box_temp+1,BANKED ; row top (0-239) movlw .189 addwf hi,W,BANKED movwf box_temp+2,BANKED ; row bottom (0-239) movlw .33 movwf box_temp+3,BANKED ; column left (0-159) movlw .35 movwf box_temp+4,BANKED ; column right (0-159) call PLED_box ; Full Cap GETCUSTOM8 d'34' ; Color battery movwf box_temp+0,BANKED ; Color Data movlw .176 addwf hi,W,BANKED movwf box_temp+1,BANKED ; row top (0-239) movlw .192 addwf hi,W,BANKED movwf box_temp+2,BANKED ; row bottom (0-239) movlw .2 movwf box_temp+3,BANKED ; column left (0-159) movff wait_temp,box_temp+4; column right (0-159) call PLED_box update_batt_voltage2a: GETCUSTOM8 d'35' ; Standard output color movwf box_temp+0,BANKED ; Data movlw .174 addwf hi,W,BANKED movwf box_temp+1,BANKED ; row top (0-239) movlw .194 addwf hi,W,BANKED movwf box_temp+2,BANKED ; row bottom (0-239) movlw .1 movwf box_temp+3,BANKED ; column left (0-159) movlw .32 movwf box_temp+4,BANKED ; column right (0-159) call PLED_frame movlw .181 addwf hi,W,BANKED movwf box_temp+1,BANKED ; row top (0-239) movlw .187 addwf hi,W,BANKED movwf box_temp+2,BANKED ; row bottom (0-239) movlw .32 movwf box_temp+3,BANKED ; column left (0-159) movlw .34 movwf box_temp+4,BANKED ; column right (0-159) call PLED_box ; Full Cap ; movlw .181 ; movff WREG,box_temp+1 ; row top (0-239) ; movlw .187 ; movff WREG,box_temp+2 ; row bottom (0-239) ; movlw .31 ; movff WREG,box_temp+3 ; column left (0-159) ; movlw .33 ; movff WREG,box_temp+4 ; column right (0-159) ; call PLED_frame ; Empty cap ; update_batt_voltage3: call PLED_standard_color return update_batt_voltage2_empty: movlw d'1' movwf wait_temp bra update_batt_blink update_batt_voltage2_full: movlw d'30' movwf wait_temp bra update_batt_clear PLED_convert_date: ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) tstfsz EEDATA bra PLED_convert_date1 ; Use MMDDYY movff convert_value_temp+0,lo ;month bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+1,lo ;day bra PLED_convert_date1_common ;year PLED_convert_date1: read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) decfsz EEDATA,F bra PLED_convert_date2 ; Use DDMMYY movff convert_value_temp+1,lo ;day bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+0,lo ;month PLED_convert_date1_common: bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+2,lo ;year bsf leftbind output_99x return PLED_convert_date2: ; Use YYMMDD movff convert_value_temp+2,lo ;year bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+0,lo ;month bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+1,lo ;day bsf leftbind output_99x return PLED_convert_date_short: ; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2 read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) tstfsz EEDATA bra PLED_convert_date_short1 ; Use MMDDYY PLED_convert_date_short_common: movff convert_value_temp+0,lo ;month bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+1,lo ;day bsf leftbind output_99x bcf leftbind return PLED_convert_date_short1: read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) decfsz EEDATA,F bra PLED_convert_date_short_common ; Use YYMMDD ; Use DDMMYY movff convert_value_temp+1,lo ;day bsf leftbind output_99x bcf leftbind movlw '/' movwf POSTINC2 movff convert_value_temp+0,lo ;month bsf leftbind output_99x bcf leftbind return update_date: ostc_debug 'd' WIN_TOP .75 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff month,convert_value_temp+0 movff day,convert_value_temp+1 movff year,convert_value_temp+2 call PLED_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 call word_processor return PLED_menu_clear: movlw .0 movff WREG,box_temp+0 ; Data movlw .0 movff WREG,box_temp+1 ; row top (0-239) movlw .26 movff WREG,box_temp+2 ; row bottom (0-239) movlw .65 movff WREG,box_temp+3 ; column left (0-159) movlw .100 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_max_pressure: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'p' ; Sends debug-information to screen if debugmode active WIN_TOP .184 WIN_LEFT .0 WIN_FONT FT_MEDIUM WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movff max_pressure+0,lo movff max_pressure+1,hi call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] bsf leftbind bsf ignore_digit5 ; do not display 1cm depth output_16dp d'3' bcf leftbind bcf show_last3 call word_processor WIN_FONT FT_SMALL return PLED_divemins: btfsc menubit ; Divemode menu active? return ; Yes, do not update divetime ostc_debug 'A' ; Sends debug-information to screen if debugmode active btfsc gauge_mode ; different display in gauge mode bra PLED_divemins_gauge btfsc FLAG_apnoe_mode ; different display in apnoe mode bra PLED_divemins_apnoe GETCUSTOM8 d'38' ; Show seconds (=1?) movwf lo movlw d'1' cpfseq lo ; =1? bra PLED_divemins2 ; No, minutes only bra PLED_divemins_gauge ; Yes, use Gauge routine PLED_divemins2: movff divemins+0,lo movff divemins+1,hi bcf leftbind lfsr FSR2,letter output_16_3 ; displays only last three figures from a 16Bit value (0-999) WIN_TOP .20 WIN_LEFT .120 WIN_FONT FT_MEDIUM call PLED_standard_color call word_processor WIN_FONT FT_SMALL return PLED_display_apnoe_surface: btfsc menubit ; Divemode menu active? return ; Yes, do not display surface mode timeout call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXT d'140' ; "SURFACE" call PLED_standard_color WIN_TOP .85 WIN_LEFT .90 WIN_FONT FT_MEDIUM call PLED_standard_color movff apnoe_surface_mins,lo bcf leftbind lfsr FSR2,letter output_8 movlw ':' movwf POSTINC2 movff apnoe_surface_secs,lo output_99x call word_processor WIN_FONT FT_SMALL return PLED_apnoe_clear_surface: ; Clear Surface timer.... movlw .0 movff WREG,box_temp+0 ; Data movlw .60 movff WREG,box_temp+1 ; row top (0-239) movlw .119 movff WREG,box_temp+2 ; row bottom (0-239) movlw .90 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_display_apnoe_descent: call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXT d'139' ; "Descent" call PLED_standard_color WIN_TOP .145 WIN_LEFT .90 WIN_FONT FT_MEDIUM call PLED_standard_color movff apnoe_mins,lo lfsr FSR2,letter output_8 movlw ':' movwf POSTINC2 movff apnoe_secs,lo output_99x call word_processor WIN_FONT FT_SMALL return PLED_divemins_apnoe: PLED_divemins_gauge: movff divemins+0,lo movff divemins+1,hi bcf leftbind bsf show_last3 lfsr FSR2,letter output_16_3 ;Displays only 0...999 movlw ':' movwf POSTINC2 movff divesecs,lo output_99x WIN_TOP .20 WIN_LEFT .90 WIN_FONT FT_MEDIUM call PLED_standard_color call word_processor bcf show_last3 WIN_FONT FT_SMALL return PLED_stopwatch_remove: movlw .0 movff WREG,box_temp+0 ; Data movlw .54 movff WREG,box_temp+1 ; row top (0-239) movlw .102 movff WREG,box_temp+2 ; row bottom (0-239) movlw .062 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_stopwatch_show: btfsc menubit ; Divemode menu active? return ; Yes, No update and return! ostc_debug 'V' ; Sends debug-information to screen if debugmode active ; Stopwatch call PLED_divemask_color ; Set Color for Divemode mask DISPLAYTEXTH d'283' ; Counter call PLED_standard_color WIN_TOP .80 WIN_LEFT .110 WIN_FONT FT_SMALL call PLED_standard_color lfsr FSR2,letter movff average_divesecs+0,lo ; Stopwatch movff average_divesecs+1,hi ; Stopwatch movlw d'2' subwf lo,F movlw d'0' subwfb hi,F ; Subtract 2 seconds call convert_time ; converts hi:lo in seconds to mins (hi) and secs (lo) movff lo,wait_temp movff hi,lo clrf hi movlw d'0' bcf leftbind bsf show_last3 output_16_3 ;Displays only 0...999 movlw ':' movwf POSTINC2 movff wait_temp,lo output_99x bcf leftbind call word_processor ostc_debug 'U' ; Sends debug-information to screen if debugmode active WIN_TOP .80 WIN_LEFT .62 WIN_FONT FT_SMALL call PLED_standard_color lfsr FSR2,letter movff avr_rel_pressure+0,lo movff avr_rel_pressure+1,hi call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] bsf leftbind bsf ignore_digit5 ; do not display 1cm depth output_16dp d'3' bcf leftbind movlw 'm' movwf POSTINC2 movlw ' ' movwf POSTINC2 call word_processor return PLED_serial: ; Writes OSTC #Serial and Firmware version in surfacemode ostc_debug 'a' ; Sends debug-information to screen if debugmode active WIN_TOP .0 WIN_LEFT .1 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter OUTPUTTEXTH d'262' ; "OSTC " clrf EEADRH clrf EEADR ; Get Serial number LOW call read_eeprom ; read byte movff EEDATA,lo incf EEADR,F ; Get Serial number HIGH call read_eeprom ; read byte movff EEDATA,hi bsf leftbind output_16 movlw ' ' movwf POSTINC2 movlw 'V' movwf POSTINC2 movlw softwareversion_x movwf lo bsf leftbind output_8 movlw '.' movwf POSTINC2 movlw softwareversion_y movwf lo bsf leftbind output_99x bcf leftbind call word_processor return PLED_divemode_menu_mask_first: ; Write Divemode menu1 mask ostc_debug 'o' ; Sends debug-information to screen if debugmode active call PLED_menu_clear ; clear "Menu?" btfsc FLAG_const_ppO2_mode ; are we in ppO2 mode? bra PLED_divemode_menu_mask_first2 ; in OC Mode DISPLAYTEXT .32 ;"Gaslist" DISPLAYTEXT .31 ;"Decoplan" DISPLAYTEXT .122 ;"Set Gas" bra PLED_divemode_menu_mask_first3 PLED_divemode_menu_mask_first2: ; in CC Mode DISPLAYTEXT .238 ;"SetPoint" DISPLAYTEXT .31 ;"Decoplan" DISPLAYTEXT .137 ;"Bailout" PLED_divemode_menu_mask_first3: ; In all modes DISPLAYTEXT .33 ;"More" DISPLAYTEXT .34 ;"Exit" return PLED_divemode_menu_mask_second: ; Write Divemode menu1 mask ostc_debug 'o' ; Sends debug-information to screen if debugmode active DISPLAYTEXT .240 ;"Graphs" DISPLAYTEXT .241 ;"Display" DISPLAYTEXTH .281 ;"L. Tissue" DISPLAYTEXT .147 ;"Stopwat." DISPLAYTEXT .244 ;"Exit" return PLED_divemode_set_xgas: ; Displayes the "Set Gas" menu WIN_LEFT .100 WIN_TOP .0 WIN_FONT FT_SMALL call PLED_standard_color lfsr FSR2,letter movlw 'S' movwf POSTINC2 movlw 'e' movwf POSTINC2 movlw 'l' movwf POSTINC2 read_int_eeprom d'24' ; Get Gas6 %O2 movff EEDATA,lo bcf leftbind output_99 ; outputs into Postinc2! movlw '/' movwf POSTINC2 read_int_eeprom d'25' ; Get Gas6 %He movff EEDATA,lo output_99 ; outputs into Postinc2! call word_processor DISPLAYTEXT .123 ; O2 + DISPLAYTEXT .124 ; O2 - DISPLAYTEXT .125 ; He + DISPLAYTEXT .126 ; He - return PLED_divemode_simulator_mask: DISPLAYTEXT .254 ; EXIT DISPLAYTEXT .250 ; + 1m DISPLAYTEXT .251 ; - 1m DISPLAYTEXT .252 ; +10m DISPLAYTEXT .253 ; -10m return PLED_decoplan_bargraph: GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movff hi,win_top incf win_top,F ; +1 movff win_top,box_temp+1 ; row top (0-239) movff win_top,box_temp+2 ; movlw d'18' addwf box_temp+2,F ; row bottom (0-239) movlw .122 movff WREG,box_temp+3 ; column left (0-159) addwf lo,F ; Add time offset btfsc STATUS,C ; >255? setf lo ; limit to 255 decf lo,F ; No, minus one movlw d'138' ; Limit length (16min) cpfslt lo movwf lo movff lo,box_temp+4 ; column right (0-159) call PLED_box movlw .0 movff WREG,box_temp+0 ; Data movff win_top,box_temp+1 ; row top (0-239) movff win_top,box_temp+2 ; movlw d'18' addwf box_temp+2,F ; row bottom (0-239) movff lo,box_temp+3 ; incf box_temp+3,F ; column left (0-159) movlw .139 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_decoplan_delete_gf: ; Delete unused rows movlw .238 movff WREG,box_temp+2 ; row bottom (0-239) bra PLED_decoplan_delete_common PLED_decoplan_delete: ; Delete unused rows movlw .184 movff WREG,box_temp+2 ; row bottom (0-239) PLED_decoplan_delete_common: movlw .0 movff WREG,box_temp+0 ; data 00, x0, 0y, xy clear, links, rechts, beide movff hi,box_temp+1 ; row top (0-239) movlw .100 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box bsf last_ceiling_gf_shown ; Set flag return PLED_decoplan_gf_page_current: movlw d'0' cpfseq temp8 bra PLED_decoplan_gf_page2 ; =1: Dispplay Page 2 bra PLED_decoplan_gf_page1 ; =0, Display Page 1 PLED_decoplan_gf_page1: ostc_debug 'n' ; Sends debug-information to screen if debugmode active movff char_O_array_decodepth+0,lo ; Get Depth tstfsz lo bra PLED_decoplan_gf_page1x ; No Deco, show "no Deco" DISPLAYTEXT d'239' ;"No Deco" return PLED_decoplan_gf_page2: ; temp7 holds last displayed depth ; temp5 list entry movff temp5,temp9 ; save movff temp7,temp10 ; save movlw .231 movwf temp6 ; row PLED_decoplan_gf_page2y: movlw d'3' addwf temp7,F ; Add 3m for next stop movlw d'25' addwf temp6,F incf temp5,F call PLED_decoplan_show_stop_gf movlw d'15' ; the next 8 Stops... cpfseq temp5 bra PLED_decoplan_gf_page2y movff temp9,temp5 ; restore movff temp10,temp7 ; restore bsf last_ceiling_gf_shown ; Set flag return PLED_decoplan_gf_page1x: clrf temp8 ; Page 0-3 of deco list GETCUSTOM8 d'29' ; Last Deco in m movwf temp7 ; Start with last stop setf temp5 movlw .231 movwf temp6 ; row ; Show last stop manually movlw d'25' addwf temp6,F incf temp5,F call PLED_decoplan_show_stop_gf GETCUSTOM8 d'29' ; Last Deco in m movwf temp7 ; Last deco movlw d'4' cpfslt temp7 ; >=3m? bra PLED_decoplan_gf_page1x_next_6m movlw d'3' movwf temp7 bra PLED_decoplan_gf_page1y PLED_decoplan_gf_page1x_next_6m: movlw d'6' movwf temp7 incf temp5,F PLED_decoplan_gf_page1y: movlw d'3' addwf temp7,F ; Add 3m for next stop movlw d'25' addwf temp6,F incf temp5,F call PLED_decoplan_show_stop_gf movlw d'7' ; the next 7 Stops... cpfseq temp5 bra PLED_decoplan_gf_page1y return PLED_decoplan_show_stop_gf: bsf leftbind WIN_LEFT .100 movff temp6,win_top movff temp6,hi ; copy for PLED_decoplan_bargraph movff char_O_array_decodepth+0,WREG ; Ceiling cpfslt temp7 ; Ceiling already displayed? goto PLED_decoplan_delete_gf ; Yes, quit display and RETURN movff temp7,lo ; Decodepth lfsr FSR2,letter output_99x ; outputs into Postinc2! movlw 'm' movwf POSTINC2 call word_processor WIN_LEFT .140 movff temp6,win_top ; lfsr FSR1,0x251 lfsr FSR1,0x0E1 ; Gf_decolist_copy movf temp5,W ; number of entry movff PLUSW1,lo ; Stop length incf lo,F ; add one dummy minute lfsr FSR2,letter output_99x ; outputs into Postinc2! movlw d'39' ;"'" movwf POSTINC2 call word_processor tstfsz lo ; 0 min "Stop"? rcall PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth return PLED_decoplan: ; display the Decoplan ostc_debug 'n' ; Sends debug-information to screen if debugmode active movff char_O_array_decodepth+0,lo ; Get Depth tstfsz lo bra PLED_decoplan1 ; No Deco, show "no Deco" ; call PLED_clear_divemode_menu ; Clear Deco area DISPLAYTEXT d'239' ;"No Deco" return PLED_decoplan1: setf temp5 movlw .231 movwf temp6 ; row PLED_decoplan2: movlw d'25' addwf temp6,F incf temp5,F call PLED_decoplan_show_stop movlw d'5' ; 6 Stops... cpfseq temp5 bra PLED_decoplan2 return PLED_decoplan_show_stop: bsf leftbind WIN_LEFT .100 movff temp6,win_top movff temp6,hi ; copy for PLED_decoplan_bargraph lfsr FSR1,char_O_array_decodepth;+0 movf temp5,W ; number of entry movff PLUSW1,lo movf lo,w btfsc STATUS,Z ; =0 goto PLED_decoplan_delete ; Yes, quit display lfsr FSR2,letter output_8 ; outputs into Postinc2! movlw 'm' movwf POSTINC2 call word_processor WIN_LEFT .140 movff temp6,win_top lfsr FSR1,char_O_array_decotime;+0 movf temp5,W ; number of entry movff PLUSW1,lo lfsr FSR2,letter output_99x ; outputs into Postinc2! movlw d'39' ;"'" movwf POSTINC2 call word_processor tstfsz lo ; 0 min "Stop"? rcall PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth return PLED_gas_list: ostc_debug 'm' ; Sends debug-information to screen if debugmode active WIN_LEFT .100 WIN_FONT FT_SMALL bsf leftbind movlw d'2' movwf wait_temp ; here: stores eeprom address for gas list movlw d'231' movwf waitms_temp ; here: stores row for gas list clrf hi ; here: Gas counter PLED_gas_list_loop: incf hi,F ; Increase Gas movlw d'4' addwf wait_temp,F ; Increase eeprom address for gas list movlw d'25' addwf waitms_temp,F ; Increase row WIN_LEFT .100 movff waitms_temp,win_top ; Set Row lfsr FSR2,letter movlw 'G' movwf POSTINC2 movff hi,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movff wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! movlw '/' movwf POSTINC2 incf EEADR,F ; Gas #hi: %He - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! decf EEADR,F ; Gas #hi: %O2 - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) PLED_color_code warn_gas_in_gaslist ; Color-code output (%O2 in "EEDATA") ; Check if gas needs to be greyed-out (inactive) read_int_eeprom d'27' ; read flag register movff hi,lo ; copy gas number PLED_gas_list_loop1: rrcf EEDATA ; roll flags into carry decfsz lo,F ; max. 5 times... bra PLED_gas_list_loop1 movlw color_grey btfss STATUS,C ; test carry call PLED_set_color ; grey out inactive gases! call word_processor call PLED_standard_color movlw d'5' ; list all five gases cpfseq hi ; All gases shown? bra PLED_gas_list_loop ; No return ; No, return (OC mode) PLED_splist_start: WIN_LEFT .100 WIN_FONT FT_SMALL bsf leftbind ; list three SP in Gaslist movlw d'35' ; 36 = current SP position in EEPROM movwf wait_temp ; here: stores eeprom address for gas list movlw d'231' movwf waitms_temp ; here: stores row for gas list clrf temp5 ; here: SP counter PLED_splist_loop: incf wait_temp,F ; EEPROM address incf temp5,F ; Increase SP movlw d'25' addwf waitms_temp,F ; Increase row movff waitms_temp,win_top ; Set Row WIN_LEFT .100 lfsr FSR2,letter movlw 'S' movwf POSTINC2 movlw 'P' movwf POSTINC2 movff temp5,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movff wait_temp, EEADR; SP #hi position call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo clrf hi output_16dp d'3' ; outputs into Postinc2! call word_processor movlw d'3' ; list all three SP cpfseq temp5 ; All gases shown? bra PLED_splist_loop ; No bcf leftbind return ; no, return PLED_clear_divemode_menu: movlw .0 movff WREG,box_temp+0 ; Data movlw .0 movff WREG,box_temp+1 ; row top (0-239) ; movlw .125 movlw .185 movff WREG,box_temp+2 ; row bottom (0-239) movlw .082 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_divemenu_cursor: ostc_debug 'l' ; Sends debug-information to screen if debugmode active WIN_TOP .0 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .25 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .50 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .75 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor WIN_TOP .100 WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB8 movwf POSTINC2 call word_processor movff menupos,temp1 movlw d'0' dcfsnz temp1,F movlw d'0' dcfsnz temp1,F movlw d'25' dcfsnz temp1,F movlw d'50' dcfsnz temp1,F movlw d'75' dcfsnz temp1,F movlw d'100' movff WREG,win_top WIN_LEFT .85 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color lfsr FSR2,letter movlw 0xB7 ; Arrow for menu movwf POSTINC2 call word_processor return ;PLED_profileview_menu: ; DISPLAYTEXT .127 ;"Exit" ; DISPLAYTEXT .128 ;"Delete" ;; DISPLAYTEXT .132 ;"Format" ; return custom_warn_surfmode: ; With CF in temp1 movlw .0 movff WREG,box_temp+0 ; Data movlw .56 movff WREG,box_temp+1 ; row top (0-239) movlw .88 movff WREG,box_temp+2 ; row bottom (0-239) movlw .69 movff WREG,box_temp+3 ; column left (0-159) movlw .115 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .58 movff WREG,box_temp+1 ; row top (0-239) movlw .86 movff WREG,box_temp+2 ; row bottom (0-239) movlw .70 movff WREG,box_temp+3 ; column left (0-159) movlw .114 movff WREG,box_temp+4 ; column right (0-159) call PLED_frame ; warning text WIN_TOP .60 WIN_LEFT .71 WIN_FONT FT_SMALL WIN_INVERT .1 ; Init new Wordprocessor call PLED_warnings_color ; Set Color for Warning lfsr FSR2,letter movlw 'C' movwf POSTINC2 movlw 'F' movwf POSTINC2 movff temp1,lo output_8 movlw '!' movwf POSTINC2 call word_processor WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color return PLED_saturation_graph_divemode: ostc_debug 'h' ; Sends debug-information to screen if debugmode active PLED_tissue_saturation_graph: ostc_debug 'i' ; Sends debug-information to screen if debugmode active ; Clear graph area... movlw .0 movff WREG,box_temp+0 ; Data movlw .25 movff WREG,box_temp+1 ; row top (0-239) movlw .120 movff WREG,box_temp+2 ; row bottom (0-239) movlw .82 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box ; Draw Frame GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .25 movff WREG,box_temp+1 ; row top (0-239) movlw .120 movff WREG,box_temp+2 ; row bottom (0-239) movlw .82 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_frame ; Draw N2 Tissues lfsr FSR2, char_O_tissue_saturation+.000 ; N2 movlw d'16' movwf wait_temp ; 16 tissues clrf waitms_temp ; Row offset PLED_tissue_saturation_graph3: GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .28 addwf waitms_temp,W movff WREG,box_temp+1 ; row top (0-239) movlw .28 addwf waitms_temp,W movff WREG,box_temp+2 ; row bottom (0-239) incf waitms_temp,F incf waitms_temp,F movlw .100 movff WREG,box_temp+3 ; column left (0-159) movff POSTINC2,box_temp+4 bcf STATUS,C rrcf box_temp+4,F bcf STATUS,C rrcf box_temp+4,F movlw .100 addwf box_temp+4,F ; column right (0-159) movlw d'157' ; limit display cpfslt box_temp+4 ; skip if 157 (WREG) < box_temp+4 movwf box_temp+4 call PLED_box decfsz wait_temp,F bra PLED_tissue_saturation_graph3 ; Draw He Tissues lfsr FSR2, char_O_tissue_saturation+.016 ; He movlw d'16' movwf wait_temp ; 16 tissues clrf waitms_temp ; Row offset PLED_tissue_saturation_graph2: GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .86 addwf waitms_temp,W movff WREG,box_temp+1 ; row top (0-239) movlw .86 addwf waitms_temp,W movff WREG,box_temp+2 ; row bottom (0-239) incf waitms_temp,F incf waitms_temp,F movlw .100 movff WREG,box_temp+3 ; column left (0-159) movff POSTINC2,box_temp+4 bcf STATUS,C rrcf box_temp+4,F bcf STATUS,C rrcf box_temp+4,F movlw .100 addwf box_temp+4,F ; column right (0-159) movlw d'157' ; limit display cpfslt box_temp+4 ; skip if 157 (WREG) < box_temp+4 movwf box_temp+4 call PLED_box decfsz wait_temp,F bra PLED_tissue_saturation_graph2 ; Draw Text WIN_LEFT .84 WIN_TOP .32 call PLED_standard_color lfsr FSR2,letter movlw 'N' movwf POSTINC2 movlw '2' movwf POSTINC2 call word_processor WIN_LEFT .84 WIN_TOP .90 call PLED_standard_color lfsr FSR2,letter movlw 'H' movwf POSTINC2 movlw 'e' movwf POSTINC2 call word_processor movff char_O_gtissue_no,wait_temp ; used as temp lfsr FSR2,letter lfsr FSR1,char_O_tissue_saturation+0 incf wait_temp,F ; make 1-16 of 0-15 PLED_tissue_saturation_graph4: ; point to leading tissue... movff POSTINC1,lo ; copy/overwrite to lo register decfsz wait_temp,F ; count until zero bra PLED_tissue_saturation_graph4 ;loop output_8 movlw '%' movwf POSTINC2 movlw ' ' movwf POSTINC2 WIN_LEFT .84 WIN_TOP .62 WIN_FONT FT_SMALL call PLED_standard_color call word_processor bcf leftbind ; Draw Scale GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .73 movff WREG,box_temp+1 ; row top (0-239) movlw .74 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121 movff WREG,box_temp+3 ; column left (0-159) movlw .157 movff WREG,box_temp+4 ; column right (0-159) call PLED_frame GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .61 movff WREG,box_temp+1 ; row top (0-239) movlw .84 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121 movff WREG,box_temp+3 ; column left (0-159) movlw .122 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .65 movff WREG,box_temp+1 ; row top (0-239) movlw .80 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121+.9 movff WREG,box_temp+3 ; column left (0-159) movlw .122+.9 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .65 movff WREG,box_temp+1 ; row top (0-239) movlw .80 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121+.18 movff WREG,box_temp+3 ; column left (0-159) movlw .122+.18 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .65 movff WREG,box_temp+1 ; row top (0-239) movlw .80 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121+.27 movff WREG,box_temp+3 ; column left (0-159) movlw .122+.27 movff WREG,box_temp+4 ; column right (0-159) call PLED_box GETCUSTOM8 d'35' ; Standard output color movff WREG,box_temp+0 ; Data movlw .61 movff WREG,box_temp+1 ; row top (0-239) movlw .84 movff WREG,box_temp+2 ; row bottom (0-239) movlw .121+.36 movff WREG,box_temp+3 ; column left (0-159) movlw .122+.36 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_startupscreen1: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT d'3' ; "HeinrichsWeikamp" WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .68 ; Licence 1/2 DISPLAYTEXT .69 DISPLAYTEXT .70 DISPLAYTEXT .71 DISPLAYTEXT .72 DISPLAYTEXT .73 DISPLAYTEXT .74 return PLED_startupscreen2: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXT d'3' ; "HeinrichsWeikamp" WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXT .75 ; Licence 2/2 DISPLAYTEXT .76 DISPLAYTEXT .77 DISPLAYTEXT .78 DISPLAYTEXT .79 DISPLAYTEXT .80 DISPLAYTEXT .81 return PLED_new_cf_warning: call PLED_topline_box WIN_INVERT .1 ; Init new Wordprocessor DISPLAYTEXTH .271 ; New CF added! WIN_INVERT .0 ; Init new Wordprocessor DISPLAYTEXTH .272 ; New CustomFunctions DISPLAYTEXTH .273 ; were added! Check DISPLAYTEXTH .274 ; CF I and CF II Menu DISPLAYTEXTH .275 ; for Details! return PLED_const_ppO2_value: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! ostc_debug 'j' ; Sends debug-information to screen if debugmode active WIN_TOP .168 WIN_LEFT .65 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor lfsr FSR2,letter movff char_I_const_ppO2,lo tstfsz lo ; In Bailout mode (char_I_const_ppO2=0)? bra PLED_const_ppO2_value2 ; No, display Setpoint ; Yes, Display "Bail" call PLED_standard_color OUTPUTTEXTH d'263' ;"Bail" call word_processor return PLED_const_ppO2_value2: ; Display SetPoint ;Show fixed SP value movff amb_pressure+0,xA+0 movff amb_pressure+1,xA+1 movlw d'10' movwf xB+0 clrf xB+1 ;xA/xB=xC with xA as remainder call div16x16 ; xC+0=p_amb/10 ; char_I_const_ppO2 > p_amb/10 -> Not physically possible! -> Display actual value! tstfsz xC+1 ; xC>255 setf xC+0 ; Yes, set xC+0 to 2,55bar ppO2 movff ppO2_setpoint_store,WREG cpfslt xC+0 ; Setpoint value possible? bra PLED_const_ppO2_value1 ; Yes movff xC+0,char_I_const_ppO2 ; No, Overwrite with actual value bra PLED_const_ppO2_value1a PLED_const_ppO2_value1: ; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value! movff amb_pressure+0,xA+0 movff amb_pressure+1,xA+1 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 char_I_O2_ratio,xB+0 clrf xB+1 call mult16x16 ; xC:2=char_I_O2_ratio * p_amb/10 movff xC+0,sub_b+0 movff xC+1,sub_b+1 movff ppO2_setpoint_store,WREG; Setpoint mullw d'100' ; Setpoint*100 movff PRODL,sub_a+0 movff PRODH,sub_a+1 call sub16 ; sub_c = sub_a - sub_b btfss neg_flag bra PLED_const_ppO2_value11 ; Value in range ; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value! movff xC+0,xA+0 movff xC+1,xA+1 movlw d'100' movwf xB+0 clrf xB+1 call div16x16 ;xA/xB=xC with xA as remainder movff xC+0,char_I_const_ppO2 ; No, Overwrite with actual value bra PLED_const_ppO2_value1a PLED_const_ppO2_value11: ; Setpoint in possible limits movff ppO2_setpoint_store,char_I_const_ppO2 ; Restore Setpoint PLED_const_ppO2_value1a: PLED_color_code warn_ppo2 ; Color-code output movff char_I_const_ppO2,lo clrf hi bsf leftbind output_16dp d'3' bcf leftbind call word_processor call PLED_standard_color return PLED_show_leading_tissue: call deco_main_calc_desaturation_time ; calculate desaturation time movlb b'00000001' ; select ram bank 1 DISPLAYTEXTH .282 ; L. Tissue: lfsr FSR2,letter movlw '#' movwf POSTINC2 movff char_O_gtissue_no,lo movff char_O_gtissue_no,wait_temp ; used as temp bsf leftbind output_8 movlw ' ' movwf POSTINC2 movlw '(' movwf POSTINC2 movlw d'16' cpfslt wait_temp bra PLED_show_leading_tissue_he movlw 'N' movwf POSTINC2 movlw '2' movwf POSTINC2 bra PLED_show_leading_tissue2 PLED_show_leading_tissue_he: movlw 'H' movwf POSTINC2 movlw 'e' movwf POSTINC2 PLED_show_leading_tissue2: movlw ')' movwf POSTINC2 movlw ' ' movwf POSTINC2 WIN_LEFT .100 WIN_TOP .25 WIN_FONT FT_SMALL call PLED_standard_color call word_processor lfsr FSR2,letter lfsr FSR1,char_O_tissue_saturation+0 incf wait_temp,F ; make 1-16 of 0-15 PLED_show_leading_tissue3: ; point to leading tissue... movff POSTINC1,lo ; copy/overwrite to lo register decfsz wait_temp,F ; count until zero bra PLED_show_leading_tissue3 ;loop output_8 movlw '%' movwf POSTINC2 movlw ' ' movwf POSTINC2 WIN_LEFT .100 WIN_TOP .50 WIN_FONT FT_SMALL call PLED_standard_color call word_processor bcf leftbind return PLED_topline_box_clear: ; Writes an empty box movlw .0 bra PLED_topline_box2 PLED_topline_box: ; Writes a filled box GETCUSTOM8 d'35' PLED_topline_box2: movff WREG,box_temp+0 ; Data movlw .000 movff WREG,box_temp+1 ; row top (0-239) movlw .026 movff WREG,box_temp+2 ; row bottom (0-239) movlw .000 movff WREG,box_temp+3 ; column left (0-159) movlw .159 movff WREG,box_temp+4 ; column right (0-159) call PLED_box return PLED_display_cns: btfsc multi_gf_display ; Is the Multi-GF Table displayed? return ; Yes, No update and return! btfsc gauge_mode ; Do not display in gauge mode return btfsc FLAG_apnoe_mode ; Do not display in apnoe mode return btfsc pled_velocity_display ; Is velocity displayed?` return ; Yes, do not overwrite until pled_velocity_clear was called ostc_debug 'k' ; Sends debug-information to screen if debugmode active WIN_TOP .090 WIN_LEFT .0 WIN_FONT FT_SMALL PLED_color_code warn_cns ; Color-code CNS output lfsr FSR2,letter movlw 'C' movwf POSTINC2 movlw 'N' movwf POSTINC2 movlw 'S' movwf POSTINC2 movlw ':' movwf POSTINC2 movff char_O_CNS_fraction,lo bsf leftbind output_8 bcf leftbind movlw '%' movwf POSTINC2 call word_processor return PLED_display_cns_surface: ; Check if CNS should be displayed movff char_O_CNS_fraction,lo ; copy into bank1 GETCUSTOM8 d'15' ; cns_display_high_surfacemode subwf lo,W btfss STATUS,C return ; Do not show... ; Show CNS ostc_debug 'W' ; Sends debug-information to screen if debugmode active WIN_TOP .175 WIN_LEFT .45 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor PLED_color_code warn_cns ; Color-code CNS output lfsr FSR2,letter movlw 'C' movwf POSTINC2 movlw 'N' movwf POSTINC2 movlw 'S' movwf POSTINC2 movlw ':' movwf POSTINC2 movff char_O_CNS_fraction,lo bsf leftbind output_8 bcf leftbind movlw '%' movwf POSTINC2 call word_processor return PLED_custom_text: read_int_eeprom d'64' movlw d'1' cpfseq EEDATA ; Custom text active? bra PLED_clear_custom_text ; No, Delete row WIN_TOP .200 WIN_LEFT .0 WIN_FONT FT_SMALL WIN_INVERT .0 ; Init new Wordprocessor call PLED_divemask_color ; Set Color for Divemode mask lfsr FSR2,letter movlw d'64' movwf lo movlw d'24' movwf hi ; counter PLED_custom_text1: incf lo,F call PLED_get_custom_letter ; Get one letter for the custom text movlw '}' ; End marker found? cpfseq EEDATA bra PLED_custom_text2 ; No bra PLED_custom_text3 PLED_custom_text2: movff EEDATA,POSTINC2 ; Copy into Postinc decfsz hi,F ; Max. numbers? bra PLED_custom_text1 ; No, get next letters PLED_custom_text3: call word_processor call PLED_standard_color return PLED_get_custom_letter: movff lo,EEADR ; Address for next custom text letter call read_eeprom ; Read letter return PLED_clear_custom_text: movlw d'24' movwf temp1 WIN_TOP .200 WIN_LEFT .0 call PLED_display_clear_common_y1 return PLED_simdata_screen: ;Display Pre-Dive Screen ; List active gases/Setpoints btfsc FLAG_const_ppO2_mode ; in ppO2 mode? bra PLED_simdata_screen3 ; Yes, display SetPoint/Sensor result list PLED_simdata_screen2: ostc_debug 'm' ; Sends debug-information to screen if debugmode active WIN_LEFT .0 WIN_FONT FT_SMALL bsf leftbind movlw d'2' movwf wait_temp ; here: stores eeprom address for gas list movlw d'10' movwf waitms_temp ; here: stores row for gas list clrf hi ; here: Gas counter PLED_simdata_screen2_loop: incf hi,F ; Increase Gas movlw d'4' addwf wait_temp,F ; Increase eeprom address for gas list lfsr FSR2,letter movlw 'G' movwf POSTINC2 movff hi,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movff wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! movlw '/' movwf POSTINC2 incf EEADR,F ; Gas #hi: %He - Set address in internal EEPROM call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo output_8 ; outputs into Postinc2! movlw ' ' movwf POSTINC2 movf hi,W ; Gas number addlw d'27' ; -> Adress of change depth register call read_int_eeprom_1 movff EEDATA,lo ; Change depth in m output_99 ; outputs into Postinc2! movlw 'm' movwf POSTINC2 read_int_eeprom d'27' ; read flag register movff hi,lo ; copy gas number PLED_simdata_screen2_loop1: rrcf EEDATA ; roll flags into carry decfsz lo,F ; max. 5 times... bra PLED_simdata_screen2_loop1 btfsc STATUS,C ; test carry bra PLED_simdata_white movlw color_grey call PLED_set_color ; grey out inactive gases! bra PLED_simdata_color_done PLED_simdata_white: call PLED_standard_color PLED_simdata_color_done: movlw d'25' addwf waitms_temp,F ; Increase row WIN_LEFT .0 movff waitms_temp,win_top ; Set Row call word_processor ; display gas PLED_simdata_screen2b: call PLED_standard_color movlw d'5' ; list all five gases cpfseq hi ; All gases shown? bra PLED_simdata_screen2_loop ; No return ; No, return (OC mode) PLED_simdata_screen3: WIN_LEFT .0 WIN_FONT FT_SMALL bsf leftbind ; list three SP in Gaslist movlw d'35' ; 36 = current SP position in EEPROM movwf wait_temp ; here: stores eeprom address for gas list movlw d'10' movwf waitms_temp ; here: stores row for gas list clrf temp6 ; here: SP counter PLED_simdata_screen3_loop: incf wait_temp,F ; EEPROM address incf temp6,F ; Increase SP movlw d'25' addwf waitms_temp,F ; Increase row WIN_LEFT .0 movff waitms_temp,win_top ; Set Row lfsr FSR2,letter movlw 'S' movwf POSTINC2 movlw 'P' movwf POSTINC2 movff temp6,lo ; copy gas number output_8 ; display gas number movlw ':' movwf POSTINC2 movlw ' ' movwf POSTINC2 movff wait_temp, EEADR; SP #hi position call read_eeprom ; get byte (stored in EEDATA) movff EEDATA,lo ; copy to lo clrf hi output_16dp d'3' ; outputs into Postinc2! call word_processor movlw d'3' ; list all three SP cpfseq temp6 ; All gases shown? bra PLED_simdata_screen3_loop ;no read_int_eeprom d'33' ; Read byte (stored in EEDATA) movff EEDATA,active_gas ; Read start gas (1-5) decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'7' ; = address for He ratio movwf EEADR call read_eeprom ; Read He ratio movff EEDATA,hi ; And copy into hold register decf active_gas,W ; Gas 0-4 mullw d'4' movf PRODL,W addlw d'6' ; = address for O2 ratio movwf EEADR call read_eeprom ; Read O2 ratio movff EEDATA, lo ; O2 ratio WIN_LEFT .0 WIN_TOP .110 lfsr FSR2,letter movlw 'D' movwf POSTINC2 movlw 'i' movwf POSTINC2 movlw 'l' movwf POSTINC2 movlw ':' movwf POSTINC2 output_8 ; O2 Ratio movlw '/' movwf POSTINC2 movff hi,lo output_8 ; He Ratio call word_processor bcf leftbind return ; Return (CC Mode) adjust_depth_with_salinity: ; computes salinity setting into lo:hi [mBar] btfsc simulatormode_active ; Do apply salinity in Simulatormode return read_int_eeprom d'26' ; Read Salinity from EEPROM movff EEDATA, wait_temp ; salinity movlw d'105' ; 105% ? cpfslt wait_temp ; Salinity higher limit return ; Out of limit, do not adjust lo:hi movlw d'99' ; 99% ? cpfsgt wait_temp ; Salinity lower limit return ; Out of limit, do not adjust lo:hi movff lo,xA+0 movff hi,xA+1 movlw d'100' movwf xB+0 clrf xB+1 call mult16x16 ;xA*xB=xC (lo:hi * 100) movff wait_temp,xB+0 ; Salinity clrf xB+1 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo movff xC+1,hi ; restore lo and hi with updated value return