Mercurial > public > hwos_code
diff src/simulator.asm @ 582:b455b31ce022
work on 2.97 stable
author | heinrichsweikamp |
---|---|
date | Mon, 26 Feb 2018 16:40:28 +0100 |
parents | b7eb98dbd800 |
children | e1f0f5e3d4e4 |
line wrap: on
line diff
--- a/src/simulator.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/simulator.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,118 +1,119 @@ ;============================================================================= ; -; File simulator.asm REFACTORED VERSION V2.95a1 +; File simulator.asm REFACTORED VERSION V2.98 ; ; Decoplan interface to C model code. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY -; 2011-07-09 : [jDG] Creation... +; 2011-07-09 : [jDG] Creation... -#include "hwos.inc" ; Mandatory include -#include "convert.inc" ; output_* -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "strings.inc" ; STRCPY,... -#include "tft.inc" ; WIN_LEFT,... -#include "wait.inc" ; speed_* +#include "hwos.inc" ; Mandatory include +#include "convert.inc" ; output_* +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "strings.inc" ; STRCPY,... +#include "tft.inc" ; WIN_LEFT,... +#include "wait.inc" ; speed_* #include "start.inc" #include "divemode.inc" #include "math.inc" #include "eeprom_rs232.inc" #include "tft_outputs.inc" #include "gaslist.inc" +#include "isr.inc" -gui CODE +gui CODE - extern deco_clear_tissue - extern deco_push_tissues_to_vault - extern deco_calc_dive_interval - extern deco_calc_hauptroutine - extern deco_pull_tissues_from_vault - extern TFT_display_decotype_surface1 - extern get_first_dil_to_WREG - extern get_first_gas_to_WREG - extern setup_dil_registers - extern setup_gas_registers - extern deco_setup_cc_diluents - extern deco_setup_oc_gases + extern deco_clear_tissue + extern deco_push_tissues_to_vault + extern deco_calc_dive_interval + extern deco_calc_hauptroutine + extern deco_pull_tissues_from_vault + extern TFT_display_decotype_surface1 + extern get_first_dil_to_WREG + extern get_first_gas_to_WREG + extern setup_dil_registers + extern setup_gas_registers + extern deco_setup_cc_diluents + extern deco_setup_oc_gases + extern log_screendump_and_onesecond + extern logbook_preloop_tasks + extern do_return_demo_planner - extern log_screendump_and_onesecond, logbook_preloop_tasks - extern do_planner_menu - -;---- Private temp variables ------------------------------------------------- +;---- Private local variables ------------------------------------------------- - CBLOCK tmp+0x12 ; Reserved space for word processor and convert - decoplan_index ; within each page - decoplan_gindex ; global index - decoplan_last ; Depth of last stop (CF#29) - decoplan_flags ; Various private flags. - decoplan_page ; page number - decoplan_warnings ; deco engine warnings (ex reserved to tmp+0x18...) - ENDC - + CBLOCK local1 ; max size is 16 Byte !!! + decoplan_index ; within each page + decoplan_gindex ; global index + decoplan_last ; Depth of last stop (CF#29) + decoplan_flags ; Various private flags. + decoplan_page ; page number + decoplan_warnings ; deco engine warnings + gas_counter ; counter for looping through the gases + row_pos ; used for positioning of graphic elements + ENDC ; used: 8 byte, remaining: 8 byte + ;---- Defines ---------------------------------------------------------------- #define decoplan_last_ceiling_shown decoplan_flags,0 -#define decoplan_abort decoplan_flags,1 +#define decoplan_abort decoplan_flags,1 ;---- Demo deco planner ------------------------------------------------------ - global do_demo_planner + global do_demo_planner do_demo_planner: btfsc FLAG_gauge_mode ; =1: In Gauge mode - goto do_planner_menu + goto do_return_demo_planner btfsc FLAG_apnoe_mode ; =1: In Apnea mode - goto do_planner_menu + goto do_return_demo_planner bcf decoplan_abort ; initialize (clear) abort flag bcf is_bailout ; clear bailout condition (may have remained set from last invocation) rcall deco_planer btfss decoplan_abort ; skip recall deco_show_plan if calculations were aborted rcall deco_show_plan - goto do_planner_menu + goto do_return_demo_planner global deco_setup deco_setup: - banksel common btfsc FLAG_ccr_mode bra deco_setup_cc btfsc FLAG_pscr_mode bra deco_setup_cc deco_setup_oc: - call get_first_gas_to_WREG ; gets first gas (1-5) into WREG - call setup_gas_registers ; with WREG=Gas 1-5 + call get_first_gas_to_WREG ; gets first gas (1-5) into WREG + call setup_gas_registers ; with WREG=Gas 1-5 call deco_setup_oc_gases ; setup OC/Bailout Gases and configure for OC deco calculation bra deco_setup_cont deco_setup_cc: - call get_first_dil_to_WREG ; gets first gas (1-5) into WREG - call setup_dil_registers ; with WREG=Gas 1-5 + call get_first_dil_to_WREG ; gets first gas (1-5) into WREG + call setup_dil_registers ; with WREG=Gas 1-5 call deco_setup_cc_diluents ; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation deco_setup_cont: - ; use ambient conditions for simulation ## V2.94 - #include "isr.inc" + ; use ambient conditions for simulation SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ; copy surface pressure to deco routine - + movlw deco_distance movff WREG,char_I_deco_distance movff opt_last_stop,char_I_depth_last_deco movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage - + ; overwrite GF if aGF is wanted bsf use_agf TSTOSS opt_sim_use_aGF bcf use_agf - btfsc use_agf ; =1: Use aGF + btfsc use_agf ; =1: Use aGF movff opt_aGF_low,char_I_GF_Low_percentage - btfsc use_agf ; =1: Use aGF + btfsc use_agf ; =1: Use aGF movff opt_aGF_high,char_I_GF_High_percentage bcf is_bailout - + ; setup char_I_const_ppO2 for CC modes clrf WREG btfsc FLAG_pscr_mode @@ -120,256 +121,248 @@ btfss FLAG_ccr_mode return ; done if not in CCR mode movff opt_sim_setpoint_number,WREG ; configure CCR computations to selected setpoint - decf WREG,W ; 1-5 -> 0-4 - lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list - movff PLUSW1,char_I_const_ppO2 ; setup setpoint + decf WREG,W ; 1-5 -> 0-4 + lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list + movff PLUSW1,char_I_const_ppO2 ; setup setpoint return - + ;============================================================================= ; Launch deco planning -; - global deco_planer +; + global deco_planer deco_planer: - call speed_fastest ; Quick ! - call deco_push_tissues_to_vault - rcall deco_setup ; Setup all model parameters. + call speed_fastest ; Quick ! + call deco_push_tissues_to_vault ; C-code: back-up state of the real tissues + banksel common + rcall deco_setup ; Setup all model parameters. ;---- Specific settings ------------------------------------------------------ - ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent - movff char_O_deco_status,WREG ; bank-safe copy - bcf WREG,DECO_PLAN_FLAG ; normal plan mode, - bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), - bsf WREG,DECO_VOLUME_FLAG ; enable gas volume calculation, and - bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation - movff WREG,char_O_deco_status ; bank-safe copy back + ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent + movff char_O_deco_status,WREG ; bank-safe copy + bcf WREG,DECO_PLAN_FLAG ; normal plan mode, + bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), + bsf WREG,DECO_VOLUME_FLAG ; enable gas volume calculation, and + bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff WREG,char_O_deco_status ; bank-safe copy back - ; configure the deco engine for total-dive gas volume calculation - movff char_O_main_status,WREG ; bank-safe copy - bsf WREG,DECO_BOTTOM_FLAG ; set bottom flag - movff WREG,char_O_main_status ; bank-safe copy back + ; configure the deco engine for total-dive gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bsf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back deco_planer_redo: + ; show deco calculation is in progress + call TFT_ClearScreen + WIN_COLOR color_greenish + TEXT_SMALL .20,.40, tCalculating + WIN_COLOR color_lightblue + WIN_SMALL .1,.215 + STRCPY_TEXT_PRINT tAbort - ; show deco calculation is in progress - call TFT_ClearScreen - WIN_COLOR color_greenish - TEXT_SMALL .20,.40, tCalculating - WIN_COLOR color_lightblue - WIN_SMALL .1,.215 - STRCPY_TEXT_PRINT tAbort - - ; configure the deco engine for restart: - movff char_O_deco_status,WREG ; bank-safe copy - bsf WREG,DECO_STATUS_0_FLAG ; configure init ... - bsf WREG,DECO_STATUS_1_FLAG ; ... state, - movff WREG,char_O_deco_status ; bank-safe copy back + ; configure the deco engine for restart: + movff char_O_deco_status,WREG ; bank-safe copy + bsf WREG,DECO_STATUS_0_FLAG ; configure init ... + bsf WREG,DECO_STATUS_1_FLAG ; ... state, + movff WREG,char_O_deco_status ; bank-safe copy back ;---- Add delay at surface, if needed ---------------------------------------- - - banksel char_I_dive_interval - tstfsz char_I_dive_interval - call deco_calc_dive_interval + banksel char_I_dive_interval + tstfsz char_I_dive_interval + call deco_calc_dive_interval ;---- Dive loop -------------------------------------------------------------- + ; Compute dive ambient conditions + banksel char_I_bottom_depth + movf char_I_bottom_depth,W + mullw .100 + movlw LOW(.1000) + addwf PRODL,W + movwf int_I_pres_respiration+0 + movlw HIGH(.1000) + addwfc PRODH,W + movwf int_I_pres_respiration+1 + banksel common - ; Compute dive ambient conditions - banksel char_I_bottom_depth - movf char_I_bottom_depth,W - mullw .100 - movlw LOW(.1000) - addwf PRODL,W - movwf int_I_pres_respiration+0 - movlw HIGH(.1000) - addwfc PRODH,W - movwf int_I_pres_respiration+1 - - banksel common + movff char_I_bottom_time,char_I_sim_advance_time + + clrf TMR5L + clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - movff char_I_bottom_time,char_I_sim_advance_time - - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H + call deco_calc_hauptroutine ; C-code: initialization + complete bottom time part + banksel common - call deco_calc_hauptroutine ; initialization + complete bottom time part - banksel common - ;---- BAILOUT: Switch to OC gases for ascent cycles -------------------------- - - btfss is_bailout ; Doing a bailout deco plan ? - bra deco_planer_finishing ; NO - keep gases + btfss is_bailout ; Doing a bailout deco plan ? + bra deco_planer_finishing ; NO - keep gases ; YES - switch to OC gas - ; reconfigure the deco engine for delayed ascent mode - movff char_O_deco_status,lo ; bank-safe copy - bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation - movff lo,char_O_deco_status ; bank-safe copy back + ; reconfigure the deco engine for delayed ascent mode + movff char_O_deco_status,lo ; bank-safe copy + bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation + movff lo,char_O_deco_status ; bank-safe copy back - ; configure the deco engine for delayed ascent part gas volume calculation - movff char_O_main_status,WREG ; bank-safe copy - bcf WREG,DECO_BOTTOM_FLAG ; set bottom flag - movff WREG,char_O_main_status ; bank-safe copy back + ; configure the deco engine for delayed ascent part gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bcf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back - ; reconfigure gas settings to OC gases - call get_first_gas_to_WREG ; get first gas (1-5) into WREG - call setup_gas_registers ; With WREG=Gas 1-5 (or 6, not applicable here) - call deco_setup_oc_gases ; With WREG=Gas 1-5 (or 6, not applicable here) - - ; set the gas change override flag to allow gas changes before deco stops as done in alternative plan - movff char_O_main_status,lo ; bank-safe copy - bsf lo,DECO_GASCHANGE_OVRD ; set flag for gas change override - movff lo,char_O_main_status ; bank-safe copy back + ; reconfigure gas settings to OC gases + call get_first_gas_to_WREG ; get first gas (1-5) into WREG + call setup_gas_registers ; With WREG=Gas 1-5 (or 6, not applicable here) + call deco_setup_oc_gases ; With WREG=Gas 1-5 (or 6, not applicable here) + + ; set the gas change override flag to allow gas changes before deco stops as done in alternative plan + movff char_O_main_status,lo ; bank-safe copy + bsf lo,DECO_GASCHANGE_OVRD ; set flag for gas change override + movff lo,char_O_main_status ; bank-safe copy back ;---- Wait until status reaches zero ------------------------------------------- +deco_planer_finishing: + call deco_calc_hauptroutine ; C-code: Simulate more dive time to trigger the deco calculations + banksel common -deco_planer_finishing: - call deco_calc_hauptroutine ; Simulate more dive time to trigger the deco calculations - banksel common - - btfss switch_left ; check if left button was pressed - bra deco_planer_finishing_1 ; NO - continue calculations - bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called - bra deco_planer_finishing_2 ; do some clean-up and return + btfss switch_left ; check if left button was pressed + bra deco_planer_finishing_1 ; NO - continue calculations + bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called + bra deco_planer_finishing_2 ; do some clean-up and return deco_planer_finishing_1: - movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common - movlw DECO_STATUS_MASK ; bit mask for deco status bit set - andwf lo,W ; mask out bits showing state of computation - tstfsz WREG ; check if a compute cycle is finished (bits 1 and 0 == 0) - bra deco_planer_finishing ; NO - needs more computation cycles + movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common + movlw DECO_STATUS_MASK ; bit mask for deco status bit set + andwf lo,W ; mask out bits showing state of computation + tstfsz WREG ; check if a compute cycle is finished (bits 1 and 0 == 0) + bra deco_planer_finishing ; NO - needs more computation cycles ;---- Done: add CNS from decoplan, and restore tissues - deco_planer_finishing_2: - movff char_O_deco_warnings,decoplan_warnings ; copy warnings - - call deco_pull_tissues_from_vault ; restore "real" deco data - banksel common ; back to bank 1 + + call deco_pull_tissues_from_vault ; C-code: restore status of the real tissues + banksel common ; back to bank 1 - movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz + movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz movwf T3CON - goto speed_normal ;(and return) + goto speed_normal ; (and return) ;----------------------------------------------------------------------------- ; Draw a stop of the deco plan (simulator or dive). -; Inputs: lo = depth. Range 3m...93m -; + 0x80 if this is a switch-gas stop. -; up = minutes. range 1'..240'. -; win_top = line to draw on screen. -; Trashed: up, lo, win_height, win_leftx2, win_width, win_color*, +; Inputs: lo = depth +; hi = minutes +; win_top = line to draw on screen. +; +; Trashed: hi, lo, +; win_height, win_leftx2, win_width, win_color*, ; WREG, PROD, TBLPTR TABLAT. ; deco_plan_show_stop: + ;---- Print depth ---------------------------------------------------- + lfsr FSR2,char_O_deco_gas ; needed to be initialized here every time because... + movf decoplan_gindex,W ; ...FSR2 is also used for string operations + movff PLUSW2,WREG ; get current gas and copy it to WREG for color-coding + call TFT_color_code_gas ; set output color dependent on gas (1-5) - ;---- Print depth ---------------------------------------------------- - bcf lo,7 ; clear gas-switch flag (not used any more anyhow) - lfsr FSR2,char_O_deco_gas - movf decoplan_gindex,W ; index - movff PLUSW2,WREG ; get current gas - rcall simulator_color_gas ; set output color dependent on gas (1-5) + lfsr FSR2,buffer - lfsr FSR2,buffer - - TSTOSS opt_units ; 0=Meters, 1=Feets - bra deco_plan_show_nstd_stop_metric + TSTOSS opt_units ; 0=Meters, 1=Feets + bra deco_plan_show_nstd_stop_metric - WIN_LEFT .85 - movf lo,W ; lo = m - mullw .100 ; PRODL:PRODH = mbar - movff PRODL,lo - movff PRODH,hi - ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... - movff lo,xA+0 - movff hi,xA+1 - movlw LOW d'334' ; 334feet/100m - movwf xB+0 - movlw HIGH d'334' - movwf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 328) - movlw d'50' ; round up - addwf xC+0,F - movlw 0 - addwfc xC+1,F - addwfc xC+2,F - addwfc xC+3,F - movlw d'100' - movwf xB+0 - clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value - bsf leftbind - bsf ignore_digit4 ; Only full feet - output_16 - bcf leftbind - STRCAT_PRINT "ft " - bra deco_plan_show_nstd_stop_common + WIN_LEFT .85 + movf lo,W ; lo = m + mullw .100 ; PRODL:PRODH = mbar + movff PRODL,lo + movff PRODH,hi + ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... + movff lo,xA+0 + movff hi,xA+1 + movlw LOW d'334' ; 334feet/100m + movwf xB+0 + movlw HIGH d'334' + movwf xB+1 + call mult16x16 ; xA*xB=xC (lo:hi * 328) + movlw d'50' ; round up + addwf xC+0,F + movlw .0 + addwfc xC+1,F + addwfc xC+2,F + addwfc xC+3,F + movlw d'100' + movwf xB+0 + clrf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movff xC+0,lo + movff xC+1,hi ; restore lo and hi with updated value + bsf leftbind + bsf ignore_digit4 ; Only full feet + output_16 + bcf leftbind + STRCAT_PRINT "ft " + bra deco_plan_show_nstd_stop_common deco_plan_show_nstd_stop_metric: - WIN_LEFT .90 - bsf leftbind - output_8 ; outputs into Postinc2! - bcf leftbind - STRCAT_PRINT "m " + WIN_LEFT .90 + bsf leftbind + output_8 ; outputs into Postinc2! + bcf leftbind + STRCAT_PRINT "m " + deco_plan_show_nstd_stop_common: - ;---- Print duration ------------------------------------------------- - WIN_LEFT .135 - lfsr FSR2,buffer - - movf lo,W ; Swap up & lo - movff up,lo - movwf up + ;---- Print duration ------------------------------------------------- + WIN_LEFT .135 + lfsr FSR2,buffer - output_8 ; Allow up to 240' - STRCAT "' " ; 1 to 3 chars for depth. - clrf WREG - movff WREG,buffer+.3 ; limit to 4 chars - STRCAT_PRINT "" + movf lo,W ; Swap hi & lo + movff hi,lo + movwf hi + + output_8 ; Allow up to 240' + clrf WREG + movff WREG,buffer+.3 ; limit to 2 chars + STRCAT_PRINT "" - movf lo,W ; Swap back up & lo - movff up,lo - movwf up + movf lo,W ; Swap back hi & lo + movff hi,lo + movwf hi - ;--------------------------------------------------------------------- - ; Draw the bar graph used for deco stops (deco plan in simulator or dive). - incf win_top,F - movlw .19 - movwf win_height - movlw .118 - movwf win_leftx2 ; column left (0-159) - movlw .16 - movwf win_width+0 ; column max width. - clrf win_width+1 + ;--------------------------------------------------------------------- + ; Draw the bar graph used for deco stops (deco plan in simulator or dive). + incf win_top,F + movlw .19 + movwf win_height + movlw .118 + movwf win_leftx2 ; column left (0-159) + movlw .16 + movwf win_width+0 ; column max width. + clrf win_width+1 - ; Draw used area (up = minutes): - movlw .16 ; Limit length (16min) - cpfslt up - movwf up - movff up,win_bargraph ; Active width, the rest is cleared. - call TFT_box + ; Draw used area (hi = minutes): + movlw .16 ; Limit length (16min) + cpfslt hi + movwf hi + movff hi,win_bargraph ; Active width, the rest is cleared. + call TFT_box - ; Restore win_top - call TFT_standard_color - decf win_top,F ; Restore win_top - return + ; Restore win_top + call TFT_standard_color + decf win_top,F ; Restore win_top + return ;----------------------------------------------------------------------------- ; Clear unused area below last stop ; Inputs: win_top : last used area... deco_plan_show_clear_bottom: - movf win_top,W ; Get back from bank0 - sublw .239 ; No: bottom row in planning - movwf win_height + movf win_top,W ; Get back from bank0 + sublw .239 ; No: bottom row in planning + movwf win_height - WIN_LEFT .85 ; Full dive menu width - movlw .159-.85+1 - movwf win_width+0 - clrf win_width+1 + WIN_LEFT .85 ; Full dive menu width + movlw .159-.85+.1 + movwf win_width+0 + clrf win_width+1 - clrf win_color1 ; Fill with black - clrf win_color2 + clrf win_color1 ; Fill with black + clrf win_color2 - goto TFT_box ; and return + goto TFT_box ; and return ;----------------------------------------------------------------------------- ; Display the deco plan (simulator). @@ -377,381 +370,331 @@ ; decoplan_page = page number. ; deco_show_plan_page: - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag - ;---- Is there deco stops ? ------------------------------------------ - movff char_O_first_deco_depth,WREG - iorwf WREG - bnz deco_plan_show_1 + ;---- Is there deco stops ? ------------------------------------------ + movff char_O_first_deco_depth,WREG + iorwf WREG + bnz deco_plan_show_1 - ;---- No Deco -------------------------------------------------------- - call TFT_standard_color - TEXT_SMALL .80, .0, tNoDeco - bsf decoplan_last_ceiling_shown - return + ;---- No Deco -------------------------------------------------------- + call TFT_standard_color + TEXT_SMALL .80, .0, tNoDeco + bsf decoplan_last_ceiling_shown + return deco_plan_show_1: - lfsr FSR0,char_O_deco_depth ; Initialize indexed addressing. - lfsr FSR1,char_O_deco_time + lfsr FSR0,char_O_deco_depth ; Initialize indexed addressing. + lfsr FSR1,char_O_deco_time - clrf decoplan_index ; Start with index = 0 - clrf win_top ; and row = 0 + clrf decoplan_index ; Start with index = 0 + clrf win_top ; and row = 0 - ; Read stop parameters, indexed by decoplan_index and decoplan_page - movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index - mullw .8 ; 8 lines/page in deco plan - movf decoplan_index,W - addwf PRODL,W - movwf decoplan_gindex ; --> decoplan_gindex + ; Read stop parameters, indexed by decoplan_index and decoplan_page + movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index + mullw .8 ; 8 lines/page in deco plan + movf decoplan_index,W + addwf PRODL,W + movwf decoplan_gindex ; --> decoplan_gindex - bcf decoplan_last_ceiling_shown ; Not finished yet... + bcf decoplan_last_ceiling_shown ; Not finished yet... deco_plan_show_2: - btfsc decoplan_gindex,5 ; Reached table length (32) ? - bra deco_plan_show_99 ; YES: finished... + btfsc decoplan_gindex,5 ; Reached table length (32) ? + bra deco_plan_show_99 ; YES: finished... - ; Read stop parameters, indexed by decoplan_index - movf decoplan_gindex,W ; index - movff PLUSW1,up ; char_O_deco_time [gindex] --> up - movff PLUSW0,lo ; char_O_deco_depth[gindex] - movf lo,W - bz deco_plan_show_99 ; depth == 0 : finished. + ; Read stop parameters, indexed by decoplan_index + movf decoplan_gindex,W ; index + movff PLUSW0,lo ; char_O_deco_depth[gindex] + movff PLUSW1,hi ; char_O_deco_time [gindex] + movf lo,W + bz deco_plan_show_99 ; depth == 0 : finished. - ; Display the stop line - rcall deco_plan_show_stop + ; Display the stop line + rcall deco_plan_show_stop - ; Next - movlw .24 - addwf win_top,F ; row: += 24 - incf decoplan_index,F ; local index += 1 - incf decoplan_gindex,F ; global index += 1 + ; Next + movlw .24 + addwf win_top,F ; row: += 24 + incf decoplan_index,F ; local index += 1 + incf decoplan_gindex,F ; global index += 1 - ; Max number of lines/page reached ? - movlw .8 ; 8 lines/page in deco plan - cpfseq decoplan_index - bra deco_plan_show_2 ; NO: loop + ; Max number of lines/page reached ? + movlw .8 ; 8 lines/page in deco plan + cpfseq decoplan_index + bra deco_plan_show_2 ; NO: loop - ; Check if next stop is end-of-list ? - movf decoplan_gindex,W - movf PLUSW0,W ; char_O_deco_depth[gindex] - bz deco_plan_show_99 ; End of list... + ; Check if next stop is end-of-list ? + movf decoplan_gindex,W + movf PLUSW0,W ; char_O_deco_depth[gindex] + bz deco_plan_show_99 ; End of list... - ; Display the message "more..." - rcall deco_plan_show_clear_bottom ; Clear from next line + ; Display the message "more..." + rcall deco_plan_show_clear_bottom ; Clear from next line - call TFT_standard_color - TEXT_SMALL .88, .220, tMore - return + call TFT_standard_color + TEXT_SMALL .88, .220, tMore + return deco_plan_show_99: - bsf decoplan_last_ceiling_shown ; Nothing more in table to display. - rcall deco_plan_show_clear_bottom ; Clear from next line - return + bsf decoplan_last_ceiling_shown ; Nothing more in table to display. + rcall deco_plan_show_clear_bottom ; Clear from next line + return ;----------------------------------------------------------------------------- ; Loop to show all pages of the deco plan (surface mode) - global deco_show_plan + global deco_show_plan deco_show_plan: - clrf decoplan_page - call TFT_ClearScreen - WIN_COLOR color_greenish - btfsc is_bailout - bra deco_show_plan_bail_title - TEXT_SMALL .1,.1, tDivePlan - bra deco_show_plan2 + clrf decoplan_page + call TFT_ClearScreen + WIN_COLOR color_greenish + btfsc is_bailout + bra deco_show_plan_bail_title + TEXT_SMALL .1,.1, tDivePlan + bra deco_show_plan2 deco_show_plan_bail_title: - TEXT_SMALL .1,.1, tDiveBailout + TEXT_SMALL .1,.1, tDiveBailout deco_show_plan2: - call TFT_standard_color - ;---- Display Plan Parameters - WIN_SMALL .0,.25 - STRCPY "Int:" - movff char_I_dive_interval,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "'" - WIN_SMALL .0,.50 - STRCPY_TEXT tBtTm_short - movff char_I_bottom_time,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "'" - WIN_SMALL .0,.75 - STRCPY_TEXT tDepth - PUTC ":" - movff char_I_bottom_depth,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "m" - - WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors - - ;---- Check for Stop Table Overflow - btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning - bra deco_show_plan2a ; NO - skip - ;---- Display Overflow warning - call TFT_warnings_color ; YES - show overflow warning - STRCAT_PRINT "incomplete" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors + call TFT_standard_color + ;---- Display Plan Parameters + WIN_SMALL .0,.25 + STRCPY "Int:" + movff char_I_dive_interval,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "'" + WIN_SMALL .0,.50 + STRCPY_TEXT tBtTm_short + movff char_I_bottom_time,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "'" + WIN_SMALL .0,.75 + STRCPY_TEXT tDepth + PUTC ":" + movff char_I_bottom_depth,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "m" + WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors -deco_show_plan2a: - ;---- Check for IBCD Warning - btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning - bra deco_show_plan2b ; NO - skip - ;---- Display IBCD warning - call TFT_attention_color ; YES - show IBCD warning - STRCAT_PRINT "IBCD!" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors - + ;---- Check for Stop Table Overflow + btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning + bra deco_show_plan2a ; NO - skip + ;---- Display Overflow warning + call TFT_warnings_color ; YES - show overflow warning + STRCAT_PRINT "incomplete" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors + +deco_show_plan2a: + ;---- Check for IBCD Warning + btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning + bra deco_show_plan2b ; NO - skip + ;---- Display IBCD warning + call TFT_attention_color ; YES - show IBCD warning + STRCAT_PRINT "IBCD!" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors + deco_show_plan2b: - ;---- Display Sat/Desat Factors --> is skipped if there were warnings - STRCAT_PRINT "SD:" - WIN_SMALL .25,.105 - movff char_I_saturation_multiplier,lo - output_8 - STRCAT "/" - movff char_I_desaturation_multiplier,lo - output_8 - STRCAT_PRINT "" + ;---- Display Sat/Desat Factors --> omitted if there were warnings + STRCAT_PRINT "SD:" + WIN_SMALL .25,.105 + movff char_I_saturation_multiplier,lo + output_8 + STRCAT "/" + movff char_I_desaturation_multiplier,lo + output_8 + STRCAT_PRINT "" deco_show_plan_m1: - call TFT_standard_color ; clean-up from warnings + call TFT_standard_color ; clean-up from warnings - ;---- Get Model - movff char_I_deco_model,WREG - iorwf WREG - bz deco_show_plan_m2 + ;---- Get Model + movff char_I_deco_model,WREG + iorwf WREG + bz deco_show_plan_m2 - ;---- Display GF low/high values - WIN_SMALL .0,.130 - STRCAT_PRINT "GF:" - WIN_SMALL .25,.130 - movff char_I_GF_Low_percentage,lo - output_99x - STRCAT "/" - movff char_I_GF_High_percentage,lo - output_99x - STRCAT_PRINT "" + ;---- Display GF low/high values + WIN_SMALL .0,.130 + STRCAT_PRINT "GF:" + WIN_SMALL .25,.130 + movff char_I_GF_Low_percentage,lo + output_99x + STRCAT "/" + movff char_I_GF_High_percentage,lo + output_99x + STRCAT_PRINT "" deco_show_plan_m2: - ;---- Display Deco Mode - WIN_SMALL .0,.155 - lfsr FSR2,buffer - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - call TFT_display_decotype_surface1 - btfss FLAG_ccr_mode ; current dive mode = CCR ? - bra deco_show_plan2c ; NO - branch - WIN_SMALL .25,.155 - STRCPY "SP:" ; output setpoint used for calculation - movff opt_sim_setpoint_number,lo - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "" + ;---- Display Deco Mode + WIN_SMALL .0,.155 + lfsr FSR2,buffer + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + call TFT_display_decotype_surface1 + btfss FLAG_ccr_mode ; current dive mode = CCR ? + bra deco_show_plan2c ; NO - branch + WIN_SMALL .25,.155 + STRCPY "SP:" ; output setpoint used for calculation + movff opt_sim_setpoint_number,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "" deco_show_plan2c: - ;---- Display TTS result - WIN_SMALL .0,.180 - STRCPY_TEXT tTTS - STRCAT ": " - movff int_O_ascenttime+0,lo - movff int_O_ascenttime+1,hi - bsf leftbind - output_16 - bcf leftbind - STRCAT_PRINT "'" + ;---- Display TTS result + WIN_SMALL .0,.180 + STRCPY_TEXT tTTS + STRCAT ": " + movff int_O_ascenttime+0,lo + movff int_O_ascenttime+1,hi + bsf leftbind + output_16 + bcf leftbind + STRCAT_PRINT "'" - ;---- Display CNS result - WIN_TOP .205 - STRCPY_TEXT tCNS2 ; "CNS:" - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - bcf leftbind - STRCAT "%\x92" ; "->" - movff int_O_normal_CNS_fraction+0,lo - movff int_O_normal_CNS_fraction+1,hi - TFT_color_code warn_cns ; Color-code CNS output - bsf leftbind - output_16_3 ; limit to 999 and display only (0-999) - bcf leftbind - STRCAT_PRINT "%" - call TFT_standard_color - - ;---- Loop through pages + ;---- Display CNS result + WIN_TOP .205 + STRCPY_TEXT tCNS2 ; "CNS:" + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + STRCAT "%\x92" ; "->" + movff int_O_normal_CNS_fraction+0,lo + movff int_O_normal_CNS_fraction+1,hi + call TFT_color_code_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + STRCAT_PRINT "%" + call TFT_standard_color + + ;---- Loop through pages deco_show_plan_1: - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right - - rcall deco_show_plan_page - incf decoplan_page,F - call logbook_preloop_tasks + ; Clear the complete stop result column: + WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right + + rcall deco_show_plan_page + incf decoplan_page,F + call logbook_preloop_tasks deco_show_plan_2: - btfsc switch_right - bra deco_show_plan_3 - btfsc switch_left - return ; Return to simulator menu - call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second - btfsc sleepmode ; Timeout? - goto restart - bra deco_show_plan_2 + btfsc switch_right + bra deco_show_plan_3 + btfsc switch_left + return ; Return to simulator menu + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second + btfsc sleepmode ; Timeout? + goto restart + bra deco_show_plan_2 deco_show_plan_3: - btfss decoplan_last_ceiling_shown - bra deco_show_plan_1 - ; All stops shown - -;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- + btfss decoplan_last_ceiling_shown + bra deco_show_plan_1 + ; All stops shown - banksel common - movff char_O_deco_status,WREG ; get deco calculation status - btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode - bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display - bsf is_bailout ; YES - redo 2nd deco-plan in bailout mode - rcall deco_planer_redo ; redo plan computation +;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- + movff char_O_deco_status,WREG ; get deco calculation status + btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode + bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display + bsf is_bailout ; YES - redo 2nd deco-plan in bailout mode + rcall deco_planer_redo ; redo plan computation - btfss decoplan_abort ; shall we abort? - bra deco_show_plan ; NO - display bailout stops - return ; YES + btfss decoplan_abort ; shall we abort? + bra deco_show_plan ; NO - display bailout stops + return ; YES -;---- In OC+BAIL modes, show the gas Usage special page ----------------------- -simulator_show_decoplan5_0: - - movlb .1 - - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right +;---- In OC+BAIL modes, show the gas usage special page ----------------------- +simulator_show_decoplan5_0: + ; Clear the complete stop result column: + WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right - movlw .25 - movwf waitms_temp ; Row for gas list is .25+.25 - clrf wait_temp ; Gas counter - lfsr FSR0,int_O_gas_volumes ; Initialize indexed addressing. + movlw .25 + movwf row_pos ; Row for gas list is .25+.25 + clrf gas_counter ; Gas counter + lfsr FSR0,int_O_gas_volumes ; Initialize indexed addressing. - WIN_LEFT .80 ; Set column - call TFT_standard_color + WIN_LEFT .80 ; Set column + call TFT_standard_color simulator_show_decoplan5_loop: - movff wait_temp,PRODL ; Copy to PRODL first - incf wait_temp,F ; Increment gas # + movff gas_counter,PRODL ; Copy to PRODL first + incf gas_counter,F ; Increment gas # + + movff gas_counter,WREG ; copy current gas to WREG for color-coding + call TFT_color_code_gas ; set output color according to gas (1-5) - movff wait_temp,WREG - rcall simulator_color_gas ; set output color according to gas (number 1-5 in WREG) + lfsr FSR2,buffer + bsf short_gas_decriptions + bsf divemode ; Tweak "customview_show_mix:" + call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + bcf divemode ; Tweak "customview_show_mix:" - lfsr FSR2,buffer - bsf short_gas_decriptions - bsf divemode ; Tweak "customview_show_mix:" - call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - bcf divemode ; Tweak "customview_show_mix:" - movlw .25 - addwf waitms_temp,F ; Increase row position - movff waitms_temp,win_top ; Set Row + addwf row_pos,F ; Increase row position + movff row_pos,win_top ; Set Row + + movff POSTINC0,lo ; Read (16bit) result, low first, + movff POSTINC0,hi ; then high. - movff POSTINC0,lo ; Read (16bit) result, low first, - movff POSTINC0,hi ; then high. + movf lo,W + andwf hi,W + incf WREG ; > 65535? + bnz simulator_show_decoplan5_1 ; NO + STRCAT_PRINT ">65500" ; YES + bra simulator_show_decoplan5_2 - movf lo,W - andwf hi,W - incf WREG ; > 65535? - bnz simulator_show_decoplan5_2 ; NO - STRCAT_PRINT ">65500" ; YES - bra simulator_show_decoplan5_1 - -simulator_show_decoplan5_2: - PUTC ":" - bsf leftbind - output_16 ; No decimal anymore. - bcf leftbind - STRCAT_PRINT "" ; No unit: can be bars or litters. - - ; Loop for all 5 gas simulator_show_decoplan5_1: - movlw d'5' ; list all five gases - cpfseq wait_temp ; All gases shown? + PUTC ":" + bsf leftbind + output_16 ; No decimal anymore. + bcf leftbind + STRCAT_PRINT "" + + ; Loop for all 5 gas +simulator_show_decoplan5_2: + movlw d'5' ; list all five gases + cpfseq gas_counter ; All gases shown? bra simulator_show_decoplan5_loop ; No - - WIN_COLOR color_greenish - WIN_SMALL .80,.25 - STRCPY_TEXT tGasUsage ; OC: "Gas Usage" - STRCAT_PRINT ":" - call TFT_standard_color - call logbook_preloop_tasks + + WIN_COLOR color_greenish + + movlw .30 + addwf row_pos,F ; Increase row position + movff row_pos,win_top ; Set Row + STRCPY_TEXT_PRINT tBarLiter ; "Bar Liter" + + WIN_SMALL .80,.25 + STRCPY_TEXT tGasUsage ; "Gas Usage" + STRCAT_PRINT ":" + + call TFT_standard_color + call logbook_preloop_tasks simulator_show_decoplan5_3: - btfss switch_right + btfss switch_right bra simulator_show_decoplan5_3a bcf switch_right - clrf decoplan_page + clrf decoplan_page bra deco_show_plan_1 ; toggle between stops plan and gas usage simulator_show_decoplan5_3a: - btfss switch_left + btfss switch_left bra simulator_show_decoplan5_4 - bcf is_bailout ; Back to normal - bcf ccr_diluent_setup ; init for OC/Bailout - return ; Return to simulator menu - -simulator_show_decoplan5_4: - call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second - btfsc sleepmode ; Timeout? - goto restart - bra simulator_show_decoplan5_3 - + bcf is_bailout ; Back to normal + bcf ccr_diluent_setup ; init for OC/Bailout + return ; Return to simulator menu -simulator_color_gas: ; set output color dependent on gas (1-5, in WREG) - movwf tft_temp1 ; used in TFT_set_color anyway - dcfsnz tft_temp1,F - movlw color_white ; color for Gas 1 - dcfsnz tft_temp1,F - movlw color_green ; color for Gas 2 - dcfsnz tft_temp1,F - movlw color_red ; Color for Gas 3 - dcfsnz tft_temp1,F - movlw color_yellow ; color for Gas 4 - dcfsnz tft_temp1,F - movlw color_cyan ; color for Gas 5 - goto TFT_set_color ; set color and return... - -;============================================================================= -; - global do_demo_divemode -do_demo_divemode: - extern option_save_all - call option_save_all ; Save all settings into EEPROM before starting simulation - call deco_push_tissues_to_vault - banksel common ; Bank1 +simulator_show_decoplan5_4: + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second + btfsc sleepmode ; Timeout? + goto restart + bra simulator_show_decoplan5_3 - ; +++ COMMENTED OUT FOR TESTING PURPOSE ONLY !!! +++ - ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ - bsf restore_deco_data ; Restore tissue and CNS after simulator use - - bcf pressure_refresh - btfss pressure_refresh ; Wait for sensor - bra $-2 - - bsf simulatormode_active ; Set Flag - ; Compute dive ambient conditions - banksel char_I_bottom_depth - movf char_I_bottom_depth,W - mullw .100 - movff PRODL,rel_pressure+0 - movff PRODH,rel_pressure+1 - movlw LOW(.1000) - addwf PRODL,W - movff WREG,sim_pressure+0 - movlw HIGH(.1000) - addwfc PRODH,W - movff WREG,sim_pressure+1 - - banksel common ; Bank1 - bsf divemode - goto diveloop ; Switch into Divemode! - - - END \ No newline at end of file + END \ No newline at end of file