Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/pled_outputs.asm @ 0:96a35aeda5f2
Initial setup
author | heinrichsweikamp |
---|---|
date | Tue, 12 Jan 2010 15:05:59 +0100 |
parents | |
children | 3cf8af30b36e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/pled_outputs.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,3287 @@ + +; 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 + +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 + WIN_COLOR color_white + 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: + call set_LEDr + call clear_LEDnofly + call PLED_boot ; PLED boot + call PLED_ClearScreen ; clean up OLED + + WIN_COLOR color_white + + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + + 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 + WIN_COLOR color_white + + 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 + call clear_LEDy + return + +PLED_divemode_mask: ; Displays mask in Dive-Mode + WIN_COLOR color_red + DISPLAYTEXTH .267 ; Max Depth + DISPLAYTEXT .86 ; Divetime + DISPLAYTEXT .87 ; Depth + WIN_COLOR color_white + 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 + + WIN_COLOR color_red + DISPLAYTEXT d'84' ; NoStop + WIN_COLOR color_white + +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 + WIN_COLOR color_white + 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 + WIN_COLOR color_red + DISPLAYTEXT d'85' ; DECOSUM + WIN_COLOR color_white + 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 + WIN_COLOR color_red + DISPLAYTEXT d'82' ; DEKOSTOP + WIN_COLOR color_white + + WIN_TOP .118 + WIN_LEFT .94 + WIN_FONT FT_MEDIUM + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + return + +PLED_simulator_data: + WIN_TOP .65 + WIN_LEFT .105 + WIN_FONT FT_SMALL + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + lfsr FSR2,letter + movlw '-' + btfsc neg_flag + movlw '+' + movwf POSTINC2 + movff divA+0,lo + output_99 + OUTPUTTEXT d'83' ; m/min + call word_processor + 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_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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 + WIN_COLOR color_white + lfsr FSR2,letter + movlw 0xB8 + movwf POSTINC2 + call word_processor + + WIN_TOP .65 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + lfsr FSR2,letter + movlw 0xB8 + movwf POSTINC2 + call word_processor + + WIN_TOP .95 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + lfsr FSR2,letter + movlw 0xB8 + movwf POSTINC2 + call word_processor + + WIN_TOP .125 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + lfsr FSR2,letter + movlw 0xB8 + movwf POSTINC2 + call word_processor + + WIN_TOP .155 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + lfsr FSR2,letter + movlw 0xB8 + movwf POSTINC2 + call word_processor + + WIN_TOP .185 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 .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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + lfsr FSR2,letter + movlw 'p' + movwf POSTINC2 + movlw 'p' + movwf POSTINC2 + movlw 'O' + movwf POSTINC2 + movlw '2' + movwf POSTINC2 + movlw ':' + movwf POSTINC2 + movff xC+0,lo + movff xC+1,hi + bsf ignore_digit4 + output_16dp d'1' + bcf ignore_digit4 + movlw ' ' + movwf POSTINC2 + call word_processor + return + +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! + + ostc_debug 's' ; Sends debug-information to screen if debugmode active +; gas + WIN_TOP .192 + WIN_LEFT .65 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + + 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 " + 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 ' ' + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + call word_processor + return + + +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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + + 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_8 ; O2 ratio is still in "lo" + movlw '/' + movwf POSTINC2 + movff char_I_He_ratio,lo ; copy He ratio into lo + output_8 + 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 + + movlw .255 + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + + 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 + WIN_COLOR color_white + + 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 + WIN_COLOR color_white + 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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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: + +update_batt_voltage: + 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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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: + movlw .255 + movff WREG,box_temp+0 ; Data + movlw .174 + movff WREG,box_temp+1 ; row top (0-239) + movlw .194 + movff WREG,box_temp+2 ; row bottom (0-239) + movlw .0 + movff WREG,box_temp+3 ; column left (0-159) + movlw .31 + movff WREG,box_temp+4 ; column right (0-159) + call PLED_frame + +; 3600-Vbatt + movlw LOW d'3600' + movwf sub_a+0 + movlw HIGH d'3600' + 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 (>3600mV? + btfsc neg_flag + bra update_batt_voltage2_full + +; Vbatt-3000 + movlw LOW d'3000' + movwf sub_b+0 + movlw HIGH d'3000' + 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 3000mV? + btfsc neg_flag + bra update_batt_voltage2_empty + +; Battery is between 3000 and 3600mV +; 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 + + movlw d'2' + cpfsgt wait_temp + movwf wait_temp ; Minimum = 2 + + +update_batt_voltage2a: + movlw .255 + movff WREG,box_temp+0 ; Data + 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: + GETCUSTOM8 d'34' ; Color battery + movff WREG,box_temp+0 ; Color Data + movlw .175 + movff WREG,box_temp+1 ; row top (0-239) + movlw .193 + movff WREG,box_temp+2 ; row bottom (0-239) + movlw .1 + movff WREG,box_temp+3 ; column left (0-159) + movff wait_temp,box_temp+4 ; column right (0-159) + call PLED_box + + WIN_COLOR color_white ; Reset Color + return + +update_batt_voltage2_empty: + movlw d'1' + movwf wait_temp + bra update_batt_voltage2a + +update_batt_voltage2_full: + movlw d'30' + movwf wait_temp + + movlw .255 + movff WREG,box_temp+0 ; Data + 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_box ; Full Cap + bra update_batt_voltage3 + +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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + + WIN_COLOR color_red + DISPLAYTEXT d'140' ; "SURFACE" + WIN_COLOR color_white + + WIN_TOP .85 + WIN_LEFT .90 + WIN_FONT FT_MEDIUM + WIN_COLOR color_white + + 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: + WIN_COLOR color_red + DISPLAYTEXT d'139' ; "Descent" + WIN_COLOR color_white + + WIN_TOP .145 + WIN_LEFT .90 + WIN_FONT FT_MEDIUM + WIN_COLOR color_white + + 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 + WIN_COLOR color_white + 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 + + WIN_COLOR color_red + DISPLAYTEXTH d'283' ; Counter + WIN_COLOR color_white + + WIN_TOP .80 + WIN_LEFT .110 + WIN_FONT FT_SMALL + WIN_COLOR color_white + + + + 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 + WIN_COLOR color_white + + 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 .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + WIN_COLOR color_white + + 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?" + DISPLAYTEXT .31 ;"Show Deco" + + btfsc FLAG_const_ppO2_mode ; are we in ppO2 mode? + bra PLED_divemode_menu_mask_first2 +; in OC Mode + DISPLAYTEXT .32 ;"Gaslist" + DISPLAYTEXT .122 ; "Set Gas" + bra PLED_divemode_menu_mask_first3 + +PLED_divemode_menu_mask_first2: +; in CC Mode + DISPLAYTEXT .238 ; "SetPoint" + 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 + WIN_COLOR color_white + 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: + movlw .255 + movff WREG,box_temp+0 ; Data + movff win_top,box_temp+1 ; row top (0-239) + movff win_top,box_temp+2 ; + movlw d'20' + 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 + decf lo,F ; 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'20' + 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: ; Delete unused rows + movlw .0 + movff WREG,box_temp+0 ; data 00, x0, 0y, xy clear, links, rechts, beide + + movff hi,box_temp+1 ; row top (0-63) + movlw .125 + movff WREG,box_temp+2 ; row bottom (0-63) + 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 + 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: + bsf leftbind + WIN_LEFT .100 + movlw .000 + movff WREG,win_top + movwf hi ; copy for PLED_decoplan_bargraph + call PLED_SetRow ; Set Row + lfsr FSR2,letter + movff char_O_array_decodepth+0,lo ; Get Depth + movf lo,w + btfsc STATUS,Z ; =0 + goto PLED_decoplan_delete ; Yes, quit display + output_8 ; outputs into Postinc2! + movlw 'm' + movwf POSTINC2 + call word_processor + WIN_LEFT .140 + movlw .000 + movff WREG,win_top + lfsr FSR2,letter + movff char_O_array_decotime+0,lo ; Get length for this stop + output_99x ; outputs into Postinc2! + movlw d'39' ;"'" + movwf POSTINC2 + call word_processor + call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth + + WIN_LEFT .100 + movlw .025 + movff WREG,win_top + movwf hi ; copy for PLED_decoplan_bargraph + call PLED_SetRow ; Set Row + lfsr FSR2,letter + movff char_O_array_decodepth+1,lo ; Get Depth + movf lo,w + btfsc STATUS,Z ; =0 + goto PLED_decoplan_delete ; Yes, quit display + output_8 ; outputs into Postinc2! + movlw 'm' + movwf POSTINC2 + call word_processor + WIN_LEFT .140 + movlw .025 + movff WREG,win_top + lfsr FSR2,letter + movff char_O_array_decotime+1,lo ; Get length for this stop + output_99x ; outputs into Postinc2! + movlw d'39' ;"'" + movwf POSTINC2 + call word_processor + call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth + + WIN_LEFT .100 + movlw .050 + movff WREG,win_top + movwf hi ; copy for PLED_decoplan_bargraph + call PLED_SetRow ; Set Row + lfsr FSR2,letter + movff char_O_array_decodepth+2,lo ; Get Depth + movf lo,w + btfsc STATUS,Z ; =0 + goto PLED_decoplan_delete ; Yes, quit display + output_8 ; outputs into Postinc2! + movlw 'm' + movwf POSTINC2 + call word_processor + WIN_LEFT .140 + movlw .050 + movff WREG,win_top + lfsr FSR2,letter + movff char_O_array_decotime+2,lo ; Get length for this stop + output_99x ; outputs into Postinc2! + movlw d'39' ;"'" + movwf POSTINC2 + call word_processor + call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth + + WIN_LEFT .100 + movlw .075 + movff WREG,win_top + movwf hi ; copy for PLED_decoplan_bargraph + call PLED_SetRow ; Set Row + lfsr FSR2,letter + movff char_O_array_decodepth+3,lo ; Get Depth + movf lo,w + btfsc STATUS,Z ; =0 + goto PLED_decoplan_delete ; Yes, quit display + output_8 ; outputs into Postinc2! + movlw 'm' + movwf POSTINC2 + call word_processor + WIN_LEFT .140 + movlw .075 + movff WREG,win_top + lfsr FSR2,letter + movff char_O_array_decotime+3,lo ; Get length for this stop + output_99x ; outputs into Postinc2! + movlw d'39' ;"'" + movwf POSTINC2 + call word_processor + call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth + + WIN_LEFT .100 + movlw .100 + movff WREG,win_top + movwf hi ; copy for PLED_decoplan_bargraph + call PLED_SetRow ; Set Row + lfsr FSR2,letter + movff char_O_array_decodepth+4,lo ; Get Depth + movf lo,w + btfsc STATUS,Z ; =0 + goto PLED_decoplan_delete ; Yes, quit display + output_8 ; outputs into Postinc2! + movlw 'm' + movwf POSTINC2 + call word_processor + WIN_LEFT .140 + movlw .100 + movff WREG,win_top + lfsr FSR2,letter + movff char_O_array_decotime+4,lo ; Get length for this stop + output_99x ; outputs into Postinc2! + movlw d'39' ;"'" + movwf POSTINC2 + call word_processor + call 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! + + + 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 .015 + btfss STATUS,C ; test carry + movlw .010 + movwf grayvalue ; grey out inactive gases! + + call word_processor + movlw .015 + movwf grayvalue ; reset grey value for compatibility + + 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 + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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: + 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 + + movlw .255 + 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 + WIN_COLOR color_red + 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 + WIN_COLOR color_white + 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 +; with dd_font2display + + movlw .255 + 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 + + 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: + movlw .255 + 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 + + 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: + movlw .255 + 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 + + WIN_LEFT .84 + WIN_TOP .32 + WIN_COLOR color_white + lfsr FSR2,letter + movlw 'N' + movwf POSTINC2 + movlw '2' + movwf POSTINC2 + call word_processor + + WIN_LEFT .84 + WIN_TOP .90 + WIN_COLOR color_white + lfsr FSR2,letter + movlw 'H' + movwf POSTINC2 + movlw 'e' + movwf POSTINC2 + call word_processor + 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! + btfsc menubit ; Divemode menu active? + return ; Yes, No update and return! + btfsc premenu ; Showing "Menu?"? + return ; Yes, do not display ppO2/"Bail" + + 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 + WIN_COLOR color_white + 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" + OUTPUTTEXTH d'263' ;"Bail" + call word_processor + return + +PLED_const_ppO2_value2: ; Display SetPoint +;Show fixed SP value + clrf hi + bsf leftbind + output_16dp d'3' + bcf leftbind + call word_processor + 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 + WIN_COLOR color_white + 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 + WIN_COLOR color_white + 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 + movlw .255 +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 + WIN_COLOR color_white + + 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 + WIN_COLOR color_red + + 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 + WIN_COLOR color_white + 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_const_ppO2_DEBUG: +; movlw .007 +; call PLED_SetColumn +; movlw .032 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_O_diluent,lo +; output_8 +; movlw .001 +; movwf scaleY +; call word_processor +; movlw .007 +; call PLED_SetColumn +; movlw .024 +; call PLED_SetRow +; lfsr FSR2,letter +; movff last_diluent,lo +; output_8 +; movlw .001 +; movwf scaleY +; call word_processor +; movlw .007 +; call PLED_SetColumn +; movlw .016 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_O_deco_status,lo +; output_8 +; movlw .001 +; movwf scaleY +; call word_processor +; return +; + +;PLED_gaschange_DEBUG: +; movlw .008 +; call PLED_SetColumn +; movlw .016 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_I_deco_He_ratio,lo +; output_8 +; call word_processor +; +; movlw .024 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_I_deco_N2_ratio,lo +; output_8 +; call word_processor +; +; movlw .032 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_I_deco_gas_change,lo +; output_8 +; call word_processor +; +; movlw .040 +; call PLED_SetRow +; lfsr FSR2,letter +; movff hi,lo +; output_8 +; call word_processor +; return + + +PLED_MultiGF_deco_mask: +; movlw 0x30 +; movwf wait_temp +; movff wait_temp,box_temp+1 ; row +; movlw 0xAA +; movwf wait_temp +; movff wait_temp,box_temp+0 ; color +; goto DD_hline ; returns +return + +PLED_MultiGF_deco_all: +return +; movff char_O_actual_pointer,wait_temp +; movff char_O_GF_low_pointer,waitms_temp +; movf waitms_temp,F +; bz PLED_MultiGF_no_deco +; movf waitms_temp,W +; cpfsgt wait_temp +; bra PLED_MultiGF_actual_in_deco +; call PLED_MultiGF_clear_behind_depth +; movff char_O_GF_low_pointer,wait_temp +; incf wait_temp,F +; bra PLED_MultiGF_complete_list_only ; input wait_temp +;PLED_MultiGF_actual_in_deco: +; call PLED_MultiGF_gradient +; call PLED_MultiGF_time_at_deco +; call PLED_MultiGF_deco_depth_actual +; movff char_O_actual_pointer,wait_temp +;PLED_MultiGF_complete_list_only: +; call PLED_MultiGF_table ; input wait_temp +; return + +;PLED_MultiGF_table: +; movlw .043 +; movwf temp5 +; movlw .48 + .8 +; movwf temp6 +; movff char_O_GF_low_pointer,wait_temp +;PLED_MultiGF_loop: +; decfsz wait_temp,F +; bra PLED_MulitGF_nextentry +; +;; bra PLED_MultiGF_calc_tissue_counter +;;PLED_MGF_lp_calc_tis_counter: +; +;PLED_MGF_lp_clear_rem_space: +; lfsr FSR2,letter +; movlw ' ' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw .8 +; subwf temp6,F +; bnz PLED_MultiGF_column_ok_space +; movlw .21 +; subwf temp5,F +; bc PLED_MultiGF_new_row_space +; return +;PLED_MultiGF_new_row_space: +; movlw .48 +; movwf temp6 +;PLED_MultiGF_column_ok_space: +; movf temp5,W +; call PLED_SetColumn +; movlw .8 +; subwf temp6,W +; call PLED_SetRow +; call word_processor +; bra PLED_MGF_lp_clear_rem_space +; +;PLED_MulitGF_nextentry: +; lfsr FSR2,letter +; movff wait_temp,lo ; pointer to meter +; movf lo,W +; rlncf lo,F +; addwf lo,F +; decfsz wait_temp,W +; bra PLED_MGF_skip_last_deco2 +; movff char_I_depth_last_deco,lo +;PLED_MGF_skip_last_deco2: +; output_99 +; movlw 0x02 +; movwf POSTINC2 +; movlw ':' +; movwf POSTINC2 +; movlw 0x02 +; movwf POSTINC2 +; lfsr FSR0,0x250 +; movf wait_temp,W +; movff PLUSW0,lo +; movlw d'10' ; gray code +; tstfsz lo +; movlw b'00001111' ; gray code +; movwf grayvalue +; bsf leftbind +; output_99 +; bcf leftbind +; movlw ' ' +; movwf POSTINC2 +; movlw .8 +; subwf temp6,F +; bnz PLED_MultiGF_column_ok +; movlw .21 +; subwf temp5,F +; bc PLED_MultiGF_new_row +; return +;PLED_MultiGF_new_row: +; movlw .48 +; movwf temp6 +;PLED_MultiGF_column_ok: +; movf temp5,W +; call PLED_SetColumn +; movlw .8 +; subwf temp6,W +; call PLED_SetRow +; call word_processor +; movlw b'00001111' ; gray code +; movwf grayvalue +; bra PLED_MultiGF_loop +; +;PLED_MultiGF_no_deco: +; DISPLAYTEXT d'242' ;"no deco" +; return +; +;PLED_MultiGF_depth: +; lfsr FSR2,letter +; movff rel_pressure+0,lo +; movff 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 .004 +; movwf wait_temp +; movff wait_temp,0x086 ; left +; movlw .049 +; movwf wait_temp +; movff wait_temp,0x087 ; top +; movlw .015 +; movwf wait_temp +; movff wait_temp,0x088 ; heightmax +; movff dd_oled_brightness_offset,wait_temp +; movff wait_temp,0x089 ; oled_brightness_offset_const +; call main_DD2_write_incon24 +; movlb b'00000001' ; Back to Bank1 +; return +; +;PLED_MultiGF_deco_depth_actual: +; lfsr FSR2,letter +; movff char_O_actual_pointer,lo ; pointer to meter +; movf lo,W +; rlncf lo,F +; addwf lo,F +; movff char_O_actual_pointer,wait_temp ; test last_deco +; decfsz wait_temp,F +; bra PLED_MGF_skip_last_deco_depth +; movff char_I_depth_last_deco,lo +;PLED_MGF_skip_last_deco_depth: +; output_99 +; movlw 'm' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw .23 +; call PLED_SetColumn +; movlw .57 +; call PLED_SetRow +; goto word_processor +; +;PLED_MultiGF_gradient: +; lfsr FSR2,letter +; movff char_O_gradient_factor,lo +; bsf leftbind +; output_99 +; bcf leftbind +; movlw '%' +; movwf POSTINC2 +; movlw ' ' +; movwf POSTINC2 +; movlw .23 +; call PLED_SetColumn +; movlw .49 +; call PLED_SetRow +; goto word_processor +; +;PLED_MultiGF_time_at_deco: +; movlw .045 +; movwf wait_temp +; movff wait_temp,0x086 ; left +; movlw .050 +; movwf wait_temp +; movff wait_temp,0x087 ; top +; movlw .015 +; movwf wait_temp +; movff wait_temp,0x088 ; heightmax +; movff dd_oled_brightness_offset,wait_temp +; movff wait_temp,0x089 ; oled_brightness_offset_const +; lfsr FSR2,letter +; lfsr FSR0,0x250 +; movff char_O_actual_pointer,lo +; movf lo,W +; movff PLUSW0,lo +; bsf leftbind +; output_99 +; movlw '<' ; Textmapping to "'"! +; movwf POSTINC2 +; call main_DD2_write_incon24 +; movlb b'00000001' ; Back to Bank1 +; return +; +;PLED_MultiGF_clear_behind_depth: +; movlw 0x01 +; movwf wait_temp +; movff wait_temp,width ; font select left side before decpoint +; movff wait_temp,box_temp+5 ; font select right side decpoint and after +; movlw .063 +; movwf wait_temp +; movff wait_temp,box_temp+1 ; bottom row +; movlw .020 +; movwf wait_temp +; movff wait_temp,box_temp+2 ; start column +; movlw .063 +; movwf wait_temp +; movff wait_temp,box_temp+3 ; end column +; movlw .051 +; movwf wait_temp +; movff wait_temp,box_temp+4 ; start column dec point +; lfsr FSR2,letter +;; call DD_Main +; return +;; movlw 0x31 +; movwf wait_temp +; movff wait_temp,box_temp+1 ; row +; movlw 0x00 +; movwf wait_temp +; movff wait_temp,box_temp+0 ; color +; call DD_hline +; return +; + +;PLED_MulitGF_nextentry_tissues: +; lfsr FSR2,letter +; lfsr FSR0,0x200 +; rlncf wait_temp,W +; movff PLUSW0,lo +; addlw .001 +; movff PLUSW0,hi +; output_16 +; movlw ' ' +; movwf POSTINC2 +; movlw .8 +; subwf temp6,F +; bnz PLED_MultiGF_column_ok_tissues +; movlw b'00001111' ; gray code +; movwf grayvalue +; movlw .21 +; subwf temp5,F +; bc PLED_MultiGF_new_row_tissues +; return +;PLED_MultiGF_new_row_tissues: +; movlw .48 +; movwf temp6 +;PLED_MultiGF_column_ok_tissues: +; movf temp5,W +; call PLED_SetColumn +; movlw .8 +; subwf temp6,W +; call PLED_SetRow +; call word_processor +; bra PLED_MultiGF_loop_tissues +; + +;PLED_MultiGF_uart_out: +; call rs232_wait_tx +;; header ff ff +; movlw 0xff +; movwf wait_temp +; movff wait_temp,TXREG +; call rs232_wait_tx +; movff wait_temp,TXREG +; call rs232_wait_tx +;; 2sec counter +; movff 0x290,TXREG +; call rs232_wait_tx +; movff 0x291,TXREG +; call rs232_wait_tx +;; movff ,TXREG +;; pres_respiration +; movff amb_pressure,TXREG +; call rs232_wait_tx +; movff amb_pressure+1,TXREG +; call rs232_wait_tx +;; pres_surface +; movff last_surfpressure,TXREG +; call rs232_wait_tx +; movff last_surfpressure+1,TXREG +; call rs232_wait_tx +;; tissue pres +; lfsr FSR0,0x200 +; movlw .64 +; movwf wait_temp +;pled_multigraf_tissue_uart_loop: +; movff POSTINC0,TXREG +; call rs232_wait_tx +; decfsz wait_temp +; bra pled_multigraf_tissue_uart_loop +;; movff ,TXREG +;; call rs232_wait_tx +; return + +;PLED_MulitGF_nextentry_debug: +; lfsr FSR2,letter +; movff wait_temp,lo +; output_99 +; movlw 0x02 +; movwf POSTINC2 +; movlw ':' +; movwf POSTINC2 +; movlw 0x02 +; movwf POSTINC2 +; lfsr FSR0,0x300 +; movf wait_temp,W +; movff PLUSW0,lo +; output_99 +; movlw ' ' +; movwf POSTINC2 +; movlw .8 +; subwf temp6,F +; bnz PLED_MultiGF_column_ok_debug +; movlw b'00001111' ; gray code +; movwf grayvalue +; movlw .21 +; subwf temp5,F +; bc PLED_MultiGF_new_row_debug +; return +;PLED_MultiGF_new_row_debug: +; movlw .48 +; movwf temp6 +;PLED_MultiGF_column_ok_debug: +; movf temp5,W +; call PLED_SetColumn +; movlw .8 +; subwf temp6,W +; call PLED_SetRow +; call word_processor +; bra PLED_MultiGF_loop_debug + +;PLED_MultiGF_calc_tissue_counter: +; movlw d'8' ; gray code +; movwf grayvalue +; movff 0x290,lo +; movff 0x291,hi +; movlw '(' +; movwf POSTINC2 +; output_16 +; movlw ')' +; movwf POSTINC2 +; movlw .8 +; subwf temp6,F +; bnz PLED_MGF_ok_col_calc_tis_cter +; movlw b'00001111' ; gray code +; movwf grayvalue +; movlw .21 +; subwf temp5,F +; bc PLED_MGF_n_row_calc_tis_cter +; return +;PLED_MGF_n_row_calc_tis_cter: +; movlw .48 +; movwf temp6 +;PLED_MGF_ok_col_calc_tis_cter: +; movf temp5,W +; call PLED_SetColumn +; movlw .8 +; subwf temp6,W +; call PLED_SetRow +; call word_processor +; bra PLED_MGF_lp_calc_tis_counter +; + +;PLED_debug_deko: +; movlw .009 +; call PLED_SetColumn +; movlw .008 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_O_deco_status,lo +; output_8 +; call word_processor +; +; movlw .009 +; call PLED_SetColumn +; movlw .016 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_O_array_decodepth+0,lo +; output_8 +; call word_processor +; return +; + + + +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 \ No newline at end of file