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